95 lines
2.5 KiB
TypeScript
95 lines
2.5 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
|
|
import { validateFieldEvidenceInput } from "../../scripts/lib/field-vitals-evidence.ts";
|
|
|
|
const input = {
|
|
schemaVersion: 1,
|
|
environment: "production",
|
|
releaseId: "release-2026-06-29",
|
|
source: {
|
|
system: "privacy-approved-rum-export",
|
|
exportId: "export-2026-06-29",
|
|
},
|
|
privacy: {
|
|
approved: true,
|
|
approvalRef: "PRIVACY-42",
|
|
},
|
|
window: {
|
|
start: "2026-06-01T00:00:00Z",
|
|
end: "2026-06-29T00:00:00Z",
|
|
},
|
|
thresholdDecision: {
|
|
status: "approved",
|
|
minimumEligibleSamples: 25,
|
|
owner: "performance-owner",
|
|
reviewedAt: "2026-06-30T00:00:00Z",
|
|
evidenceRef: "PERF-BASELINE-7",
|
|
},
|
|
samples: [
|
|
{
|
|
timestamp: "2026-06-20T00:00:00Z",
|
|
consent: true,
|
|
releaseId: "release-2026-06-29",
|
|
routeId: "APP_HOME",
|
|
lcpMs: 1200,
|
|
cls: 0.01,
|
|
inpMs: 80,
|
|
},
|
|
],
|
|
};
|
|
|
|
describe("field Web Vitals evidence input", () => {
|
|
it("accepts reviewed, coherent 28-day production metadata", () => {
|
|
expect(
|
|
validateFieldEvidenceInput(
|
|
input,
|
|
"25",
|
|
new Date("2026-07-01T00:00:00Z"),
|
|
),
|
|
).toMatchObject({
|
|
failures: [],
|
|
minimumEligibleSamples: 25,
|
|
passed: true,
|
|
});
|
|
});
|
|
|
|
it("rejects a threshold that does not match the owner decision", () => {
|
|
expect(
|
|
validateFieldEvidenceInput(
|
|
input,
|
|
"10",
|
|
new Date("2026-07-01T00:00:00Z"),
|
|
),
|
|
).toMatchObject({
|
|
failures: [
|
|
"MIN_ELIGIBLE_SAMPLES: does not match the approved threshold decision",
|
|
],
|
|
passed: false,
|
|
});
|
|
});
|
|
|
|
it("rejects local, unapproved, malformed, or impossible measurements", () => {
|
|
const invalid = {
|
|
...input,
|
|
environment: "local",
|
|
releaseId: "local-release",
|
|
privacy: { approved: false, approvalRef: "" },
|
|
window: { ...input.window, end: "2026-06-28T00:00:00Z" },
|
|
samples: [{ ...input.samples[0], lcpMs: -1 }],
|
|
};
|
|
const validation = validateFieldEvidenceInput(
|
|
invalid,
|
|
"-1",
|
|
new Date("2026-07-01T00:00:00Z"),
|
|
);
|
|
expect(validation.passed).toBe(false);
|
|
expect(validation.failures.join("\n")).toContain("environment");
|
|
expect(validation.failures.join("\n")).toContain("releaseId");
|
|
expect(validation.failures.join("\n")).toContain("privacy");
|
|
expect(validation.failures.join("\n")).toContain("lcpMs");
|
|
expect(validation.failures.join("\n")).toContain(
|
|
"MIN_ELIGIBLE_SAMPLES: must be a positive integer",
|
|
);
|
|
});
|
|
});
|