Skip to content

altiore/typeorm-fixtures

Repository files navigation

Why we need it?

Quite often we have to load data into a database before running tests. This library helps to solve this problem effortlessly.

Usage example:

1. Create fixture creators (only once per project)

import { fixtureCreator, many, one } from "typeorm-fixtures";

import { Role } from "../.."; // this is typeorm Entity
import { Project } from "../.."; // this is typeorm Entity
import { User } from "../.."; // this is typeorm Entity

// NOTICE: not arrow function here!
export const createUsersFixture = fixtureCreator<User>(
  User,
  function (entity, index) {
    return {
      email: `test${index}@mail.com`,
      status: 10,
      ...entity,
      roles: many(this, Role, entity.roles),
    };
  }
);

// NOTICE: not arrow function here!
export const createProjectsFixture = fixtureCreator<Project>(
  Project,
  function (entity, index) {
    return {
      title: `Default Title`,
      ...entity,
      owner: one(this, User, entity.owner),
    };
  }
);

2. Create fixtures (each time for certain test)

export const usersFixture = createUsersFixture([
  {
    email: "[email protected]",
    roles: [{ name: "user" }], // roles will automatically added here (look usage)
  },
  {
    email: "[email protected]",
    roles: [{ name: "user" }, { name: "admin" }],
  },
]);

export const projectsFixture = createProjectsFixture([
  {
    owner: { email: "[email protected]" }, // owner will automatically linked with user above
  },
]);

3. Download data before test and drop after

import { TypeormFixtures } from "typeorm-fixtures";

// typeormf config from js/ts file or any other if required
const typeormConfig = {};
const h = new TypeormFixtures(false, typeormConfig)
  .findEntities({ name: In(["user", "admin"]) }, Role) // sequence is important here!
  .addFixture(usersFixture) // sequence is important here!
  .addFixture(projectsFixture); // sequence is important here!

describe(`GET /url`, async () => {
  let projectId: number;
  let user: User;

  beforeAll(async () => {
    await h.loadFixtures();
    projectId = h.entities.Project[0].id; // this is our project id, which was loaded
    user = h.entities.User.find((el) => el.email === "[email protected]"); // we also can find loaded user by email
  });

  afterAll(h.dropFixtures);

  it("test", async () => {
    // now all data loaded to database and you can perform any actions here
  });
});

Install

npm i typeorm-fixtures --save-dev
yarn add typeorm-fixtures --dev

Stay in touch

Thanks for helping

License

Nest is MIT licensed.