92 lines
3.1 KiB
TypeScript
92 lines
3.1 KiB
TypeScript
import { describe, expect, it } from "@jest/globals";
|
|
import { applyDefaultTheme, withoutThemeFields } from "../../../src/api/controllers/statusPageThemeFlag.ts";
|
|
import { DEFAULT_STATUS_PAGE_THEME, DEFAULT_STATUS_PAGE_THEME_MODE } from "../../../src/domain/status-pages/status-page.type.ts";
|
|
import { makeStatusPage } from "../../helpers/makeStatusPage.ts";
|
|
|
|
describe("statusPageThemeFlag", () => {
|
|
describe("withoutThemeFields", () => {
|
|
it("removes theme and themeMode from a body that has them", () => {
|
|
const body = { companyName: "Co", theme: "modern", themeMode: "dark" };
|
|
const result = withoutThemeFields(body);
|
|
expect(result).toEqual({ companyName: "Co" });
|
|
});
|
|
|
|
it("is a no-op when neither field is present", () => {
|
|
const body = { companyName: "Co", url: "page" };
|
|
const result = withoutThemeFields(body);
|
|
expect(result).toEqual({ companyName: "Co", url: "page" });
|
|
});
|
|
|
|
it("removes only the theme fields when one is present", () => {
|
|
const body = { companyName: "Co", theme: "bold" };
|
|
const result = withoutThemeFields(body);
|
|
expect(result).toEqual({ companyName: "Co" });
|
|
});
|
|
|
|
it("does not mutate the input body", () => {
|
|
const body = { companyName: "Co", theme: "modern", themeMode: "dark" };
|
|
withoutThemeFields(body);
|
|
expect(body).toEqual({ companyName: "Co", theme: "modern", themeMode: "dark" });
|
|
});
|
|
|
|
it("preserves all other fields verbatim", () => {
|
|
const body = {
|
|
companyName: "Co",
|
|
monitors: ["m-1", "m-2"],
|
|
isPublished: true,
|
|
showCharts: false,
|
|
color: "#13715B",
|
|
theme: "editorial",
|
|
themeMode: "light",
|
|
};
|
|
const result = withoutThemeFields(body);
|
|
expect(result).toEqual({
|
|
companyName: "Co",
|
|
monitors: ["m-1", "m-2"],
|
|
isPublished: true,
|
|
showCharts: false,
|
|
color: "#13715B",
|
|
});
|
|
});
|
|
});
|
|
|
|
describe("applyDefaultTheme", () => {
|
|
it("overwrites theme and themeMode with the canonical defaults", () => {
|
|
const sp = makeStatusPage({ theme: "modern", themeMode: "dark" });
|
|
const result = applyDefaultTheme(sp);
|
|
expect(result.theme).toBe(DEFAULT_STATUS_PAGE_THEME);
|
|
expect(result.themeMode).toBe(DEFAULT_STATUS_PAGE_THEME_MODE);
|
|
});
|
|
|
|
it("leaves all other fields untouched", () => {
|
|
const sp = makeStatusPage({
|
|
companyName: "Test Co",
|
|
url: "my-page",
|
|
monitors: ["mon-1", "mon-2"],
|
|
isPublished: true,
|
|
color: "#13715B",
|
|
});
|
|
const result = applyDefaultTheme(sp);
|
|
expect(result.companyName).toBe("Test Co");
|
|
expect(result.url).toBe("my-page");
|
|
expect(result.monitors).toEqual(["mon-1", "mon-2"]);
|
|
expect(result.isPublished).toBe(true);
|
|
expect(result.color).toBe("#13715B");
|
|
});
|
|
|
|
it("does not mutate the input status page", () => {
|
|
const sp = makeStatusPage({ theme: "modern", themeMode: "dark" });
|
|
applyDefaultTheme(sp);
|
|
expect(sp.theme).toBe("modern");
|
|
expect(sp.themeMode).toBe("dark");
|
|
});
|
|
|
|
it("works on a status page that has no theme set yet", () => {
|
|
const sp = makeStatusPage({ theme: undefined, themeMode: undefined });
|
|
const result = applyDefaultTheme(sp);
|
|
expect(result.theme).toBe(DEFAULT_STATUS_PAGE_THEME);
|
|
expect(result.themeMode).toBe(DEFAULT_STATUS_PAGE_THEME_MODE);
|
|
});
|
|
});
|
|
});
|