#How can I use a different "dataSourceOptions" for tests?

3 messages · Page 1 of 1 (latest)

real ginkgo
#

Here is my db/data-source.ts:

export const dataSourceOptions: DataSourceOptions = {
    type: 'postgres',
    host: process.env.DATABASE_HOST,
    port: parseInt(process.env.DATABASE_PORT),
    username: process.env.DATABASE_USER,
    password: process.env.DATABASE_PASSWORD,
    database: process.env.DATABASE_NAME,
    entities: ['dist/src/classes/**/**/entities/*.entity{.ts,.js}'],
    migrations: ['dist/db/migrations/*{.ts,.js}'],
};

export const testDataSourceOptions: DataSourceOptions = {
    type: 'postgres',
    host: process.env.DATABASE_HOST,
    port: parseInt(process.env.DATABASE_PORT),
    username: process.env.DATABASE_USER,
    password: process.env.DATABASE_PASSWORD,
    database: process.env.DATABASE_NAME,
    entities: ['src/classes/**/**/entities/*.entity{.ts,.js}'],
    migrations: ['db/migrations/*{.ts,.js}'],
};

export const seederOptions: SeederOptions = {
    seeds: [
        'dist/src/database/seeds/app.seeder{.ts,.js}',
        'dist/src/database/seeds/users/*{.ts,.js}'
    ],
    factories: ['dist/src/database/factories/**/*{.ts,.js}']
};

const dataSource = new DataSource({ ...dataSourceOptions, ...seederOptions });
export default dataSource;

I use dataSourceOptions in app.module TypeOrmModule.forRoot(dataSourceOptions), I want to use testDataSourceOptions for my tests.
I actually did that :

// user.e2e-spec.ts
import { startE2ETest } from '../utils';
describe('userController (e2e)', () => {
  let app: INestApplication;
  
  beforeAll(async () => {
      const { dataSource, app: newApp } = await startE2ETest();
      app = newApp;
      await userTestDbInit(dataSource);
  })
  ...
})
#
// utils.ts
import { testDataSourceOptions } from '../db/data-source';
export async function startE2ETest(): Promise<{ dataSource: DataSource, app: INestApplication }>{
    process.env.NODE_ENV = 'test';
    const moduleFixture: TestingModule = await Test.createTestingModule({
        imports: [
            TypeOrmModule.forRoot(testDataSourceOptions), // did not work
            AppModule
        ]
    }).compile();

    const app = moduleFixture.createNestApplication();
    app.useGlobalPipes(new ValidationPipe({
        whitelist: true
    }));
    await app.init();

    const dataSource = app.get(DataSource);
    return { dataSource: dataSource, app: app };
}
#

I don't understand why the imports of TypeOrmModule.forRoot(testDataSourceOptions) does not override the one in app.module.