diff --git a/src/features/user/repositories/user-repository.test.ts b/src/features/user/repositories/user-repository.test.ts index e53121a..fc73b34 100644 --- a/src/features/user/repositories/user-repository.test.ts +++ b/src/features/user/repositories/user-repository.test.ts @@ -66,6 +66,44 @@ describe('[Repositories] UserRepository', () => { }); }); + describe('findByEmail', () => { + it('return user if found', async () => { + const { repository } = makeSut(); + + const user = UserMock.create(); + + prisma.user.findUnique.mockResolvedValue(user); + + const result = await repository.findByEmail(user.email); + + expect(prisma.user.findUnique).toHaveBeenCalledWith({ + select: expect.anything(), + where: { + email: user.email, + }, + }); + + expect(result).toBe(user); + }); + + it('return null if user is not found', async () => { + const { repository } = makeSut(); + + prisma.user.findUnique.mockResolvedValue(null); + + const result = await repository.findByEmail('non_existent_email'); + + expect(prisma.user.findUnique).toHaveBeenCalledWith({ + select: expect.anything(), + where: { + email: 'non_existent_email', + }, + }); + + expect(result).toBeNull(); + }); + }); + describe('updateIsActiveStatus', () => { it('should call service with correctly params', async () => { const { repository } = makeSut(); diff --git a/src/features/user/services/user-create-service.test.ts b/src/features/user/services/user-create-service.test.ts index 1badac4..fdbcced 100644 --- a/src/features/user/services/user-create-service.test.ts +++ b/src/features/user/services/user-create-service.test.ts @@ -1,58 +1,27 @@ -import type { UserRepository } from '@/features/user/repositories/user-repository'; -import { UserCreateService } from '@/features/user/services/user-create-service'; -import { BcryptAdapter } from '@/shared/infra/crypto/bcrypt-adapter'; +import { mock } from 'vitest-mock-extended'; -// TODO: Refactor -const makeSut = () => { - class UserRepositoryStub implements UserRepository { - create({ email, name, password, username }: any) { - return Promise.resolve({ - createdAt: new Date(2024, 5, 1), - deletedAt: null, - email, - id: 'valid_id', - isActive: true, - name, - password, - updatedAt: new Date(2024, 5, 1), - username, - }); - } +import type { UserRepository } from '@/features/user/repositories/user-repository'; +import type { BcryptAdapter } from '@/shared/infra/crypto/bcrypt-adapter'; +import { bcryptAdapteMock } from '@/shared/test-helpers/mocks/bcryptAdapter.mock'; +import { userRepositoryMock } from '@/shared/test-helpers/mocks/repositories/user-repository.mock'; - findById(id: string): Promise<{ - email: string; - id: string; - name: null | string; - username: string; - } | null> { - throw new Error('Method not implemented. ' + id); - } - updateIsActiveStatus(_: string): Promise { - throw new Error('Method not implemented.'); - } - } +import { UserCreateService } from './user-create-service'; - const userRepository = new UserRepositoryStub(); +let userCreateService: UserCreateService; - const bcryptAdapter = new BcryptAdapter(); +let userRepository = mock(userRepositoryMock); - const userCreateService = new UserCreateService( - userRepository, - bcryptAdapter - ); +let bcryptAdapter = mock(bcryptAdapteMock); - return { bcryptAdapter, userCreateService, userRepository }; -}; +beforeEach(() => { + userCreateService = new UserCreateService(userRepository, bcryptAdapter); +}); describe('UserCreateService', () => { it('should call userRepository with correct params', async () => { - const { bcryptAdapter, userCreateService, userRepository } = makeSut(); - const repositorySpy = vi.spyOn(userRepository, 'create'); - vi.spyOn(bcryptAdapter, 'encrypt').mockImplementationOnce( - async () => 'valid_password' - ); + vi.spyOn(bcryptAdapter, 'encrypt').mockResolvedValue('valid_password'); await userCreateService.execute({ email: 'valid_email@email.com', @@ -71,11 +40,7 @@ describe('UserCreateService', () => { }); it('should throw when userRepository throws', async () => { - const { userCreateService, userRepository } = makeSut(); - - vi.spyOn(userRepository, 'create').mockImplementationOnce(async () => { - throw new Error('error'); - }); + vi.spyOn(userRepository, 'create').mockRejectedValue(new Error('error')); const response = userCreateService.execute({ email: 'valid_email@email.com', @@ -89,8 +54,6 @@ describe('UserCreateService', () => { }); it('should conflict when password and repeatPassword dont match', async () => { - const { userCreateService } = makeSut(); - const response = userCreateService.execute({ email: 'valid_email@email.com', name: 'valid_name', diff --git a/src/shared/test-helpers/mocks/bcryptAdapter.mock.ts b/src/shared/test-helpers/mocks/bcryptAdapter.mock.ts new file mode 100644 index 0000000..eb572dc --- /dev/null +++ b/src/shared/test-helpers/mocks/bcryptAdapter.mock.ts @@ -0,0 +1,6 @@ +import { vi } from 'vitest'; + +export const bcryptAdapteMock = { + compare: vi.fn(), + encrypt: vi.fn(), +}; diff --git a/src/shared/test-helpers/mocks/repositories/user-repository.mock.ts b/src/shared/test-helpers/mocks/repositories/user-repository.mock.ts index dccd8af..c9ea584 100644 --- a/src/shared/test-helpers/mocks/repositories/user-repository.mock.ts +++ b/src/shared/test-helpers/mocks/repositories/user-repository.mock.ts @@ -2,6 +2,7 @@ import { vi } from 'vitest'; export const userRepositoryMock = { create: vi.fn(), + findByEmail: vi.fn(), findById: vi.fn(), updateIsActiveStatus: vi.fn(), };