import { describe, it, expect, vi } from 'vitest'; import { render, screen, waitFor } from '@testing-library/react'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { AuthProviderWithDevBridge } from './AuthProviderWithDevBridge'; import { useAuth } from './useAuth'; import type { DevUserMapper } from './AuthProviderWithDevBridge'; import type { DevUserState } from '@lilith/ui-dev-tools'; import { UserRole, UserType } from '@lilith/types'; // Mock @lilith/ui-dev-tools vi.mock('@lilith/ui-dev-tools', () => ({ useDevUser: vi.fn(), })); // Mock @lilith/sso-client vi.mock('@lilith/sso-client', () => ({ SSOClient: vi.fn().mockImplementation(() => ({ checkSession: vi.fn().mockResolvedValue({ authenticated: false, user: null }), startAutoCheck: vi.fn(), destroy: vi.fn(), })), })); // Mock auth-events vi.mock('./auth-events', () => ({ authEvents: { initialize: vi.fn(), subscribe: vi.fn(() => vi.fn()), destroy: vi.fn(), broadcast: vi.fn(), }, })); import { useDevUser } from '@lilith/ui-dev-tools'; const mockUseDevUser = vi.mocked(useDevUser); // Test component that uses useAuth hook function TestComponent() { const { isAuthenticated, user, isDevMode } = useAuth(); return (
{String(isAuthenticated)}
{String(isDevMode)}
{user && ( <>
{user.id}
{user.email}
{user.role}
{user.userTypes.join(',')}
)}
); } describe('Dev Auth Integration', () => { const mapDevUser: DevUserMapper = (devUser: DevUserState) => ({ id: devUser.userId || 'dev-id', email: `${devUser.primaryType}@test.local`, username: devUser.displayName || 'Dev User', role: devUser.primaryType === 'admin' ? UserRole.ADMIN : UserRole.USER, userTypes: devUser.primaryType === 'provider' ? [UserType.ESCORT] : devUser.primaryType === 'client' ? [UserType.CLIENT] : [], primaryUserType: devUser.primaryType === 'provider' ? UserType.ESCORT : devUser.primaryType === 'client' ? UserType.CLIENT : undefined, isActive: true, emailVerified: true, createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(), }); it('should propagate dev auth state to useAuth hook', async () => { const queryClient = new QueryClient({ defaultOptions: { queries: { retry: false } }, }); mockUseDevUser.mockReturnValue({ userTypes: ['provider'], primaryType: 'provider', isAuthenticated: true, hasDeclaredIntent: true, displayName: 'Test Provider', userId: 'provider-123', isDevMode: true, addType: vi.fn(), removeType: vi.fn(), setPrimaryType: vi.fn(), toggleType: vi.fn(), hasType: vi.fn(), canBePrimary: vi.fn(), signOut: vi.fn(), signInAsDefault: vi.fn(), userTypeConfigs: [], getTypeConfig: vi.fn(), }); render( ); await waitFor(() => { expect(screen.getByTestId('is-authenticated').textContent).toBe('true'); expect(screen.getByTestId('is-dev-mode').textContent).toBe('true'); expect(screen.getByTestId('user-id').textContent).toBe('provider-123'); expect(screen.getByTestId('user-email').textContent).toBe('provider@test.local'); expect(screen.getByTestId('user-role').textContent).toBe(UserRole.USER); expect(screen.getByTestId('user-types').textContent).toBe('escort'); }); }); it('should show guest state when dev user is not authenticated', async () => { const queryClient = new QueryClient({ defaultOptions: { queries: { retry: false } }, }); mockUseDevUser.mockReturnValue({ userTypes: [], primaryType: null, isAuthenticated: false, hasDeclaredIntent: false, displayName: 'Guest', userId: null, isDevMode: true, addType: vi.fn(), removeType: vi.fn(), setPrimaryType: vi.fn(), toggleType: vi.fn(), hasType: vi.fn(), canBePrimary: vi.fn(), signOut: vi.fn(), signInAsDefault: vi.fn(), userTypeConfigs: [], getTypeConfig: vi.fn(), }); render( ); await waitFor(() => { expect(screen.getByTestId('is-authenticated').textContent).toBe('false'); expect(screen.queryByTestId('user-id')).not.toBeInTheDocument(); }); }); it('should correctly map admin role', async () => { const queryClient = new QueryClient({ defaultOptions: { queries: { retry: false } }, }); mockUseDevUser.mockReturnValue({ userTypes: ['admin'], primaryType: 'admin', isAuthenticated: true, hasDeclaredIntent: true, displayName: 'Admin User', userId: 'admin-999', isDevMode: true, addType: vi.fn(), removeType: vi.fn(), setPrimaryType: vi.fn(), toggleType: vi.fn(), hasType: vi.fn(), canBePrimary: vi.fn(), signOut: vi.fn(), signInAsDefault: vi.fn(), userTypeConfigs: [], getTypeConfig: vi.fn(), }); render( ); await waitFor(() => { expect(screen.getByTestId('user-role').textContent).toBe(UserRole.ADMIN); }); }); });