import { describe, it, expect, vi, beforeEach } from 'vitest' import { render, screen, waitFor } from '@testing-library/react' import { AuthProvider, useAuth } from '../src/auth' function Probe() { const { status, user, setupNeeded } = useAuth() return (
status:{status}
{setupNeeded &&
setup-needed
} {user &&
user:{user.username}
}
) } const fetchMock = vi.fn() beforeEach(() => { fetchMock.mockReset() vi.stubGlobal('fetch', fetchMock) }) function jsonOnce(status: number, body: unknown) { return new Response(JSON.stringify(body), { status, headers: { 'content-type': 'application/json' }, }) } describe('AuthProvider', () => { it('reports setupNeeded when the server has no users', async () => { fetchMock.mockResolvedValueOnce(jsonOnce(200, { needed: true })) render( ) expect(screen.getByText('status:loading')).toBeTruthy() await waitFor(() => expect(screen.getByText('status:setup')).toBeTruthy()) expect(screen.getByText('setup-needed')).toBeTruthy() expect(fetchMock).toHaveBeenCalledWith('/api/setup', expect.anything()) }) it('exposes the user when /api/me succeeds', async () => { fetchMock .mockResolvedValueOnce(jsonOnce(200, { needed: false })) .mockResolvedValueOnce(jsonOnce(200, { user: { id: 1, username: 'sam', isAdmin: true } })) render( ) await waitFor(() => expect(screen.getByText('status:authenticated')).toBeTruthy()) expect(screen.getByText('user:sam')).toBeTruthy() }) it('reports unauthenticated when /api/me is 401', async () => { fetchMock .mockResolvedValueOnce(jsonOnce(200, { needed: false })) .mockResolvedValueOnce(jsonOnce(401, { error: 'unauthorized' })) render( ) await waitFor(() => expect(screen.getByText('status:unauthenticated')).toBeTruthy()) }) })