/** * Tests for SetupGuard component. */ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' import { render, screen, waitFor } from '@testing-library/react' import { http, HttpResponse } from 'msw' import { server } from '@/mocks/server' import { SetupGuard } from './setup-guard' const API_URL = '' const mockReplace = vi.fn() let mockPathname = '/' vi.mock('next/navigation', () => ({ useRouter: () => ({ push: vi.fn(), replace: mockReplace, back: vi.fn(), }), usePathname: () => mockPathname, })) describe('SetupGuard', () => { beforeEach(() => { mockReplace.mockClear() mockPathname = '/' }) afterEach(() => { vi.restoreAllMocks() }) it('redirects to /setup when community is not initialized', async () => { server.use( http.get(`${API_URL}/api/setup/status`, () => { return HttpResponse.json({ initialized: false }) }) ) render(

Child content

) await waitFor(() => { expect(mockReplace).toHaveBeenCalledWith('/setup') }) }) it('renders children when community is initialized', async () => { // Default handler returns initialized: true render(

Child content

) await waitFor(() => { expect(screen.getByText('Child content')).toBeInTheDocument() }) expect(mockReplace).not.toHaveBeenCalled() }) it('does not redirect when current path is /setup', async () => { mockPathname = '/setup' server.use( http.get(`${API_URL}/api/setup/status`, () => { return HttpResponse.json({ initialized: false }) }) ) render(

Setup page

) await waitFor(() => { expect(screen.getByText('Setup page')).toBeInTheDocument() }) expect(mockReplace).not.toHaveBeenCalled() }) it('does not redirect when current path is /login', async () => { mockPathname = '/login' server.use( http.get(`${API_URL}/api/setup/status`, () => { return HttpResponse.json({ initialized: false }) }) ) render(

Login page

) await waitFor(() => { expect(screen.getByText('Login page')).toBeInTheDocument() }) expect(mockReplace).not.toHaveBeenCalled() }) it('does not redirect when current path starts with /auth/', async () => { mockPathname = '/auth/callback' server.use( http.get(`${API_URL}/api/setup/status`, () => { return HttpResponse.json({ initialized: false }) }) ) render(

Auth callback

) await waitFor(() => { expect(screen.getByText('Auth callback')).toBeInTheDocument() }) expect(mockReplace).not.toHaveBeenCalled() }) it('renders children when status check fails (allows through)', async () => { server.use( http.get(`${API_URL}/api/setup/status`, () => { return HttpResponse.json({ error: 'Server error' }, { status: 500 }) }) ) render(

Child content

) await waitFor(() => { expect(screen.getByText('Child content')).toBeInTheDocument() }) expect(mockReplace).not.toHaveBeenCalled() }) })