update tests

This commit is contained in:
Gsk54 2023-01-18 10:47:20 +01:00
parent 972d43ac30
commit 1d2e7da673
8 changed files with 62 additions and 52 deletions

View File

@ -18,37 +18,37 @@ const existingUsername = {
type: Type.EMAIL, type: Type.EMAIL,
}; };
const newUsernameRequest: UpdateUsernameRequest = new UpdateUsernameRequest();
newUsernameRequest.uuid = 'bb281075-1b98-4456-89d6-c643d3044a90';
newUsernameRequest.username = '+33611223344';
newUsernameRequest.type = Type.PHONE;
const updateUsernameRequest: UpdateUsernameRequest = const updateUsernameRequest: UpdateUsernameRequest =
new UpdateUsernameRequest(); new UpdateUsernameRequest();
updateUsernameRequest.uuid = 'bb281075-1b98-4456-89d6-c643d3044a91'; updateUsernameRequest.uuid = 'bb281075-1b98-4456-89d6-c643d3044a91';
updateUsernameRequest.username = 'johnny.doe@email.com'; updateUsernameRequest.username = 'johnny.doe@email.com';
updateUsernameRequest.type = Type.EMAIL; updateUsernameRequest.type = Type.EMAIL;
const newUsernameRequest: UpdateUsernameRequest = new UpdateUsernameRequest();
newUsernameRequest.uuid = 'bb281075-1b98-4456-89d6-c643d3044a91';
newUsernameRequest.username = '+33611223344';
newUsernameRequest.type = Type.PHONE;
const invalidUpdateUsernameRequest: UpdateUsernameRequest =
new UpdateUsernameRequest();
invalidUpdateUsernameRequest.uuid = 'bb281075-1b98-4456-89d6-c643d3044a91';
invalidUpdateUsernameRequest.username = '';
invalidUpdateUsernameRequest.type = Type.EMAIL;
const unknownUsernameRequest: UpdateUsernameRequest = const unknownUsernameRequest: UpdateUsernameRequest =
new UpdateUsernameRequest(); new UpdateUsernameRequest();
unknownUsernameRequest.uuid = 'bb281075-1b98-4456-89d6-c643d3044a91'; unknownUsernameRequest.uuid = 'bb281075-1b98-4456-89d6-c643d3044a92';
unknownUsernameRequest.username = 'unknown@email.com'; unknownUsernameRequest.username = 'unknown@email.com';
unknownUsernameRequest.type = Type.EMAIL; unknownUsernameRequest.type = Type.EMAIL;
const updateUsernameCommand: UpdateUsernameCommand = new UpdateUsernameCommand( const invalidUpdateUsernameRequest: UpdateUsernameRequest =
updateUsernameRequest, new UpdateUsernameRequest();
); invalidUpdateUsernameRequest.uuid = 'bb281075-1b98-4456-89d6-c643d3044a93';
invalidUpdateUsernameRequest.username = '';
invalidUpdateUsernameRequest.type = Type.EMAIL;
const newUsernameCommand: UpdateUsernameCommand = new UpdateUsernameCommand( const newUsernameCommand: UpdateUsernameCommand = new UpdateUsernameCommand(
newUsernameRequest, newUsernameRequest,
); );
const updateUsernameCommand: UpdateUsernameCommand = new UpdateUsernameCommand(
updateUsernameRequest,
);
const invalidUpdateUsernameCommand: UpdateUsernameCommand = const invalidUpdateUsernameCommand: UpdateUsernameCommand =
new UpdateUsernameCommand(invalidUpdateUsernameRequest); new UpdateUsernameCommand(invalidUpdateUsernameRequest);
@ -56,19 +56,22 @@ const unknownUpdateUsernameCommand: UpdateUsernameCommand =
new UpdateUsernameCommand(unknownUsernameRequest); new UpdateUsernameCommand(unknownUsernameRequest);
const mockUsernameRepository = { const mockUsernameRepository = {
findOne: jest.fn().mockResolvedValue(existingUsername), findOne: jest.fn().mockImplementation((request) => {
updateWhere: jest if (request.uuid == 'bb281075-1b98-4456-89d6-c643d3044a90') {
.fn() return Promise.resolve(null);
.mockImplementationOnce(() => { }
return Promise.resolve(updateUsernameRequest); return Promise.resolve(existingUsername);
}) }),
.mockImplementationOnce(() => { updateWhere: jest.fn().mockImplementation((request) => {
if (request.uuid_type.uuid == 'bb281075-1b98-4456-89d6-c643d3044a90') {
return Promise.resolve(newUsernameRequest); return Promise.resolve(newUsernameRequest);
}) }
.mockImplementationOnce(() => { if (request.uuid_type.uuid == 'bb281075-1b98-4456-89d6-c643d3044a91') {
return Promise.resolve(updateUsernameRequest);
}
if (request.uuid_type.uuid == 'bb281075-1b98-4456-89d6-c643d3044a92') {
throw new Error('Error'); throw new Error('Error');
}) }
.mockImplementationOnce(() => {
return Promise.resolve(invalidUpdateUsernameRequest); return Promise.resolve(invalidUpdateUsernameRequest);
}), }),
}; };
@ -115,15 +118,6 @@ describe('UpdateUsernameUseCase', () => {
}); });
describe('execute', () => { describe('execute', () => {
it('should update a username for email type', async () => {
const updatedUsername: Username = await updateUsernameUseCase.execute(
updateUsernameCommand,
);
expect(updatedUsername.username).toBe(updateUsernameRequest.username);
expect(updatedUsername.type).toBe(updateUsernameRequest.type);
});
it('should create a new username', async () => { it('should create a new username', async () => {
const newUsername: Username = await updateUsernameUseCase.execute( const newUsername: Username = await updateUsernameUseCase.execute(
newUsernameCommand, newUsernameCommand,
@ -133,6 +127,15 @@ describe('UpdateUsernameUseCase', () => {
expect(newUsername.type).toBe(newUsernameRequest.type); expect(newUsername.type).toBe(newUsernameRequest.type);
}); });
it('should update a username for email type', async () => {
const updatedUsername: Username = await updateUsernameUseCase.execute(
updateUsernameCommand,
);
expect(updatedUsername.username).toBe(updateUsernameRequest.username);
expect(updatedUsername.type).toBe(updateUsernameRequest.type);
});
it('should throw an error if username does not exist', async () => { it('should throw an error if username does not exist', async () => {
await expect( await expect(
updateUsernameUseCase.execute(unknownUpdateUsernameCommand), updateUsernameUseCase.execute(unknownUpdateUsernameCommand),

View File

@ -5,13 +5,14 @@ import { lastValueFrom } from 'rxjs';
import { Action } from '../../domain/dtos/action.enum'; import { Action } from '../../domain/dtos/action.enum';
import { Domain } from '../../domain/dtos/domain.enum'; import { Domain } from '../../domain/dtos/domain.enum';
import { IMakeDecision } from '../../domain/interfaces/decision-maker'; import { IMakeDecision } from '../../domain/interfaces/decision-maker';
import { ContextItem } from '../../domain/dtos/context-item';
import { Decision } from './decision'; import { Decision } from './decision';
@Injectable() @Injectable()
export class OpaDecisionMaker extends IMakeDecision { export class OpaDecisionMaker extends IMakeDecision {
constructor( constructor(
private readonly configService: ConfigService, private readonly _configService: ConfigService,
private readonly httpService: HttpService, private readonly _httpService: HttpService,
) { ) {
super(); super();
} }
@ -20,11 +21,11 @@ export class OpaDecisionMaker extends IMakeDecision {
uuid: string, uuid: string,
domain: Domain, domain: Domain,
action: Action, action: Action,
context: Array<{ name: string; value: string }>, context: Array<ContextItem>,
): Promise<boolean> { ): Promise<boolean> {
const { data } = await lastValueFrom( const { data } = await lastValueFrom(
this.httpService.post<Decision>( this._httpService.post<Decision>(
this.configService.get<string>('OPA_URL') + domain + '/' + action, this._configService.get<string>('OPA_URL') + domain + '/' + action,
{ {
input: { input: {
uuid, uuid,

View File

@ -0,0 +1,9 @@
export class ContextItem {
name: string;
value: any;
constructor(name: string, value: any) {
this.name = name;
this.value = value;
}
}

View File

@ -1,4 +1,5 @@
import { IsArray, IsNotEmpty, IsString } from 'class-validator'; import { IsArray, IsNotEmpty, IsString } from 'class-validator';
import { ContextItem } from './context-item';
import { Action } from './action.enum'; import { Action } from './action.enum';
import { Domain } from './domain.enum'; import { Domain } from './domain.enum';
@ -16,5 +17,5 @@ export class DecisionRequest {
action: Action; action: Action;
@IsArray() @IsArray()
context?: Array<{ name: string; value: string }>; context?: Array<ContextItem>;
} }

View File

@ -1,3 +1,4 @@
import { ContextItem } from '../domain/dtos/context-item';
import { Action } from '../domain/dtos/action.enum'; import { Action } from '../domain/dtos/action.enum';
import { Domain } from '../domain/dtos/domain.enum'; import { Domain } from '../domain/dtos/domain.enum';
@ -5,13 +6,13 @@ export class DecisionQuery {
readonly uuid: string; readonly uuid: string;
readonly domain: Domain; readonly domain: Domain;
readonly action: Action; readonly action: Action;
readonly context: Array<{ name: string; value: string }>; readonly context: Array<ContextItem>;
constructor( constructor(
uuid: string, uuid: string,
domain: Domain, domain: Domain,
action: Action, action: Action,
context?: Array<{ name: string; value: string }>, context?: Array<ContextItem>,
) { ) {
this.uuid = uuid; this.uuid = uuid;
this.domain = domain; this.domain = domain;

View File

@ -3,6 +3,7 @@ import { AutomapperModule } from '@automapper/nestjs';
import { Test, TestingModule } from '@nestjs/testing'; import { Test, TestingModule } from '@nestjs/testing';
import { OpaDecisionMaker } from '../../adapters/secondaries/opa.decision-maker'; import { OpaDecisionMaker } from '../../adapters/secondaries/opa.decision-maker';
import { Action } from '../../domain/dtos/action.enum'; import { Action } from '../../domain/dtos/action.enum';
import { ContextItem } from '../../domain/dtos/context-item';
import { DecisionRequest } from '../../domain/dtos/decision.request'; import { DecisionRequest } from '../../domain/dtos/decision.request';
import { Domain } from '../../domain/dtos/domain.enum'; import { Domain } from '../../domain/dtos/domain.enum';
import { DecisionUseCase } from '../../domain/usecases/decision.usecase'; import { DecisionUseCase } from '../../domain/usecases/decision.usecase';
@ -40,13 +41,7 @@ describe('DecisionUseCase', () => {
decisionRequest.uuid = 'bb281075-1b98-4456-89d6-c643d3044a91'; decisionRequest.uuid = 'bb281075-1b98-4456-89d6-c643d3044a91';
decisionRequest.domain = Domain.user; decisionRequest.domain = Domain.user;
decisionRequest.action = Action.create; decisionRequest.action = Action.create;
decisionRequest.context = [ decisionRequest.context = [new ContextItem('context1', 'value1')];
{
name: 'context1',
value: 'value1',
},
];
expect( expect(
decisionUseCase.execute( decisionUseCase.execute(
new DecisionQuery( new DecisionQuery(