relay-settings.test.ts

2.1 KB · raw

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});