From 5d472cafd777b820e15d608d30128b4a7800b4e2 Mon Sep 17 00:00:00 2001 From: David Ambrozio Date: Tue, 30 Apr 2024 11:58:08 -0300 Subject: [PATCH 01/11] feat: add findById method to user repository --- .../user-repository/user-repository.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/features/user/repositories/user-repository/user-repository.ts b/src/features/user/repositories/user-repository/user-repository.ts index 0cffab1..f373755 100644 --- a/src/features/user/repositories/user-repository/user-repository.ts +++ b/src/features/user/repositories/user-repository/user-repository.ts @@ -14,4 +14,18 @@ export class UserRepository { }, }); } + + async findById(id: string) { + const user = await database.user.findUnique({ + select: { + email: true, + id: true, + }, + where: { + id, + }, + }); + + return user; + } } From a9b29244d9ee6a76d88ee4695c36ff9be2154c94 Mon Sep 17 00:00:00 2001 From: David Ambrozio Date: Tue, 30 Apr 2024 13:06:13 -0300 Subject: [PATCH 02/11] test: add tests for findById method in user repository --- .../user-repository/user-repository.test.ts | 49 ++++++++++++++++++- src/shared/test-helpers/mocks/user.mock.ts | 1 + 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/src/features/user/repositories/user-repository/user-repository.test.ts b/src/features/user/repositories/user-repository/user-repository.test.ts index 32fbf3d..1fde25e 100644 --- a/src/features/user/repositories/user-repository/user-repository.test.ts +++ b/src/features/user/repositories/user-repository/user-repository.test.ts @@ -17,8 +17,10 @@ describe('[Repositories] UserRepository', () => { await repository.create(user); + const { id, ...userWithoutId } = user; + expect(prisma.user.create).toHaveBeenCalledWith({ - data: user, + data: userWithoutId, }); }); @@ -36,4 +38,49 @@ describe('[Repositories] UserRepository', () => { await expect(response).rejects.toThrowError(); }); }); + + describe('findById', () => { + it('should return user if found', async () => { + const { repository } = makeSut(); + + const user = UserMock.create(); + + prisma.user.findUnique.mockResolvedValue(user); + + const result = await repository.findById(user.id); + + expect(prisma.user.findUnique).toHaveBeenCalledWith({ + select: { + email: true, + id: true, + }, + where: { + id: user.id, + }, + }); + + expect(result).toEqual(user); + }); + + it('should return null if user is not found', async () => { + const { repository } = makeSut(); + + // eslint-disable-next-line unicorn/no-null + prisma.user.findUnique.mockResolvedValue(null); + + const result = await repository.findById('non_existent_id'); + + expect(prisma.user.findUnique).toHaveBeenCalledWith({ + select: { + email: true, + id: true, + }, + where: { + id: 'non_existent_id', + }, + }); + + expect(result).toBeNull(); + }); + }); }); diff --git a/src/shared/test-helpers/mocks/user.mock.ts b/src/shared/test-helpers/mocks/user.mock.ts index f61b639..ea5092c 100644 --- a/src/shared/test-helpers/mocks/user.mock.ts +++ b/src/shared/test-helpers/mocks/user.mock.ts @@ -4,6 +4,7 @@ export class UserMock { public static create() { return { email: faker.internet.email(), + id: '00000000-0000-0000-0000-000000000000', name: faker.person.firstName(), password: faker.internet.password(), username: faker.internet.userName(), From 17cc1b05cec57db31daae4fbc73f1cc6f4b67836 Mon Sep 17 00:00:00 2001 From: David Ambrozio Date: Tue, 30 Apr 2024 13:06:43 -0300 Subject: [PATCH 03/11] fix: resolve ESLint configuration issue --- package.json | 1 + pnpm-lock.yaml | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/package.json b/package.json index 434b795..a114e70 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ "eslint-config-prettier": "9.1.0", "eslint-define-config": "2.1.0", "eslint-import-resolver-typescript": "3.6.1", + "eslint-plugin-array-func": "5.0.1", "eslint-plugin-import": "2.29.1", "eslint-plugin-only-warn": "1.1.0", "eslint-plugin-perfectionist": "2.10.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a43ead6..21ecfc8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -82,6 +82,9 @@ devDependencies: eslint-import-resolver-typescript: specifier: 3.6.1 version: 3.6.1(@typescript-eslint/parser@7.6.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-plugin-array-func: + specifier: 5.0.1 + version: 5.0.1(eslint@8.57.0) eslint-plugin-import: specifier: 2.29.1 version: 2.29.1(@typescript-eslint/parser@7.6.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) @@ -3192,6 +3195,15 @@ packages: - supports-color dev: true + /eslint-plugin-array-func@5.0.1(eslint@8.57.0): + resolution: {integrity: sha512-bRydL/TorX9B6HMMGzggkTzoaY0dM1iCIdA/SGM8VB2P8+38TH+dqYmDdfLCR5LOdDUHq0XBFgkvVnb7DB61cw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=8.51.0' + dependencies: + eslint: 8.57.0 + dev: true + /eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.6.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} engines: {node: '>=4'} From 48ffeddd53d50b6ac72df5b5392251b2a596575f Mon Sep 17 00:00:00 2001 From: David Ambrozio Date: Tue, 30 Apr 2024 21:06:41 -0300 Subject: [PATCH 04/11] feat: add name property to user model, update tests, and migrate changes --- .../migration.sql | 13 +++++++++++++ prisma/schema.prisma | 2 +- .../user-repository/user-repository.test.ts | 18 ++++++------------ .../user-repository/user-repository.ts | 7 ++----- src/shared/test-helpers/mocks/user.mock.ts | 3 ++- 5 files changed, 24 insertions(+), 19 deletions(-) create mode 100644 prisma/migrations/20240430234824_update_user_model/migration.sql diff --git a/prisma/migrations/20240430234824_update_user_model/migration.sql b/prisma/migrations/20240430234824_update_user_model/migration.sql new file mode 100644 index 0000000..fcf0aac --- /dev/null +++ b/prisma/migrations/20240430234824_update_user_model/migration.sql @@ -0,0 +1,13 @@ +/* + Warnings: + + - The primary key for the `User` table will be changed. If it partially fails, the table could be left without primary key constraint. + - The `id` column on the `User` table would be dropped and recreated. This will lead to data loss if there is data in the column. + +*/ +-- AlterTable +ALTER TABLE "User" DROP CONSTRAINT "User_pkey", +ADD COLUMN "name" TEXT, +DROP COLUMN "id", +ADD COLUMN "id" SERIAL NOT NULL, +ADD CONSTRAINT "User_pkey" PRIMARY KEY ("id"); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 82eea46..67289b6 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -14,7 +14,7 @@ datasource db { } model User { - id String @id @default(uuid()) + id String @id @default(autoincrement()) email String @unique name String? username String @unique diff --git a/src/features/user/repositories/user-repository/user-repository.test.ts b/src/features/user/repositories/user-repository/user-repository.test.ts index 1fde25e..3649696 100644 --- a/src/features/user/repositories/user-repository/user-repository.test.ts +++ b/src/features/user/repositories/user-repository/user-repository.test.ts @@ -40,7 +40,7 @@ describe('[Repositories] UserRepository', () => { }); describe('findById', () => { - it('should return user if found', async () => { + it('return user if found', async () => { const { repository } = makeSut(); const user = UserMock.create(); @@ -50,10 +50,7 @@ describe('[Repositories] UserRepository', () => { const result = await repository.findById(user.id); expect(prisma.user.findUnique).toHaveBeenCalledWith({ - select: { - email: true, - id: true, - }, + select: expect.anything(), where: { id: user.id, }, @@ -62,21 +59,18 @@ describe('[Repositories] UserRepository', () => { expect(result).toEqual(user); }); - it('should return null if user is not found', async () => { + it('return null if user is not found', async () => { const { repository } = makeSut(); // eslint-disable-next-line unicorn/no-null prisma.user.findUnique.mockResolvedValue(null); - const result = await repository.findById('non_existent_id'); + const result = await repository.findById(0); expect(prisma.user.findUnique).toHaveBeenCalledWith({ - select: { - email: true, - id: true, - }, + select: expect.anything(), where: { - id: 'non_existent_id', + id: 0, }, }); diff --git a/src/features/user/repositories/user-repository/user-repository.ts b/src/features/user/repositories/user-repository/user-repository.ts index f373755..b99f1b8 100644 --- a/src/features/user/repositories/user-repository/user-repository.ts +++ b/src/features/user/repositories/user-repository/user-repository.ts @@ -15,12 +15,9 @@ export class UserRepository { }); } - async findById(id: string) { + async findById(id: number) { const user = await database.user.findUnique({ - select: { - email: true, - id: true, - }, + select: expect.anything(), where: { id, }, diff --git a/src/shared/test-helpers/mocks/user.mock.ts b/src/shared/test-helpers/mocks/user.mock.ts index ea5092c..0b57ea7 100644 --- a/src/shared/test-helpers/mocks/user.mock.ts +++ b/src/shared/test-helpers/mocks/user.mock.ts @@ -4,8 +4,9 @@ export class UserMock { public static create() { return { email: faker.internet.email(), - id: '00000000-0000-0000-0000-000000000000', + id: faker.number.int(), name: faker.person.firstName(), + name: faker.person.fullName(), password: faker.internet.password(), username: faker.internet.userName(), }; From d6eda1a2d3901435680c82e4fda4aebc93b5605b Mon Sep 17 00:00:00 2001 From: David Ambrozio Date: Tue, 30 Apr 2024 21:08:18 -0300 Subject: [PATCH 05/11] chore: remove eslint-plugin-array-func from dependencies --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index a114e70..434b795 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,6 @@ "eslint-config-prettier": "9.1.0", "eslint-define-config": "2.1.0", "eslint-import-resolver-typescript": "3.6.1", - "eslint-plugin-array-func": "5.0.1", "eslint-plugin-import": "2.29.1", "eslint-plugin-only-warn": "1.1.0", "eslint-plugin-perfectionist": "2.10.0", From 8c07cc00960c0475b0fc40423f35c42599fda2a3 Mon Sep 17 00:00:00 2001 From: David Ambrozio Date: Wed, 1 May 2024 17:51:59 -0300 Subject: [PATCH 06/11] chore: remove migration file no longer needed --- .../20240430234824_update_user_model/migration.sql | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 prisma/migrations/20240430234824_update_user_model/migration.sql diff --git a/prisma/migrations/20240430234824_update_user_model/migration.sql b/prisma/migrations/20240430234824_update_user_model/migration.sql deleted file mode 100644 index fcf0aac..0000000 --- a/prisma/migrations/20240430234824_update_user_model/migration.sql +++ /dev/null @@ -1,13 +0,0 @@ -/* - Warnings: - - - The primary key for the `User` table will be changed. If it partially fails, the table could be left without primary key constraint. - - The `id` column on the `User` table would be dropped and recreated. This will lead to data loss if there is data in the column. - -*/ --- AlterTable -ALTER TABLE "User" DROP CONSTRAINT "User_pkey", -ADD COLUMN "name" TEXT, -DROP COLUMN "id", -ADD COLUMN "id" SERIAL NOT NULL, -ADD CONSTRAINT "User_pkey" PRIMARY KEY ("id"); From 014d2950bb66a7a2e0774617e8d00ce4010bd94b Mon Sep 17 00:00:00 2001 From: David Ambrozio Date: Wed, 1 May 2024 17:53:39 -0300 Subject: [PATCH 07/11] fix: corrected schema.prisma syntax issue --- prisma/schema.prisma | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 67289b6..82eea46 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -14,7 +14,7 @@ datasource db { } model User { - id String @id @default(autoincrement()) + id String @id @default(uuid()) email String @unique name String? username String @unique From e09f6d8cb8dcd206aca84f905cda87b0909c51e8 Mon Sep 17 00:00:00 2001 From: David Ambrozio Date: Wed, 1 May 2024 17:57:46 -0300 Subject: [PATCH 08/11] refactor: change id type from Int to String in repository and user mock --- .../user/repositories/user-repository/user-repository.ts | 2 +- src/shared/test-helpers/mocks/user.mock.ts | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/features/user/repositories/user-repository/user-repository.ts b/src/features/user/repositories/user-repository/user-repository.ts index b99f1b8..2fb7031 100644 --- a/src/features/user/repositories/user-repository/user-repository.ts +++ b/src/features/user/repositories/user-repository/user-repository.ts @@ -15,7 +15,7 @@ export class UserRepository { }); } - async findById(id: number) { + async findById(id: string) { const user = await database.user.findUnique({ select: expect.anything(), where: { diff --git a/src/shared/test-helpers/mocks/user.mock.ts b/src/shared/test-helpers/mocks/user.mock.ts index 0b57ea7..437a88e 100644 --- a/src/shared/test-helpers/mocks/user.mock.ts +++ b/src/shared/test-helpers/mocks/user.mock.ts @@ -4,9 +4,8 @@ export class UserMock { public static create() { return { email: faker.internet.email(), - id: faker.number.int(), + id: faker.string.numeric(), name: faker.person.firstName(), - name: faker.person.fullName(), password: faker.internet.password(), username: faker.internet.userName(), }; From 38f8a60830089e39878685b996749ab7d1e46fc8 Mon Sep 17 00:00:00 2001 From: David Ambrozio Date: Thu, 2 May 2024 11:54:51 -0300 Subject: [PATCH 09/11] test: update findById test --- pnpm-lock.yaml | 12 ------------ .../user-repository/user-repository.test.ts | 5 ++--- 2 files changed, 2 insertions(+), 15 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 21ecfc8..a43ead6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -82,9 +82,6 @@ devDependencies: eslint-import-resolver-typescript: specifier: 3.6.1 version: 3.6.1(@typescript-eslint/parser@7.6.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0) - eslint-plugin-array-func: - specifier: 5.0.1 - version: 5.0.1(eslint@8.57.0) eslint-plugin-import: specifier: 2.29.1 version: 2.29.1(@typescript-eslint/parser@7.6.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) @@ -3195,15 +3192,6 @@ packages: - supports-color dev: true - /eslint-plugin-array-func@5.0.1(eslint@8.57.0): - resolution: {integrity: sha512-bRydL/TorX9B6HMMGzggkTzoaY0dM1iCIdA/SGM8VB2P8+38TH+dqYmDdfLCR5LOdDUHq0XBFgkvVnb7DB61cw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '>=8.51.0' - dependencies: - eslint: 8.57.0 - dev: true - /eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.6.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} engines: {node: '>=4'} diff --git a/src/features/user/repositories/user-repository/user-repository.test.ts b/src/features/user/repositories/user-repository/user-repository.test.ts index 3649696..ed739a7 100644 --- a/src/features/user/repositories/user-repository/user-repository.test.ts +++ b/src/features/user/repositories/user-repository/user-repository.test.ts @@ -62,15 +62,14 @@ describe('[Repositories] UserRepository', () => { it('return null if user is not found', async () => { const { repository } = makeSut(); - // eslint-disable-next-line unicorn/no-null prisma.user.findUnique.mockResolvedValue(null); - const result = await repository.findById(0); + const result = await repository.findById('non_existent_id'); expect(prisma.user.findUnique).toHaveBeenCalledWith({ select: expect.anything(), where: { - id: 0, + id: 'non_existent_id', }, }); From 73103906eb564d4761f034ffce95ad966b147b6b Mon Sep 17 00:00:00 2001 From: David Ambrozio Date: Thu, 2 May 2024 12:45:08 -0300 Subject: [PATCH 10/11] test: update findById test --- .../user-repository/user-repository.test.ts | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/features/user/repositories/user-repository/user-repository.test.ts b/src/features/user/repositories/user-repository/user-repository.test.ts index ed739a7..66155b8 100644 --- a/src/features/user/repositories/user-repository/user-repository.test.ts +++ b/src/features/user/repositories/user-repository/user-repository.test.ts @@ -45,7 +45,18 @@ describe('[Repositories] UserRepository', () => { const user = UserMock.create(); - prisma.user.findUnique.mockResolvedValue(user); + const expectedResult = { + createdAt: new Date(), + deletedAt: null, + email: user.email, + id: user.id, + name: user.name, + password: user.password, + updatedAt: new Date(), + username: user.username, + }; + + prisma.user.findUnique.mockResolvedValue(expectedResult); const result = await repository.findById(user.id); @@ -56,7 +67,7 @@ describe('[Repositories] UserRepository', () => { }, }); - expect(result).toEqual(user); + expect(result).toEqual(expectedResult); }); it('return null if user is not found', async () => { From cc3ffb008cceae38e880ee5dc628c453dd50b55b Mon Sep 17 00:00:00 2001 From: David Ambrozio Date: Sat, 4 May 2024 20:52:44 -0300 Subject: [PATCH 11/11] feat: update findById method to user repository --- .../user/repositories/user-repository/user-repository.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/features/user/repositories/user-repository/user-repository.ts b/src/features/user/repositories/user-repository/user-repository.ts index 2fb7031..ab173fd 100644 --- a/src/features/user/repositories/user-repository/user-repository.ts +++ b/src/features/user/repositories/user-repository/user-repository.ts @@ -17,7 +17,12 @@ export class UserRepository { async findById(id: string) { const user = await database.user.findUnique({ - select: expect.anything(), + select: { + email: true, + id: true, + name: true, + username: true, + }, where: { id, },