release-gate.ts

1.5 KB · raw

1/**2 * PB-26-210: Release browser-gate validation.3 *4 * Pure functions that verify a gate result has no silent failures.5 * A release cannot report success with zero tests, unexpected skips,6 * flaky retries, or missing required projects.7 */89export interface ProjectResult {10  name: string;11  totalTests: number;12  passed: number;13  skipped: number;14  flaky: number;15}1617export interface GateResult {18  projects: ProjectResult[];19}2021export const REQUIRED_BROWSER_PROJECTS = ["chrome-release", "firefox-release"] as const;2223/**24 * Validate a gate result. Returns a list of error strings — empty means pass.25 * The release gate fails (non-zero) on any error.26 */27export function validateGateResult(28  result: GateResult,29  requiredProjects: readonly string[] = REQUIRED_BROWSER_PROJECTS,30): string[] {31  const errors: string[] = [];3233  const totalTests = result.projects.reduce((sum, p) => sum + p.totalTests, 0);34  if (totalTests === 0) {35    errors.push("zero tests discovered across all projects");36  }3738  for (const name of requiredProjects) {39    const project = result.projects.find((p) => p.name === name);40    if (!project) {41      errors.push(`required project "${name}" is missing`);42      continue;43    }44    if (project.totalTests === 0) {45      errors.push(`project "${name}" has zero tests`);46    }47    if (project.skipped > 0) {48      errors.push(`project "${name}" has ${project.skipped} skipped test(s)`);49    }50    if (project.flaky > 0) {51      errors.push(`project "${name}" has ${project.flaky} flaky retry/retr(y)ies`);52    }53  }5455  return errors;56}