cc-haha/scripts/pr/pr-quality-workflow.test.ts
程序员阿江(Relakkes) b156be8d8d feat: make PR quality verification self-enforcing
Contributors and coding agents need one local command that both reports and enforces the quality contract. This change turns the PR gate into the shared verification entrypoint, adds path-selected local lanes, tightens coverage accounting around changed lines, and documents the repair loop in contributor and agent-facing guidance.

Constraint: Ordinary PR verification must stay non-live and runnable without provider credentials
Constraint: Coverage policy updates in this commit require maintainer approval before push/merge
Rejected: Keep quality guidance only in docs | agents need executable scripts and AGENTS.md instructions to follow the loop consistently
Confidence: high
Scope-risk: broad
Directive: Do not bypass `bun run verify` for production changes; fix failed lanes and coverage reports instead of lowering thresholds
Tested: bun run check:policy
Tested: ALLOW_CLI_CORE_CHANGE=1 ALLOW_COVERAGE_BASELINE_CHANGE=1 bun run verify
Not-tested: live provider baseline; no provider credentials were required for this non-live PR gate
2026-05-06 22:33:43 +08:00

36 lines
1.8 KiB
TypeScript

import { describe, expect, test } from 'bun:test'
import { readFileSync } from 'node:fs'
describe('PR quality workflow', () => {
test('routes policy outputs into conditional check jobs', () => {
const workflow = readFileSync('.github/workflows/pr-quality.yml', 'utf8')
expect(workflow).toContain("if: needs.change-policy.outputs.desktop_checks == 'true'")
expect(workflow).toContain("if: needs.change-policy.outputs.server_checks == 'true'")
expect(workflow).toContain("if: needs.change-policy.outputs.adapter_checks == 'true'")
expect(workflow).toContain("if: needs.change-policy.outputs.desktop_native_checks == 'true'")
expect(workflow).toContain("if: needs.change-policy.outputs.docs_checks == 'true'")
expect(workflow).toContain("if: needs.change-policy.outputs.coverage_checks == 'true'")
})
test('keeps coverage artifacts observable in CI', () => {
const workflow = readFileSync('.github/workflows/pr-quality.yml', 'utf8')
expect(workflow).toContain('COVERAGE_BASE_REF: origin/${{ github.base_ref }}')
expect(workflow).toContain('cat "$latest_report" >> "$GITHUB_STEP_SUMMARY"')
expect(workflow).toContain('uses: actions/upload-artifact@v4')
expect(workflow).toContain('path: artifacts/coverage/')
expect(workflow).toContain('retention-days: 14')
})
test('exposes a single required gate job for branch protection', () => {
const workflow = readFileSync('.github/workflows/pr-quality.yml', 'utf8')
expect(workflow).toContain('pr-quality-gate:')
expect(workflow).toContain('name: pr-quality-gate')
expect(workflow).toContain('if: always()')
expect(workflow).toContain('require_success "change-policy" "${{ needs.change-policy.result }}"')
expect(workflow).toContain('allow_skip_or_success "coverage-checks" "${{ needs.coverage-checks.result }}"')
})
})