diff --git a/src/signals/test-evidence.ts b/src/signals/test-evidence.ts index 85e4d69ef3..1d8a41ba40 100644 --- a/src/signals/test-evidence.ts +++ b/src/signals/test-evidence.ts @@ -1,10 +1,12 @@ export function isTestPath(file: string): boolean { return ( - /(^|\/)(test|tests|spec|__tests__)\//i.test(file) || + /(^|\/)(test|tests|spec|__tests__|e2e|integration|playwright|cypress)\//i.test(file) || /(^|\/)src\/test\//i.test(file) || /(^|\/)[^/]+_test\.(go|py|rb)$/i.test(file) || /(^|\/)[^/]+_spec\.rb$/i.test(file) || - /\.(test|spec)\.(ts|tsx|js|jsx|py|rb|rs)$/i.test(file) + /\.(test|spec)\.(ts|tsx|js|jsx|py|rb|rs)$/i.test(file) || + /(^|\/)[^/]+\.(cy|e2e)\.(ts|tsx|js|jsx)$/i.test(file) || + /(^|\/)__snapshots__\//i.test(file) ); } diff --git a/test/unit/test-evidence.test.ts b/test/unit/test-evidence.test.ts index 09bfc2dcf2..3059d665ba 100644 --- a/test/unit/test-evidence.test.ts +++ b/test/unit/test-evidence.test.ts @@ -8,6 +8,12 @@ describe("test evidence helpers", () => { expect(isTestPath("src/test/helpers.ts")).toBe(true); expect(isTestPath("tests/integration/api.test.ts")).toBe(true); expect(isTestPath("__tests__/widget.spec.tsx")).toBe(true); + expect(isTestPath("e2e/login.spec.ts")).toBe(true); + expect(isTestPath("integration/api_flow.cy.ts")).toBe(true); + expect(isTestPath("playwright/smoke.spec.ts")).toBe(true); + expect(isTestPath("cypress/e2e/checkout.cy.js")).toBe(true); + expect(isTestPath("components/__snapshots__/Card.tsx.snap")).toBe(true); + expect(isTestPath("src/state.snap")).toBe(false); expect(isTestPath("src/widget.rs")).toBe(false); }); @@ -30,6 +36,7 @@ describe("classifyTestCoverage", () => { it("classifies >= 40% test ratio as strong", () => { // 2 source + 2 test = 50% expect(classifyTestCoverage(["src/a.ts", "src/b.ts", "test/a.test.ts", "test/b.test.ts"])).toBe("strong"); + expect(classifyTestCoverage(["src/a.ts", "src/b.ts", "e2e/a.spec.ts", "e2e/b.spec.ts"])).toBe("strong"); }); it("classifies 20%–39% test ratio as adequate", () => {