-
Notifications
You must be signed in to change notification settings - Fork 820
/
Copy pathconditional-validation.spec.ts
143 lines (122 loc) · 4.09 KB
/
conditional-validation.spec.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
import { IsNotEmpty, ValidateIf, IsOptional, Equals } from '../../src/decorator/decorators';
import { Validator } from '../../src/validation/Validator';
import {IsNullable} from "../../src/decorator/common/IsNullable";
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');
});
});
it('should validate a property when value is supplied', () => {
class MyClass {
@IsNullable()
@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');
});
});
it('should validate a property when value is undefined', () => {
class MyClass {
@IsNullable()
@Equals('test')
title: string = undefined;
}
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(undefined);
});
});
it("shouldn't validate a property when value is null", () => {
class MyClass {
@IsNullable()
@Equals('test')
title: string = null;
}
const model = new MyClass();
return validator.validate(model).then(errors => {
expect(errors.length).toEqual(0);
});
});
});