Path: blob/main/tests/smoke/render/render-freeze.test.ts
12925 views
/*1* render-freeze.test.ts2*3* Copyright (C) 2020-2022 Posit Software, PBC4*5*/6import { stringify } from "../../../src/core/yaml.ts";7import { dirname, join } from "../../../src/deno_ral/path.ts";8import { assert } from "testing/asserts";910import { Metadata } from "../../../src/config/types.ts";11import { removeIfEmptyDir } from "../../../src/core/path.ts";12import { quarto } from "../../../src/quarto.ts";13import { ExecuteOutput, Verify } from "../../test.ts";14import { outputCreated } from "../../verify.ts";15import { testRender } from "./render.ts";1617const regex = /output file: .*\.knit\.md/m;1819const testFileName = "freeze-test";20const tempDir = Deno.makeTempDirSync();21const path = join(tempDir, `${testFileName}.qmd`);22const baseMeta: Metadata = {23title: "Freeze Test",24format: "html",25freeze: true,26};27const baseMarkdown: string[] = [28"## Freeze Testing Document",29"",30"```{r}",31"plot(cars)",32"```",33"",34];3536const useFrozen = {37name: "Ensure using frozen execution",38verify: (output: ExecuteOutput[]) => {39output.forEach((msg) => {40if (msg.levelName === "INFO") {41assert(42!msg.msg.match(regex),43"Document was executed when it should've used the frozen result",44);45}46});47return Promise.resolve();48},49};5051const ignoreFrozen = {52name: "Ensure ignoring frozen execution",53verify: (output: ExecuteOutput[]) => {54const matches = output.some((msg) => {55if (msg.levelName === "INFO") {56return msg.msg.match(regex);57}58});59assert(60matches,61"Document was not executed when it should have been",62);63return Promise.resolve();64},65};6667const projectOutputExists: Verify = {68name: "Make sure project output exists",69verify: (_output: ExecuteOutput[]) => {70outputCreated(path, "html");71return Promise.resolve();72},73};7475async function writeFile(76path: string,77frontMatter: Metadata,78markdown: string[],79) {80const yamlStr = stringify(frontMatter);81await Deno.writeTextFile(82path,83["---", yamlStr, "---", "", ...markdown].join("\n"),84);85}8687function testFileContext(88path: string,89frontMatter: Metadata,90markdown: string[],91) {92const dir = dirname(path);93const quartoProj = join(dir, "_quarto.yml");94return {95setup: async () => {96// Write a quarto project97await Deno.writeTextFile(98quartoProj,99"title: 'Hello Project'\nproject:\n type: default\n",100);101102// Write the test file103await writeFile(104path,105frontMatter,106markdown,107);108109await quarto(["render", path]);110},111teardown: async () => {112// Clean up the test file113await Deno.remove(path);114await Deno.remove(quartoProj);115116// Get rid of the freezer117const freezerDir = join(dirname(path), "_freeze");118Deno.removeSync(join(freezerDir, testFileName), { recursive: true });119120// Maybe clean up empty freeze dir121removeIfEmptyDir(freezerDir);122},123};124}125126const testContext = testFileContext(path, baseMeta, baseMarkdown);127// Reader and use the freezer (freeze, auto)128testRender(129dirname(path) + "/",130"html",131false,132[projectOutputExists, useFrozen],133{134name: "clean fzr - auto",135...testContext,136},137);138139// Render and mutate to be sure we ignore freezer140testRender(141dirname(path) + "/",142"html",143false,144[projectOutputExists, ignoreFrozen],145{146name: "dirty fzr - auto",147setup: async () => {148await testContext.setup();149150// mutate the file151writeFile(path, { ...baseMeta, freeze: "auto" }, [152...baseMarkdown,153"",154"```{r}",155"head(cars)",156"```",157"",158]);159},160teardown: testContext.teardown,161},162);163164// Render and mutate to be sure we ignore freezer165testRender(166dirname(path) + "/",167"html",168false,169[projectOutputExists, useFrozen],170{171name: "dirty fzr - freeze",172setup: async () => {173await testContext.setup();174175// mutate the file176writeFile(path, baseMeta, [177...baseMarkdown,178"",179"```{r}",180"head(cars)",181"```",182"",183]);184},185teardown: testContext.teardown,186},187);188189190