Skip to content

Commit

Permalink
refactor: test and implemented repo findByEmail
Browse files Browse the repository at this point in the history
  • Loading branch information
Frompaje committed Aug 23, 2024
1 parent 1586cff commit 5c46f8c
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 51 deletions.
38 changes: 38 additions & 0 deletions src/features/user/repositories/user-repository.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
65 changes: 14 additions & 51 deletions src/features/user/services/user-create-service.test.ts
Original file line number Diff line number Diff line change
@@ -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<void> {
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<UserRepository>(userRepositoryMock);

const userCreateService = new UserCreateService(
userRepository,
bcryptAdapter
);
let bcryptAdapter = mock<BcryptAdapter>(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: '[email protected]',
Expand All @@ -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: '[email protected]',
Expand All @@ -89,8 +54,6 @@ describe('UserCreateService', () => {
});

it('should conflict when password and repeatPassword dont match', async () => {
const { userCreateService } = makeSut();

const response = userCreateService.execute({
email: '[email protected]',
name: 'valid_name',
Expand Down
6 changes: 6 additions & 0 deletions src/shared/test-helpers/mocks/bcryptAdapter.mock.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import { vi } from 'vitest';

export const bcryptAdapteMock = {
compare: vi.fn(),
encrypt: vi.fn(),
};
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { vi } from 'vitest';

export const userRepositoryMock = {
create: vi.fn(),
findByEmail: vi.fn(),
findById: vi.fn(),
updateIsActiveStatus: vi.fn(),
};

0 comments on commit 5c46f8c

Please sign in to comment.