From 5aa4d9e5688ea04c0626ab5716785c414740889d Mon Sep 17 00:00:00 2001 From: Romain Thouvenin Date: Fri, 3 May 2024 11:21:37 +0200 Subject: [PATCH] Unit tests for the update-ad service --- tests/unit/ad/ad.mocks.ts | 10 +++ tests/unit/ad/core/create-ad.service.spec.ts | 26 +++---- tests/unit/ad/core/update-ad.service.spec.ts | 71 ++++++++++++++++++++ 3 files changed, 90 insertions(+), 17 deletions(-) create mode 100644 tests/unit/ad/ad.mocks.ts create mode 100644 tests/unit/ad/core/update-ad.service.spec.ts diff --git a/tests/unit/ad/ad.mocks.ts b/tests/unit/ad/ad.mocks.ts new file mode 100644 index 0000000..2b97881 --- /dev/null +++ b/tests/unit/ad/ad.mocks.ts @@ -0,0 +1,10 @@ +import { DateTimeTransformerPort } from '@modules/ad/core/application/ports/datetime-transformer.port'; + +export function mockInputDateTimeTransformer(): DateTimeTransformerPort { + return { + fromDate: jest.fn(), + toDate: jest.fn(), + day: jest.fn(), + time: jest.fn(), + }; +} diff --git a/tests/unit/ad/core/create-ad.service.spec.ts b/tests/unit/ad/core/create-ad.service.spec.ts index 18ed15d..89ac262 100644 --- a/tests/unit/ad/core/create-ad.service.spec.ts +++ b/tests/unit/ad/core/create-ad.service.spec.ts @@ -1,18 +1,17 @@ -import { Test, TestingModule } from '@nestjs/testing'; +import { AggregateID, ConflictException } from '@mobicoop/ddd-library'; import { AD_REPOSITORY, INPUT_DATETIME_TRANSFORMER, } from '@modules/ad/ad.di-tokens'; -import { WaypointDto } from '@modules/ad/interface/grpc-controllers/dtos/waypoint.dto'; -import { CreateAdRequestDto } from '@modules/ad/interface/grpc-controllers/dtos/create-ad.request.dto'; -import { AggregateID } from '@mobicoop/ddd-library'; -import { AdEntity } from '@modules/ad/core/domain/ad.entity'; -import { ConflictException } from '@mobicoop/ddd-library'; -import { Frequency } from '@modules/ad/core/domain/ad.types'; -import { CreateAdService } from '@modules/ad/core/application/commands/create-ad/create-ad.service'; import { CreateAdCommand } from '@modules/ad/core/application/commands/create-ad/create-ad.command'; +import { CreateAdService } from '@modules/ad/core/application/commands/create-ad/create-ad.service'; +import { AdEntity } from '@modules/ad/core/domain/ad.entity'; import { AdAlreadyExistsException } from '@modules/ad/core/domain/ad.errors'; -import { DateTimeTransformerPort } from '@modules/ad/core/application/ports/datetime-transformer.port'; +import { Frequency } from '@modules/ad/core/domain/ad.types'; +import { CreateAdRequestDto } from '@modules/ad/interface/grpc-controllers/dtos/create-ad.request.dto'; +import { WaypointDto } from '@modules/ad/interface/grpc-controllers/dtos/waypoint.dto'; +import { Test, TestingModule } from '@nestjs/testing'; +import { mockInputDateTimeTransformer } from '../ad.mocks'; const originWaypoint: WaypointDto = { position: 0, @@ -64,13 +63,6 @@ const mockAdRepository = { }), }; -const mockInputDateTimeTransformer: DateTimeTransformerPort = { - fromDate: jest.fn(), - toDate: jest.fn(), - day: jest.fn(), - time: jest.fn(), -}; - describe('create-ad.service', () => { let createAdService: CreateAdService; @@ -83,7 +75,7 @@ describe('create-ad.service', () => { }, { provide: INPUT_DATETIME_TRANSFORMER, - useValue: mockInputDateTimeTransformer, + useValue: mockInputDateTimeTransformer(), }, CreateAdService, ], diff --git a/tests/unit/ad/core/update-ad.service.spec.ts b/tests/unit/ad/core/update-ad.service.spec.ts new file mode 100644 index 0000000..9d56fcc --- /dev/null +++ b/tests/unit/ad/core/update-ad.service.spec.ts @@ -0,0 +1,71 @@ +import { + AD_REPOSITORY, + INPUT_DATETIME_TRANSFORMER, +} from '@modules/ad/ad.di-tokens'; +import { UpdateAdCommand } from '@modules/ad/core/application/commands/update-ad/update-ad.command'; +import { UpdateAdService } from '@modules/ad/core/application/commands/update-ad/update-ad.service'; +import { AdEntity } from '@modules/ad/core/domain/ad.entity'; +import { Status } from '@modules/ad/core/domain/ad.types'; +import { EventEmitter2 } from '@nestjs/event-emitter'; +import { Test, TestingModule } from '@nestjs/testing'; +import { mockInputDateTimeTransformer } from '../ad.mocks'; +import { punctualCreateAdRequest } from '../interface/ad.fixtures'; +import { punctualPassengerCreateAdProps } from './ad.fixtures'; + +const mockAdRepository = { + findOneById: jest.fn().mockImplementation( + async (id) => + new AdEntity({ + id, + props: { ...punctualPassengerCreateAdProps(), status: Status.VALID }, + }), + ), + update: jest.fn(), +}; + +const mockEventEmitter = { + emitAsync: jest.fn(), +}; + +describe('create-ad.service', () => { + let updateAdService: UpdateAdService; + + beforeAll(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [ + { + provide: AD_REPOSITORY, + useValue: mockAdRepository, + }, + { + provide: INPUT_DATETIME_TRANSFORMER, + useValue: mockInputDateTimeTransformer(), + }, + { + provide: EventEmitter2, + useValue: mockEventEmitter, + }, + UpdateAdService, + ], + }).compile(); + + updateAdService = module.get(UpdateAdService); + }); + + it('should be defined', () => { + expect(updateAdService).toBeDefined(); + }); + + describe('execute', () => { + it('should update the ad in the repository and emit an event', async () => { + const command = new UpdateAdCommand({ + adId: '200d61a8-d878-4378-a609-c19ea71633d2', + ...punctualCreateAdRequest(), + }); + + await updateAdService.execute(command); + expect(mockAdRepository.update).toHaveBeenCalled(); + expect(mockEventEmitter.emitAsync).toHaveBeenCalled(); + }); + }); +});