/
policeman.test.ts
144 lines (118 loc) · 3.91 KB
/
policeman.test.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
144
import * as tape from "tape";
import policeman, { combineValidators, Filter } from "../lib/policeman";
import { isRequired, isEmail, isMatching } from "../lib/validators";
type Test = tape.Test;
function appliesSignleValidator(t: Test) {
const requiredCheck = isRequired(() => "is required");
const validator = policeman([
["fullName", "full_name", requiredCheck],
]);
const actual = validator({});
const expected = {
valid: false,
errors: {
fullName: "is required",
},
};
t.deepEqual(actual, expected, "results in single error if single validator was specified");
}
function appliesMultipleValidators(t: Test) {
const requiredCheck = isRequired(() => "is required");
const emailCheck = isEmail(() => "is invalid email");
const validator = policeman([
["email", "email", [requiredCheck, emailCheck]],
]);
const actual = validator({});
const expected = {
valid: false,
errors: {
email: ["is required", "is invalid email"],
},
};
t.deepEqual(actual, expected, "results in multiple errors if multiple validators were specified");
}
function combinesMultipleValidators(t: Test) {
const requiredCheck = isRequired(() => "is required");
const emailCheck = isEmail(() => "is invalid email");
const validator = policeman([
["email", "email", combineValidators(requiredCheck, emailCheck)],
]);
const actual = validator({ email: "invalid" });
const expected = {
valid: false,
errors: {
email: "is invalid email",
},
};
t.deepEqual(actual, expected, "results in single error if multiple validators were combined");
}
function validCombinesMultipleValidators(t: Test) {
const requiredCheck = isRequired(() => "is required");
const emailCheck = isEmail(() => "is invalid email");
const validator = policeman([
["email", "email", combineValidators(requiredCheck, emailCheck)],
]);
const actual = validator({ email: "test@example.com" });
const expected = {
valid: true,
errors: {
email: null,
},
};
t.deepEqual(actual, expected, "passes validation with combined multiple validators");
}
function skipValidationByFilter(t: Test) {
interface User {
gift: boolean;
giftCode?: boolean;
phone: string;
}
const requiredCheck = isRequired(() => "is required");
const emailCheck = isEmail(() => "is invalid email");
const phoneNumberCheck = isMatching(/\d{3}-?\d{3}-?\d{3}/, () => "is invalid phone");
const skipGift: Filter = (value: any, source: User) => source.gift === true;
const validator = policeman([
["email", "email", [requiredCheck, emailCheck]],
["phone", "phone", combineValidators(requiredCheck, phoneNumberCheck)],
["giftCode", "giftCode", requiredCheck, skipGift],
]);
const actual = validator({ gift: false, email: "invalid@example", phone: "777-666-55" });
const expected = {
valid: false,
errors: {
email: ["is invalid email"],
phone: "is invalid phone",
},
};
t.deepEqual(actual, expected, "skips entry validation if filter gives false");
}
function validSkipValidationByFilter(t: Test) {
interface User {
guest: boolean;
email?: string;
}
const requiredCheck = isRequired(() => "is required");
const emailCheck = isEmail(() => "is invalid email");
const isntGuest: Filter = (value: any, source: User) => source.guest !== true;
const validator = policeman([
["email", "email", [requiredCheck, emailCheck], isntGuest],
["name", "name", requiredCheck],
]);
const actual = validator({ guest: true, name: "Foo" });
const expected = {
valid: true,
errors: {
name: null,
},
};
t.deepEqual(actual, expected, "skips entry validation if filter gives false");
}
tape("policeman", (t: Test) => {
t.plan(6);
appliesSignleValidator(t);
appliesMultipleValidators(t);
combinesMultipleValidators(t);
validCombinesMultipleValidators(t);
skipValidationByFilter(t);
validSkipValidationByFilter(t);
});