validator tests
This commit is contained in:
		
							parent
							
								
									211bee2c70
								
							
						
					
					
						commit
						0409670eec
					
				| 
						 | 
				
			
			@ -1,7 +1,7 @@
 | 
			
		|||
import { AutoMap } from '@automapper/classes';
 | 
			
		||||
import { Transform } from 'class-transformer';
 | 
			
		||||
import { IsLatitude, IsLongitude } from 'class-validator';
 | 
			
		||||
import { toPrecision } from './validators/to-precision';
 | 
			
		||||
import { toPrecision } from './transformers/to-precision';
 | 
			
		||||
 | 
			
		||||
export class CoordinatesDto {
 | 
			
		||||
  @Transform(({ value }) => toPrecision(value, 6), {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,9 +14,9 @@ import { Transform, Type } from 'class-transformer';
 | 
			
		|||
import { ScheduleDto } from './schedule.dto';
 | 
			
		||||
import { MarginDurationsDto } from './margin-durations.dto';
 | 
			
		||||
import { WaypointDto } from './waypoint.dto';
 | 
			
		||||
import { intToFrequency } from './validators/frequency.mapping';
 | 
			
		||||
import { IsSchedule } from './validators/decorators/is-schedule.validator';
 | 
			
		||||
import { HasValidPositionIndexes } from './validators/decorators/valid-position-indexes.validator';
 | 
			
		||||
import { intToFrequency } from './transformers/int-to-frequency';
 | 
			
		||||
import { IsSchedule } from './validators/decorators/is-schedule.decorator';
 | 
			
		||||
import { HasValidPositionIndexes } from './validators/decorators/has-valid-position-indexes.decorator';
 | 
			
		||||
import { Frequency } from '@modules/ad/core/ad.types';
 | 
			
		||||
 | 
			
		||||
export class CreateAdRequestDto {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
import { ValidateBy, ValidationOptions, buildMessage } from 'class-validator';
 | 
			
		||||
import { hasValidPositionIndexes } from '../waypoint-position';
 | 
			
		||||
import { hasValidPositionIndexes } from '../has-valid-position-indexes.validator';
 | 
			
		||||
import { WaypointDto } from '../../waypoint.dto';
 | 
			
		||||
 | 
			
		||||
export const HasValidPositionIndexes = (
 | 
			
		||||
| 
						 | 
				
			
			@ -1,14 +1,16 @@
 | 
			
		|||
import { WaypointDto } from '../waypoint.dto';
 | 
			
		||||
 | 
			
		||||
export const hasValidPositionIndexes = (waypoints: WaypointDto[]): boolean => {
 | 
			
		||||
  if (!waypoints) return;
 | 
			
		||||
  if (!waypoints) return false;
 | 
			
		||||
  if (waypoints.length == 0) return false;
 | 
			
		||||
  if (waypoints.every((waypoint) => waypoint.position === undefined))
 | 
			
		||||
    return true;
 | 
			
		||||
    return false;
 | 
			
		||||
  if (waypoints.every((waypoint) => typeof waypoint.position === 'number')) {
 | 
			
		||||
    waypoints.sort((a, b) => a.position - b.position);
 | 
			
		||||
    for (let i = 1; i < waypoints.length; i++) {
 | 
			
		||||
      if (waypoints[i - 1].position >= waypoints[i].position) return false;
 | 
			
		||||
    }
 | 
			
		||||
    const positions = Array.from(waypoints, (waypoint) => waypoint.position);
 | 
			
		||||
    positions.sort();
 | 
			
		||||
    for (let i = 1; i < positions.length; i++)
 | 
			
		||||
      if (positions[i] != positions[i - 1] + 1) return false;
 | 
			
		||||
 | 
			
		||||
    return true;
 | 
			
		||||
  }
 | 
			
		||||
  return false;
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,62 @@
 | 
			
		|||
import { HasValidPositionIndexes } from '@modules/ad/interface/grpc-controllers/dtos/validators/decorators/has-valid-position-indexes.decorator';
 | 
			
		||||
import { WaypointDto } from '@modules/ad/interface/grpc-controllers/dtos/waypoint.dto';
 | 
			
		||||
import { Validator } from 'class-validator';
 | 
			
		||||
 | 
			
		||||
describe('valid position indexes decorator', () => {
 | 
			
		||||
  class MyClass {
 | 
			
		||||
    @HasValidPositionIndexes()
 | 
			
		||||
    waypoints: WaypointDto[];
 | 
			
		||||
  }
 | 
			
		||||
  it('should return a property decorator has a function', () => {
 | 
			
		||||
    const hasValidPositionIndexes = HasValidPositionIndexes();
 | 
			
		||||
    expect(typeof hasValidPositionIndexes).toBe('function');
 | 
			
		||||
  });
 | 
			
		||||
  it('should validate an array of waypoints with valid positions', async () => {
 | 
			
		||||
    const myClassInstance = new MyClass();
 | 
			
		||||
    myClassInstance.waypoints = [
 | 
			
		||||
      {
 | 
			
		||||
        position: 0,
 | 
			
		||||
        lon: 48.8566,
 | 
			
		||||
        lat: 2.3522,
 | 
			
		||||
        locality: 'Paris',
 | 
			
		||||
        postalCode: '75000',
 | 
			
		||||
        country: 'France',
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        position: 1,
 | 
			
		||||
        lon: 49.2628,
 | 
			
		||||
        lat: 4.0347,
 | 
			
		||||
        locality: 'Reims',
 | 
			
		||||
        postalCode: '51454',
 | 
			
		||||
        country: 'France',
 | 
			
		||||
      },
 | 
			
		||||
    ];
 | 
			
		||||
    const validator = new Validator();
 | 
			
		||||
    const validation = await validator.validate(myClassInstance);
 | 
			
		||||
    expect(validation.length).toBe(0);
 | 
			
		||||
  });
 | 
			
		||||
  it('should not validate an array of waypoints with invalid positions', async () => {
 | 
			
		||||
    const myClassInstance = new MyClass();
 | 
			
		||||
    myClassInstance.waypoints = [
 | 
			
		||||
      {
 | 
			
		||||
        position: 1,
 | 
			
		||||
        lon: 48.8566,
 | 
			
		||||
        lat: 2.3522,
 | 
			
		||||
        locality: 'Paris',
 | 
			
		||||
        postalCode: '75000',
 | 
			
		||||
        country: 'France',
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        position: 1,
 | 
			
		||||
        lon: 49.2628,
 | 
			
		||||
        lat: 4.0347,
 | 
			
		||||
        locality: 'Reims',
 | 
			
		||||
        postalCode: '51454',
 | 
			
		||||
        country: 'France',
 | 
			
		||||
      },
 | 
			
		||||
    ];
 | 
			
		||||
    const validator = new Validator();
 | 
			
		||||
    const validation = await validator.validate(myClassInstance);
 | 
			
		||||
    expect(validation.length).toBe(1);
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			@ -1,4 +1,4 @@
 | 
			
		|||
import { hasValidPositionIndexes } from '@modules/ad/interface/grpc-controllers/dtos/validators/waypoint-position';
 | 
			
		||||
import { hasValidPositionIndexes } from '@modules/ad/interface/grpc-controllers/dtos/validators/has-valid-position-indexes.validator';
 | 
			
		||||
import { WaypointDto } from '@modules/ad/interface/grpc-controllers/dtos/waypoint.dto';
 | 
			
		||||
 | 
			
		||||
describe('addresses position validator', () => {
 | 
			
		||||
| 
						 | 
				
			
			@ -26,10 +26,10 @@ describe('addresses position validator', () => {
 | 
			
		|||
    country: 'France',
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  it('should validate if no position is defined', () => {
 | 
			
		||||
  it('should not validate if no position is defined', () => {
 | 
			
		||||
    expect(
 | 
			
		||||
      hasValidPositionIndexes([mockAddress1, mockAddress2, mockAddress3]),
 | 
			
		||||
    ).toBeTruthy();
 | 
			
		||||
    ).toBeFalsy();
 | 
			
		||||
  });
 | 
			
		||||
  it('should not validate if only one position is defined', () => {
 | 
			
		||||
    mockAddress1.position = 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -61,11 +61,15 @@ describe('addresses position validator', () => {
 | 
			
		|||
    expect(
 | 
			
		||||
      hasValidPositionIndexes([mockAddress1, mockAddress2, mockAddress3]),
 | 
			
		||||
    ).toBeTruthy();
 | 
			
		||||
    mockAddress1.position = 10;
 | 
			
		||||
    mockAddress2.position = 0;
 | 
			
		||||
    mockAddress1.position = 1;
 | 
			
		||||
    mockAddress2.position = 2;
 | 
			
		||||
    mockAddress3.position = 3;
 | 
			
		||||
    expect(
 | 
			
		||||
      hasValidPositionIndexes([mockAddress1, mockAddress2, mockAddress3]),
 | 
			
		||||
    ).toBeTruthy();
 | 
			
		||||
  });
 | 
			
		||||
  it('should not validate if no waypoints are defined', () => {
 | 
			
		||||
    expect(hasValidPositionIndexes(undefined)).toBeFalsy();
 | 
			
		||||
    expect(hasValidPositionIndexes([])).toBeFalsy();
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
import { Frequency } from '@modules/ad/core/ad.types';
 | 
			
		||||
import { intToFrequency } from '@modules/ad/interface/grpc-controllers/dtos/validators/frequency.mapping';
 | 
			
		||||
import { intToFrequency } from '@modules/ad/interface/grpc-controllers/dtos/transformers/int-to-frequency';
 | 
			
		||||
 | 
			
		||||
describe('frequency mapping', () => {
 | 
			
		||||
  it('should return punctual if frequency is 1', () => {
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,30 @@
 | 
			
		|||
import { ScheduleDto } from '@modules/ad/interface/grpc-controllers/dtos/schedule.dto';
 | 
			
		||||
import { IsSchedule } from '@modules/ad/interface/grpc-controllers/dtos/validators/decorators/is-schedule.decorator';
 | 
			
		||||
import { Validator } from 'class-validator';
 | 
			
		||||
 | 
			
		||||
describe('schedule decorator', () => {
 | 
			
		||||
  class MyClass {
 | 
			
		||||
    @IsSchedule()
 | 
			
		||||
    schedule: ScheduleDto;
 | 
			
		||||
  }
 | 
			
		||||
  it('should return a property decorator has a function', () => {
 | 
			
		||||
    const isSchedule = IsSchedule();
 | 
			
		||||
    expect(typeof isSchedule).toBe('function');
 | 
			
		||||
  });
 | 
			
		||||
  it('should validate a valid schedule', async () => {
 | 
			
		||||
    const myClassInstance = new MyClass();
 | 
			
		||||
    myClassInstance.schedule = {
 | 
			
		||||
      mon: '07:15',
 | 
			
		||||
    };
 | 
			
		||||
    const validator = new Validator();
 | 
			
		||||
    const validation = await validator.validate(myClassInstance);
 | 
			
		||||
    expect(validation.length).toBe(0);
 | 
			
		||||
  });
 | 
			
		||||
  it('should not validate a invalid schedule', async () => {
 | 
			
		||||
    const myClassInstance = new MyClass();
 | 
			
		||||
    myClassInstance.schedule = {};
 | 
			
		||||
    const validator = new Validator();
 | 
			
		||||
    const validation = await validator.validate(myClassInstance);
 | 
			
		||||
    expect(validation.length).toBe(1);
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,14 @@
 | 
			
		|||
import { toPrecision } from '@modules/ad/interface/grpc-controllers/dtos/transformers/to-precision';
 | 
			
		||||
 | 
			
		||||
describe('precision handler', () => {
 | 
			
		||||
  it('should return a 6 digits float number for a 10 digits float input number and 6 as precision', () => {
 | 
			
		||||
    const precised = toPrecision(1.1234567891, 6);
 | 
			
		||||
    const stringPrecised = precised.toString().split('.')[1];
 | 
			
		||||
    expect(stringPrecised.length).toBe(6);
 | 
			
		||||
  });
 | 
			
		||||
  it('should return a 2 digits float number for a 2 digits float input number and 4 as precision', () => {
 | 
			
		||||
    const precised = toPrecision(1.12, 4);
 | 
			
		||||
    const stringPrecised = precised.toString().split('.')[1];
 | 
			
		||||
    expect(stringPrecised.length).toBe(2);
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
		Loading…
	
		Reference in New Issue