Files
gridpilot.gg/scripts/run-contract-tests.ts
2025-12-24 00:01:01 +01:00

85 lines
2.5 KiB
TypeScript

#!/usr/bin/env tsx
/**
* Contract Testing Integration Script
*
* This script runs all contract tests in the correct order:
* 1. API contract validation
* 2. Type generation
* 3. Website contract consumption tests
* 4. Compatibility verification
*/
import { execSync } from 'child_process';
import * as fs from 'fs/promises';
import * as path from 'path';
const colors = {
reset: '\x1b[0m',
green: '\x1b[32m',
red: '\x1b[31m',
yellow: '\x1b[33m',
blue: '\x1b[34m',
cyan: '\x1b[36m',
dim: '\x1b[2m'
};
async function runContractTests(): Promise<void> {
console.log(`${colors.cyan}🚀 Starting Contract Testing Suite${colors.reset}\n`);
const steps = [
{
name: 'API Contract Validation',
command: 'npm run test:api:contracts',
description: 'Validate API DTOs and OpenAPI spec integrity'
},
{
name: 'Generate OpenAPI Spec',
command: 'npm run api:generate-spec',
description: 'Generate OpenAPI specification from DTOs'
},
{
name: 'Generate TypeScript Types',
command: 'npm run api:generate-types',
description: 'Generate TypeScript types for website'
},
{
name: 'Contract Compatibility Check',
command: 'npm run test:contract:compatibility',
description: 'Check for breaking changes in contracts'
},
{
name: 'Website Type Checking',
command: 'npm run website:type-check',
description: 'Verify website can consume generated types'
}
];
for (let i = 0; i < steps.length; i++) {
const step = steps[i];
console.log(`${colors.yellow}${i + 1}/${steps.length} ${step.name}${colors.reset}`);
console.log(`${colors.dim} ${step.description}${colors.reset}`);
try {
execSync(step.command, {
stdio: 'inherit',
env: { ...process.env, FORCE_COLOR: 'true' }
});
console.log(`${colors.green}${step.name} completed${colors.reset}\n`);
} catch (error) {
console.log(`${colors.red}${step.name} failed${colors.reset}\n`);
console.log(`${colors.red}Contract testing suite failed at step: ${step.name}${colors.reset}`);
process.exit(1);
}
}
console.log(`${colors.green}🎉 All contract tests passed!${colors.reset}`);
console.log(`${colors.green}✅ Contracts are compatible and validated${colors.reset}`);
}
// Run if called directly
if (require.main === module) {
runContractTests().catch(error => {
console.error(`${colors.red}❌ Contract testing suite failed:${colors.reset}`, error);
process.exit(1);
});
}