import React from 'react';
import { describe, it, expect, vi } from 'vitest';
import { render, fireEvent } from '@testing-library/react';
import { PixelCalendarGrid } from '../../forms/PixelCalendarGrid';
describe('PixelCalendarGrid', () => {
it('renders month label for given month', () => {
const month = new Date(2026, 5, 1); // June 2026
const { getByText } = render();
expect(getByText(/June 2026/i)).toBeTruthy();
});
it('next-month arrow advances month state', () => {
const onMonthChange = vi.fn();
const month = new Date(2026, 5, 1);
const { getByLabelText } = render(
,
);
fireEvent.click(getByLabelText(/next month/i));
expect(onMonthChange).toHaveBeenCalledTimes(1);
const arg = onMonthChange.mock.calls[0][0] as Date;
expect(arg.getFullYear()).toBe(2026);
expect(arg.getMonth()).toBe(6); // July
});
it('clicking a day calls onChange with that date', () => {
const onChange = vi.fn();
const month = new Date(2026, 5, 1);
const { getByLabelText } = render(
,
);
const day20 = getByLabelText(/June 20, 2026/i);
fireEvent.click(day20);
expect(onChange).toHaveBeenCalledTimes(1);
const arg = onChange.mock.calls[0][0] as Date;
expect(arg.getFullYear()).toBe(2026);
expect(arg.getMonth()).toBe(5);
expect(arg.getDate()).toBe(20);
});
it('disabled day is not clickable', () => {
const onChange = vi.fn();
const month = new Date(2026, 5, 1);
const disabled = new Date(2026, 5, 10);
const { getByLabelText } = render(
,
);
const day10 = getByLabelText(/June 10, 2026/i) as HTMLButtonElement;
expect(day10.disabled).toBe(true);
fireEvent.click(day10);
expect(onChange).not.toHaveBeenCalled();
});
it('rangePreview tints cells between from and hover', () => {
const month = new Date(2026, 5, 1);
const from = new Date(2026, 5, 10);
const hover = new Date(2026, 5, 15);
const { getByLabelText } = render(
,
);
// Day between from and hover should have in-range attribute
const day12 = getByLabelText(/June 12, 2026/i);
expect(day12.getAttribute('data-in-range')).toBe('true');
// Day outside the range should not have it
const day5 = getByLabelText(/June 5, 2026/i);
expect(day5.getAttribute('data-in-range')).not.toBe('true');
// Endpoints should be marked
const day10 = getByLabelText(/June 10, 2026/i);
expect(day10.getAttribute('data-range-endpoint')).toBe('true');
const day15 = getByLabelText(/June 15, 2026/i);
expect(day15.getAttribute('data-range-endpoint')).toBe('true');
});
});