import { fireEvent, render, screen, waitFor } from '@testing-library/react'; import { beforeEach, describe, expect, it, vi } from 'vitest'; vi.mock('./api/sessionApi', () => ({ getSessionMe: vi.fn(), loginSession: vi.fn(), refreshSession: vi.fn(), logoutSession: vi.fn() })); vi.mock('./api/dashboardApi', () => ({ loadDashboard: vi.fn() })); import { loadDashboard } from './api/dashboardApi'; import { getSessionMe, loginSession } from './api/sessionApi'; import App from './App'; describe('Thalos App', () => { beforeEach(() => { vi.mocked(loadDashboard).mockReset(); vi.mocked(getSessionMe).mockReset(); vi.mocked(loginSession).mockReset(); }); it('renders login gate and signs in through Thalos session endpoint', async () => { vi.mocked(getSessionMe) .mockResolvedValueOnce({ isAuthenticated: false, subjectId: '', tenantId: '', provider: 0 }) .mockResolvedValueOnce({ isAuthenticated: true, subjectId: 'demo-user', tenantId: 'demo-tenant', provider: 0 }); render(); await waitFor(() => expect(screen.getByRole('button', { name: 'Sign In' })).toBeInTheDocument()); fireEvent.change(screen.getByLabelText('Subject Id'), { target: { value: 'alice' } }); fireEvent.click(screen.getByRole('button', { name: 'Sign In' })); await waitFor(() => { expect(loginSession).toHaveBeenCalledTimes(1); expect(screen.getByText(/subject: demo-user/i)).toBeInTheDocument(); }); }); it('loads protected session snapshot through dashboard adapter', async () => { vi.mocked(getSessionMe).mockResolvedValue({ isAuthenticated: true, subjectId: 'demo-user', tenantId: 'demo-tenant', provider: 0 }); vi.mocked(loadDashboard).mockResolvedValue({ isAuthenticated: true, subjectId: 'demo-user', tenantId: 'demo-tenant', provider: 0 }); render(); await waitFor(() => expect(screen.getByRole('button', { name: 'Reload Snapshot' })).toBeInTheDocument()); fireEvent.click(screen.getByRole('button', { name: 'Reload Snapshot' })); await waitFor(() => { expect(loadDashboard).toHaveBeenCalledTimes(1); expect(screen.getByText(/demo-user/)).toBeInTheDocument(); }); }); });