import { describe, expect, it, vi } from 'vitest'; import { isTauri, platform, routeFromDeepLink, type DesktopMessage } from '@/lib/platform'; /** Ставит в window фальшивый мост Tauri v2 и возвращает список вызовов. */ function stubTauri(): Array<{ command: string; args: unknown }> { const calls: Array<{ command: string; args: unknown }> = []; vi.stubGlobal('__TAURI_INTERNALS__', { invoke: (command: string, args?: unknown) => { calls.push({ command, args }); return Promise.resolve(undefined); }, }); return calls; } describe('routeFromDeepLink', () => { it('разбирает приглашение', () => { expect(routeFromDeepLink('glchat://invite/AbC123')).toBe('/invite/AbC123'); }); it('разбирает сервер и комнату', () => { expect(routeFromDeepLink('glchat://guild/10/channel/20')).toBe('/app/10/20'); }); it('разбирает личную беседу', () => { expect(routeFromDeepLink('glchat://dm/77')).toBe('/app/friends/77'); }); it('не принимает мусор в ссылке на беседу', () => { expect(routeFromDeepLink('glchat://dm/77/лишнее')).toBeNull(); expect(routeFromDeepLink('glchat://dm')).toBeNull(); }); it('игнорирует чужие схемы и неизвестные пути', () => { expect(routeFromDeepLink('https://gl.mhspx.su/invite/abc')).toBeNull(); expect(routeFromDeepLink('glchat://unknown/1')).toBeNull(); expect(routeFromDeepLink('glchat://guild/10')).toBeNull(); expect(routeFromDeepLink('не ссылка')).toBeNull(); }); }); describe('платформа в браузере', () => { it('определяется как web и не падает на вызовах', () => { expect(isTauri()).toBe(false); expect(platform.kind).toBe('web'); expect(() => { platform.notify({ title: 'a', body: 'b' }); platform.setBadge(3); platform.ready(); platform.openSettings(); }).not.toThrow(); expect(platform.onMessage(() => {})()).toBeUndefined(); }); }); describe('платформа в desktop-обёртке', () => { it('вызывает команды обёртки и принимает её сообщения', async () => { const calls = stubTauri(); vi.resetModules(); const desktop = await import('@/lib/platform'); expect(desktop.isTauri()).toBe(true); expect(desktop.platform.kind).toBe('tauri'); desktop.platform.notify({ title: 'Упоминание', body: 'привет', channelId: 'c1' }); desktop.platform.setBadge(2); desktop.platform.ready(); desktop.platform.openSettings(); expect(calls.map((call) => call.command)).toEqual([ 'desktop_notify', 'desktop_set_badge', 'desktop_ready', 'desktop_open_settings', ]); expect(calls[0]?.args).toEqual({ payload: { title: 'Упоминание', body: 'привет', guildId: null, channelId: 'c1' }, }); expect(calls[1]?.args).toEqual({ count: 2 }); // Обёртка зовёт страницу через window.__glchatDesktop.receive. const received: DesktopMessage[] = []; const unsubscribe = desktop.platform.onMessage((message) => received.push(message)); const bridge = window as unknown as { __glchatDesktop?: { receive: (m: DesktopMessage) => void }; }; bridge.__glchatDesktop?.receive({ type: 'ptt', active: true }); expect(received).toEqual([{ type: 'ptt', active: true }]); unsubscribe(); bridge.__glchatDesktop?.receive({ type: 'toggleMic' }); expect(received).toHaveLength(1); }); });