89 lines
3.1 KiB
TypeScript
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));
|
|
});
|