src/store/storeSettings.test.ts

import { test } from "bun:test"; import assert from "node:assert/strict"; import { Store } from "./store.ts"; import { normalizeSettings } from "./settingsNormalization.ts";

test("patchSettingsWithVersion preserves unrelated settings when saving a partial patch", () => { const store = new Store(":memory:"); store.init();

try { store.setSettings({ identity: { botName: "patch me" }, permissions: { replies: { maxMessagesPerHour: 77 } } });

const current = store.getSettingsRecord();
const result = store.patchSettingsWithVersion({
  agentStack: {
    runtimeConfig: {
      browser: {
        enabled: false
      }
    }
  }
}, current.updatedAt);

assert.equal(result.ok, true);
if (!result.ok) {
  throw new Error("expected versioned settings patch to succeed");
}

assert.equal(result.settings.identity.botName, "patch me");
assert.equal(result.settings.permissions.replies.maxMessagesPerHour, 77);
assert.equal(result.settings.agentStack.runtimeConfig.browser.enabled, false);

} finally { store.close(); } });

test("replaceSettingsWithVersion restores fields that were set back to defaults", () => { const store = new Store(":memory:"); store.init();

try { const defaultBotName = normalizeSettings({}).identity.botName; store.setSettings({ identity: { botName: "patched name" }, permissions: { replies: { maxMessagesPerHour: 77 } } });

const current = store.getSettingsRecord();
const result = store.replaceSettingsWithVersion({
  identity: {
    botName: defaultBotName
  }
}, current.updatedAt);

assert.equal(result.ok, true);
if (!result.ok) {
  throw new Error("expected versioned settings replace to succeed");
}

assert.equal(result.settings.identity.botName, defaultBotName);
assert.equal(result.intent.identity, undefined);
assert.equal(
  store.getSettings().permissions.replies.maxMessagesPerHour,
  normalizeSettings({}).permissions.replies.maxMessagesPerHour
);

} finally { store.close(); } });