import { describe, it, expect, vi, beforeEach } from 'vitest'; import { render, screen, fireEvent, waitFor } from '@testing-library/react'; import '@testing-library/jest-dom'; import SleepButton from '../../src/components/tracker/SleepButton'; import { useSleepSession } from '../../src/hooks/useSleepSession'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; vi.mock('../../src/hooks/useSleepSession', () => ({ useSleepSession: vi.fn(), })); const createTestQueryClient = () => new QueryClient({ defaultOptions: { queries: { retry: false }, }, }); describe('SleepButton', () => { let queryClient: any; beforeEach(() => { queryClient = createTestQueryClient(); vi.clearAllMocks(); }); const renderWithProviders = (ui: React.ReactElement) => { return render( {ui} ); }; it('renders "Start Sleep" when no active session', async () => { (useSleepSession as any).mockReturnValue({ activeSession: null, isCreating: false, isEnding: false, }); renderWithProviders(); expect(screen.getByRole('button', { name: /Start Sleep/i })).toBeInTheDocument(); }); it('renders "Stop Sleep" when session is active', async () => { (useSleepSession as any).mockReturnValue({ activeSession: { id: 1, start_time: '2024-01-01T12:00' }, isCreating: false, isEnding: false, }); renderWithProviders(); expect(screen.getByRole('button', { name: /Stop Sleep/i })).toBeInTheDocument(); }); it('calls endSession when session is active and button is clicked', async () => { const endSessionMock = vi.fn(); (useSleepSession as any).mockReturnValue({ activeSession: { id: 1, start_time: '2024-01-01T12:00' }, isCreating: false, isEnding: false, endSession: endSessionMock, }); renderWithProviders(); const button = screen.getByRole('button', { name: /Stop Sleep/i }); fireEvent.click(button); await waitFor(() => expect(endSessionMock).toHaveBeenCalled()); }); });