mirror of
https://github.com/AmruthPillai/Reactive-Resume.git
synced 2026-08-23 23:02:17 +10:00
feat: add semantic CSS stylesheets (#3274)
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
This commit is contained in:
co-authored by
Cursor Agent
parent
4ac19f81b3
commit
d2ffbf9618
@@ -0,0 +1,66 @@
|
||||
import { createHash } from "node:crypto";
|
||||
import { readFile } from "node:fs/promises";
|
||||
import { readSemanticCssFixture } from "../../fixtures/db";
|
||||
import {
|
||||
createSemanticCssResume,
|
||||
downloadPdf,
|
||||
replaceStylesheet,
|
||||
seedSemanticCssResume,
|
||||
waitForStablePreview,
|
||||
waitForStylesheetStatus,
|
||||
} from "../../fixtures/semantic-css";
|
||||
import { expect, test } from "../../fixtures/test";
|
||||
|
||||
test.setTimeout(120_000);
|
||||
|
||||
const renderedPdfFingerprint = (pdf: Buffer) => {
|
||||
const stablePdf = pdf
|
||||
.toString("latin1")
|
||||
.replace(/D:\d{14}Z/g, "D:00000000000000Z")
|
||||
.replace(/[A-Z]{6}\+/g, "SUBSET+")
|
||||
.replace(/\/ID \[<[\da-f]+> <[\da-f]+>\]/gi, "/ID [<ID> <ID>]");
|
||||
|
||||
return createHash("sha256").update(stablePdf, "latin1").digest("hex");
|
||||
};
|
||||
|
||||
test("@semantic-css keeps preview and export on the last valid source", async ({ authPage: page }, testInfo) => {
|
||||
const resumeId = await createSemanticCssResume(page, testInfo);
|
||||
await seedSemanticCssResume(page, resumeId);
|
||||
await replaceStylesheet(page, "@version 1;\nname { color: #dc2626; }\n");
|
||||
await waitForStylesheetStatus(page, "Applied");
|
||||
|
||||
const canvas = await waitForStablePreview(page);
|
||||
const validPreview = await canvas.evaluate((element) => (element as HTMLCanvasElement).toDataURL());
|
||||
const validDownload = await downloadPdf(page);
|
||||
const validPdf = await readFile(await validDownload.path());
|
||||
expect(validPdf.subarray(0, 4).toString()).toBe("%PDF");
|
||||
|
||||
await replaceStylesheet(page, "@version 1;\nname { color: ; }\n");
|
||||
await waitForStylesheetStatus(page, "Error");
|
||||
await expect(page.getByText("Preview and export use the last valid version.", { exact: true })).toBeVisible();
|
||||
await expect.poll(() => canvas.evaluate((element) => (element as HTMLCanvasElement).toDataURL())).toBe(validPreview);
|
||||
const invalidDownload = await downloadPdf(page);
|
||||
const invalidPdf = await readFile(await invalidDownload.path());
|
||||
expect(invalidPdf.subarray(0, 4).toString()).toBe("%PDF");
|
||||
expect(renderedPdfFingerprint(invalidPdf)).toBe(renderedPdfFingerprint(validPdf));
|
||||
await expect
|
||||
.poll(async () => (await readSemanticCssFixture(resumeId)).stylesheet)
|
||||
.toMatchObject({
|
||||
source: { text: "@version 1;\nname { color: ; }\n" },
|
||||
applied: { text: "@version 1;\nname { color: #dc2626; }\n" },
|
||||
});
|
||||
|
||||
await replaceStylesheet(page, "@version 1;\nname { color: #2563eb; }\n");
|
||||
await waitForStylesheetStatus(page, "Applied");
|
||||
await expect
|
||||
.poll(() => canvas.evaluate((element) => (element as HTMLCanvasElement).toDataURL()))
|
||||
.not.toBe(validPreview);
|
||||
await waitForStablePreview(page);
|
||||
const fixedDownload = await downloadPdf(page);
|
||||
const fixedPdf = await readFile(await fixedDownload.path());
|
||||
expect(fixedPdf.subarray(0, 4).toString()).toBe("%PDF");
|
||||
expect(renderedPdfFingerprint(fixedPdf)).not.toBe(renderedPdfFingerprint(validPdf));
|
||||
await expect
|
||||
.poll(async () => (await readSemanticCssFixture(resumeId)).stylesheet?.applied.text)
|
||||
.toBe("@version 1;\nname { color: #2563eb; }\n");
|
||||
});
|
||||
Reference in New Issue
Block a user