import { describe, it, expect, vi, beforeEach } from 'vitest'; import { render, screen } from '@testing-library/react'; import { ShiftCard } from '../shifts/shift-card'; import { useSignUpShift, useCancelSignUp } from '@/hooks/useShifts'; vi.mock('@/hooks/useShifts', () => ({ useSignUpShift: vi.fn(), useCancelSignUp: vi.fn(), })); describe('ShiftCard', () => { const mockSignUp = vi.fn(); const mockCancel = vi.fn(); beforeEach(() => { vi.clearAllMocks(); (useSignUpShift as ReturnType).mockReturnValue({ mutate: mockSignUp, isPending: false }); (useCancelSignUp as ReturnType).mockReturnValue({ mutate: mockCancel, isPending: false }); }); it('shows capacity correctly (2/3 spots filled)', () => { render( ); expect(screen.getByText('2/3 spots filled')).toBeInTheDocument(); }); it('disables sign-up button when full', () => { render( ); expect(screen.getByText('3/3 spots filled')).toBeInTheDocument(); expect(screen.queryByRole('button', { name: 'Sign Up' })).not.toBeInTheDocument(); }); it('shows "Past" badge and no sign-up button for past shifts', () => { render( ); expect(screen.getByText('Past')).toBeInTheDocument(); expect(screen.queryByRole('button', { name: 'Sign Up' })).not.toBeInTheDocument(); }); it('shows cancel sign-up button when signed up', () => { render( ); expect(screen.getByText('Cancel Sign-up')).toBeInTheDocument(); }); });