import {afterEach, beforeEach, describe, expect, it, vi} from 'vitest' import {ref} from 'vue' import {useMonthMatrix} from './useMonthMatrix' describe('useMonthMatrix', () => { it('always produces 6 weeks of 7 days', () => { const {weeks} = useMonthMatrix(ref(4), ref(2026)) // mai 2026 expect(weeks.value).toHaveLength(6) weeks.value.forEach(week => expect(week.days).toHaveLength(7)) }) it('starts every week on a Monday', () => { const {weeks} = useMonthMatrix(ref(4), ref(2026)) weeks.value.forEach(week => { const first = new Date(`${week.days[0].isoDate}T00:00:00`) expect(first.getDay()).toBe(1) // 1 = lundi }) }) it('flags exactly the days of the current month', () => { const {weeks} = useMonthMatrix(ref(4), ref(2026)) // mai = 31 jours const currentMonthDays = weeks.value .flatMap(w => w.days) .filter(d => d.isCurrentMonth) expect(currentMonthDays).toHaveLength(31) expect(currentMonthDays.every(d => d.isoDate.startsWith('2026-05'))).toBe(true) }) it('handles leap year February (29 days)', () => { const {weeks} = useMonthMatrix(ref(1), ref(2024)) // février 2024 const days = weeks.value.flatMap(w => w.days).filter(d => d.isCurrentMonth) expect(days).toHaveLength(29) }) it('assigns ISO week 1 to the week containing Jan 4th', () => { const {weeks} = useMonthMatrix(ref(0), ref(2026)) // janvier 2026 const weekWithJan4 = weeks.value.find(w => w.days.some(d => d.isoDate === '2026-01-04'), ) expect(weekWithJan4?.weekNumber).toBe(1) }) it('reacts to month/year changes', () => { const month = ref(4) const year = ref(2026) const {weeks} = useMonthMatrix(month, year) const mayCount = weeks.value.flatMap(w => w.days).filter(d => d.isCurrentMonth).length month.value = 1 // février year.value = 2024 const febCount = weeks.value.flatMap(w => w.days).filter(d => d.isCurrentMonth).length expect(mayCount).toBe(31) expect(febCount).toBe(29) }) describe('isToday', () => { beforeEach(() => { vi.useFakeTimers() vi.setSystemTime(new Date(2026, 4, 19)) // 19 mai 2026 }) afterEach(() => vi.useRealTimers()) it('flags only today', () => { const {weeks} = useMonthMatrix(ref(4), ref(2026)) const todays = weeks.value.flatMap(w => w.days).filter(d => d.isToday) expect(todays).toHaveLength(1) expect(todays[0].isoDate).toBe('2026-05-19') }) }) })