/** * A stored sign-in the server can't check yet waits on the page it asked for * instead of landing on /login (#3360): a SpoolBuddy kiosk is touch-only and * has no way to sign in there, so it stayed on the login page until a reboot. */ import { afterEach, beforeEach, describe, expect, it } from 'vitest'; import { render, screen } from '@testing-library/react'; import { MemoryRouter, Route, Routes } from 'react-router-dom'; import { http, HttpResponse } from 'msw'; import { server } from '../mocks/server'; import { AuthProvider } from '../../contexts/AuthContext'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { PermissionRoute, ProtectedRoute } from '../../App'; import { CamWallPage } from '../../pages/CamWallPage'; import { setAuthToken } from '../../api/client'; function renderKiosk() { return render( login page} />
kiosk page
} />
); } describe('ProtectedRoute while the sign-in is unconfirmed (#3360)', () => { let down: boolean; beforeEach(() => { down = true; setAuthToken('bb_kiosk', 'persistent'); server.use( http.get('/api/v1/auth/status', () => HttpResponse.json({ auth_enabled: true, requires_setup: false })), http.get('/api/v1/auth/me', () => down ? HttpResponse.json({ detail: 'Authentication service temporarily unavailable' }, { status: 503 }) : HttpResponse.json({ id: 1, username: 'kiosk', is_active: true, permissions: [], groups: [] }) ) ); }); afterEach(() => { setAuthToken(null); }); it('shows the retry screen, then the page once Bambuddy answers', async () => { renderKiosk(); expect(await screen.findByText("Can't reach Bambuddy. Retrying…", {}, { timeout: 4000 })).toBeInTheDocument(); expect(screen.queryByText('login page')).not.toBeInTheDocument(); down = false; expect(await screen.findByText('kiosk page', {}, { timeout: 6000 })).toBeInTheDocument(); }, 12000); it('waits the same way on a permission-gated page', async () => { render( login page} />
settings
} />
); expect(await screen.findByText("Can't reach Bambuddy. Retrying…", {}, { timeout: 4000 })).toBeInTheDocument(); expect(screen.queryByText('login page')).not.toBeInTheDocument(); }); it('waits the same way on the Cam Wall opened with a session', async () => { render( login page} /> } /> ); expect(await screen.findByText("Can't reach Bambuddy. Retrying…", {}, { timeout: 4000 })).toBeInTheDocument(); expect(screen.queryByText('login page')).not.toBeInTheDocument(); }); it('still goes to the login page on a definite 401', async () => { server.use(http.get('/api/v1/auth/me', () => HttpResponse.json({ detail: 'Invalid API key' }, { status: 401 }))); renderKiosk(); expect(await screen.findByText('login page', {}, { timeout: 4000 })).toBeInTheDocument(); }); });