cast values on set

This commit is contained in:
sbriat 2023-10-27 11:20:24 +02:00
parent d20da85896
commit d6d0b4ed11
6 changed files with 125 additions and 78 deletions

View File

@ -87,7 +87,6 @@ export class ConfigurationsManagerService {
for (key in configuration) { for (key in configuration) {
if (key !== 'domain' && key === property) return configuration[key]; if (key !== 'domain' && key === property) return configuration[key];
} }
throw new NotFoundException('Configuration item not found');
}; };
private _isInt = (number: number): boolean => number % 1 === 0; private _isInt = (number: number): boolean => number % 1 === 0;

View File

@ -1,22 +0,0 @@
import { ValidateBy, ValidationOptions, buildMessage } from 'class-validator';
export const IsConfigurationType = (
validationOptions?: ValidationOptions,
): PropertyDecorator =>
ValidateBy(
{
name: '',
constraints: [],
validator: {
validate: (value: any): boolean =>
typeof value === 'number' ||
typeof value === 'boolean' ||
typeof value === 'string',
defaultMessage: buildMessage(
() => `Value must be a number, boolean or string`,
validationOptions,
),
},
},
validationOptions,
);

View File

@ -1,6 +1,5 @@
import { ConfigurationDomain } from '@mobicoop/configuration-module'; import { ConfigurationDomain } from '@mobicoop/configuration-module';
import { IsEnum, IsNotEmpty, IsString } from 'class-validator'; import { IsEnum, IsNotEmpty, IsString } from 'class-validator';
import { IsConfigurationType } from './is-configuration-type.decorator';
export class SetConfigurationRequestDto { export class SetConfigurationRequestDto {
@IsEnum(ConfigurationDomain) @IsEnum(ConfigurationDomain)
@ -11,7 +10,6 @@ export class SetConfigurationRequestDto {
@IsNotEmpty() @IsNotEmpty()
key: string; key: string;
@IsConfigurationType()
@IsNotEmpty() @IsNotEmpty()
value: string | boolean | number; value: string | boolean | number;
} }

View File

@ -0,0 +1,125 @@
import {
ConfigurationDomain,
ConfigurationIdentifier,
ConfigurationType,
} from '@mobicoop/configuration-module';
import { NotFoundException } from '@mobicoop/ddd-library';
import { ConfigurationsManagerService } from '@modules/configuration/core/application/services/configurations-manager.service';
import { ConfigService } from '@nestjs/config';
import { Test, TestingModule } from '@nestjs/testing';
import { Config } from '@src/config/config';
const mockConfigService = {
get: jest.fn().mockImplementation((domain: string) => {
switch (domain) {
case 'carpool':
return {
departureTimeMargin: 900,
role: 'passenger',
seatsProposed: 3,
seatsRequested: 1,
strictFrequency: false,
};
case 'pagination':
return {
perPage: 10,
};
}
}),
};
describe('Configurations Manager Service', () => {
let configurationsManagerService: ConfigurationsManagerService;
beforeAll(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [
{
provide: ConfigService,
useValue: mockConfigService,
},
ConfigurationsManagerService,
],
}).compile();
configurationsManagerService = module.get<ConfigurationsManagerService>(
ConfigurationsManagerService,
);
});
it('should be defined', () => {
expect(configurationsManagerService).toBeDefined();
});
it('should return the list of configuration elements', () => {
const list: Config[] = configurationsManagerService.list();
expect(list).toHaveLength(2);
});
describe('identifierType', () => {
it('should return the type of a configuration item for a given identifier', () => {
const configurationIdentifier: ConfigurationIdentifier = {
domain: ConfigurationDomain.CARPOOL,
key: 'seatsProposed',
};
const configurationType: ConfigurationType =
configurationsManagerService.identifierType(configurationIdentifier);
expect(configurationType).toBe(ConfigurationType.INT);
});
it('should throw if configuration item is not found', () => {
const configurationIdentifier: ConfigurationIdentifier = {
domain: ConfigurationDomain.CARPOOL,
key: 'minAge',
};
expect(() => {
configurationsManagerService.identifierType(configurationIdentifier);
}).toThrow(NotFoundException);
});
});
describe('configurationType', () => {
it('should return the configuration type of an int', () => {
expect(configurationsManagerService.configurationType(3)).toBe(
ConfigurationType.INT,
);
});
it('should return the configuration type of a float', () => {
expect(configurationsManagerService.configurationType(3.5)).toBe(
ConfigurationType.FLOAT,
);
});
it('should return the configuration type of a boolean', () => {
expect(configurationsManagerService.configurationType(true)).toBe(
ConfigurationType.BOOLEAN,
);
});
it('should return the configuration type of a string', () => {
expect(configurationsManagerService.configurationType('role')).toBe(
ConfigurationType.STRING,
);
});
});
describe('cast', () => {
it('should cast a string to int', () => {
expect(
configurationsManagerService.cast('1', ConfigurationType.INT),
).toBe(1);
});
it('should cast a string to float', () => {
expect(
configurationsManagerService.cast('1.5', ConfigurationType.FLOAT),
).toBe(1.5);
});
it('should cast a string to boolean', () => {
expect(
configurationsManagerService.cast('true', ConfigurationType.BOOLEAN),
).toBeTruthy();
});
it('should not cast a string and return it as is', () => {
expect(
configurationsManagerService.cast('role', ConfigurationType.STRING),
).toBe('role');
});
});
});

View File

@ -1,46 +0,0 @@
import { ConfigurationsManagerService } from '@modules/configuration/core/application/services/configurations-manager.service';
import { ConfigService } from '@nestjs/config';
import { Test, TestingModule } from '@nestjs/testing';
const mockConfigService = {
get: jest.fn().mockImplementation((domain: string) => {
switch (domain) {
case 'carpool':
return {
departureTimeMargin: 900,
role: 'passenger',
seatsProposed: 3,
seatsRequested: 1,
strictFrequency: false,
};
case 'pagination':
return {
perPage: 10,
};
}
}),
};
describe('Configurations Manager Service', () => {
let configurationsManagerService: ConfigurationsManagerService;
beforeAll(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [
{
provide: ConfigService,
useValue: mockConfigService,
},
ConfigurationsManagerService,
],
}).compile();
configurationsManagerService = module.get<ConfigurationsManagerService>(
ConfigurationsManagerService,
);
});
it('should be defined', () => {
expect(configurationsManagerService).toBeDefined();
});
});

View File

@ -59,11 +59,4 @@ describe('Populate Service', () => {
it('should be defined', () => { it('should be defined', () => {
expect(populateService).toBeDefined(); expect(populateService).toBeDefined();
}); });
// it('should populate database with default values', () => {
// jest.spyOn(mockConfigurationRepository, 'get');
// jest.spyOn(mockConfigurationRepository, 'set');
// expect(mockConfigurationRepository.get).toHaveBeenCalled();
// expect(mockConfigurationRepository.set).toHaveBeenCalled();
// });
}); });