import assert from "node:assert/strict"; import { describe, it } from "node:test"; import { applyRiskPolicy, getChecks } from "../lib/scripts/validateChanged"; import type { ICheckContext, TRisk } from "../lib/scripts/validateChanged"; const resolveChecks = (files: string[], risk: TRisk): string[] => { const { checks, reasons, context } = getChecks(files); return applyRiskPolicy(checks, reasons, context, risk).checks; }; const has = (checks: string[], value: string): boolean => checks.includes(value); describe("validate::changed risk policy", () => { it("docs-only changes produce no checks for any risk", () => { const files = [ "docs/CONTRIBUTING.md", "CHANGELOG.md" ]; [ "low", "medium", "high" ].forEach((risk) => { const checks = resolveChecks(files, risk as TRisk); assert.deepEqual(checks, [], `Expected no checks for docs-only with risk=${risk}`); }); }); it("package code + medium risk triggers full package checks", () => { const checks = resolveChecks([ "src/package/utils/getCfg.ts" ], "medium"); [ "lint", "test", "dpdm", "build::package" ].forEach((name) => { assert.ok(has(checks, name), `Expected "${name}" for package code + medium`); }); }); it("package code + low risk keeps only lint/test", () => { const checks = resolveChecks([ "src/package/utils/getCfg.ts" ], "low"); assert.ok(has(checks, "lint")); assert.ok(has(checks, "test")); [ "dpdm", "build::package", "build::storybook" ].forEach((name) => { assert.ok(!has(checks, name), `Did not expect "${name}" for package code + low`); }); }); it("storybook change + medium risk triggers storybook build", () => { const checks = resolveChecks([ "src/storybook/src/pages/cases/locales.mdx" ], "medium"); assert.ok(has(checks, "build::storybook")); assert.ok(!has(checks, "build::package")); }); it("package.json-only change does not trigger heavy checks by default", () => { const checks = resolveChecks([ "package.json" ], "medium"); assert.ok(has(checks, "lint")); [ "dpdm", "build::package", "build::storybook" ].forEach((name) => { assert.ok(!has(checks, name), `Did not expect "${name}" for package.json-only change`); }); }); it("high risk escalates checks for storybook/runtime-impact context", () => { const checks = resolveChecks([ "src/storybook/src/stories/input/Input.stories.tsx" ], "high"); [ "lint", "test", "build::package", "build::storybook" ].forEach((name) => { assert.ok(has(checks, name), `Expected "${name}" for high-risk storybook change`); }); }); it("low risk policy still preserves lint when lint scope exists", () => { const checks = resolveChecks([ "eslint.config.ts" ], "low"); assert.ok(has(checks, "lint")); }); it("applyRiskPolicy keeps medium risk unchanged", () => { const context: ICheckContext = { hasPackageCode: true, hasStorybook: false, hasHeavyConfig: false, hasDocsScript: false, hasLintScope: true, hasOnlyDocs: false, }; const source = [ "lint", "test", "dpdm", "build::package" ]; const reasons = { lint: [ "src/package/index.ts" ], test: [ "src/package/index.ts" ], }; const output = applyRiskPolicy([ ...source ], reasons, context, "medium"); assert.deepEqual(output.checks, source); }); });