clone

a deno framework for local-first web apps that open instantly, work offline and sync when users choose

fix/175-template-quality-pass
lofi / package / tooling / diagnostics_test.ts
diagnostics_test.ts 5.2K
1import { join } from "node:path";2import { createProject } from "../create_core.ts";3import { doctorReport } from "./diagnostics.ts";45function assert(condition: unknown, message: string): asserts condition {6 if (!condition) throw new Error(message);7}89function makeTestRoot(): Promise<string> {10 return Deno.makeTempDir({ dir: ".", prefix: ".lofi-doctor-test-" });11}1213Deno.test("doctor reports value-free local capability states without booting Astro", async () => {14 const cwd = await makeTestRoot();15 try {16 const project = await createProject({ cwd, name: "starter" });17 const report = await doctorReport({18 root: project.destination,19 environment: {},20 denoVersion: "2.9.0",21 });22 assert(!report.blocked, "valid generated project should not be blocked");23 assert(report.validation.mode === "local-only", "empty environment should be local-only");24 assert(25 report.diagnostics.some((item) => item.name === "Storage" && item.status === "pending"),26 "doctor must defer browser-only storage facts",27 );28 assert(29 report.diagnostics.some((item) => item.name === "Device URL" && item.status === "pending"),30 "doctor must report the stable device URL gap",31 );32 } finally {33 await Deno.remove(cwd, { recursive: true });34 }35});3637Deno.test("doctor blocks partial configuration without exposing values", async () => {38 const cwd = await makeTestRoot();39 const secretValue = "must-not-appear-in-doctor-output";40 try {41 const project = await createProject({ cwd, name: "starter" });42 const report = await doctorReport({43 root: project.destination,44 environment: {45 JAZZ_APP_ID: secretValue,46 JAZZ_ADMIN_SECRET: secretValue,47 },48 denoVersion: "2.9.0",49 });50 assert(report.blocked, "partial cloud configuration must block boot");51 assert(report.validation.mode === "invalid", "partial cloud configuration must be invalid");52 assert(53 !JSON.stringify(report).includes(secretValue),54 "doctor report exposed an environment value",55 );56 assert(57 report.diagnostics.some((item) => item.remediation?.includes("edit `.env` once")),58 "configuration blocker must include a one-edit remediation",59 );60 } finally {61 await Deno.remove(cwd, { recursive: true });62 }63});6465Deno.test("doctor blocks unsupported Deno and incomplete generated layouts", async () => {66 const root = await makeTestRoot();67 try {68 await Deno.writeTextFile(join(root, "deno.json"), "{}\n");69 const report = await doctorReport({ root, environment: {}, denoVersion: "2.8.9" });70 assert(report.blocked, "unsupported runtime and missing files must block boot");71 assert(72 report.diagnostics.some((item) => item.name === "Deno" && item.status === "blocker"),73 "old Deno was not reported",74 );75 assert(76 report.diagnostics.some((item) => item.name === "Project" && item.status === "blocker"),77 "missing project files were not reported",78 );79 } finally {80 await Deno.remove(root, { recursive: true });81 }82});8384Deno.test("doctor normalizes a deployment base and blocks an unsafe one", async () => {85 const cwd = await makeTestRoot();86 try {87 const project = await createProject({ cwd, name: "starter" });88 const valid = await doctorReport({89 root: project.destination,90 environment: { LOFI_BASE_PATH: "/field-notes" },91 denoVersion: "2.9.0",92 });93 assert(!valid.blocked, "valid non-root deployment base should pass doctor");94 assert(valid.validation.basePath === "/field-notes/", "deployment base was not normalized");95 assert(96 valid.diagnostics.some((item) =>97 item.name === "PWA" && item.detail.includes("/field-notes/")98 ),99 "doctor did not report the deployment base",100 );101102 const invalid = await doctorReport({103 root: project.destination,104 environment: { LOFI_BASE_PATH: "https://example.com/field-notes" },105 denoVersion: "2.9.0",106 });107 assert(invalid.blocked, "origin-like deployment base should block doctor");108 assert(109 invalid.diagnostics.some((item) => item.detail.includes("LOFI_BASE_PATH")),110 "doctor did not name the invalid deployment base",111 );112 } finally {113 await Deno.remove(cwd, { recursive: true });114 }115});116117Deno.test("doctor blocks malformed author-owned PWA metadata with one file-specific action", async () => {118 const cwd = await makeTestRoot();119 try {120 const project = await createProject({ cwd, name: "starter" });121 await Deno.writeTextFile(join(project.destination, "public", "manifest.webmanifest"), "{\n");122 const report = await doctorReport({123 root: project.destination,124 environment: {},125 denoVersion: "2.9.0",126 });127 assert(report.blocked, "malformed manifest did not block doctor");128 const blocker = report.diagnostics.find((item) =>129 item.name === "PWA source" && item.status === "blocker"130 );131 assert(blocker, "doctor did not emit a PWA source blocker");132 assert(133 blocker.detail.includes("public/manifest.webmanifest: malformed JSON"),134 "doctor did not name the malformed manifest",135 );136 assert(137 blocker.remediation?.includes("rerun `deno task doctor`"),138 "doctor did not provide a direct PWA remediation",139 );140 } finally {141 await Deno.remove(cwd, { recursive: true });142 }143});