test.web/presentation/renderers/site.renderer.test.ts

test.web/presentation/renderers/site.renderer.test.ts is a file in Codebase Testing. 59 lines of code and 0 definitions.

import {
    CONTACT_CLOSING,
    CREATIVE_COMMONS_LICENSE,
    GRAMMAR_LICENSE,
    MODEL_CLOSING,
    USE_CLOSING,
} from "@banes-lab/web/configuration/strings/page.strings.ts";
import { LICENSE_PAGE, TERMS_PAGE } from "@banes-lab/web/core/ids/page.ids.ts";
import { describe, expect, it } from "vitest";
import { PROFILE_LINKS } from "@banes-lab/web/configuration/icons/company.icons.ts";
import { pagePath } from "@banes-lab/web/core/assets/link.assets.ts";
import { renderSiteFooter } from "@banes-lab/web/presentation/renderers/site.renderer.ts";

const CLOSING_SELECTOR = ".site-closing";
const LICENSE_SELECTOR = ".site-license";
const BADGE_SELECTOR = ".license-badge";
const COPYRIGHT_SELECTOR = ".site-copyright";

describe("renderSiteFooter", () => {
    it("is one grid of the model, use and contact cells, in that order", () => {
        const footer = renderSiteFooter();
        expect(footer.children).toHaveLength(1);
        const cells = [...(footer.querySelector(CLOSING_SELECTOR)?.children ?? [])];
        expect(cells.map((cell) => cell.querySelector("h3")?.textContent)).toStrictEqual([
            MODEL_CLOSING.title,
            USE_CLOSING.title,
            CONTACT_CLOSING.title,
        ]);
    });

    it("leaves the copyright out of the grid", () => {
        expect(renderSiteFooter().querySelector(COPYRIGHT_SELECTOR)).toBeNull();
    });

    it("stacks the contact terms and ends on the profile links, the mail link first", () => {
        const contact = renderSiteFooter().querySelector(CLOSING_SELECTOR)?.lastElementChild;
        expect(contact?.querySelectorAll(".closing-line")).toHaveLength(CONTACT_CLOSING.terms.length);
        expect(contact?.querySelector("a")?.getAttribute("href")).toContain("mailto:");
        const profiles = [...(contact?.querySelectorAll(".profile-link") ?? [])].map((link) =>
            link.getAttribute("href"),
        );
        expect(profiles).toStrictEqual(PROFILE_LINKS.map((link) => link.href));
    });

    it("links the platform pages inside the use cell", () => {
        const use = renderSiteFooter().querySelector(CLOSING_SELECTOR)?.children[1];
        const hrefs = [...(use?.querySelectorAll("a") ?? [])].map((link) => link.getAttribute("href"));
        expect(hrefs).toContain(pagePath(TERMS_PAGE));
    });

    it("carries no license notice for a page that declares none", () => {
        expect(renderSiteFooter().querySelector(LICENSE_SELECTOR)).toBeNull();
    });

    it("renders a declared license as one line of its lead, its name and its badges", () => {
        const notice = renderSiteFooter(CREATIVE_COMMONS_LICENSE).querySelector(LICENSE_SELECTOR);
        expect(notice?.textContent).toContain(CREATIVE_COMMONS_LICENSE.lead + CREATIVE_COMMONS_LICENSE.name);
        expect(notice?.querySelectorAll(BADGE_SELECTOR)).toHaveLength(CREATIVE_COMMONS_LICENSE.badges.length);
    });

    it("links a license held on this site to its page and shows no badges for it", () => {
        const notice = renderSiteFooter(GRAMMAR_LICENSE).querySelector(LICENSE_SELECTOR);
        const hrefs = [...(notice?.querySelectorAll("a") ?? [])].map((link) => link.getAttribute("href"));
        expect(hrefs).toContain(pagePath(LICENSE_PAGE));
        expect(notice?.querySelectorAll(BADGE_SELECTOR)).toHaveLength(0);
    });
});