import { act, cleanup, render, screen } from '@testing-library/react'; import { afterEach, describe, expect, it, vi } from 'vitest'; import { DESKTOP_COOKIE_NAME } from '@/lib/desktop-client'; import { DesktopAppSettings } from './desktop-app-settings'; /** * desktop-app-settings.test — Einstellungsseite "Desktop-App" (18-03). * next-intl-Mock nach dem Muster in widget-settings-panel.test.tsx * (de.json-gestuetzt), `@/lib/desktop` gemockt. */ vi.mock('next-intl', async () => { const messages = (await import('@/messages/de.json')).default as Record; const lookup = (path: string): string | undefined => path.split('.').reduce((o, k) => (o && typeof o === 'object' ? (o as any)[k] : undefined), messages) as | string | undefined; return { useTranslations: (ns?: string) => (key: string, values?: Record) => { const raw = lookup(ns ? `${ns}.${key}` : key) ?? key; return values ? raw.replace(/\{(\w+)\}/g, (_: string, n: string) => String(values[n] ?? '')) : raw; }, useLocale: () => 'de', }; }); const { loadDesktopLatest } = vi.hoisted(() => ({ loadDesktopLatest: vi.fn() })); vi.mock('@/lib/desktop', async (importOriginal) => { const actual = await importOriginal(); return { ...actual, loadDesktopLatest, }; }); function clearDesktopCookie() { document.cookie = `${DESKTOP_COOKIE_NAME}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/`; } afterEach(() => { cleanup(); vi.clearAllMocks(); clearDesktopCookie(); }); const windowsFile = { name: 'Tessera-Setup-1.1.0.exe', size: 6123456, sha256: 'x', url: '/desktop/download/windows', }; const linuxFile = { name: 'Tessera-1.1.0.AppImage', size: 106461688, sha256: 'y', url: '/desktop/download/linux', }; describe('DesktopAppSettings (18-03)', () => { it('Test 1 (beide Plattformen): Version, zwei Links, Dateiname und Groesse', async () => { loadDesktopLatest.mockResolvedValue({ version: '1.1.0', channel: 'live', commit: 'abc1234', buildTime: 'x', files: { windows: windowsFile, linux: linuxFile }, }); render(); expect(await screen.findByText('Aktuelle Version: 1.1.0')).toBeInTheDocument(); const windowsLink = screen.getByTestId('desktop-download-windows'); expect(windowsLink).toHaveAttribute('href', 'http://localhost:3001/desktop/download/windows'); const linuxLink = screen.getByTestId('desktop-download-linux'); expect(linuxLink).toHaveAttribute('href', 'http://localhost:3001/desktop/download/linux'); expect(screen.getByText('Tessera-Setup-1.1.0.exe · 5,8 MB')).toBeInTheDocument(); expect(screen.getByText('Tessera-1.1.0.AppImage · 101,5 MB')).toBeInTheDocument(); }); it('Test 2 (Beta-Kanal): Hinweis mit Commit', async () => { loadDesktopLatest.mockResolvedValue({ version: '1.1.0', channel: 'beta', commit: 'abc1234', buildTime: 'x', files: { windows: windowsFile, linux: linuxFile }, }); render(); expect(await screen.findByText('Beta-Ausgabe, Stand abc1234')).toBeInTheDocument(); }); it('Test 3 (keine Pakete): Hinweistext statt Knoepfe, Saetze bleiben', async () => { loadDesktopLatest.mockResolvedValue(null); render(); expect( await screen.findByText('Auf diesem Server sind derzeit keine Desktop-Pakete hinterlegt.'), ).toBeInTheDocument(); expect(screen.queryByTestId('desktop-download-windows')).toBeNull(); expect(screen.queryByTestId('desktop-download-linux')).toBeNull(); expect( screen.getByText( 'Die Desktop-App öffnet Tessera in einem eigenen Fenster – ohne Browser, mit Symbol im Infobereich der Taskleiste.', ), ).toBeInTheDocument(); }); it('Test 4 (im Desktop-Client): zeigt verbundenen Server und Änderungshinweis', async () => { document.cookie = `${DESKTOP_COOKIE_NAME}=1; path=/`; loadDesktopLatest.mockResolvedValue(null); render(); expect(await screen.findByText('Verbunden mit: http://localhost:3000')).toBeInTheDocument(); expect( screen.getByText('Ändern über das Tessera-Symbol im Infobereich → „Server-Adresse ändern…“'), ).toBeInTheDocument(); expect(screen.getByTestId('desktop-connected')).toBeInTheDocument(); }); it('Test 5 (im Browser): kein Block ohne Desktop-Cookie', async () => { loadDesktopLatest.mockResolvedValue(null); render(); await act(async () => {}); expect(screen.queryByTestId('desktop-connected')).toBeNull(); }); });