1import { beforeEach, describe, expect, it, vi } from "vitest";2import { DEFAULT_RELAY_URL } from "../shared/rendezvous";34const setRelayUrlForAllPairedDevices = vi.fn(async (_relayUrl: string) => undefined);5vi.mock("./paired-devices", () => ({6 setRelayUrlForAllPairedDevices: (url: string) => setRelayUrlForAllPairedDevices(url),7}));89import {10 getSyncSettings,11 isPrivateRelayUnconfigured,12 relayInForce,13 setRelayUrl,14 setSyncMode,15} from "./sync-settings";1617const PRIVATE_RELAY = "wss://relay.example.com";1819let store: Record<string, unknown> = {};2021beforeEach(() => {22 store = {};23 setRelayUrlForAllPairedDevices.mockClear();24 (globalThis as unknown as { chrome: unknown }).chrome = {25 storage: {26 local: {27 get: async (keys: string[]) =>28 Object.fromEntries(keys.filter((k) => k in store).map((k) => [k, store[k]])),29 set: async (values: Record<string, unknown>) => {30 Object.assign(store, values);31 },32 },33 },34 };35});3637describe("sync settings", () => {38 it("defaults to public relay with nothing stored", async () => {39 expect(await getSyncSettings()).toEqual({ mode: "public", relayUrl: DEFAULT_RELAY_URL });40 });4142 it("maps a configured custom relay with no stored mode to private", async () => {43 store.peach_relay_url_v1 = PRIVATE_RELAY;44 expect(await getSyncSettings()).toEqual({ mode: "private", relayUrl: PRIVATE_RELAY });45 });4647 it("keeps a configured private relay through off and back", async () => {48 await setRelayUrl(PRIVATE_RELAY);49 await setSyncMode("off");50 expect((await getSyncSettings()).relayUrl).toBe(PRIVATE_RELAY);51 expect(await setSyncMode("private")).toEqual({ mode: "private", relayUrl: PRIVATE_RELAY });52 });53});5455describe("relayInForce", () => {56 it("returns the relay under public and private", async () => {57 expect(relayInForce(await getSyncSettings())).toBe(DEFAULT_RELAY_URL);58 expect(relayInForce(await setRelayUrl(PRIVATE_RELAY))).toBe(PRIVATE_RELAY);59 });6061 it("refuses when sync is off", async () => {62 expect(() => relayInForce({ mode: "off", relayUrl: DEFAULT_RELAY_URL })).toThrow("sync_disabled");63 });6465 66 67 68 it("stays public when the adopted relay is Peach's own", async () => {69 const settings = await setRelayUrl(DEFAULT_RELAY_URL);70 expect(settings.mode).toBe("public");71 expect(relayInForce(settings)).toBe(DEFAULT_RELAY_URL);72 });7374 it("refuses private with no URL rather than falling back to the public relay", async () => {75 const settings = await setSyncMode("private");76 expect(isPrivateRelayUnconfigured(settings)).toBe(true);77 expect(() => relayInForce(settings)).toThrow("private_relay_unset");78 });79});8081describe("mesh relay propagation", () => {82 it("does not push the public relay to peers when private has no URL yet", async () => {83 await setSyncMode("private");84 expect(setRelayUrlForAllPairedDevices).not.toHaveBeenCalled();85 });8687 it("pushes the relay once it is a real choice", async () => {88 await setRelayUrl(PRIVATE_RELAY);89 expect(setRelayUrlForAllPairedDevices).toHaveBeenCalledWith(PRIVATE_RELAY);90 setRelayUrlForAllPairedDevices.mockClear();91 await setSyncMode("public");92 expect(setRelayUrlForAllPairedDevices).toHaveBeenCalledWith(DEFAULT_RELAY_URL);93 });94});