import { IsNotEmpty, ValidateIf, IsOptional, Equals } from '../../src/decorator/decorators'; import { Validator } from '../../src/validation/Validator'; const validator = new Validator(); describe('conditional validation', () => { it("shouldn't validate a property when the condition is false", () => { expect.assertions(1); class MyClass { @ValidateIf(o => false) @IsNotEmpty() title: string; } const model = new MyClass(); return validator.validate(model).then(errors => { expect(errors.length).toEqual(0); }); }); it('should validate a property when the condition is true', () => { expect.assertions(5); class MyClass { @ValidateIf(o => true) @IsNotEmpty() title: string = ''; } const model = new MyClass(); return validator.validate(model).then(errors => { expect(errors.length).toEqual(1); expect(errors[0].target).toEqual(model); expect(errors[0].property).toEqual('title'); expect(errors[0].constraints).toEqual({ isNotEmpty: 'title should not be empty' }); expect(errors[0].value).toEqual(''); }); }); it('should pass the object being validated to the condition function', () => { expect.assertions(3); class MyClass { @ValidateIf(o => { expect(o).toBeInstanceOf(MyClass); expect(o.title).toEqual('title'); return true; }) @IsNotEmpty() title: string = 'title'; } const model = new MyClass(); return validator.validate(model).then(errors => { expect(errors.length).toEqual(0); }); }); it('should validate a property when value is empty', () => { expect.assertions(5); class MyClass { @IsOptional() @Equals('test') title: string = ''; } const model = new MyClass(); return validator.validate(model).then(errors => { expect(errors.length).toEqual(1); expect(errors[0].target).toEqual(model); expect(errors[0].property).toEqual('title'); expect(errors[0].constraints).toEqual({ equals: 'title must be equal to test' }); expect(errors[0].value).toEqual(''); }); }); it('should validate a property when value is supplied', () => { class MyClass { @IsOptional() @Equals('test') title: string = 'bad_value'; } const model = new MyClass(); return validator.validate(model).then(errors => { expect(errors.length).toEqual(1); expect(errors[0].target).toEqual(model); expect(errors[0].property).toEqual('title'); expect(errors[0].constraints).toEqual({ equals: 'title must be equal to test' }); expect(errors[0].value).toEqual('bad_value'); }); }); });