This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
import { spawnSync } from 'node:child_process'
|
||||
import path from 'node:path'
|
||||
import { fileURLToPath } from 'node:url'
|
||||
|
||||
const repositoryRoot = path.resolve(
|
||||
path.dirname(fileURLToPath(import.meta.url)),
|
||||
'..',
|
||||
)
|
||||
|
||||
if (!process.env.DATABASE_URL) {
|
||||
console.error(
|
||||
'Integration gate failed: DATABASE_URL is required and all PostgreSQL tests would otherwise be skipped.',
|
||||
)
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
const vitestPath = path.join(
|
||||
repositoryRoot,
|
||||
'node_modules',
|
||||
'vitest',
|
||||
'vitest.mjs',
|
||||
)
|
||||
const startedAt = Date.now()
|
||||
const result = spawnSync(
|
||||
process.execPath,
|
||||
[
|
||||
vitestPath,
|
||||
'run',
|
||||
'--config',
|
||||
path.join(repositoryRoot, 'vitest.integration.config.ts'),
|
||||
'--reporter=json',
|
||||
],
|
||||
{
|
||||
cwd: repositoryRoot,
|
||||
encoding: 'utf8',
|
||||
env: process.env,
|
||||
maxBuffer: 64 * 1024 * 1024,
|
||||
},
|
||||
)
|
||||
|
||||
if (result.stderr) process.stderr.write(result.stderr)
|
||||
|
||||
let report
|
||||
try {
|
||||
report = JSON.parse(result.stdout)
|
||||
} catch {
|
||||
if (result.stdout) process.stdout.write(result.stdout)
|
||||
console.error(
|
||||
'Integration gate failed: Vitest did not produce a valid JSON report.',
|
||||
)
|
||||
process.exit(result.status && result.status !== 0 ? result.status : 1)
|
||||
}
|
||||
|
||||
const executed = report.numPassedTests + report.numFailedTests
|
||||
const skipped = report.numPendingTests
|
||||
const failed = report.numFailedTests
|
||||
const durationMs = Date.now() - startedAt
|
||||
|
||||
console.log(
|
||||
`Integration test summary: executed=${executed} skipped=${skipped} failed=${failed} durationMs=${durationMs}`,
|
||||
)
|
||||
|
||||
if (result.status !== 0 || failed > 0) {
|
||||
for (const testFile of report.testResults ?? []) {
|
||||
for (const assertion of testFile.assertionResults ?? []) {
|
||||
if (assertion.status !== 'failed') continue
|
||||
console.error(`FAIL ${assertion.fullName}`)
|
||||
for (const message of assertion.failureMessages ?? [])
|
||||
console.error(message)
|
||||
}
|
||||
}
|
||||
process.exit(result.status && result.status !== 0 ? result.status : 1)
|
||||
}
|
||||
|
||||
if (executed === 0) {
|
||||
console.error(
|
||||
`Integration gate failed: zero tests executed (${skipped} skipped). A green Vitest process is insufficient.`,
|
||||
)
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
if (skipped > 0) {
|
||||
console.error(
|
||||
`Integration gate failed: ${skipped} required PostgreSQL tests were skipped.`,
|
||||
)
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
console.log('Integration gate passed with non-zero PostgreSQL test execution.')
|
||||
Reference in New Issue
Block a user