import { expect, it, vi } from 'vitest'; import { screen } from '@testing-library/react'; import { FormProvider, useForm } from 'react-hook-form'; import ClientRenewalFields from '@/pages/clients/ClientRenewalFields'; import { HttpUtil, Msg } from '@/utils'; import { renderWithProviders } from './test-utils'; function PreviewForm() { const form = useForm({ defaultValues: { reset: 1, resetDay: 0, resetWeekday: 0, resetMax: 0 } }); return ( {}} /> ); } it.each([ { name: 'explains Local UTC without converting into the browser timezone', zone: 'Local', label: 'Server local time', dates: ['2026-09-27T05:00:00Z', '2026-09-27T04:59:59Z', '2026-09-28T05:00:00Z'], displayed: [ '2026-09-27 05:00:00 UTC+00:00', '2026-09-27 04:59:59 UTC+00:00', '2026-09-28 05:00:00 UTC+00:00', ], }, { name: 'preserves different offsets across a daylight-saving transition', zone: 'America/New_York', label: 'America/New_York', dates: ['2030-03-10T00:00:00-05:00', '2030-03-09T23:59:59-05:00', '2030-03-17T00:00:00-04:00'], displayed: [ '2030-03-10 00:00:00 UTC-05:00', '2030-03-09 23:59:59 UTC-05:00', '2030-03-17 00:00:00 UTC-04:00', ], }, { name: 'keeps fractional cutoffs and fractional-hour server offsets', zone: 'Local', label: 'Server local time', dates: [ '2030-01-01T00:00:00.123+05:45', '2030-01-01T00:00:00+05:45', '2030-01-02T00:00:00.123+05:45', ], displayed: [ '2030-01-01 00:00:00.123 UTC+05:45', '2030-01-01 00:00:00 UTC+05:45', '2030-01-02 00:00:00.123 UTC+05:45', ], }, ])('$name', async ({ zone, label, dates, displayed }) => { const post = vi.spyOn(HttpUtil, 'post').mockResolvedValue( new Msg(true, '', { timeZone: zone, renewAt: dates[0], validThrough: dates[1], nextExpiry: dates[2], suggestedExpiryTime: 0, suggestedExpiry: '', renewals: 1, canRenew: true, delayedStart: false, }), ); try { renderWithProviders(); await screen.findByText(`Renewal preview (panel time zone: ${label})`); const times = Array.from(document.querySelectorAll('time')); expect(times.map((el) => el.textContent)).toEqual(displayed); expect(times.map((el) => el.dateTime)).toEqual(dates); expect(times.map((el) => el.dir)).toEqual(['ltr', 'ltr', 'ltr']); } finally { post.mockRestore(); } });