normogen/web/normogen-web/src/components/medication/MedicationManager.test.tsx

83 lines
2.7 KiB
TypeScript

import { describe, it, expect, beforeEach, vi } from 'vitest';
import { render, screen, fireEvent } from '@testing-library/react';
import { mockStoreFactory, setMockStore, resetMockStore } from '../../test/mockStore';
vi.mock('../../store/useStore', () => mockStoreFactory());
// Import AFTER the mock is registered so the component picks up the mock.
const { MedicationManager } = await import('./MedicationManager');
const { useAuthStore } = await import('../../store/useStore');
const med = (overrides: Partial<Record<string, unknown>> = {}) => ({
medication_id: 'm1',
name: 'Ibuprofen',
dosage: '200mg',
frequency: 'daily',
active: true,
instructions: undefined,
...overrides,
});
const baseActions = {
loadMedications: vi.fn(),
createMedication: vi.fn(),
updateMedication: vi.fn(),
deleteMedication: vi.fn(),
selectMedication: vi.fn(),
clearError: vi.fn(),
loadAdherence: vi.fn(),
logDose: vi.fn(),
isLoading: false,
error: null,
adherence: {},
selectedMedication: null,
};
describe('MedicationManager', () => {
beforeEach(() => {
resetMockStore();
setMockStore({
useAuthStore: { user: { user_id: 'u1', username: 'tester' }, profile: {} },
});
baseActions.loadMedications.mockClear();
});
it('renders the medications from the store', () => {
setMockStore({
useMedicationStore: {
...baseActions,
medications: [med({ name: 'Aspirin' }), med({ medication_id: 'm2', name: 'Warfarin' })],
},
});
render(<MedicationManager />);
expect(screen.getByText('Aspirin')).toBeInTheDocument();
expect(screen.getByText('Warfarin')).toBeInTheDocument();
});
it('shows the empty state when there are no medications', () => {
setMockStore({ useMedicationStore: { ...baseActions, medications: [] } });
render(<MedicationManager />);
expect(screen.getByText(/No medications yet/i)).toBeInTheDocument();
});
it('loads medications on mount', () => {
setMockStore({ useMedicationStore: { ...baseActions, medications: [] } });
render(<MedicationManager />);
expect(baseActions.loadMedications).toHaveBeenCalled();
});
it('opens the create dialog when Add is clicked', () => {
setMockStore({ useMedicationStore: { ...baseActions, medications: [] } });
render(<MedicationManager />);
fireEvent.click(screen.getByText('Add'));
expect(screen.getByText('Add medication')).toBeInTheDocument();
});
it('renders an error banner when the store has an error', () => {
setMockStore({
useMedicationStore: { ...baseActions, medications: [], error: 'Something broke' },
});
render(<MedicationManager />);
expect(screen.getByText('Something broke')).toBeInTheDocument();
});
});