auth/src/modules/oldauthentication/tests/unit/delete-username.usecase.spe...

116 lines
3.4 KiB
TypeScript

import { classes } from '@automapper/classes';
import { AutomapperModule } from '@automapper/nestjs';
import { UnauthorizedException } from '@nestjs/common';
import { Test, TestingModule } from '@nestjs/testing';
import { Messager } from '../../adapters/secondaries/messager';
import { UsernameRepository } from '../../adapters/secondaries/username.repository';
import { DeleteUsernameCommand } from '../../commands/delete-username.command';
import { DeleteUsernameRequest } from '../../domain/dtos/delete-username.request';
import { Type } from '../../domain/dtos/type.enum';
import { DeleteUsernameUseCase } from '../../domain/usecases/delete-username.usecase';
const usernamesEmail = {
data: [
{
uuid: 'cf76af29-f75d-4f6e-bb40-4ecbcfa3356e',
username: 'john.doe@email.com',
type: Type.EMAIL,
},
{
uuid: 'cf76af29-f75d-4f6e-bb40-4ecbcfa3356e',
username: '0611223344',
type: Type.PHONE,
},
],
total: 2,
};
const usernamesPhone = {
data: [
{
uuid: 'a7fa221f-dd77-481c-bb77-ae89da662c87',
username: '0611223344',
type: Type.PHONE,
},
],
total: 1,
};
const deleteUsernameEmailRequest: DeleteUsernameRequest =
new DeleteUsernameRequest();
deleteUsernameEmailRequest.username = 'john.doe@email.com';
const deleteUsernamePhoneRequest: DeleteUsernameRequest =
new DeleteUsernameRequest();
deleteUsernamePhoneRequest.username = '0611223344';
const deleteUsernameEmailCommand: DeleteUsernameCommand =
new DeleteUsernameCommand(deleteUsernameEmailRequest);
const deleteUsernamePhoneCommand: DeleteUsernameCommand =
new DeleteUsernameCommand(deleteUsernamePhoneRequest);
const mockUsernameRepository = {
findOne: jest.fn().mockImplementation((where) => {
if (where.username == 'john.doe@email.com') {
return { uuid: 'cf76af29-f75d-4f6e-bb40-4ecbcfa3356e' };
}
return { uuid: 'a7fa221f-dd77-481c-bb77-ae89da662c87' };
}),
findAll: jest.fn().mockImplementation((page, perPage, query) => {
if (query.uuid == 'cf76af29-f75d-4f6e-bb40-4ecbcfa3356e') {
return Promise.resolve(usernamesEmail);
}
return Promise.resolve(usernamesPhone);
}),
deleteMany: jest.fn().mockResolvedValue(undefined),
};
const mockMessager = {
publish: jest.fn().mockImplementation(),
};
describe('DeleteUsernameUseCase', () => {
let deleteUsernameUseCase: DeleteUsernameUseCase;
beforeAll(async () => {
const module: TestingModule = await Test.createTestingModule({
imports: [AutomapperModule.forRoot({ strategyInitializer: classes() })],
providers: [
{
provide: UsernameRepository,
useValue: mockUsernameRepository,
},
{
provide: Messager,
useValue: mockMessager,
},
DeleteUsernameUseCase,
],
}).compile();
deleteUsernameUseCase = module.get<DeleteUsernameUseCase>(
DeleteUsernameUseCase,
);
});
it('should be defined', () => {
expect(deleteUsernameUseCase).toBeDefined();
});
describe('execute', () => {
it('should delete a username', async () => {
const deletedEmailUsername = await deleteUsernameUseCase.execute(
deleteUsernameEmailCommand,
);
expect(deletedEmailUsername).toBe(undefined);
});
it('should throw an exception if auth has only one username', async () => {
await expect(
deleteUsernameUseCase.execute(deleteUsernamePhoneCommand),
).rejects.toBeInstanceOf(UnauthorizedException);
});
});
});