frigate/web/e2e/specs/_meta/mock-overrides.spec.ts
Josh Hawkins d113be5e19
Some checks are pending
CI / AMD64 Build (push) Waiting to run
CI / ARM Build (push) Waiting to run
CI / Jetson Jetpack 6 (push) Waiting to run
CI / AMD64 Extra Build (push) Blocked by required conditions
CI / ARM Extra Build (push) Blocked by required conditions
CI / Synaptics Build (push) Blocked by required conditions
CI / Assemble and push default build (push) Blocked by required conditions
Improve frontend test framework (#22824)
* add error allowlist file for error collector

* add error collector for console + page + request errors

* wire error collector into frigateApp fixture

* add self-tests for error collector fixture

* gate strict error mode on E2E_STRICT_ERRORS=1

* triage pre-existing errors and seed allowlist

* add mockEmpty/mockError/mockDelay helpers for state-driven tests

* add self-tests for mock override helpers

* add mobile affordance helpers to BasePage

* add lint script for banned spec patterns and @mobile rule

* apply prettier fixes to new e2e files

* rewrite export.spec.ts

* clean up

* move export spec rewrite and bugfix to separate branch
2026-04-09 14:42:36 -06:00

74 lines
2.5 KiB
TypeScript

/**
* Self-tests for the mock override helpers. Verifies each helper
* intercepts the matched URL and returns the expected payload/status.
*/
import { test, expect } from "../../fixtures/frigate-test";
import { mockEmpty, mockError, mockDelay } from "../../helpers/mock-overrides";
test.describe("Mock Overrides — empty @meta", () => {
test("mockEmpty returns []", async ({ page, frigateApp }) => {
await mockEmpty(page, "**/api/__meta_test__");
await frigateApp.goto("/");
const result = await page.evaluate(async () => {
const r = await fetch("/api/__meta_test__");
return { status: r.status, body: await r.json() };
});
expect(result.status).toBe(200);
expect(result.body).toEqual([]);
});
});
test.describe("Mock Overrides — error default @meta", () => {
// Match both the collected request error and the browser's console echo.
// Using a single alternation regex avoids Playwright's isFixtureTuple
// collision with multi-element RegExp arrays.
test.use({
expectedErrors: [/500.*__meta_test__|Failed to load resource.*500/],
});
test("mockError returns 500 by default", async ({ page, frigateApp }) => {
await mockError(page, "**/api/__meta_test__");
await frigateApp.goto("/");
const status = await page.evaluate(async () => {
const r = await fetch("/api/__meta_test__");
return r.status;
});
expect(status).toBe(500);
});
});
test.describe("Mock Overrides — error custom status @meta", () => {
// The browser emits a "Failed to load resource" console.error for 404s,
// which the error collector catches even though 404 is not a 5xx.
test.use({
expectedErrors: [/Failed to load resource.*404|404.*__meta_test_404__/],
});
test("mockError accepts a custom status", async ({ page, frigateApp }) => {
await mockError(page, "**/api/__meta_test_404__", 404);
await frigateApp.goto("/");
const status = await page.evaluate(async () => {
const r = await fetch("/api/__meta_test_404__");
return r.status;
});
expect(status).toBe(404);
});
});
test.describe("Mock Overrides — delay @meta", () => {
test("mockDelay delays response by the requested ms", async ({
page,
frigateApp,
}) => {
await mockDelay(page, "**/api/__meta_test_delay__", 300, ["delayed"]);
await frigateApp.goto("/");
const elapsed = await page.evaluate(async () => {
const start = performance.now();
await fetch("/api/__meta_test_delay__");
return performance.now() - start;
});
expect(elapsed).toBeGreaterThanOrEqual(250);
});
});