n8n/packages/testing/containers/services/postgres.ts
2026-01-05 09:54:19 +00:00

59 lines
1.6 KiB
TypeScript

import { PostgreSqlContainer } from '@testcontainers/postgresql';
import type { StartedNetwork } from 'testcontainers';
import { TEST_CONTAINER_IMAGES } from '../test-containers';
import type { Service, ServiceResult } from './types';
const HOSTNAME = 'postgres';
export interface PostgresMeta {
database: string;
username: string;
password: string;
}
export type PostgresResult = ServiceResult<PostgresMeta>;
export const postgres: Service<PostgresResult> = {
description: 'PostgreSQL database',
shouldStart: (ctx) => ctx.usePostgres,
async start(network: StartedNetwork, projectName: string): Promise<PostgresResult> {
const container = await new PostgreSqlContainer(TEST_CONTAINER_IMAGES.postgres)
.withNetwork(network)
.withNetworkAliases(HOSTNAME)
.withDatabase('n8n_db')
.withUsername('n8n_user')
.withPassword('test_password')
.withStartupTimeout(30000)
.withLabels({
'com.docker.compose.project': projectName,
'com.docker.compose.service': HOSTNAME,
})
.withName(`${projectName}-${HOSTNAME}`)
.withAddedCapabilities('NET_ADMIN') // Allows us to drop IP tables and block traffic
.withReuse()
.start();
return {
container,
meta: {
database: container.getDatabase(),
username: container.getUsername(),
password: container.getPassword(),
},
};
},
env(result: PostgresResult): Record<string, string> {
return {
DB_TYPE: 'postgresdb',
DB_POSTGRESDB_HOST: HOSTNAME,
DB_POSTGRESDB_PORT: '5432',
DB_POSTGRESDB_DATABASE: result.meta.database,
DB_POSTGRESDB_USER: result.meta.username,
DB_POSTGRESDB_PASSWORD: result.meta.password,
};
},
};