148 lines
4.2 KiB
TypeScript
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;
|
|
};
|