Files
Checkmate/server/test/unit/middleware/statusPageCorsOrigin.test.ts
Ian Troisi 517139cbf4 fix: cache negative custom domain CORS lookups
Use a shorter TTL for rejected origins so unknown domains do not hit
the database on every cross-origin request.
2026-06-11 14:48:31 -04:00

75 lines
3.1 KiB
TypeScript

import { describe, expect, it, jest, beforeEach } from "@jest/globals";
import { createStatusPageCorsOrigin } from "../../../src/api/middleware/statusPageCorsOrigin.ts";
import type { IStatusPagesRepository } from "../../../src/domain/status-pages/status-page-repository.interface.ts";
import type { StatusPage } from "../../../src/domain/status-pages/status-page.type.ts";
const makeStatusPage = (overrides?: Partial<StatusPage>): StatusPage =>
({
id: "sp-1",
isPublished: true,
customDomain: "status.example.com",
...overrides,
}) as StatusPage;
const createRepo = () =>
({
findByCustomDomain: jest.fn().mockResolvedValue(makeStatusPage()),
}) as unknown as jest.Mocked<Pick<IStatusPagesRepository, "findByCustomDomain">>;
const invokeOrigin = (originFn: ReturnType<typeof createStatusPageCorsOrigin>, origin: string): Promise<boolean | string> =>
new Promise((resolve, reject) => {
originFn?.(origin, (error, result) => {
if (error) {
reject(error);
return;
}
resolve(result ?? false);
});
});
describe("createStatusPageCorsOrigin", () => {
let repo: jest.Mocked<Pick<IStatusPagesRepository, "findByCustomDomain">>;
beforeEach(() => {
repo = createRepo();
});
it("allows the configured client host without a repository lookup", async () => {
const originFn = createStatusPageCorsOrigin("https://checkmate.example.com", repo as IStatusPagesRepository);
await expect(invokeOrigin(originFn, "https://checkmate.example.com")).resolves.toBe(true);
expect(repo.findByCustomDomain).not.toHaveBeenCalled();
});
it("caches published custom domain lookups", async () => {
const originFn = createStatusPageCorsOrigin("https://checkmate.example.com", repo as IStatusPagesRepository);
await expect(invokeOrigin(originFn, "https://status.example.com")).resolves.toBe("https://status.example.com");
await expect(invokeOrigin(originFn, "https://status.example.com")).resolves.toBe("https://status.example.com");
expect(repo.findByCustomDomain).toHaveBeenCalledTimes(1);
expect(repo.findByCustomDomain).toHaveBeenCalledWith("status.example.com");
});
it("rejects unpublished custom domains", async () => {
repo.findByCustomDomain.mockResolvedValue(makeStatusPage({ isPublished: false }));
const originFn = createStatusPageCorsOrigin("https://checkmate.example.com", repo as IStatusPagesRepository);
await expect(invokeOrigin(originFn, "https://status.example.com")).resolves.toBe(false);
await expect(invokeOrigin(originFn, "https://status.example.com")).resolves.toBe(false);
expect(repo.findByCustomDomain).toHaveBeenCalledTimes(1);
});
it("caches unknown custom domain lookups", async () => {
repo.findByCustomDomain.mockRejectedValue(new Error("Status page not found"));
const originFn = createStatusPageCorsOrigin("https://checkmate.example.com", repo as IStatusPagesRepository);
await expect(invokeOrigin(originFn, "https://unknown.example.com")).resolves.toBe(false);
await expect(invokeOrigin(originFn, "https://unknown.example.com")).resolves.toBe(false);
expect(repo.findByCustomDomain).toHaveBeenCalledTimes(1);
expect(repo.findByCustomDomain).toHaveBeenCalledWith("unknown.example.com");
});
});