mirror of
https://github.com/AmruthPillai/Reactive-Resume.git
synced 2026-10-03 18:23:47 +10:00
Prune the unit and e2e suites to what protects security, user data, public contracts and past regressions. Drop what slowed development without catching bugs: markup and label assertions, wrappers that only proved Base UI works, copied inventories and snapshots, mock call-shape checks, permutation matrices across templates, fonts and locales, and env-gated suites that never ran in CI. - Unit: 4749 tests in 421 files become 1212 in 227. PDF tests that rendered or rasterized every template, font and locale combination go; one render per template stays and now checks that every visible section reaches a page, which a blank page used to pass. - E2E: 55 tests in 35 specs become 11 in 9, one journey per severe area: sign-up and sign-in, autosave, a failed save during navigation, JSON export and import, public and password-protected sharing, slug redirects, OAuth consent for MCP clients, and the assistant. - Tests a coverage review found to be the only guard of a contract were kept or restored, each checked by breaking the code it guards. - Remove exports, tooling and dev dependencies that only the pruned tests used. - The Semantic CSS guide check now reads indented code fences, so the guide example it skipped is compiled too.
110 lines
2.8 KiB
TypeScript
110 lines
2.8 KiB
TypeScript
// @vitest-environment happy-dom
|
|
|
|
import type { CustomSection, ResumeData } from "@reactive-resume/schema/resume/data";
|
|
import { describe, expect, it } from "vitest";
|
|
import { getDefaultSectionIconName } from "@reactive-resume/schema/resume/section-icons";
|
|
import { renderCustomSection, renderSummary, setRenderConfig } from "./section-renderers";
|
|
|
|
const baseConfig = {
|
|
headingFont: "Inter",
|
|
headingSizeHalfPt: 28,
|
|
bodyFont: "Inter",
|
|
bodySizeHalfPt: 20,
|
|
textColorHex: "111111",
|
|
primaryColorHex: "0563C1",
|
|
};
|
|
|
|
setRenderConfig(baseConfig);
|
|
|
|
const HEX = "#0563C1";
|
|
|
|
describe("renderSummary", () => {
|
|
it("returns [] when the section is hidden", () => {
|
|
const summary: ResumeData["summary"] = {
|
|
title: "Summary",
|
|
icon: getDefaultSectionIconName("summary"),
|
|
content: "<p>Hello</p>",
|
|
hidden: true,
|
|
showHeading: true,
|
|
columns: 1,
|
|
keepTogether: false,
|
|
startOnNewPage: false,
|
|
};
|
|
expect(renderSummary(summary, HEX)).toEqual([]);
|
|
});
|
|
|
|
it("includes a heading paragraph when both title and content are present", () => {
|
|
const summary: ResumeData["summary"] = {
|
|
title: "Summary",
|
|
icon: getDefaultSectionIconName("summary"),
|
|
content: "<p>Hello world</p>",
|
|
hidden: false,
|
|
showHeading: true,
|
|
columns: 1,
|
|
keepTogether: false,
|
|
startOnNewPage: false,
|
|
};
|
|
const paragraphs = renderSummary(summary, HEX);
|
|
// One heading + the htmlToParagraphs output for one <p>.
|
|
expect(paragraphs.length).toBeGreaterThanOrEqual(2);
|
|
});
|
|
|
|
it("omits a disabled heading while retaining summary content", () => {
|
|
const summary: ResumeData["summary"] = {
|
|
title: "Summary",
|
|
icon: getDefaultSectionIconName("summary"),
|
|
content: "<p>Hello world</p>",
|
|
hidden: false,
|
|
showHeading: false,
|
|
columns: 1,
|
|
keepTogether: false,
|
|
startOnNewPage: false,
|
|
};
|
|
|
|
const paragraphs = renderSummary(summary, HEX);
|
|
|
|
expect(paragraphs).toHaveLength(1);
|
|
});
|
|
});
|
|
|
|
describe("renderCustomSection", () => {
|
|
const baseCustom: CustomSection = {
|
|
id: "custom-1",
|
|
type: "summary",
|
|
title: "Notes",
|
|
icon: getDefaultSectionIconName("summary"),
|
|
columns: 1,
|
|
hidden: false,
|
|
showHeading: true,
|
|
keepTogether: false,
|
|
startOnNewPage: false,
|
|
items: [],
|
|
};
|
|
|
|
it("returns [] when all items are hidden or empty", () => {
|
|
const section: CustomSection = {
|
|
...baseCustom,
|
|
items: [{ id: "x", hidden: true } as never],
|
|
};
|
|
expect(renderCustomSection(section, HEX)).toEqual([]);
|
|
});
|
|
|
|
it("renders recipient + content for a cover-letter custom section", () => {
|
|
const section: CustomSection = {
|
|
...baseCustom,
|
|
type: "cover-letter",
|
|
title: "Cover Letter",
|
|
items: [
|
|
{
|
|
id: "x",
|
|
hidden: false,
|
|
recipient: "<p>Dear Jane,</p>",
|
|
content: "<p>Body</p>",
|
|
} as never,
|
|
],
|
|
};
|
|
const paragraphs = renderCustomSection(section, HEX);
|
|
expect(paragraphs).toHaveLength(2);
|
|
});
|
|
});
|