Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 7 additions & 8 deletions tests/smoke/axe/axe-exit-codes.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,19 +21,20 @@ import { existsSync } from "../../../src/deno_ral/fs.ts";
import { join } from "../../../src/deno_ral/path.ts";
import { execProcess } from "../../../src/core/process.ts";
import { unitTest } from "../../test.ts";
import { writeFixture } from "../../utils.ts";
import { quartoDevBinCmd, quartoSpawnEnvOptions } from "../../quarto-cmd.ts";
import { AxeFindings } from "../../../src/command/call/axe/schemas.ts";

const workingDir = Deno.makeTempDirSync({ prefix: "quarto-axe-exit" });
Deno.mkdirSync(join(workingDir, "site"));
Deno.writeTextFileSync(
join(workingDir, "site", "index.html"),
writeFixture(
workingDir,
"site/index.html",
`<!DOCTYPE html>
<html lang="en"><head><title>exit codes</title></head>
<body><main><h1>Exit codes</h1><img src="dot.png"></main></body></html>
`,
);
Deno.writeTextFileSync(join(workingDir, "site", "dot.png"), "not-really-a-png");
writeFixture(workingDir, "site/dot.png", "not-really-a-png");

function findings(): AxeFindings {
return JSON.parse(
Expand Down Expand Up @@ -158,10 +159,8 @@ unitTest(
const notABrowser = join(workingDir, "not-a-browser");
Deno.writeTextFileSync(notABrowser, "");
// a previous scan's summary must not survive to be read as current
const artifacts = join(workingDir, "_axe-checks");
Deno.mkdirSync(artifacts, { recursive: true });
const staleFindings = join(artifacts, "findings.json");
Deno.writeTextFileSync(staleFindings, `{"stale": true}`);
writeFixture(workingDir, "_axe-checks/findings.json", `{"stale": true}`);
const staleFindings = join(workingDir, "_axe-checks", "findings.json");

const result = await execProcess({
cmd: quartoDevBinCmd(),
Expand Down
3 changes: 2 additions & 1 deletion tests/smoke/check/check-info-project.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
*/

import { dirname, join, resolve } from "../../../src/deno_ral/path.ts";
import { writeDefaultProject } from "../../utils.ts";
import { execProcess } from "../../../src/core/process.ts";
import { originalRealPathSync } from "../../../src/deno_ral/original-real-path.ts";
import { isWindows } from "../../../src/deno_ral/platform.ts";
Expand All @@ -30,7 +31,7 @@ function tempDir(prefix: string): string {
// The tree must exist at registration: the harness enters `cwd` before setup.
function tempProject(): string {
const dir = tempDir("quarto-check-info-project");
Deno.writeTextFileSync(join(dir, "_quarto.yml"), "project:\n type: default\n");
writeDefaultProject(dir);
Deno.mkdirSync(join(dir, "sub"));
return dir;
}
Expand Down
4 changes: 2 additions & 2 deletions tests/smoke/check/check-project-config-only.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import {
makeUnreadableDir,
removeProject,
tempProject,
writeFixture,
} from "../../utils.ts";
import { assert, assertEquals } from "testing/asserts";

Expand All @@ -23,8 +24,7 @@ import { assert, assertEquals } from "testing/asserts";
if (canMakeUnreadableDir) {
const projectDir = tempProject("quarto-check-project");
const locked = join(projectDir, "locked");
Deno.mkdirSync(locked);
Deno.writeTextFileSync(join(locked, "doc.qmd"), "# Locked\n");
writeFixture(projectDir, "locked/doc.qmd", "# Locked\n");
const output = join(projectDir, "check-info.json");
let restore: (() => void) | undefined;
testQuartoCmdJson(
Expand Down
7 changes: 3 additions & 4 deletions tests/smoke/check/check-render-temp-in-project.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import {
canMakeUnreadableDir,
makeUnreadableDir,
tempProject,
writeFixture,
} from "../../utils.ts";
import { checkRender } from "../../../src/command/check/check-render.ts";
import { renderServices } from "../../../src/command/render/render-services.ts";
Expand All @@ -36,8 +37,7 @@ unitTest(
async () => {
const projectDir = tempProject("quarto-check-render-temp");
const locked = join(projectDir, "locked");
Deno.mkdirSync(locked);
Deno.writeTextFileSync(join(locked, "doc.qmd"), "# Locked\n");
writeFixture(projectDir, "locked/doc.qmd", "# Locked\n");
const tmp = join(projectDir, "tmp");
Deno.mkdirSync(tmp);
const restore = makeUnreadableDir(locked);
Expand Down Expand Up @@ -72,8 +72,7 @@ unitTest(
await initYamlIntelligenceResourcesFromFilesystem();
const projectDir = tempProject("quarto-check-render-temp");
const locked = join(projectDir, "locked");
Deno.mkdirSync(locked);
Deno.writeTextFileSync(join(locked, "doc.qmd"), "# Locked\n");
writeFixture(projectDir, "locked/doc.qmd", "# Locked\n");
const restore = makeUnreadableDir(locked);
const services = {
...renderServices(notebookContext()),
Expand Down
6 changes: 3 additions & 3 deletions tests/smoke/project/project-unreadable-dir.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import {
makeUnreadableDir,
removeProject,
tempProject,
writeFixture,
} from "../../utils.ts";
import { assert, assertEquals } from "testing/asserts";

Expand All @@ -42,11 +43,10 @@ function registerUnreadableDirTest(
) {
const root = normalizePath(tempProject("quarto-unreadable-project"));
if (quartoYml) {
Deno.writeTextFileSync(join(root, "_quarto.yml"), quartoYml);
writeFixture(root, "_quarto.yml", quartoYml);
}
const locked = join(root, "locked");
Deno.mkdirSync(locked);
Deno.writeTextFileSync(join(locked, "doc.qmd"), "# Locked\n");
writeFixture(root, "locked/doc.qmd", "# Locked\n");
let restore: (() => void) | undefined;
testQuartoCmd(cmd, ["index.qmd"], [verify(root, locked)], {
cwd: () => join(root, "sub"),
Expand Down
73 changes: 29 additions & 44 deletions tests/smoke/use/brand.test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { testQuartoCmd, ExecuteOutput, Verify } from "../../test.ts";
import { fileExists, folderExists, noErrorsOrWarnings, printsMessage } from "../../verify.ts";
import { join, fromFileUrl, dirname } from "../../../src/deno_ral/path.ts";
import { writeDefaultProject, writeFixture } from "../../utils.ts";
import { ensureDirSync, existsSync } from "../../../src/deno_ral/fs.ts";
import { pathWithForwardSlashes } from "../../../src/core/path.ts";

Expand Down Expand Up @@ -90,7 +91,7 @@ testQuartoCmd(
],
{
setup: () => {
Deno.writeTextFileSync(join(basicDir, "_quarto.yml"), "project:\n type: default\n");
writeDefaultProject(basicDir);
return Promise.resolve();
},
cwd: () => basicDir,
Expand Down Expand Up @@ -137,7 +138,7 @@ testQuartoCmd(
],
{
setup: () => {
Deno.writeTextFileSync(join(dryRunDir, "_quarto.yml"), "project:\n type: default\n");
writeDefaultProject(dryRunDir);
return Promise.resolve();
},
cwd: () => dryRunDir,
Expand Down Expand Up @@ -188,14 +189,12 @@ testQuartoCmd(
],
{
setup: () => {
Deno.writeTextFileSync(join(forceOverwriteDir, "_quarto.yml"), "project:\n type: default\n");
writeDefaultProject(forceOverwriteDir);
// Create existing _brand directory with files
const brandDir = join(forceOverwriteDir, "_brand");
ensureDirSync(brandDir);
// This file exists in source - should be overwritten
Deno.writeTextFileSync(join(brandDir, "_brand.yml"), "meta:\n name: Old Brand\n");
writeFixture(forceOverwriteDir, "_brand/_brand.yml", "meta:\n name: Old Brand\n");
// This file does NOT exist in source - should be preserved
Deno.writeTextFileSync(join(brandDir, "unrelated.txt"), "keep me");
writeFixture(forceOverwriteDir, "_brand/unrelated.txt", "keep me");
return Promise.resolve();
},
cwd: () => forceOverwriteDir,
Expand Down Expand Up @@ -257,12 +256,10 @@ testQuartoCmd(
],
{
setup: () => {
Deno.writeTextFileSync(join(dryRunOverwriteDir, "_quarto.yml"), "project:\n type: default\n");
writeDefaultProject(dryRunOverwriteDir);
// Create existing _brand directory with _brand.yml and extra.txt (not logo.png)
const brandDir = join(dryRunOverwriteDir, "_brand");
ensureDirSync(brandDir);
Deno.writeTextFileSync(join(brandDir, "_brand.yml"), "meta:\n name: Old Brand\n");
Deno.writeTextFileSync(join(brandDir, "extra.txt"), "extra file not in source");
writeFixture(dryRunOverwriteDir, "_brand/_brand.yml", "meta:\n name: Old Brand\n");
writeFixture(dryRunOverwriteDir, "_brand/extra.txt", "extra file not in source");
return Promise.resolve();
},
cwd: () => dryRunOverwriteDir,
Expand All @@ -285,7 +282,7 @@ testQuartoCmd(
],
{
setup: () => {
Deno.writeTextFileSync(join(errorFlagDir, "_quarto.yml"), "project:\n type: default\n");
writeDefaultProject(errorFlagDir);
return Promise.resolve();
},
cwd: () => errorFlagDir,
Expand Down Expand Up @@ -336,7 +333,7 @@ testQuartoCmd(
],
{
setup: () => {
Deno.writeTextFileSync(join(multiFileDir, "_quarto.yml"), "project:\n type: default\n");
writeDefaultProject(multiFileDir);
return Promise.resolve();
},
cwd: () => multiFileDir,
Expand Down Expand Up @@ -384,7 +381,7 @@ testQuartoCmd(
],
{
setup: () => {
Deno.writeTextFileSync(join(nestedDir, "_quarto.yml"), "project:\n type: default\n");
writeDefaultProject(nestedDir);
return Promise.resolve();
},
cwd: () => nestedDir,
Expand Down Expand Up @@ -464,14 +461,12 @@ testQuartoCmd(
],
{
setup: () => {
Deno.writeTextFileSync(join(nestedOverwriteDir, "_quarto.yml"), "project:\n type: default\n");
writeDefaultProject(nestedOverwriteDir);
// Create existing _brand/images directory with files
const imagesDir = join(nestedOverwriteDir, "_brand", "images");
ensureDirSync(imagesDir);
// This file exists in source - should be overwritten
Deno.writeTextFileSync(join(imagesDir, "logo.png"), "old logo\n");
writeFixture(nestedOverwriteDir, "_brand/images/logo.png", "old logo\n");
// This file does NOT exist in source - should be preserved
Deno.writeTextFileSync(join(imagesDir, "unrelated.png"), "keep me nested");
writeFixture(nestedOverwriteDir, "_brand/images/unrelated.png", "keep me nested");
return Promise.resolve();
},
cwd: () => nestedOverwriteDir,
Expand Down Expand Up @@ -521,13 +516,11 @@ testQuartoCmd(
],
{
setup: () => {
Deno.writeTextFileSync(join(dryRunNestedDir, "_quarto.yml"), "project:\n type: default\n");
writeDefaultProject(dryRunNestedDir);
// Create existing _brand/images directory with only logo.png (not header.png)
const imagesDir = join(dryRunNestedDir, "_brand", "images");
ensureDirSync(imagesDir);
Deno.writeTextFileSync(join(imagesDir, "logo.png"), "old logo\n");
writeFixture(dryRunNestedDir, "_brand/images/logo.png", "old logo\n");
// Also create _brand.yml so we're only testing nested behavior
Deno.writeTextFileSync(join(dryRunNestedDir, "_brand", "_brand.yml"), "meta:\n name: Old\n");
writeFixture(dryRunNestedDir, "_brand/_brand.yml", "meta:\n name: Old\n");
return Promise.resolve();
},
cwd: () => dryRunNestedDir,
Expand Down Expand Up @@ -565,11 +558,9 @@ testQuartoCmd(
],
{
setup: () => {
Deno.writeTextFileSync(join(nestedNewSubdirDir, "_quarto.yml"), "project:\n type: default\n");
writeDefaultProject(nestedNewSubdirDir);
// Create _brand/ but NOT images/ subdirectory
const brandDir = join(nestedNewSubdirDir, "_brand");
ensureDirSync(brandDir);
Deno.writeTextFileSync(join(brandDir, "_brand.yml"), "meta:\n name: Old Brand\n");
writeFixture(nestedNewSubdirDir, "_brand/_brand.yml", "meta:\n name: Old Brand\n");
return Promise.resolve();
},
cwd: () => nestedNewSubdirDir,
Expand Down Expand Up @@ -610,11 +601,9 @@ testQuartoCmd(
],
{
setup: () => {
Deno.writeTextFileSync(join(dryRunNewSubdirDir, "_quarto.yml"), "project:\n type: default\n");
writeDefaultProject(dryRunNewSubdirDir);
// Create _brand/ but NOT images/ subdirectory
const brandDir = join(dryRunNewSubdirDir, "_brand");
ensureDirSync(brandDir);
Deno.writeTextFileSync(join(brandDir, "_brand.yml"), "meta:\n name: Old\n");
writeFixture(dryRunNewSubdirDir, "_brand/_brand.yml", "meta:\n name: Old\n");
return Promise.resolve();
},
cwd: () => dryRunNewSubdirDir,
Expand Down Expand Up @@ -659,11 +648,9 @@ testQuartoCmd(
],
{
setup: () => {
Deno.writeTextFileSync(join(emptyDirCleanupDir, "_quarto.yml"), "project:\n type: default\n");
writeDefaultProject(emptyDirCleanupDir);
// Create _brand/extras/ with a file not in source
const extrasDir = join(emptyDirCleanupDir, "_brand", "extras");
ensureDirSync(extrasDir);
Deno.writeTextFileSync(join(extrasDir, "orphan.txt"), "this file will be removed");
writeFixture(emptyDirCleanupDir, "_brand/extras/orphan.txt", "this file will be removed");
return Promise.resolve();
},
cwd: () => emptyDirCleanupDir,
Expand Down Expand Up @@ -708,11 +695,9 @@ testQuartoCmd(
],
{
setup: () => {
Deno.writeTextFileSync(join(deepNestedCleanupDir, "_quarto.yml"), "project:\n type: default\n");
writeDefaultProject(deepNestedCleanupDir);
// Create _brand/deep/nested/path/ with a file not in source
const deepDir = join(deepNestedCleanupDir, "_brand", "deep", "nested", "path");
ensureDirSync(deepDir);
Deno.writeTextFileSync(join(deepDir, "orphan.txt"), "deeply nested orphan");
writeFixture(deepNestedCleanupDir, "_brand/deep/nested/path/orphan.txt", "deeply nested orphan");
return Promise.resolve();
},
cwd: () => deepNestedCleanupDir,
Expand Down Expand Up @@ -772,7 +757,7 @@ testQuartoCmd(
],
{
setup: () => {
Deno.writeTextFileSync(join(brandExtDir, "_quarto.yml"), "project:\n type: default\n");
writeDefaultProject(brandExtDir);
return Promise.resolve();
},
cwd: () => brandExtDir,
Expand Down Expand Up @@ -807,7 +792,7 @@ testQuartoCmd(
],
{
setup: () => {
Deno.writeTextFileSync(join(brandExtDryRunDir, "_quarto.yml"), "project:\n type: default\n");
writeDefaultProject(brandExtDryRunDir);
return Promise.resolve();
},
cwd: () => brandExtDryRunDir,
Expand Down Expand Up @@ -853,7 +838,7 @@ testQuartoCmd(
],
{
setup: () => {
Deno.writeTextFileSync(join(brandExtSubdirDir, "_quarto.yml"), "project:\n type: default\n");
writeDefaultProject(brandExtSubdirDir);
return Promise.resolve();
},
cwd: () => brandExtSubdirDir,
Expand Down
32 changes: 19 additions & 13 deletions tests/smoke/use/template-ai-config.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,36 +9,42 @@

import { testQuartoCmd } from "../../test.ts";
import { fileExists, noErrorsOrWarnings, pathDoNotExists } from "../../verify.ts";
import { writeFixture } from "../../utils.ts";
import { join } from "../../../src/deno_ral/path.ts";
import { ensureDirSync } from "../../../src/deno_ral/fs.ts";

const tempDir = Deno.makeTempDirSync();

// Create a mock template source with AI config files
const templateSourceDir = join(tempDir, "template-source");
ensureDirSync(templateSourceDir);
Deno.writeTextFileSync(
join(templateSourceDir, "template.qmd"),
writeFixture(
templateSourceDir,
"template.qmd",
"---\ntitle: Template Document\n---\n\nThis is a template document."
);
Deno.writeTextFileSync(
join(templateSourceDir, "CLAUDE.md"),
writeFixture(
templateSourceDir,
"CLAUDE.md",
"# Claude Configuration\n\nThis should be excluded."
);
Deno.writeTextFileSync(
join(templateSourceDir, "AGENTS.md"),
writeFixture(
templateSourceDir,
"AGENTS.md",
"# Agents Configuration\n\nThis should be excluded."
);
Deno.writeTextFileSync(
join(templateSourceDir, "CLAUDE.local.md"),
writeFixture(
templateSourceDir,
"CLAUDE.local.md",
"# Claude Local Configuration\n\nThis should be excluded."
);
Deno.writeTextFileSync(
join(templateSourceDir, "AGENTS.local.md"),
writeFixture(
templateSourceDir,
"AGENTS.local.md",
"# Agents Local Configuration\n\nThis should be excluded."
);
Deno.writeTextFileSync(
join(templateSourceDir, "README.md"),
writeFixture(
templateSourceDir,
"README.md",
"# Template README\n\nThis should also be excluded."
);

Expand Down
Loading
Loading