0.7.1 • Published 2 years ago

@rxstack/data-fixtures v0.7.1

Weekly downloads
1
License
MIT
Repository
github
Last release
2 years ago

RxStack DataFixtures Module

This module aims to provide a simple way to manage and execute the loading of data fixtures.

Installation

npm install @rxstack/data-fixtures --save

// peerDependencies
npm install --no-save @rxstack/core@^0.7 @rxstack/exceptions@^0.6 @rxstack/service-registry@^0.6 @rxstack/async-event-dispatcher@^0.6 winston@^3.3.3

Documentation

Setup

DataFixtures module needs to be registered in the application.

Let's create the application:

import {Application, ApplicationOptions} from '@rxstack/core';
import {DataFixtureModule} from '@rxstack/data-fixtures';

export const APP_OPTIONS: ApplicationOptions = {
  imports: [
    // ...
    DataFixtureModule,
  ],
  servers: [
    // ...
  ], 
  providers: [
    // ...
  ]
};

new Application(APP_OPTIONS).start();

Purger

Purger is a service responsible to purge the database. By default a NoopPurger is registered (which does nothing) but you can register your own by implementing PurgerInterface:

import {Injectable} from 'injection-js';
import {PurgerInterface} from '@rxstack/data-fixtures';

@Injectable()
export class MyPurger implements PurgerInterface {
  async purge(): Promise<void> { 
    // purge database
  }
}

then you need to register it in the application providers:

import {PURGER_SERVICE} from '@rxstack/data-fixtures';

{
  providers: [
    // ...
    { provide: PURGER_SERVICE, useClass: MyPurger },
  ]
}

Create a fixture

Let's create a fixture:

import {AbstractFixture} from '@rxstack/data-fixtures';
import {Injectable} from 'injection-js';

@Injectable()
export class MyFixture extends AbstractFixture {

  async load(): Promise<void> {
    const service = '...'; // any persistent service
    
    // save the data
    const result = await service.insertOne({
      'name': 'Nikolay',
      'pasword': 'secret'
    });
    
    // share the result with other fixtures
    this.setReference('result-1', result);
  }
  
  getName(): string {
    return 'my-fixture';
  }
  
  // fixture ordering, defaults to 0
  getOrder(): number {
    return 1;
  }
}

and now we need to register it in the application providers:

import {FIXTURE_REGISTRY} from '@rxstack/data-fixtures';

{
  providers: [
    // ...
    { provide: FIXTURE_REGISTRY, useClass: MyFixture, multi: true },
  ]
}

Share fixture result

Fixtures can be shared using the following methods:

import {AbstractFixture} from '@rxstack/data-fixtures';
import {Injectable} from 'injection-js';

@Injectable()
export class MySecondFixture extends AbstractFixture {

  async load(): Promise<void> {
    const result = '...';
    
    // sets the result to the `ReferenceRepository`
    this.setReference('result-2', result);
    
    // gets already added reference from the `ReferenceRepository`, if name does not exist an exception will be thrown
    this.getReference('result-1');
  }

  // ...
}

Usage in tests

Let's assume you need to load fixtures before you execute a testcase.

import 'reflect-metadata';
// ...
import {Application} from '@rxstack/core';
import {Injector} from 'injection-js';
import {FixtureManager} from '@rxstack/data-fixtures';

describe('TestcaseWithFixtures', () => {
  // Setup application
  const app = new Application(APP_OPTIONS);
  let injector: Injector;

  before(async() =>  {
    await app.start();
    injector = app.getInjector();
    // purge the database and load fixtures
    await this.injector.get(FixtureManager).execute(true);
  });

  after(async() =>  {
    await app.stop();
  });
  
  // ...
});

CLI command

You can load fixtures from the command line:

$ npm run cli data-fixtures:load -- --purge=true

License

Licensed under the MIT license.

0.7.1

2 years ago

0.7.0

3 years ago

0.6.1

3 years ago

0.6.0

4 years ago

0.5.0

4 years ago

0.4.0

5 years ago

0.3.0

5 years ago

0.2.0

5 years ago

0.1.2

5 years ago

0.1.1

6 years ago

0.1.0

6 years ago