import React from 'react'; import '@testing-library/jest-dom'; import { render, screen, fireEvent, waitFor } from '@testing-library/react'; import AddReminderModal from '../AddReminderModal'; describe('AddReminderModal validation', () => { const onClose = jest.fn(); const onAdd = jest.fn(); beforeEach(() => { jest.clearAllMocks(); }); it('displays an error when frequency is below the minimum', () => { render(); const frequencyInput = screen.getByLabelText('Remind me every (minutes)'); fireEvent.change(frequencyInput, { target: { value: '1' } }); expect( screen.getByText(/Choose a value between 5 and 720 minutes\./i) ).toBeInTheDocument(); const submitButton = screen.getByRole('button', { name: /add reminder/i }); expect(submitButton).toBeDisabled(); }); it('disables submit when end time is earlier than start time', () => { render(); const startInput = screen.getByLabelText('From'); const endInput = screen.getByLabelText('Until'); fireEvent.change(startInput, { target: { value: '10:00' } }); fireEvent.change(endInput, { target: { value: '09:00' } }); expect( screen.getByText(/End time must be later than start time\./i) ).toBeInTheDocument(); expect( screen.getByRole('button', { name: /add reminder/i }) ).toBeDisabled(); }); it('calls onAdd with valid data', async () => { const resolveAdd = jest.fn().mockResolvedValue(undefined); render(); fireEvent.change(screen.getByLabelText('Title'), { target: { value: 'Hydrate' }, }); fireEvent.change(screen.getByLabelText('Remind me every (minutes)'), { target: { value: '30' }, }); fireEvent.change(screen.getByLabelText('From'), { target: { value: '08:00' }, }); fireEvent.change(screen.getByLabelText('Until'), { target: { value: '12:00' }, }); fireEvent.click(screen.getByRole('button', { name: /add reminder/i })); await waitFor(() => expect(resolveAdd).toHaveBeenCalledTimes(1)); expect(resolveAdd).toHaveBeenCalledWith({ title: 'Hydrate', icon: 'bell', frequencyMinutes: 30, startTime: '08:00', endTime: '12:00', }); }); });