/// import { beforeEach, afterEach, describe, expect, test } from "vitest"; import { existsSync, mkdtempSync, readFileSync, rmSync, writeFileSync, } from "node:fs"; import { join } from "node:path"; import { tmpdir } from "node:os"; import { SettingsService } from "../../src/services/settings"; /** * Tests for SettingsService persistence and migration behavior. */ describe("SettingsService", () => { let testDir: string; let settingsPath: string; beforeEach(() => { testDir = mkdtempSync(join(tmpdir(), "xo-cli-settings-test-")); settingsPath = join(testDir, ".wallet"); }); afterEach(() => { rmSync(testDir, { recursive: true, force: true }); }); test("returns defaults when settings file does not exist", () => { const settings = new SettingsService(settingsPath); expect(settings.getDefaultMnemonic()).toBeUndefined(); expect(settings.getCurrency()).toBe("USD"); expect(settings.getSettings()).toEqual({ currency: "USD" }); expect(existsSync(settingsPath)).toBe(false); }); test("migrates legacy .wallet plaintext mnemonic to JSON", () => { writeFileSync(settingsPath, "mnemonic-legacy", "utf8"); const settings = new SettingsService(settingsPath); expect(settings.getDefaultMnemonic()).toBe("mnemonic-legacy"); expect(settings.getCurrency()).toBe("USD"); const persisted = JSON.parse(readFileSync(settingsPath, "utf8")) as { "default-mnemonic"?: string; currency: string; }; expect(persisted).toEqual({ "default-mnemonic": "mnemonic-legacy", currency: "USD", }); }); test("normalizes and persists currency and default-mnemonic", () => { const settings = new SettingsService(settingsPath); settings.setDefaultMnemonic(" mnemonic-primary "); settings.setCurrency("aud"); expect(settings.getSettings()).toEqual({ "default-mnemonic": "mnemonic-primary", currency: "AUD", }); const persisted = JSON.parse(readFileSync(settingsPath, "utf8")) as { "default-mnemonic"?: string; currency: string; }; expect(persisted).toEqual({ "default-mnemonic": "mnemonic-primary", currency: "AUD", }); }); test("emits settings-updated events on setting changes", () => { const settings = new SettingsService(settingsPath); const events: Array<{ key: string; value: string | undefined }> = []; settings.on("settings-updated", (event) => { events.push({ key: event.key, value: event.value }); }); settings.setCurrency("cad"); settings.setDefaultMnemonic("mnemonic-blue"); expect(events).toEqual([ { key: "currency", value: "CAD" }, { key: "default-mnemonic", value: "mnemonic-blue" }, ]); }); });