1import { beforeEach, describe, expect, it, vi } from "vitest";23import {4 getRelaySettings,5 setLanOnly,6 setRelayUrl,7} from "./relay-settings";8import { DEFAULT_RELAY_URL } from "../shared/rendezvous";910let stored: Record<string, unknown>;1112beforeEach(() => {13 stored = {};14 (globalThis as { chrome?: unknown }).chrome = {15 storage: {16 local: {17 get: vi.fn(async (keys: string | string[]) => {18 const requested = Array.isArray(keys) ? keys : [keys];19 return Object.fromEntries(20 requested21 .filter((key) => key in stored)22 .map((key) => [key, stored[key]]),23 );24 }),25 set: vi.fn(async (values: Record<string, unknown>) => {26 Object.assign(stored, values);27 }),28 },29 },30 };31});3233describe("relay settings", () => {34 it("defaults to June's relay with internet fallback enabled", async () => {35 await expect(getRelaySettings()).resolves.toEqual({36 relayUrl: DEFAULT_RELAY_URL,37 lanOnly: false,38 });39 });4041 it("persists a normalized self-hosted wss URL and LAN-only opt-out", async () => {42 stored.peach_paired_devices_v3 = [43 {44 deviceId: "phone",45 deviceName: "Phone",46 deviceType: "android",47 longTermPublicKeyHex: "0".repeat(64),48 pairedAt: 1,49 relayUrl: "wss://old-relay.example",50 },51 ];52 await expect(setRelayUrl("wss://relay.example.test/base/")).resolves.toBe(53 "wss://relay.example.test/base",54 );55 await setLanOnly(true);56 await expect(getRelaySettings()).resolves.toEqual({57 relayUrl: "wss://relay.example.test/base",58 lanOnly: true,59 });60 expect(stored.peach_paired_devices_v3).toEqual([61 expect.objectContaining({62 deviceId: "phone",63 relayUrl: "wss://relay.example.test/base",64 }),65 ]);66 });6768 it("rejects ws and ignores an invalid stored URL", async () => {69 await expect(setRelayUrl("ws://relay.example.test")).rejects.toThrow(/wss/);70 stored.peach_relay_url_v1 = "https://not-a-websocket.example";71 await expect(getRelaySettings()).resolves.toMatchObject({72 relayUrl: DEFAULT_RELAY_URL,73 });74 });75});