import { describe, expect, it } from 'vitest'; import { captureRulesEditable, pairingAvailable, statusLine, unpairAvailable } from '../../src/options/view.js'; import type { PanelStatus } from '../../src/background/bridge.js'; function status(over: Partial = {}): PanelStatus { return { state: 'connected', needsPairing: false, fatal: null, retryAfterSec: null, sessionId: null, daemonVersion: null, capabilities: [], kind: 'ws', ...over, }; } describe('statusLine', () => { it('names the state, version, and transport kind', () => { expect(statusLine(status({ daemonVersion: '1.2.3' }))).toBe('connected · v1.2.3 · via WebSocket'); }); it('calls out native messaging', () => { expect(statusLine(status({ kind: 'uds' }))).toBe('connected · via native messaging'); }); it('surfaces "needs pairing" with no retry hint', () => { expect(statusLine(status({ state: 'disconnected', needsPairing: true, retryAfterSec: null, kind: null }))).toBe( 'disconnected · needs pairing', ); }); it('surfaces a pairing lockout with the retry hint', () => { expect( statusLine(status({ state: 'disconnected', needsPairing: true, retryAfterSec: 45, kind: 'ws' })), ).toBe('disconnected · via WebSocket · pairing locked (45s)'); }); it('surfaces a fatal condition', () => { expect(statusLine(status({ fatal: 'protocol mismatch' }))).toContain('protocol mismatch'); }); }); describe('pairingAvailable', () => { it('is available on ws and before the kind is known', () => { expect(pairingAvailable(status({ kind: 'ws' }))).toBe(true); expect(pairingAvailable(status({ kind: null }))).toBe(true); }); it('is not available on native messaging (no token concept there)', () => { expect(pairingAvailable(status({ kind: 'uds' }))).toBe(false); }); }); describe('unpairAvailable', () => { it('only on ws, never before the kind is known (nothing to revoke yet)', () => { expect(unpairAvailable(status({ kind: 'ws' }))).toBe(true); expect(unpairAvailable(status({ kind: 'uds' }))).toBe(false); expect(unpairAvailable(status({ kind: null }))).toBe(false); }); }); describe('captureRulesEditable', () => { it('only true over native messaging, matching METHODS privileged/uds-only', () => { expect(captureRulesEditable(status({ kind: 'uds' }))).toBe(true); expect(captureRulesEditable(status({ kind: 'ws' }))).toBe(false); expect(captureRulesEditable(status({ kind: null }))).toBe(false); }); });