diff --git a/src/modules/ad/domain/usecases/create-ad.usecase.ts b/src/modules/ad/domain/usecases/create-ad.usecase.ts index 6fb9d85..b04b2f3 100644 --- a/src/modules/ad/domain/usecases/create-ad.usecase.ts +++ b/src/modules/ad/domain/usecases/create-ad.usecase.ts @@ -56,57 +56,8 @@ export class CreateAdUseCase { withPoints: true, withTime: false, }); - this.ad.driverDistance = this.geography.driverRoute?.distance; - this.ad.driverDuration = this.geography.driverRoute?.duration; - this.ad.passengerDistance = this.geography.passengerRoute?.distance; - this.ad.passengerDuration = this.geography.passengerRoute?.duration; - this.ad.fwdAzimuth = this.geography.driverRoute - ? this.geography.driverRoute.fwdAzimuth - : this.geography.passengerRoute.fwdAzimuth; - this.ad.backAzimuth = this.geography.driverRoute - ? this.geography.driverRoute.backAzimuth - : this.geography.passengerRoute.backAzimuth; - this.ad.waypoints = this.directionEncoder.encode( - command.createAdRequest.waypoints, - ); - this.ad.direction = this.geography.driverRoute - ? this.directionEncoder.encode(this.geography.driverRoute.points) - : undefined; - this.ad.monTime = TimeConverter.toUtcDatetime( - this.ad.fromDate, - command.createAdRequest.monTime, - this.timezone, - ); - this.ad.tueTime = TimeConverter.toUtcDatetime( - this.ad.fromDate, - command.createAdRequest.tueTime, - this.timezone, - ); - this.ad.wedTime = TimeConverter.toUtcDatetime( - this.ad.fromDate, - command.createAdRequest.wedTime, - this.timezone, - ); - this.ad.thuTime = TimeConverter.toUtcDatetime( - this.ad.fromDate, - command.createAdRequest.thuTime, - this.timezone, - ); - this.ad.friTime = TimeConverter.toUtcDatetime( - this.ad.fromDate, - command.createAdRequest.friTime, - this.timezone, - ); - this.ad.satTime = TimeConverter.toUtcDatetime( - this.ad.fromDate, - command.createAdRequest.satTime, - this.timezone, - ); - this.ad.sunTime = TimeConverter.toUtcDatetime( - this.ad.fromDate, - command.createAdRequest.sunTime, - this.timezone, - ); + this.setAdGeography(command); + this.setAdSchedule(command); return await this.adRepository.createAd(this.ad); } catch (error) { throw error; @@ -133,4 +84,61 @@ export class CreateAdUseCase { private setGeography = (coordinates: Coordinate[]): void => { this.geography = new Geography(coordinates); }; + + private setAdGeography = (command: CreateAdCommand): void => { + this.ad.driverDistance = this.geography.driverRoute?.distance; + this.ad.driverDuration = this.geography.driverRoute?.duration; + this.ad.passengerDistance = this.geography.passengerRoute?.distance; + this.ad.passengerDuration = this.geography.passengerRoute?.duration; + this.ad.fwdAzimuth = this.geography.driverRoute + ? this.geography.driverRoute.fwdAzimuth + : this.geography.passengerRoute.fwdAzimuth; + this.ad.backAzimuth = this.geography.driverRoute + ? this.geography.driverRoute.backAzimuth + : this.geography.passengerRoute.backAzimuth; + this.ad.waypoints = this.directionEncoder.encode( + command.createAdRequest.waypoints, + ); + this.ad.direction = this.geography.driverRoute + ? this.directionEncoder.encode(this.geography.driverRoute.points) + : undefined; + }; + + private setAdSchedule = (command: CreateAdCommand): void => { + this.ad.monTime = TimeConverter.toUtcDatetime( + this.ad.fromDate, + command.createAdRequest.monTime, + this.timezone, + ); + this.ad.tueTime = TimeConverter.toUtcDatetime( + this.ad.fromDate, + command.createAdRequest.tueTime, + this.timezone, + ); + this.ad.wedTime = TimeConverter.toUtcDatetime( + this.ad.fromDate, + command.createAdRequest.wedTime, + this.timezone, + ); + this.ad.thuTime = TimeConverter.toUtcDatetime( + this.ad.fromDate, + command.createAdRequest.thuTime, + this.timezone, + ); + this.ad.friTime = TimeConverter.toUtcDatetime( + this.ad.fromDate, + command.createAdRequest.friTime, + this.timezone, + ); + this.ad.satTime = TimeConverter.toUtcDatetime( + this.ad.fromDate, + command.createAdRequest.satTime, + this.timezone, + ); + this.ad.sunTime = TimeConverter.toUtcDatetime( + this.ad.fromDate, + command.createAdRequest.sunTime, + this.timezone, + ); + }; } diff --git a/src/modules/ad/tests/unit/domain/create-ad.usecase.spec.ts b/src/modules/ad/tests/unit/domain/create-ad.usecase.spec.ts index 9079642..040c763 100644 --- a/src/modules/ad/tests/unit/domain/create-ad.usecase.spec.ts +++ b/src/modules/ad/tests/unit/domain/create-ad.usecase.spec.ts @@ -9,14 +9,48 @@ import { Ad } from '../../../domain/entities/ad'; import { AdProfile } from '../../../mappers/ad.profile'; import { Frequency } from '../../../domain/types/frequency.enum'; import { RouteKey } from '../../../domain/entities/geography'; +import { DatabaseException } from '../../../../database/exceptions/database.exception'; +import { Route } from '../../../../geography/domain/entities/route'; -const mockAdRepository = {}; +const mockAdRepository = { + createAd: jest.fn().mockImplementation((ad) => { + if (ad.uuid == '00000000-0000-0000-0000-000000000000') + throw new DatabaseException(); + return new Ad(); + }), +}; const mockGeorouterCreator = { create: jest.fn().mockImplementation(() => ({ route: jest.fn().mockImplementation(() => [ + { + key: RouteKey.DRIVER, + route: { + points: [], + fwdAzimuth: 0, + backAzimuth: 180, + distance: 20000, + duration: 1800, + }, + }, + { + key: RouteKey.PASSENGER, + route: { + points: [], + fwdAzimuth: 0, + backAzimuth: 180, + distance: 20000, + duration: 1800, + }, + }, { key: RouteKey.COMMON, - points: [], + route: { + points: [], + fwdAzimuth: 0, + backAzimuth: 180, + distance: 20000, + duration: 1800, + }, }, ]), })), @@ -31,7 +65,9 @@ const mockParamsProvider = { const mockTimezoneFinder = { timezones: jest.fn().mockImplementation(() => ['Europe/Paris']), }; -const mockDirectionEncoder = {}; +const mockDirectionEncoder = { + encode: jest.fn(), +}; const createAdRequest: CreateAdRequest = { uuid: '77c55dfc-c28b-4026-942e-f94e95401fb1', @@ -64,6 +100,18 @@ const createAdRequest: CreateAdRequest = { ], }; +const setUuid = async (uuid: string): Promise => { + createAdRequest.uuid = uuid; +}; + +const setIsDriver = async (isDriver: boolean): Promise => { + createAdRequest.driver = isDriver; +}; + +const setIsPassenger = async (isPassenger: boolean): Promise => { + createAdRequest.passenger = isPassenger; +}; + describe('CreateAdUseCase', () => { let createAdUseCase: CreateAdUseCase; @@ -103,12 +151,26 @@ describe('CreateAdUseCase', () => { expect(createAdUseCase).toBeDefined(); }); - // describe('execute', () => { - // it('should create an ad', async () => { - // const ad = await createAdUseCase.execute( - // new CreateAdCommand(createAdRequest), - // ); - // expect(ad).toBeInstanceOf(Ad); - // }); - // }); + describe('execute', () => { + it('should create an ad as driver', async () => { + const ad = await createAdUseCase.execute( + new CreateAdCommand(createAdRequest), + ); + expect(ad).toBeInstanceOf(Ad); + }); + it('should create an ad as passenger', async () => { + await setIsDriver(false); + await setIsPassenger(true); + const ad = await createAdUseCase.execute( + new CreateAdCommand(createAdRequest), + ); + expect(ad).toBeInstanceOf(Ad); + }); + it('should throw an exception if repository fails', async () => { + await setUuid('00000000-0000-0000-0000-000000000000'); + await expect( + createAdUseCase.execute(new CreateAdCommand(createAdRequest)), + ).rejects.toBeInstanceOf(DatabaseException); + }); + }); });