import { getDateTimeFromISO } from './datetime' describe('datetime - getDateTimeFromISO', () => { // date formatted as per the Database API response const daylightSavingDateTime = '2024-01-31T10:09:33.706Z' // UTC const standardDateTime = '2024-07-31T10:09:33.706Z' // UTC const daylightSavingDateTimeMillis = 1704067200000 const standardDateTimeMillis = 1722470400000 it.each([ // from database => client ['America/Phoenix', 'en-US', '2024-01-31T03:09:33.706-07:00'], ['America/Chicago', 'en-US', '2024-01-31T04:09:33.706-06:00'], ['America/New_York', 'en-US', '2024-01-31T05:09:33.706-05:00'], ['America/Montevideo', 'es-UY', '2024-01-31T07:09:33.706-03:00'], ['America/Sao_Paulo', 'pt-BR', '2024-01-31T07:09:33.706-03:00'], ['UTC', 'en-US', '2024-01-31T10:09:33.706Z'], ['UTC', 'en-GB', '2024-01-31T10:09:33.706Z'], ['Europe/London', 'en-GB', '2024-01-31T10:09:33.706+00:00'], ['Europe/Paris', 'fr-FR', '2024-01-31T11:09:33.706+01:00'], ['Asia/Tbilisi', 'ka-GE', '2024-01-31T14:09:33.706+04:00'], ['Asia/Kolkata', 'hi-IN', '2024-01-31T15:39:33.706+05:30'], ])( 'daylightSavingDateTime - datetime (database: "%s" => client: "%s")', (timezone, locale, output) => expect( getDateTimeFromISO(daylightSavingDateTime, { timezone, locale }).toISO() ).toBe(output) ) it.each([ // from database => client ['America/Phoenix', 'en-US', '2024-01-31T03:09:33.706-07:00'], ['America/Chicago', 'en-US', '2024-01-31T04:09:33.706-06:00'], ['America/New_York', 'en-US', '2024-01-31T05:09:33.706-05:00'], ['America/Montevideo', 'es-UY', '2024-01-31T07:09:33.706-03:00'], ['America/Sao_Paulo', 'pt-BR', '2024-01-31T07:09:33.706-03:00'], ['UTC', 'en-US', '2024-01-31T10:09:33.706Z'], ['UTC', 'en-GB', '2024-01-31T10:09:33.706Z'], ['Europe/London', 'en-GB', '2024-01-31T10:09:33.706+00:00'], ['Europe/Paris', 'fr-FR', '2024-01-31T11:09:33.706+01:00'], ['Asia/Tbilisi', 'ka-GE', '2024-01-31T14:09:33.706+04:00'], ['Asia/Kolkata', 'hi-IN', '2024-01-31T15:39:33.706+05:30'], ])( 'daylightSavingDateTime - datetime (database: "%s" => client: "%s"), no change if subject is already in the client timezone', (timezone, locale, subject) => expect(getDateTimeFromISO(subject, { timezone, locale }).toISO()).toBe( subject ) ) it('should throw an error if the date string is invalid', () => expect(() => getDateTimeFromISO('invalid', {})).toThrow( 'Invalid date string: invalid' )) it.each([ // from database => client ['America/Phoenix', 'en-US', '2023-12-31T17:00:00.000-07:00'], ['America/Chicago', 'en-US', '2023-12-31T18:00:00.000-06:00'], ['America/New_York', 'en-US', '2023-12-31T19:00:00.000-05:00'], ['America/Montevideo', 'es-UY', '2023-12-31T21:00:00.000-03:00'], ['America/Sao_Paulo', 'pt-BR', '2023-12-31T21:00:00.000-03:00'], ['UTC', 'en-US', '2024-01-01T00:00:00.000Z'], ['UTC', 'en-GB', '2024-01-01T00:00:00.000Z'], ['Europe/London', 'en-GB', '2024-01-01T00:00:00.000+00:00'], ['Europe/Paris', 'fr-FR', '2024-01-01T01:00:00.000+01:00'], ['Asia/Tbilisi', 'ka-GE', '2024-01-01T04:00:00.000+04:00'], ['Asia/Kolkata', 'hi-IN', '2024-01-01T05:30:00.000+05:30'], ])( 'daylightSavingDateTime, parse milliseconds - datetime (database: "%s" => client: "%s")', (timezone, locale, output) => expect( getDateTimeFromISO(daylightSavingDateTimeMillis, { timezone, locale, }).toISO() ).toBe(output) ) it.each([ // from database => client ['America/Phoenix', 'en-US', '2024-07-31T03:09:33.706-07:00'], ['America/Chicago', 'en-US', '2024-07-31T05:09:33.706-05:00'], ['America/New_York', 'en-US', '2024-07-31T06:09:33.706-04:00'], ['America/Montevideo', 'es-UY', '2024-07-31T07:09:33.706-03:00'], ['America/Sao_Paulo', 'pt-BR', '2024-07-31T07:09:33.706-03:00'], ['UTC', 'en-US', '2024-07-31T10:09:33.706Z'], ['UTC', 'en-GB', '2024-07-31T10:09:33.706Z'], ['Europe/London', 'en-GB', '2024-07-31T11:09:33.706+01:00'], ['Europe/Paris', 'fr-FR', '2024-07-31T12:09:33.706+02:00'], ['Asia/Tbilisi', 'ka-GE', '2024-07-31T14:09:33.706+04:00'], ['Asia/Kolkata', 'hi-IN', '2024-07-31T15:39:33.706+05:30'], ])( 'standardDateTime - datetime (database: "%s" => client: "%s")', (timezone, locale, output) => expect( getDateTimeFromISO(standardDateTime, { timezone, locale }).toISO() ).toBe(output) ) it('should throw an error if the date string is invalid', () => expect(() => getDateTimeFromISO('invalid', {})).toThrow( 'Invalid date string: invalid' )) it.each([ // from database => client ['America/Phoenix', 'en-US', '2024-07-31T03:09:33.706-07:00'], ['America/Chicago', 'en-US', '2024-07-31T05:09:33.706-05:00'], ['America/New_York', 'en-US', '2024-07-31T06:09:33.706-04:00'], ['America/Montevideo', 'es-UY', '2024-07-31T07:09:33.706-03:00'], ['America/Sao_Paulo', 'pt-BR', '2024-07-31T07:09:33.706-03:00'], ['UTC', 'en-US', '2024-07-31T10:09:33.706Z'], ['UTC', 'en-GB', '2024-07-31T10:09:33.706Z'], ['Europe/London', 'en-GB', '2024-07-31T11:09:33.706+01:00'], ['Europe/Paris', 'fr-FR', '2024-07-31T12:09:33.706+02:00'], ['Asia/Tbilisi', 'ka-GE', '2024-07-31T14:09:33.706+04:00'], ['Asia/Kolkata', 'hi-IN', '2024-07-31T15:39:33.706+05:30'], ])( 'standardDateTime - datetime (database: "%s" => client: "%s", no change if subject is already in the client timezone)', (timezone, locale, subject) => expect(getDateTimeFromISO(subject, { timezone, locale }).toISO()).toBe( subject ) ) it.each([ // from database => client ['America/Phoenix', 'en-US', '2024-07-31T17:00:00.000-07:00'], ['America/Chicago', 'en-US', '2024-07-31T19:00:00.000-05:00'], ['America/New_York', 'en-US', '2024-07-31T20:00:00.000-04:00'], ['America/Montevideo', 'es-UY', '2024-07-31T21:00:00.000-03:00'], ['America/Sao_Paulo', 'pt-BR', '2024-07-31T21:00:00.000-03:00'], ['UTC', 'en-US', '2024-08-01T00:00:00.000Z'], ['UTC', 'en-GB', '2024-08-01T00:00:00.000Z'], ['Europe/London', 'en-GB', '2024-08-01T01:00:00.000+01:00'], ['Europe/Paris', 'fr-FR', '2024-08-01T02:00:00.000+02:00'], ['Asia/Tbilisi', 'ka-GE', '2024-08-01T04:00:00.000+04:00'], ['Asia/Kolkata', 'hi-IN', '2024-08-01T05:30:00.000+05:30'], ])( 'standardDateTime, parse milliseconds - datetime (database: "%s" => client: "%s")', (timezone, locale, output) => expect( getDateTimeFromISO(standardDateTimeMillis, { timezone, locale }).toISO() ).toBe(output) ) it('should throw an error if the date string is invalid', () => expect(() => getDateTimeFromISO('invalid', {})).toThrow( 'Invalid date string: invalid' )) })