import { spDateOnlyToIso } from './dateUtils'; // SharePoint хранит поле «только дата» как полночь по поясу САЙТА, переведённую // в UTC, — поэтому «5 октября» приходит из REST как предыдущий день по UTC. describe('spDateOnlyToIso', () => { it('сайт в UTC+5 (Астана с 2024): 04T19:00Z → 5-е', () => { expect(spDateOnlyToIso('2026-10-04T19:00:00Z')).toBe('2026-10-05'); }); it('сайт в UTC+6 (старый пояс Астаны): 04T18:00Z → 5-е', () => { expect(spDateOnlyToIso('2026-10-04T18:00:00Z')).toBe('2026-10-05'); }); it('сайт в UTC: 05T00:00Z → 5-е', () => { expect(spDateOnlyToIso('2026-10-05T00:00:00Z')).toBe('2026-10-05'); }); it('переход через месяц и год', () => { expect(spDateOnlyToIso('2026-09-30T19:00:00Z')).toBe('2026-10-01'); expect(spDateOnlyToIso('2026-12-31T19:00:00Z')).toBe('2027-01-01'); }); it('високосный год: 28 февраля → 29-е', () => { expect(spDateOnlyToIso('2028-02-28T19:00:00Z')).toBe('2028-02-29'); }); it('строку без времени возвращает как есть', () => { expect(spDateOnlyToIso('2026-10-05')).toBe('2026-10-05'); }); it('пустое/отсутствующее значение → пустая строка', () => { expect(spDateOnlyToIso('')).toBe(''); expect(spDateOnlyToIso(null)).toBe(''); expect(spDateOnlyToIso(undefined)).toBe(''); }); it('повторное сохранение не сдвигает дату (запись → чтение → запись)', () => { // Имитация: SP вернул 04T19:00Z, мы прочитали, сохранили обратно «как есть», // SP снова хранит 04T19:00Z — дата обязана остаться 5-м, а не уехать на 4-е. const firstRead = spDateOnlyToIso('2026-10-04T19:00:00Z'); expect(firstRead).toBe('2026-10-05'); const secondRead = spDateOnlyToIso(`${addDays(firstRead, -1)}T19:00:00Z`); expect(secondRead).toBe(firstRead); }); }); function addDays(isoDate: string, days: number): string { const d = new Date(`${isoDate}T00:00:00Z`); d.setUTCDate(d.getUTCDate() + days); return d.toISOString().slice(0, 10); }