Path: blob/main/tests/smoke/verify/pdf-metadata.test.ts
12925 views
/*1* pdf-metadata.test.ts2*3* Tests for the ensurePdfMetadata verify predicate.4* Renders a fixture document and runs various assertions including expected failures.5*6* Copyright (C) 2020-2025 Posit Software, PBC7*/89import { testQuartoCmd } from "../../test.ts";10import { ensurePdfMetadata } from "../../verify-pdf-metadata.ts";11import { assert } from "testing/asserts";12import { join } from "../../../src/deno_ral/path.ts";13import { safeRemoveSync, safeExistsSync } from "../../../src/core/path.ts";1415const fixtureDir = "docs/verify/pdf-metadata";16const fixtureQmd = join(fixtureDir, "fixture.qmd");17const fixturePdf = join(fixtureDir, "fixture.pdf");1819/**20* Helper to assert that a function throws with error message matching a pattern21*/22async function assertThrowsWithPattern(23fn: () => Promise<void>,24pattern: RegExp,25description: string,26) {27let threw = false;28let errorMessage = "";29try {30await fn();31} catch (e) {32threw = true;33errorMessage = e instanceof Error ? e.message : String(e);34}3536assert(threw, `Expected to throw for: ${description}`);37assert(38pattern.test(errorMessage),39`Error message "${errorMessage}" did not match pattern ${pattern} for: ${description}`,40);41}4243// Test: Render fixture and run assertions44testQuartoCmd("render", [fixtureQmd, "--to", "typst"], [], {45teardown: async () => {46// Run the test assertions after render completes47await runPositiveTests();48await runExpectedFailureTests();4950// Cleanup51if (safeExistsSync(fixturePdf)) {52safeRemoveSync(fixturePdf);53}54},55});5657/**58* Test positive assertions that should pass59*/60async function runPositiveTests() {61// Test 1: Title contains expected text62const titleTest = ensurePdfMetadata(fixturePdf, {63title: "PDF Metadata Test Fixture",64});65await titleTest.verify([]);6667// Test 2: Author contains expected text68const authorTest = ensurePdfMetadata(fixturePdf, {69author: "Test Author Name",70});71await authorTest.verify([]);7273// Test 3: Keywords contain expected values (as array)74const keywordsTest = ensurePdfMetadata(fixturePdf, {75keywords: ["quarto", "typst"],76});77await keywordsTest.verify([]);7879// Test 4: Title matches regex80const regexTest = ensurePdfMetadata(fixturePdf, {81title: /PDF.*Fixture/,82});83await regexTest.verify([]);8485// Test 5: Multiple fields at once86const multiTest = ensurePdfMetadata(fixturePdf, {87title: "Metadata",88author: "Author",89keywords: ["testing"],90});91await multiTest.verify([]);9293// Test 6: Creator field (should contain "Typst" since we render with Typst)94const creatorTest = ensurePdfMetadata(fixturePdf, {95creator: /typst/i,96});97await creatorTest.verify([]);98}99100/**101* Test expected failures - each should throw with specific error messages102*/103async function runExpectedFailureTests() {104// Error 1: Title mismatch105await assertThrowsWithPattern(106async () => {107const predicate = ensurePdfMetadata(fixturePdf, {108title: "NONEXISTENT_TITLE_12345",109});110await predicate.verify([]);111},112/title.*expected.*NONEXISTENT_TITLE_12345/i,113"Title mismatch error",114);115116// Error 2: Author mismatch117await assertThrowsWithPattern(118async () => {119const predicate = ensurePdfMetadata(fixturePdf, {120author: "NONEXISTENT_AUTHOR_12345",121});122await predicate.verify([]);123},124/author.*expected.*NONEXISTENT_AUTHOR_12345/i,125"Author mismatch error",126);127128// Error 3: Keywords mismatch129await assertThrowsWithPattern(130async () => {131const predicate = ensurePdfMetadata(fixturePdf, {132keywords: ["NONEXISTENT_KEYWORD_12345"],133});134await predicate.verify([]);135},136/keywords.*expected.*NONEXISTENT_KEYWORD_12345/i,137"Keywords mismatch error",138);139140// Error 4: Regex mismatch141await assertThrowsWithPattern(142async () => {143const predicate = ensurePdfMetadata(fixturePdf, {144title: /^EXACT_NONEXISTENT$/,145});146await predicate.verify([]);147},148/title.*expected.*match/i,149"Regex mismatch error",150);151}152153154