import { describe, it, expect, vi } from 'vitest' import { render, fireEvent, screen } from '@testing-library/react' import { VacationDaysTable } from './VacationDaysTable' const ROWS = [ { year: 2026, totalDays: 10, savedDaysIn: 2 }, { year: 2027, totalDays: 25, savedDaysIn: 0 }, { year: 2028, totalDays: 25, savedDaysIn: 0 }, ] describe('VacationDaysTable', () => { it('renders one row per year', () => { render( {}} />) expect(screen.getByTestId('vacation-year-row-2026')).toBeInTheDocument() expect(screen.getByTestId('vacation-year-row-2027')).toBeInTheDocument() expect(screen.getByTestId('vacation-year-row-2028')).toBeInTheDocument() }) it('shows the total days and saved days for each year', () => { render( {}} />) const totalInput = screen.getByTestId('vacation-total-days-2026') as HTMLInputElement const savedInput = screen.getByTestId('vacation-saved-days-2026') as HTMLInputElement expect(totalInput.value).toBe('10') expect(savedInput.value).toBe('2') }) it('calls onSave with the edited year and total days when Spara is clicked', () => { const onSave = vi.fn() render() const totalInput = screen.getByTestId('vacation-total-days-2027') fireEvent.change(totalInput, { target: { value: '30' } }) fireEvent.click(screen.getByTestId('vacation-save-2027')) expect(onSave).toHaveBeenCalledWith(2027, 30, 0) }) it('calls onSave with edited saved-days-in value', () => { const onSave = vi.fn() render() const savedInput = screen.getByTestId('vacation-saved-days-2026') fireEvent.change(savedInput, { target: { value: '5' } }) fireEvent.click(screen.getByTestId('vacation-save-2026')) expect(onSave).toHaveBeenCalledWith(2026, 10, 5) }) it('does not mix up edits between rows', () => { const onSave = vi.fn() render() fireEvent.change(screen.getByTestId('vacation-total-days-2026'), { target: { value: '15' } }) fireEvent.click(screen.getByTestId('vacation-save-2027')) expect(onSave).toHaveBeenCalledWith(2027, 25, 0) }) it('disables save buttons while saving', () => { render( {}} isSaving />) expect(screen.getByTestId('vacation-save-2026')).toBeDisabled() }) it('shows an empty message when there are no rows', () => { render( {}} />) expect(screen.queryByTestId('vacation-days-table')).not.toBeInTheDocument() expect(screen.getByText(/Inga år att visa/)).toBeInTheDocument() }) it('shows an assumed badge for a year with no entered data (§3.2)', () => { const rows = [...ROWS, { year: 2029, totalDays: 25, savedDaysIn: 0, isAssumed: true }] render( {}} />) expect(screen.getByTestId('vacation-assumed-badge-2029')).toBeInTheDocument() expect(screen.queryByTestId('vacation-assumed-badge-2026')).not.toBeInTheDocument() }) })