Files
graphql-api-js/src/__test__/containerSetup.ts
T
2022-01-20 07:11:43 +01:00

148 lines
4.2 KiB
TypeScript

import fs from 'fs';
import { resolve } from 'path';
import {
GenericContainer,
Network,
StartedNetwork,
StartedTestContainer,
Wait,
} from 'testcontainers';
import { Knex, knex } from 'knex';
// import knexTinyLogger from 'knex-tiny-logger';
export const DbNetworkName = 'postgres_container';
export const ApiNetworkName = 'api_container';
const allContainers = {
version: 0,
};
const runFile = async (db, file) => {
const sql = fs.readFileSync(resolve(__dirname, file)).toString();
await db.raw(sql);
};
const createKnexDb = (host: string, mappedPort: number, database: string) => {
const connection = `postgresql://testuser:test@${host}:${mappedPort}/${database}`;
// console.log(`connection`, connection);
const db = knex({
client: 'pg',
connection: connection,
pool: { min: 0 },
});
// knexTinyLogger(db);
return db;
};
export interface IAllTestContainers {
version: number;
dbContainer?: StartedTestContainer;
db?: Knex;
apiContainer?: StartedTestContainer;
network?: StartedNetwork;
stopAll?: any;
}
export const createAllTestContainers =
async (): Promise<IAllTestContainers> => {
const network = await new Network().start();
// ----------------------------------
// DB container
const dbContainer = await new GenericContainer('postgres')
.withNetworkMode(network.getName())
.withNetworkAliases(DbNetworkName)
.withEnv('POSTGRES_USER', 'testuser')
.withEnv('POSTGRES_PASSWORD', 'test')
.withEnv('POSTGRES_DB', 'apidb')
.withExposedPorts(5432)
.start();
// const dbLogStream = await dbContainer.logs();
// dbLogStream
// .on('data', (line) => console.log(line))
// .on('err', (line) => console.error(line))
// .on('end', () => console.log('Stream closed'));
const dbMappedPort = dbContainer.getMappedPort(5432);
const dbHost = dbContainer.getHost();
// ----------------------------------
// Knex DB
const initialDb = createKnexDb(dbHost, dbMappedPort, 'postgres');
await initialDb.raw('CREATE DATABASE photowalltest1');
await initialDb.destroy();
const db = createKnexDb(dbHost, dbMappedPort, 'photowalltest1');
await runFile(db, 'db/schema.sql');
await runFile(db, 'db/base/locales.sql');
await runFile(db, 'db/base/product-currencies.sql');
await runFile(db, 'db/base/markets.sql');
await runFile(db, 'db/base/market_locales.sql');
await runFile(db, 'db/base/i18n-territories.sql');
// Other
await runFile(db, 'db/data/addresses.sql');
// Designers
await runFile(db, 'db/data/designers.sql');
await runFile(db, 'db/data/designer_texts.sql');
await runFile(db, 'db/data/designers-blocked.sql');
// Orders
await runFile(db, 'db/data/orders.sql');
// Products
await runFile(db, 'db/data/product-products.sql');
// Set the public as the default schema
await db.raw('set search_path to "public"');
// ----------------------------------
// Api Container
const buildContext = resolve(__dirname, '../../');
const nodeContainer = await GenericContainer.fromDockerfile(
buildContext,
).build();
const dbIpAddress = dbContainer.getIpAddress(network.getName());
const apiContainer = await nodeContainer
.withNetworkMode(network.getName())
.withNetworkAliases(ApiNetworkName)
.withExposedPorts(4000)
.withEnv(
'DATABASE_URL',
`postgresql://testuser:test@${dbIpAddress}:5432/photowalltest1`,
)
.withEnv('NODE_ENV', 'test')
.withEnv('COGNITO_POOL_ID', 'eu-west-1_3O4VfvPn7')
.withWaitStrategy(
Wait.forLogMessage('Server is running on http://localhost:4000'),
)
.start();
const stream = await apiContainer.logs();
stream
.on('data', (line) => console.log(line))
.on('err', (line) => console.error(line))
.on('end', () => console.log('Stream closed'));
Object.assign(allContainers, {
version: Math.round(Math.random() * 999999),
dbContainer,
db,
apiContainer,
network,
stopAll: async () => {
await dbContainer.stop();
await apiContainer.stop();
await network.stop();
await db.destroy();
},
});
return allContainers;
};