@mondart/nestjs-common-module-testing
v1.0.1
Published
Testcontainers helpers for spinning up real MySQL/Redis/Kafka in integration tests.
Downloads
306
Readme
@mondart/nestjs-common-module-testing
Testcontainers helpers for running Jest e2e/integration suites against real
MySQL, Redis, and Kafka instead of a shared dev server. Meant to be driven
from a Jest globalSetup/globalTeardown pair, writing the resolved
connection info into a service's test/.env.test so ConfigModule picks it
up with no application code changes.
Usage
test/global-setup.ts:
import {
startMysqlContainer,
startRedisContainer,
startKafkaContainer,
writeEnvOverrides,
} from '@mondart/nestjs-common-module-testing';
export default async function globalSetup() {
const [mysql, redis, kafka] = await Promise.all([
startMysqlContainer(),
startRedisContainer(),
startKafkaContainer(),
]);
(globalThis as any).__TESTCONTAINERS__ = [
mysql.container,
redis.container,
kafka.container,
];
writeEnvOverrides(`${__dirname}/.env.test`, {
...mysql.env,
...redis.env,
BULL_HOST: redis.env.REDIS_HOST,
BULL_PORT: redis.env.REDIS_PORT,
BULL_PASSWORD: redis.env.REDIS_PASSWORD,
BULL_USERNAME: redis.env.REDIS_USERNAME,
BULL_TLS: redis.env.REDIS_TLS,
...kafka.env,
DATABASE_SYNCHRONIZE: 'true',
});
}test/global-teardown.ts:
export default async function globalTeardown() {
const containers = (globalThis as any).__TESTCONTAINERS__ ?? [];
await Promise.all(containers.map((c: { stop(): Promise<unknown> }) => c.stop()));
}Then point test/jest-e2e.json at both files via globalSetup/globalTeardown.
Note: Jest runs globalSetup and globalTeardown in the same parent
process for a given test run, so the globalThis handoff above is safe.
Testcontainers' own Ryuk reaper is also a safety net if teardown is ever
skipped — it reaps containers once the owning Docker client session ends.
