refactor(blog,marketing-pages): wire coverage helper + declare manifest bands
Migrates blog and marketing-pages to the same pattern auth landed in
f7baa8b: vitest config consumes vitestThresholdsFromBands(
DEFAULT_COVERAGE_BANDS) instead of the duplicated hand-written
thresholds block, and each manifest declares its coverage section
explicitly.
Verified semantically identical to the previous hand-written
thresholds — the same numbers come out the other end of the helper.
No new regressions:
- blog: 89 tests, 96.33% overall, all bands green
- marketing-pages: 67 tests, 95.28% overall — controllers/ shows a
real 93.54% lines / 90.9% branches gap that has been there since
before this refactor (the previous hand-written threshold was the
same 100%/95%). This is one of the L0 unification work items
listed in the PRD's findings; capturing here as the third feature
with real test gaps (navigation, media, marketing-pages).
Three of five features now drive their vitest thresholds from the
manifest helper: auth ✓, blog ✓, marketing-pages ✓. Navigation and
media stay on the legacy config until L0 unification closes their
test gaps (touching them would expose the same failures and add
nothing).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -28,6 +28,25 @@ export const blogManifest = defineFeature({
|
|||||||
},
|
},
|
||||||
realtimeChannels: [],
|
realtimeChannels: [],
|
||||||
jobs: [],
|
jobs: [],
|
||||||
|
coverage: {
|
||||||
|
bands: {
|
||||||
|
baseline: { statements: 80, branches: 75, functions: 80, lines: 80 },
|
||||||
|
entities: { statements: 100, branches: 100, functions: 100, lines: 100 },
|
||||||
|
"use-cases": {
|
||||||
|
statements: 100,
|
||||||
|
branches: 95,
|
||||||
|
functions: 100,
|
||||||
|
lines: 100,
|
||||||
|
},
|
||||||
|
controllers: {
|
||||||
|
statements: 100,
|
||||||
|
branches: 95,
|
||||||
|
functions: 100,
|
||||||
|
lines: 100,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
mutationTargets: ["entities", "use-cases"],
|
||||||
|
},
|
||||||
} as const);
|
} as const);
|
||||||
|
|
||||||
export type BlogManifest = typeof blogManifest;
|
export type BlogManifest = typeof blogManifest;
|
||||||
|
|||||||
@@ -1,7 +1,15 @@
|
|||||||
import path from "node:path";
|
import path from "node:path";
|
||||||
import { mergeConfig } from "vitest/config";
|
import { mergeConfig } from "vitest/config";
|
||||||
import { nodeVitestConfig } from "@repo/core-typescript/vitest.base.node";
|
import { nodeVitestConfig } from "@repo/core-typescript/vitest.base.node";
|
||||||
|
import {
|
||||||
|
DEFAULT_COVERAGE_BANDS,
|
||||||
|
vitestThresholdsFromBands,
|
||||||
|
} from "@repo/core-shared/conformance/coverage";
|
||||||
|
|
||||||
|
// Coverage thresholds derived from DEFAULT_COVERAGE_BANDS via the shared
|
||||||
|
// helper (ADR-020). The feature.manifest.ts `coverage.bands` section
|
||||||
|
// declares these for boot-time `assertFeatureConformance`. Edit the
|
||||||
|
// manifest, not this file, when adjusting per-feature bands.
|
||||||
export default mergeConfig(nodeVitestConfig, {
|
export default mergeConfig(nodeVitestConfig, {
|
||||||
test: {
|
test: {
|
||||||
coverage: {
|
coverage: {
|
||||||
@@ -15,30 +23,7 @@ export default mergeConfig(nodeVitestConfig, {
|
|||||||
// React Query option builders — integration-tested in apps
|
// React Query option builders — integration-tested in apps
|
||||||
"src/ui/**",
|
"src/ui/**",
|
||||||
],
|
],
|
||||||
thresholds: {
|
thresholds: vitestThresholdsFromBands(DEFAULT_COVERAGE_BANDS),
|
||||||
"src/entities/**": {
|
|
||||||
statements: 100,
|
|
||||||
branches: 100,
|
|
||||||
functions: 100,
|
|
||||||
lines: 100,
|
|
||||||
},
|
|
||||||
"src/application/use-cases/**": {
|
|
||||||
statements: 100,
|
|
||||||
branches: 95,
|
|
||||||
functions: 100,
|
|
||||||
lines: 100,
|
|
||||||
},
|
|
||||||
"src/interface-adapters/controllers/**": {
|
|
||||||
statements: 100,
|
|
||||||
branches: 95,
|
|
||||||
functions: 100,
|
|
||||||
lines: 100,
|
|
||||||
},
|
|
||||||
statements: 80,
|
|
||||||
branches: 75,
|
|
||||||
functions: 80,
|
|
||||||
lines: 80,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
resolve: {
|
resolve: {
|
||||||
|
|||||||
@@ -8,10 +8,34 @@ export const marketingPagesManifest = defineFeature({
|
|||||||
requiredCores: [],
|
requiredCores: [],
|
||||||
useCases: {
|
useCases: {
|
||||||
getPageBySlug: { mutates: false, audits: [], publishes: [], consumes: [] },
|
getPageBySlug: { mutates: false, audits: [], publishes: [], consumes: [] },
|
||||||
getSiteSettings: { mutates: false, audits: [], publishes: [], consumes: [] },
|
getSiteSettings: {
|
||||||
|
mutates: false,
|
||||||
|
audits: [],
|
||||||
|
publishes: [],
|
||||||
|
consumes: [],
|
||||||
|
},
|
||||||
},
|
},
|
||||||
realtimeChannels: [],
|
realtimeChannels: [],
|
||||||
jobs: [],
|
jobs: [],
|
||||||
|
coverage: {
|
||||||
|
bands: {
|
||||||
|
baseline: { statements: 80, branches: 75, functions: 80, lines: 80 },
|
||||||
|
entities: { statements: 100, branches: 100, functions: 100, lines: 100 },
|
||||||
|
"use-cases": {
|
||||||
|
statements: 100,
|
||||||
|
branches: 95,
|
||||||
|
functions: 100,
|
||||||
|
lines: 100,
|
||||||
|
},
|
||||||
|
controllers: {
|
||||||
|
statements: 100,
|
||||||
|
branches: 95,
|
||||||
|
functions: 100,
|
||||||
|
lines: 100,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
mutationTargets: ["entities", "use-cases"],
|
||||||
|
},
|
||||||
} as const);
|
} as const);
|
||||||
|
|
||||||
export type MarketingPagesManifest = typeof marketingPagesManifest;
|
export type MarketingPagesManifest = typeof marketingPagesManifest;
|
||||||
|
|||||||
@@ -1,7 +1,15 @@
|
|||||||
import path from "node:path";
|
import path from "node:path";
|
||||||
import { mergeConfig } from "vitest/config";
|
import { mergeConfig } from "vitest/config";
|
||||||
import { nodeVitestConfig } from "@repo/core-typescript/vitest.base.node";
|
import { nodeVitestConfig } from "@repo/core-typescript/vitest.base.node";
|
||||||
|
import {
|
||||||
|
DEFAULT_COVERAGE_BANDS,
|
||||||
|
vitestThresholdsFromBands,
|
||||||
|
} from "@repo/core-shared/conformance/coverage";
|
||||||
|
|
||||||
|
// Coverage thresholds derived from DEFAULT_COVERAGE_BANDS via the shared
|
||||||
|
// helper (ADR-020). The feature.manifest.ts `coverage.bands` section
|
||||||
|
// declares these for boot-time `assertFeatureConformance`. Edit the
|
||||||
|
// manifest, not this file, when adjusting per-feature bands.
|
||||||
export default mergeConfig(nodeVitestConfig, {
|
export default mergeConfig(nodeVitestConfig, {
|
||||||
test: {
|
test: {
|
||||||
coverage: {
|
coverage: {
|
||||||
@@ -15,30 +23,7 @@ export default mergeConfig(nodeVitestConfig, {
|
|||||||
// React Query option builders — integration-tested in apps
|
// React Query option builders — integration-tested in apps
|
||||||
"src/ui/**",
|
"src/ui/**",
|
||||||
],
|
],
|
||||||
thresholds: {
|
thresholds: vitestThresholdsFromBands(DEFAULT_COVERAGE_BANDS),
|
||||||
"src/entities/**": {
|
|
||||||
statements: 100,
|
|
||||||
branches: 100,
|
|
||||||
functions: 100,
|
|
||||||
lines: 100,
|
|
||||||
},
|
|
||||||
"src/application/use-cases/**": {
|
|
||||||
statements: 100,
|
|
||||||
branches: 95,
|
|
||||||
functions: 100,
|
|
||||||
lines: 100,
|
|
||||||
},
|
|
||||||
"src/interface-adapters/controllers/**": {
|
|
||||||
statements: 100,
|
|
||||||
branches: 95,
|
|
||||||
functions: 100,
|
|
||||||
lines: 100,
|
|
||||||
},
|
|
||||||
statements: 80,
|
|
||||||
branches: 75,
|
|
||||||
functions: 80,
|
|
||||||
lines: 80,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
resolve: {
|
resolve: {
|
||||||
|
|||||||
Reference in New Issue
Block a user