diff --git a/src/__tests__/auth/callback-page.test.tsx b/src/__tests__/auth/callback-page.test.tsx index 80cf2b6..a6a0c4c 100644 --- a/src/__tests__/auth/callback-page.test.tsx +++ b/src/__tests__/auth/callback-page.test.tsx @@ -1,5 +1,9 @@ /** * Tests for auth callback page. + * The callback page receives ?success=true after API redirects from PDS OAuth. + * It then calls POST /api/auth/refresh (using the HTTP-only cookie set by API) + * to get the access token, stores it in memory via setSessionFromCallback, + * and redirects to the returnTo path. */ import { describe, it, expect, vi, beforeEach } from 'vitest' @@ -12,7 +16,7 @@ const API_URL = '' const mockSetSessionFromCallback = vi.fn() -let mockSearchParams = new URLSearchParams('code=test-code&state=test-state') +let mockSearchParams = new URLSearchParams('success=true') vi.mock('next/navigation', () => ({ useSearchParams: () => mockSearchParams, @@ -55,13 +59,13 @@ Object.defineProperty(window, 'sessionStorage', { describe('AuthCallbackPage', () => { beforeEach(() => { mockSetSessionFromCallback.mockClear() - mockSearchParams = new URLSearchParams('code=test-code&state=test-state') + mockSearchParams = new URLSearchParams('success=true') }) it('shows loading spinner while processing', () => { - // Override callback to never resolve + // Override refresh to never resolve so we can see the spinner server.use( - http.get(`${API_URL}/api/auth/callback`, () => { + http.post(`${API_URL}/api/auth/refresh`, () => { return new Promise(() => {}) }) ) @@ -76,16 +80,22 @@ describe('AuthCallbackPage', () => { }) }) - it('shows error when code or state is missing', () => { + it('shows error when success or error param is missing', () => { mockSearchParams = new URLSearchParams('') render() - expect(screen.getByRole('alert')).toHaveTextContent(/missing authorization code or state/i) + expect(screen.getByRole('alert')).toHaveTextContent(/missing authorization parameters/i) + }) + + it('shows error from error search param', () => { + mockSearchParams = new URLSearchParams('error=OAuth+callback+failed') + render() + expect(screen.getByRole('alert')).toHaveTextContent(/oauth callback failed/i) }) it('shows error on API failure', async () => { server.use( - http.get(`${API_URL}/api/auth/callback`, () => { - return HttpResponse.json({ error: 'Invalid code' }, { status: 400 }) + http.post(`${API_URL}/api/auth/refresh`, () => { + return HttpResponse.json({ error: 'Session expired' }, { status: 401 }) }) ) @@ -97,7 +107,7 @@ describe('AuthCallbackPage', () => { it('shows retry link on error', async () => { server.use( - http.get(`${API_URL}/api/auth/callback`, () => { + http.post(`${API_URL}/api/auth/refresh`, () => { return HttpResponse.json({ error: 'Failed' }, { status: 500 }) }) )