78 lines
2.0 KiB
JavaScript
78 lines
2.0 KiB
JavaScript
import { describe, expect, it } from "vitest";
|
|
|
|
import {
|
|
evaluateBundleBudget,
|
|
evaluateFieldBudget,
|
|
evaluateLabBudget,
|
|
percentile75,
|
|
} from "../../src/application/policies/performance-budgets.js";
|
|
|
|
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 });
|
|
});
|
|
});
|