mirror of
https://github.com/ksyasuda/SubMiner.git
synced 2026-08-04 07:21:32 -07:00
67 lines
3.0 KiB
TypeScript
67 lines
3.0 KiB
TypeScript
import test from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
import { existsSync, readFileSync } from 'node:fs';
|
|
import { resolve } from 'node:path';
|
|
|
|
const qualityGateWorkflowPath = resolve(__dirname, '../.github/workflows/quality-gate.yml');
|
|
const qualityGateWorkflow = existsSync(qualityGateWorkflowPath)
|
|
? readFileSync(qualityGateWorkflowPath, 'utf8').replace(/\r\n/g, '\n')
|
|
: '';
|
|
const verificationDocPath = resolve(__dirname, '../docs/workflow/verification.md');
|
|
const verificationDoc = readFileSync(verificationDocPath, 'utf8').replace(/\r\n/g, '\n');
|
|
|
|
test('quality gate is a reusable workflow', () => {
|
|
assert.match(qualityGateWorkflow, /on:\s*\n\s*workflow_call:/);
|
|
assert.match(qualityGateWorkflow, /permissions:\s*\n\s*contents: read/);
|
|
});
|
|
|
|
test('quality gate checkout does not persist GitHub credentials', () => {
|
|
assert.match(
|
|
qualityGateWorkflow,
|
|
/uses: actions\/checkout@v4[\s\S]*?fetch-depth: 0[\s\S]*?submodules: true[\s\S]*?persist-credentials: false/,
|
|
);
|
|
});
|
|
|
|
test('quality gate installs Lua and runs the environment suite before coverage', () => {
|
|
assert.match(qualityGateWorkflow, /name: Install Lua/);
|
|
assert.match(qualityGateWorkflow, /apt-get install -y lua5\.4/);
|
|
assert.match(
|
|
qualityGateWorkflow,
|
|
/Test suite \(source\)\n\s*run: bun run test:fast\n\s*\n\s*- name: Environment suite\n\s*run: bun run test:env\n\s*\n\s*- name: Coverage suite \(maintained source lane\)/,
|
|
);
|
|
});
|
|
|
|
test('quality gate uploads maintained source coverage', () => {
|
|
assert.match(qualityGateWorkflow, /run: bun run test:coverage:src/);
|
|
assert.match(qualityGateWorkflow, /name: Upload coverage artifact/);
|
|
assert.match(qualityGateWorkflow, /path: coverage\/test-src\/lcov\.info/);
|
|
});
|
|
|
|
test('quality gate keeps pull request changelog enforcement event-aware', () => {
|
|
assert.match(qualityGateWorkflow, /bun run changelog:lint/);
|
|
assert.match(qualityGateWorkflow, /if: github\.event_name == 'pull_request'/);
|
|
assert.match(
|
|
qualityGateWorkflow,
|
|
/env:\s*\n\s*BASE_REF: \${{ github\.base_ref }}\s*\n\s*PR_LABELS: \${{ join\(github\.event\.pull_request\.labels\.\*\.name, ','\) }}\s*\n\s*run: bun run changelog:pr-check --base-ref "origin\/\$BASE_REF" --head-ref "HEAD" --labels "\$PR_LABELS"/,
|
|
);
|
|
assert.match(qualityGateWorkflow, /skip-changelog/);
|
|
});
|
|
|
|
test('quality gate verifies generated config examples', () => {
|
|
assert.match(qualityGateWorkflow, /bun run verify:config-example/);
|
|
});
|
|
|
|
test('quality gate blocks on high-severity audit findings', () => {
|
|
const securityAuditStep =
|
|
qualityGateWorkflow.match(/- name: Security audit[\s\S]*?(?=\n {6}- name:|\n?$)/)?.[0] ?? '';
|
|
const dependencyAuditPolicySection =
|
|
verificationDoc.match(/## Dependency Audit Policy[\s\S]*?(?=\n## |\n?$)/)?.[0] ?? '';
|
|
|
|
assert.match(securityAuditStep, /run: bun audit --audit-level high/);
|
|
assert.doesNotMatch(securityAuditStep, /continue-on-error: true/);
|
|
assert.match(
|
|
dependencyAuditPolicySection,
|
|
/`bun audit --audit-level high` blocks the reusable quality gate/,
|
|
);
|
|
});
|