test.social/core/factories/page.factory.test.ts

test.social/core/factories/page.factory.test.ts is a file in Codebase Testing. 64 lines of code and 0 definitions.

import { FAQ_ACCENT, HOME_ACCENT } from "@banes-lab/web/configuration/constants/page.constants.ts";
import { FAQ_PAGE, HOME_PAGE } from "@banes-lab/web/core/ids/page.ids.ts";
import { FAQ_SHARE, HOME_SHARE, SITE_NAME } from "@banes-lab/web/configuration/strings/page.strings.ts";
import { describe, expect, it } from "vitest";
import type { CardSpec } from "@banes-lab/social-share/types/card.types.ts";
import { PROFILES } from "@banes-lab/social-share/configuration/configs/card.config.ts";
import { SITE_HOST } from "@banes-lab/social-share/configuration/data/site.data.ts";
import { UNKNOWN_PAGE_ENTRY } from "@banes-lab/social-share/configuration/strings/card.strings.ts";
import { createPageCard } from "@banes-lab/social-share/core/factories/page.factory.ts";
import { fieldLayers } from "@banes-lab/social-share/core/factories/field.factory.ts";
import { pageAddress } from "@banes-lab/social-share/core/evaluators/page.evaluator.ts";
import { resolveCard } from "@banes-lab/social-share/core/evaluators/card.evaluator.ts";

const textsOf = function textsOf(spec: CardSpec): readonly string[] {
    const [profile] = PROFILES;
    if (profile === undefined) {
        throw new Error("the output config defines no profile");
    }
    return resolveCard(spec, profile, spec.timeline.keyFrame)
        .layers.filter((layer) => layer.kind === "text")
        .map((layer) => layer.content);
};

describe("createPageCard", () => {
    it("builds a page's card in its tone with its headline, tagline, the site name and the domain", () => {
        const spec = createPageCard({ id: "faq", page: FAQ_PAGE });
        expect(spec.page).toBe(FAQ_PAGE);
        expect(spec.tone).toBe(FAQ_ACCENT);
        expect(spec.alt).toContain(FAQ_SHARE.headline);
        expect(textsOf(spec)).toEqual(
            expect.arrayContaining([FAQ_SHARE.headline, FAQ_SHARE.tagline, SITE_NAME, pageAddress(FAQ_PAGE)]),
        );
        expect(pageAddress(FAQ_PAGE)).toBe(`${SITE_HOST}/${FAQ_PAGE}`);
        expect(pageAddress(HOME_PAGE)).toBe(SITE_HOST);
        expect(spec.timeline.frames).toBeGreaterThan(1);
    });

    it("drops the site-name kicker when the headline already is the site name, and takes a custom mark and field", () => {
        const spec = createPageCard({
            field: [{ id: "field", kind: "box", placement: { x: 0, y: 0 } }],
            id: "home",
            mark: { alt: "Mark", id: "mark", kind: "image", placement: { x: 0, y: 0 }, source: "/mark.png" },
            page: HOME_PAGE,
            stylesheet: ".extra {}",
        });
        expect(spec.tone).toBe(HOME_ACCENT);
        expect(spec.layers.some((layer) => layer.id === "kicker")).toBe(false);
        expect(spec.layers.filter((layer) => layer.id === "field")).toHaveLength(1);
        expect(spec.layers.some((layer) => layer.id === "ground")).toBe(false);
        expect(spec.layers.find((layer) => layer.id === "mark")?.kind).toBe("image");
        expect(spec.stylesheet.endsWith(".extra {}")).toBe(true);
        expect(textsOf(spec)).toContain(HOME_SHARE.tagline);
    });

    it("refuses a page the site does not register", () => {
        expect(() => createPageCard({ id: "stray", page: "nowhere" })).toThrow(UNKNOWN_PAGE_ENTRY);
    });
});

describe("fieldLayers", () => {
    it("lays the ground and the moving pools unless a card brings its own field", () => {
        const layers = fieldLayers();
        expect(layers[0]?.id).toBe("ground");
        expect(layers.filter((layer) => layer.id.startsWith("pool-")).length).toBeGreaterThan(0);
        expect(
            fieldLayers([{ id: "own", kind: "box", placement: { x: 0, y: 0 } }]).map((layer) => layer.id),
        ).toStrictEqual(["own"]);
    });
});