From 472de491510e5c629f8aad16385530fa37eb2f2a Mon Sep 17 00:00:00 2001 From: hided62 Date: Sun, 2 Aug 2026 04:47:03 +0000 Subject: [PATCH] test(tournament): baseline lifecycle migrations --- .../test/tournamentLifecycle.test.ts | 73 ++++++++++++++++++- 1 file changed, 71 insertions(+), 2 deletions(-) diff --git a/tools/integration-tests/test/tournamentLifecycle.test.ts b/tools/integration-tests/test/tournamentLifecycle.test.ts index 7886999..746aead 100644 --- a/tools/integration-tests/test/tournamentLifecycle.test.ts +++ b/tools/integration-tests/test/tournamentLifecycle.test.ts @@ -104,21 +104,90 @@ const truncateSchema = async (schema: string): Promise => { } }; +const hasMigrationHistory = async (schema: string): Promise => { + const connector = createGatewayPostgresConnector({ + url: resolvePostgresConfigFromEnv({ schema: 'public' }).url, + }); + await connector.connect(); + try { + const rows = (await connector.prisma.$queryRawUnsafe( + `SELECT EXISTS ( + SELECT 1 FROM pg_tables + WHERE schemaname = '${schema}' AND tablename = '_prisma_migrations' + ) AS present` + )) as Array<{ present: boolean }>; + return rows[0]?.present === true; + } finally { + await connector.disconnect(); + } +}; + +const baselineMigrations = async ( + directory: 'gateway-migrations' | 'migrations', + schemaFile: 'gateway.prisma' | 'game.prisma', + env: NodeJS.ProcessEnv +): Promise => { + const migrations = ( + await fs.readdir(path.join(workspaceRoot, 'packages', 'infra', 'prisma', directory), { + withFileTypes: true, + }) + ) + .filter((entry) => entry.isDirectory()) + .map((entry) => entry.name) + .sort(); + for (const migration of migrations) { + await execCommand( + 'pnpm', + [ + '--dir', + 'packages/infra', + 'exec', + 'prisma', + 'migrate', + 'resolve', + '--applied', + migration, + '--schema', + `prisma/${schemaFile}`, + '--config', + schemaFile === 'gateway.prisma' ? 'prisma.gateway.config.ts' : 'prisma.config.ts', + ], + env + ); + } +}; + const resetServices = async (): Promise => { await ensureSchema('public'); await ensureSchema('che'); const gatewayDatabaseUrl = resolvePostgresConfigFromEnv({ schema: 'public' }).url; const gameDatabaseUrl = resolvePostgresConfigFromEnv({ schema: 'che' }).url; - await execCommand('pnpm', ['--filter', '@sammo-ts/infra', 'prisma:migrate:deploy:gateway'], { + const gatewayHasHistory = await hasMigrationHistory('public'); + const gameHasHistory = await hasMigrationHistory('che'); + await execCommand('pnpm', ['--filter', '@sammo-ts/infra', 'prisma:db:push:gateway', '--accept-data-loss'], { ...process.env, POSTGRES_SCHEMA: 'public', GATEWAY_DATABASE_URL: gatewayDatabaseUrl, }); - await execCommand('pnpm', ['--filter', '@sammo-ts/infra', 'prisma:migrate:deploy:game'], { + await execCommand('pnpm', ['--filter', '@sammo-ts/infra', 'prisma:db:push:game', '--accept-data-loss'], { ...process.env, POSTGRES_SCHEMA: 'che', DATABASE_URL: gameDatabaseUrl, }); + if (!gatewayHasHistory) { + await baselineMigrations('gateway-migrations', 'gateway.prisma', { + ...process.env, + POSTGRES_SCHEMA: 'public', + GATEWAY_DATABASE_URL: gatewayDatabaseUrl, + }); + } + if (!gameHasHistory) { + await baselineMigrations('migrations', 'game.prisma', { + ...process.env, + POSTGRES_SCHEMA: 'che', + DATABASE_URL: gameDatabaseUrl, + }); + } await truncateSchema('public'); await truncateSchema('che');