import { describe, expect, it } from "vitest"; import { evaluateBundleBudget, evaluateFieldBudget, evaluateLabBudget, percentile75, } from "../../src/application/policies/performance-budgets.ts"; describe("performance budgets", () => { it("rejects initial and lazy JavaScript above their named limits", () => { const thresholds = { initialJsGzipBytes: 200, lazyChunkGzipBytes: 120, }; expect( evaluateBundleBudget( { initialJsGzipBytes: 201, lazyChunks: [] }, thresholds, ).passed, ).toBe(false); expect( evaluateBundleBudget( { initialJsGzipBytes: 100, lazyChunks: [{ path: "lazy.js", gzipBytes: 121 }], }, thresholds, ).passed, ).toBe(false); }); it("fails lab evidence when context is absent or a metric is over budget", () => { const thresholds = { lcpMs: 2500, cls: 0.1, namedInteractionMs: 200 }; expect( evaluateLabBudget( { metrics: { lcpMs: 1000, cls: 0, namedInteractionMs: 50 } }, thresholds, ), ).toMatchObject({ passed: false }); expect( evaluateLabBudget( { context: { runner: {}, browser: {}, viewport: {}, network: {}, cpu: {}, cache: {}, build: {}, }, metrics: { lcpMs: 2501, cls: 0, namedInteractionMs: 50 }, }, thresholds, ).passed, ).toBe(false); }); it("uses the nearest-rank p75 and fails closed while sample minimum is deferred", () => { expect(percentile75([4, 1, 3, 2])).toBe(3); expect( evaluateFieldBudget( { metrics: { p75LcpMs: 1000, p75Cls: 0.01, p75InpMs: 50 }, eligibleSamples: 100, }, { p75LcpMs: 2500, p75Cls: 0.1, p75InpMs: 200, minimumEligibleSamples: null, }, ), ).toEqual({ status: "FAIL_UNVERIFIED", passed: false }); }); });