sc-theme-builder/test/portability.test.js
2026-07-01 20:07:28 -05:00

61 lines
2.5 KiB
JavaScript

const { test } = require("node:test");
const assert = require("node:assert");
const { buildEnvelope, parseEnvelope, upcastEnvelope } = require("../lib/portability");
const { normalizeTokens } = require("../lib/themeSchema");
const { SCHEMA_ID, FORMAT_VERSION, ENGINE } = require("../lib/constants");
test("buildEnvelope produces a self-describing, id-less envelope", () => {
const env = buildEnvelope({ name: "Solar", engine: ENGINE, tokens: { colors: { primary: "#111" } } });
assert.equal(env.$schema, SCHEMA_ID);
assert.equal(env.formatVersion, FORMAT_VERSION);
assert.equal(env.name, "Solar");
assert.ok(!("id" in env) && !("version" in env));
});
test("export -> import round-trips", async () => {
const env = buildEnvelope({ name: "Solar", engine: ENGINE, tokens: normalizeTokens({ colors: { primary: "#abcdef" } }) });
const res = await parseEnvelope(JSON.stringify(env));
assert.equal(res.ok, true);
assert.equal(res.draft.name, "Solar");
assert.equal(res.draft.tokens.colors.primary, "#abcdef");
});
test("import rejects a non-saltcorn file", async () => {
const res = await parseEnvelope(JSON.stringify({ hello: "world" }));
assert.equal(res.ok, false);
assert.match(res.error, /Not a saltcorn-theme/);
});
test("import rejects invalid JSON and oversized files", async () => {
assert.equal((await parseEnvelope("{not json")).ok, false);
const huge = JSON.stringify({ $schema: SCHEMA_ID, formatVersion: 1, x: "y".repeat(3 * 1024 * 1024) });
const res = await parseEnvelope(huge);
assert.equal(res.ok, false);
assert.match(res.error, /size limit/);
});
test("upcastEnvelope lifts a formatVersion-0 (vars) export to current", () => {
const up = upcastEnvelope({ $schema: SCHEMA_ID, name: "Old", vars: { colors: { primary: "#222" } } });
assert.equal(up.formatVersion, FORMAT_VERSION);
assert.equal(up.tokens.colors.primary, "#222");
});
test("import upcasts a legacy envelope end-to-end", async () => {
const legacy = JSON.stringify({ $schema: SCHEMA_ID, name: "Legacy", vars: { colors: { primary: "#333" } } });
const res = await parseEnvelope(legacy);
assert.equal(res.ok, true);
assert.equal(res.draft.tokens.colors.primary, "#333");
});
test("import rejects an unsupported engine", async () => {
const res = await parseEnvelope(JSON.stringify({ $schema: SCHEMA_ID, formatVersion: 1, name: "X", engine: "tailwind", tokens: {} }));
assert.equal(res.ok, false);
assert.match(res.error, /Unsupported engine/);
});