@overture-stack/lyric
Version:
Data Submission system
79 lines (78 loc) • 2.82 kB
JavaScript
import { PostgreSqlContainer } from '@testcontainers/postgresql';
import pg from 'pg';
import { GenericContainer, Network, Wait } from 'testcontainers';
export async function startContainers() {
const network = await new Network().start();
const postgresContainer = await new PostgreSqlContainer('postgres:15-alpine').start();
const mongoContainer = await new GenericContainer('bitnami/mongodb:latest')
.withNetwork(network)
.withNetworkAliases('mongo')
.withEnvironment({
MONGODB_USERNAME: 'admin',
MONGODB_PASSWORD: 'password',
MONGODB_DATABASE: 'lectern',
MONGODB_ROOT_PASSWORD: 'password123',
})
.withExposedPorts(27017)
.withWaitStrategy(Wait.forLogMessage(/Waiting for connections/))
.start();
const lecternContainer = await new GenericContainer('ghcr.io/overture-stack/lectern:latest')
.withNetwork(network)
.withEnvironment({
MONGO_HOST: 'mongo',
MONGO_PORT: '27017',
MONGO_DB: 'lectern',
MONGO_USER: 'admin',
MONGO_PASS: 'password',
})
.withExposedPorts(3000)
.withWaitStrategy(Wait.forHttp('/health', 3000))
.start();
const schemaServiceUrl = `http://${lecternContainer.getHost()}:${lecternContainer.getMappedPort(3000)}`;
const dbConfig = {
host: postgresContainer.getHost(),
port: postgresContainer.getPort(),
database: postgresContainer.getDatabase(),
user: postgresContainer.getUsername(),
password: postgresContainer.getPassword(),
};
const schemaServiceConfig = { url: schemaServiceUrl };
const resetDatabases = async () => {
const pool = new pg.Pool(dbConfig);
await pool.query(`
DO $$ DECLARE r RECORD;
BEGIN
FOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = 'public' AND tablename NOT LIKE '__drizzle%') LOOP
EXECUTE 'TRUNCATE TABLE ' || quote_ident(r.tablename) || ' RESTART IDENTITY CASCADE';
END LOOP;
END $$;
`);
await pool.end();
await mongoContainer.exec([
'mongosh',
'--username',
'root',
'--password',
'password123',
'--authenticationDatabase',
'admin',
'lectern',
'--eval',
'db.getCollectionNames().forEach(function(name) { db[name].deleteMany({}) })',
]);
};
const stopContainers = async () => {
await lecternContainer.stop();
await mongoContainer.stop();
await postgresContainer.stop();
await network.stop();
};
return {
providerConfig: {
db: dbConfig,
schemaService: schemaServiceConfig,
},
resetDatabases,
stop: stopContainers,
};
}