From 525a1b9f3c7acde457c5ba904a008a2827a95b37 Mon Sep 17 00:00:00 2001 From: sbriat Date: Fri, 27 Jan 2023 16:28:50 +0100 Subject: [PATCH] complete repository test --- .../secondaries/prisma-repository.abstract.ts | 20 ++++++++ .../src/interfaces/repository.interface.ts | 1 + .../tests/unit/prisma-repository.spec.ts | 50 +++++++++++++++++++ 3 files changed, 71 insertions(+) diff --git a/src/modules/database/src/adapters/secondaries/prisma-repository.abstract.ts b/src/modules/database/src/adapters/secondaries/prisma-repository.abstract.ts index 0c7fbb2..40b2f6b 100644 --- a/src/modules/database/src/adapters/secondaries/prisma-repository.abstract.ts +++ b/src/modules/database/src/adapters/secondaries/prisma-repository.abstract.ts @@ -160,4 +160,24 @@ export abstract class PrismaRepository implements IRepository { } } } + + async deleteMany(where: any): Promise { + try { + const entity = await this._prisma[this._model].deleteMany({ + where: where, + }); + + return entity; + } catch (e) { + if (e instanceof PrismaClientKnownRequestError) { + throw new DatabaseException( + PrismaClientKnownRequestError.name, + e.code, + e.message, + ); + } else { + throw new DatabaseException(); + } + } + } } diff --git a/src/modules/database/src/interfaces/repository.interface.ts b/src/modules/database/src/interfaces/repository.interface.ts index 9228712..8912545 100644 --- a/src/modules/database/src/interfaces/repository.interface.ts +++ b/src/modules/database/src/interfaces/repository.interface.ts @@ -13,4 +13,5 @@ export interface IRepository { update(uuid: string, entity: Partial, include?: any): Promise; updateWhere(where: any, entity: Partial | any, include?: any): Promise; delete(uuid: string): Promise; + deleteMany(where: any): Promise; } diff --git a/src/modules/database/tests/unit/prisma-repository.spec.ts b/src/modules/database/tests/unit/prisma-repository.spec.ts index 5ae3feb..3595eeb 100644 --- a/src/modules/database/tests/unit/prisma-repository.spec.ts +++ b/src/modules/database/tests/unit/prisma-repository.spec.ts @@ -184,6 +184,30 @@ const mockPrismaService = { throw new Error(); } }), + + deleteMany: jest + .fn() + // eslint-disable-next-line @typescript-eslint/no-unused-vars + .mockImplementationOnce((params?: any) => { + throw new PrismaClientKnownRequestError('unknown request', { + code: 'code', + clientVersion: 'version', + }); + }) + .mockImplementation((params: any) => { + let found = false; + + fakeEntities.forEach((entity, index) => { + if (entity.uuid === params?.where?.uuid) { + found = true; + fakeEntities.splice(index, 1); + } + }); + + if (!found) { + throw new Error(); + } + }), }, }; @@ -372,4 +396,30 @@ describe('PrismaRepository', () => { ); }); }); + + describe('deleteMany', () => { + it('should throw a DatabaseException for client error', async () => { + await expect( + fakeRepository.deleteMany({ uuid: 'fake-uuid' }), + ).rejects.toBeInstanceOf(DatabaseException); + }); + + it('should delete entities based on their uuid', async () => { + const savedUuid = fakeEntities[0].uuid; + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const res = await fakeRepository.deleteMany({ uuid: savedUuid }); + + const deletedEntity = fakeEntities.find( + (entity) => entity.uuid === savedUuid, + ); + expect(deletedEntity).toBeUndefined(); + }); + + it("should throw an exception if an entity doesn't exist", async () => { + await expect( + fakeRepository.deleteMany({ uuid: 'fake-uuid' }), + ).rejects.toBeInstanceOf(DatabaseException); + }); + }); });