Files

56 lines
2.9 KiB
JavaScript

import assert from "node:assert/strict";
import { readFile } from "node:fs/promises";
import test from "node:test";
test("establishes the exact CPL 1.0 project marker and conforming layout", async () => {
const [format, native, writer] = await Promise.all([
readFile(new URL("../src-tauri/src/project_format.rs", import.meta.url), "utf8"),
readFile(new URL("../src-tauri/src/lib.rs", import.meta.url), "utf8"),
readFile(new URL("../src-tauri/src/provenance/writer.rs", import.meta.url), "utf8"),
]);
for (const exact of [
'PROJECT_FORMAT: &str = "thinkloom-cpl"',
'PROJECT_FORMAT_VERSION: &str = "1.0"',
'PROVENANCE_CONFORMANCE: &str = "cpl-1.0"',
]) assert.match(format, new RegExp(exact.replaceAll(/[.*+?^${}()|[\]\\]/g, "\\$&")));
for (const path of ["records", "provenance/ledger/active", "provenance/ledger/sealed", "reports", ".app/locks", ".app/temp", ".app/recovery"]) {
assert.match(format, new RegExp(path.replaceAll(/[.*+?^${}()|[\]\\]/g, "\\$&")));
}
assert.match(native, /project_format: project_format::PROJECT_FORMAT/);
assert.match(native, /project_format_version: project_format::PROJECT_FORMAT_VERSION/);
assert.match(native, /provenance_conformance: project_format::PROVENANCE_CONFORMANCE/);
assert.match(writer, /\.app\/locks/);
assert.match(writer, /\.app\/temp\/staging/);
assert.doesNotMatch(`${native}\n${writer}`, /\.thinkloom/);
});
test("classifies legacy projects before recovery and exposes preservation-only controls", async () => {
const [format, native, frontend] = await Promise.all([
readFile(new URL("../src-tauri/src/project_format.rs", import.meta.url), "utf8"),
readFile(new URL("../src-tauri/src/lib.rs", import.meta.url), "utf8"),
readFile(new URL("../src/Thinkloom.tsx", import.meta.url), "utf8"),
]);
assert.match(format, /LegacyPreviewReadOnly/);
assert.match(format, /schema_version_without_marker_is_legacy_and_inspection_is_read_only/);
assert.match(format, /preservation_archive_retains_source_bytes_without_changing_source/);
assert.match(format, /Not verified, converted, or CPL-conforming/);
assert.match(format, /LEGACY_ARCHIVE_INSIDE_PROJECT/);
const inspect = native.indexOf("project_format::inspect_project(&root)");
const recover = native.indexOf("CplService::new(&root, &manifest.project_id).recover()", inspect);
assert.ok(inspect >= 0 && recover > inspect, "project inspection must precede CPL recovery");
assert.match(native, /inspection\.classification != project_format::ProjectClassification::CplConforming/);
assert.match(native, /set_read_only_project/);
assert.match(native, /show_project_folder/);
assert.match(native, /create_legacy_preservation_archive/);
assert.match(native, /LEGACY_BACKUP_REFUSED/);
assert.match(frontend, /Legacy preview project/);
assert.match(frontend, /Show project folder/);
assert.match(frontend, /Create preservation archive/);
assert.match(frontend, /No migration was attempted/);
});