import { PARAMS_PROVIDER, TIMEZONE_FINDER, TIME_CONVERTER, } from '@modules/ad/ad.di-tokens'; import { Frequency } from '@modules/ad/core/application/ports/datetime-transformer.port'; import { DefaultParamsProviderPort } from '@modules/ad/core/application/ports/default-params-provider.port'; import { TimeConverterPort } from '@modules/ad/core/application/ports/time-converter.port'; import { TimezoneFinderPort } from '@modules/ad/core/application/ports/timezone-finder.port'; import { AlgorithmType } from '@modules/ad/core/application/types/algorithm.types'; import { InputDateTimeTransformer } from '@modules/ad/infrastructure/input-datetime-transformer'; import { Test, TestingModule } from '@nestjs/testing'; const mockDefaultParamsProvider: DefaultParamsProviderPort = { getParams: () => { return { DEPARTURE_TIME_MARGIN: 900, DRIVER: false, SEATS_PROPOSED: 3, PASSENGER: true, SEATS_REQUESTED: 1, STRICT: false, TIMEZONE: 'Europe/Paris', ALGORITHM_TYPE: AlgorithmType.PASSENGER_ORIENTED, REMOTENESS: 15000, USE_PROPORTION: true, PROPORTION: 0.3, USE_AZIMUTH: true, AZIMUTH_MARGIN: 10, MAX_DETOUR_DISTANCE_RATIO: 0.3, MAX_DETOUR_DURATION_RATIO: 0.3, }; }, }; const mockTimezoneFinder: TimezoneFinderPort = { timezones: jest.fn().mockImplementation(() => ['Europe/Paris']), }; const mockTimeConverter: TimeConverterPort = { localStringTimeToUtcStringTime: jest .fn() .mockImplementationOnce(() => '00:15'), utcStringTimeToLocalStringTime: jest.fn(), localStringDateTimeToUtcDate: jest .fn() .mockImplementationOnce(() => new Date('2023-07-30T06:15:00.000Z')) .mockImplementationOnce(() => new Date('2023-07-20T08:15:00.000Z')) .mockImplementationOnce(() => new Date('2023-07-19T23:15:00.000Z')) .mockImplementationOnce(() => new Date('2023-07-19T23:15:00.000Z')), utcStringDateTimeToLocalIsoString: jest.fn(), utcUnixEpochDayFromTime: jest .fn() .mockImplementationOnce(() => 4) .mockImplementationOnce(() => 3) .mockImplementationOnce(() => 3) .mockImplementationOnce(() => 5) .mockImplementationOnce(() => 5), localUnixEpochDayFromTime: jest.fn(), }; describe('Input Datetime Transformer', () => { let inputDatetimeTransformer: InputDateTimeTransformer; beforeAll(async () => { const module: TestingModule = await Test.createTestingModule({ providers: [ { provide: PARAMS_PROVIDER, useValue: mockDefaultParamsProvider, }, { provide: TIMEZONE_FINDER, useValue: mockTimezoneFinder, }, { provide: TIME_CONVERTER, useValue: mockTimeConverter, }, InputDateTimeTransformer, ], }).compile(); inputDatetimeTransformer = module.get( InputDateTimeTransformer, ); }); it('should be defined', () => { expect(inputDatetimeTransformer).toBeDefined(); }); describe('fromDate', () => { it('should return fromDate as is if frequency is recurrent', () => { const transformedFromDate: string = inputDatetimeTransformer.fromDate( { date: '2023-07-30', time: '07:15', coordinates: { lon: 6.175, lat: 48.685, }, }, Frequency.RECURRENT, ); expect(transformedFromDate).toBe('2023-07-30'); }); it('should return transformed fromDate if frequency is punctual and coordinates are those of Nancy', () => { const transformedFromDate: string = inputDatetimeTransformer.fromDate( { date: '2023-07-30', time: '07:15', coordinates: { lon: 6.175, lat: 48.685, }, }, Frequency.PUNCTUAL, ); expect(transformedFromDate).toBe('2023-07-30'); }); }); describe('toDate', () => { it('should return toDate as is if frequency is recurrent', () => { const transformedToDate: string = inputDatetimeTransformer.toDate( '2024-07-29', { date: '2023-07-20', time: '10:15', coordinates: { lon: 6.175, lat: 48.685, }, }, Frequency.RECURRENT, ); expect(transformedToDate).toBe('2024-07-29'); }); it('should return transformed fromDate if frequency is punctual', () => { const transformedToDate: string = inputDatetimeTransformer.toDate( '2024-07-30', { date: '2023-07-20', time: '10:15', coordinates: { lon: 6.175, lat: 48.685, }, }, Frequency.PUNCTUAL, ); expect(transformedToDate).toBe('2023-07-20'); }); }); describe('day', () => { it('should not change day if frequency is recurrent and converted UTC time is on the same day', () => { const day: number = inputDatetimeTransformer.day( 1, { date: '2023-07-24', time: '01:15', coordinates: { lon: 6.175, lat: 48.685, }, }, Frequency.RECURRENT, ); expect(day).toBe(1); }); it('should change day if frequency is recurrent and converted UTC time is on the previous day', () => { const day: number = inputDatetimeTransformer.day( 1, { date: '2023-07-24', time: '00:15', coordinates: { lon: 6.175, lat: 48.685, }, }, Frequency.RECURRENT, ); expect(day).toBe(0); }); it('should change day if frequency is recurrent and converted UTC time is on the previous day and given day is sunday', () => { const day: number = inputDatetimeTransformer.day( 0, { date: '2023-07-23', time: '00:15', coordinates: { lon: 6.175, lat: 48.685, }, }, Frequency.RECURRENT, ); expect(day).toBe(6); }); it('should change day if frequency is recurrent and converted UTC time is on the next day', () => { const day: number = inputDatetimeTransformer.day( 1, { date: '2023-07-24', time: '23:15', coordinates: { lon: 30.82, lat: 49.37, }, }, Frequency.RECURRENT, ); expect(day).toBe(2); }); it('should change day if frequency is recurrent and converted UTC time is on the next day and given day is saturday(6)', () => { const day: number = inputDatetimeTransformer.day( 6, { date: '2023-07-29', time: '23:15', coordinates: { lon: 30.82, lat: 49.37, }, }, Frequency.RECURRENT, ); expect(day).toBe(0); }); it('should return utc fromDate day if frequency is punctual', () => { const day: number = inputDatetimeTransformer.day( 1, { date: '2023-07-20', time: '00:15', coordinates: { lon: 6.175, lat: 48.685, }, }, Frequency.PUNCTUAL, ); expect(day).toBe(3); }); }); describe('time', () => { it('should transform given time to utc time if frequency is recurrent', () => { const time: string = inputDatetimeTransformer.time( { date: '2023-07-24', time: '01:15', coordinates: { lon: 6.175, lat: 48.685, }, }, Frequency.RECURRENT, ); expect(time).toBe('00:15'); }); it('should return given time to utc time if frequency is punctual', () => { const time: string = inputDatetimeTransformer.time( { date: '2023-07-24', time: '01:15', coordinates: { lon: 6.175, lat: 48.685, }, }, Frequency.PUNCTUAL, ); expect(time).toBe('23:15'); }); }); });