import { describe, it, expect, vi } from 'vitest'; import { render, screen, fireEvent } from '@testing-library/react'; import '@testing-library/jest-dom'; import TimeAdjuster from '../../src/components/tracker/TimeAdjuster'; describe('TimeAdjuster', () => { it('renders with default value', () => { const { container } = render( {}} />); const input = container.querySelector('input'); expect(input).toBeInTheDocument(); }); it('calls onTimeChange when value changes', () => { const handleChange = vi.fn(); const { container } = render(); const input = container.querySelector('input'); vi.clearAllMocks(); fireEvent.change(input!, { target: { value: '2024-01-01T12:00' } }); expect(handleChange).toHaveBeenCalledWith(new Date('2024-01-01T12:00').toISOString()); }); it('resets to now when reset button is clicked', async () => { const handleChange = vi.fn(); render(); const resetButton = screen.getByText(/Reset to now/i); fireEvent.click(resetButton); expect(handleChange).toHaveBeenCalled(); }); it('handles invalid date input gracefully (returns empty string)', async () => { // Since we changed the implementation, it should no longer throw. // We can't easily test the useEffect error anymore because it doesn't throw, // but we can check if onTimeChange is called with "" for invalid input. const handleChange = vi.fn(); const { container } = render(); const input = container.querySelector('input'); fireEvent.change(input!, { target: { value: '2026-06-0' } }); // We might need to wait for the effect await new Promise((r) => setTimeout(r, 0)); expect(handleChange).toHaveBeenCalledWith(""); }); });