vault-link/frontend/sync-client/src/persistence/settings.test.ts

89 lines
3.1 KiB
TypeScript

import assert from "node:assert/strict";
import { describe, it } from "node:test";
import { Logger, LogLevel } from "../tracing/logger";
import { Settings } from "./settings";
describe("Settings logging", () => {
it("redacts tokens while loading and updating settings", async () => {
const logger = new Logger();
const settings = new Settings(
logger,
{ token: "loaded-secret" },
async () => {}
);
await settings.setSettings({ token: "updated-secret" });
const messages = logger
.getMessages(LogLevel.DEBUG)
.map((entry) => entry.message)
.join("\n");
assert.doesNotMatch(messages, /loaded-secret|updated-secret/u);
assert.match(messages, /\[REDACTED\]/u);
});
it("retains and persists the configured diff cache size", async () => {
let saved = 0;
const settings = new Settings(
new Logger(),
{ diffCacheSizeMB: 7 },
async (value) => {
saved = value.diffCacheSizeMB;
}
);
assert.equal(settings.getSettings().diffCacheSizeMB, 7);
await settings.setSetting("diffCacheSizeMB", 9);
assert.equal(settings.getSettings().diffCacheSizeMB, 9);
assert.equal(saved, 9);
});
});
it("owns settings arrays instead of sharing them with callers and listeners", async () => {
const original = ["original"];
const settings = new Settings(
new Logger(),
{ ignorePatterns: original },
async () => {}
);
original.push("external mutation");
assert.deepEqual(settings.getSettings().ignorePatterns, ["original"]);
const update = ["updated"];
await settings.setSettings({ ignorePatterns: update });
update.push("external mutation");
assert.deepEqual(settings.getSettings().ignorePatterns, ["updated"]);
settings.onSettingsChanged.add((_, old) => {
old.ignorePatterns.push("listener mutation");
});
await settings.setSettings({ maxFileSizeMB: 12 });
assert.deepEqual(settings.getSettings().ignorePatterns, ["updated"]);
});
it("file eligibility follows successfully saved settings", async () => {
let fail = false;
const settings = new Settings(
new Logger(),
{
ignorePatterns: ["private/**"],
maxFileSizeMB: 1
},
async () => {
if (fail) throw new Error("save failed");
}
);
assert(settings.isIgnored("private/note.md"));
assert(settings.isIgnored(".vault-link-sync/state.json"));
assert(!settings.isIgnored("public/note.md"));
assert(!settings.isOversized(1024 * 1024));
assert(settings.isOversized(1024 * 1024 + 1));
fail = true;
await assert.rejects(
settings.setSettings({ ignorePatterns: [], maxFileSizeMB: 2 }),
/save failed/
);
assert(settings.isIgnored("private/note.md"));
assert(settings.isOversized(1024 * 1024 + 1));
fail = false;
await settings.setSettings({ ignorePatterns: [], maxFileSizeMB: 2 });
assert(!settings.isIgnored("private/note.md"));
assert(!settings.isOversized(1024 * 1024 + 1));
});