quival 0.2.7 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,85 @@
1
+ import { strict as assert } from 'assert';
2
+ import Validator from '../src/Validator.js';
3
+
4
+ describe('Functionalities', () => {
5
+ it('Create a new instance', () => {
6
+ const validator = new Validator({ field: 'abc' }, { field: 'string' });
7
+ assert(validator instanceof Validator);
8
+ });
9
+
10
+ it('Validate data', async () => {
11
+ const validator = new Validator(
12
+ {
13
+ val1: '@bc',
14
+ val2: 123,
15
+ },
16
+ {
17
+ val1: 'string|alpha|min:5',
18
+ val2: 'string|alpha',
19
+ },
20
+ );
21
+
22
+ assert.deepEqual((await validator.validate()).messages(), {
23
+ val1: ['validation.alpha', 'validation.min'],
24
+ val2: ['validation.string', 'validation.alpha'],
25
+ });
26
+ });
27
+
28
+ it('Stop on first failure', async () => {
29
+ const validator = new Validator(
30
+ {
31
+ val1: '@bc',
32
+ val2: 123,
33
+ },
34
+ {
35
+ val1: 'string|alpha|min:5',
36
+ val2: 'string|alpha',
37
+ },
38
+ );
39
+
40
+ validator.stopOnFirstFailure();
41
+
42
+ assert.deepEqual((await validator.validate()).messages(), {
43
+ val1: ['validation.alpha', 'validation.min'],
44
+ });
45
+ });
46
+
47
+ it('Always bail', async () => {
48
+ const validator = new Validator(
49
+ {
50
+ val1: '@bc',
51
+ val2: 123,
52
+ },
53
+ {
54
+ val1: 'string|alpha|min:5',
55
+ val2: 'string|alpha',
56
+ },
57
+ );
58
+
59
+ validator.alwaysBail();
60
+
61
+ assert.deepEqual((await validator.validate()).messages(), {
62
+ val1: ['validation.alpha'],
63
+ val2: ['validation.string'],
64
+ });
65
+ });
66
+
67
+ it('Stop on first failure and always bail', async () => {
68
+ const validator = new Validator(
69
+ {
70
+ val1: '@bc',
71
+ val2: 123,
72
+ },
73
+ {
74
+ val1: 'string|alpha|min:5',
75
+ val2: 'string|alpha',
76
+ },
77
+ );
78
+
79
+ validator.stopOnFirstFailure().alwaysBail();
80
+
81
+ assert.deepEqual((await validator.validate()).messages(), {
82
+ val1: ['validation.alpha'],
83
+ });
84
+ });
85
+ });
@@ -0,0 +1,174 @@
1
+ import { strict as assert } from 'assert';
2
+ import {
3
+ escapeRegExp,
4
+ flattenObject,
5
+ getByPath,
6
+ isDigits,
7
+ isEmpty,
8
+ isNumeric,
9
+ isPlainObject,
10
+ isValidDate,
11
+ parseCsvString,
12
+ parseDate,
13
+ parseDateByFormat,
14
+ setByPath,
15
+ toCamelCase,
16
+ toSnakeCase,
17
+ } from '../src/helpers.js';
18
+
19
+ describe('Helpers', () => {
20
+ it('toCamelCase', () => {
21
+ assert.equal(toCamelCase('a_test_name'), 'aTestName');
22
+ assert.equal(toCamelCase('_test_name'), 'testName');
23
+ assert.equal(toCamelCase('a-test-name'), 'aTestName');
24
+ assert.equal(toCamelCase('-test-name'), 'testName');
25
+ assert.equal(toCamelCase('a test name'), 'aTestName');
26
+ assert.equal(toCamelCase(' test name'), 'testName');
27
+ });
28
+
29
+ it('toSnakeCase', () => {
30
+ assert.equal(toSnakeCase('aTestName'), 'a_test_name');
31
+ assert.equal(toSnakeCase('a_testName'), 'a_test_name');
32
+ assert.equal(toSnakeCase('ATESTNAME'), 'a_t_e_s_t_n_a_m_e');
33
+ });
34
+
35
+ it('escapeRegExp', () => {
36
+ assert.equal(escapeRegExp('.*+?^${}()|[]\\'), '\\.\\*\\+\\?\\^\\$\\{\\}\\(\\)\\|\\[\\]\\\\');
37
+ });
38
+
39
+ it('getByPath', () => {
40
+ assert.equal(getByPath({ a: { b: 1 } }, 'a.b'), 1);
41
+ assert.equal(getByPath({ a: [1, { c: 2 }] }, 'a.1.c'), 2);
42
+ });
43
+
44
+ it('setByPath', () => {
45
+ let obj = { a: { b: 1 } };
46
+ setByPath(obj, 'a.b', 3);
47
+
48
+ assert.deepEqual(obj, { a: { b: 3 } });
49
+
50
+ obj = { a: [1, { c: 2 }] };
51
+ setByPath(obj, 'a.1.c', 5);
52
+
53
+ assert.deepEqual(obj, { a: [1, { c: 5 }] });
54
+ });
55
+
56
+ it('flattenObject', () => {
57
+ assert.deepEqual(flattenObject({ a: 1, b: { x: 41, y: 42 } }), { a: 1, 'b.x': 41, 'b.y': 42 });
58
+ assert.deepEqual(flattenObject({ a: 1, b: [71, 73, 75] }), { a: 1, 'b.0': 71, 'b.1': 73, 'b.2': 75 });
59
+ });
60
+
61
+ it('parseCsvString', () => {
62
+ assert.deepEqual(parseCsvString('a,b,c'), ['a', 'b', 'c']);
63
+ assert.deepEqual(parseCsvString('a, b, c'), ['a', ' b', ' c']);
64
+ assert.deepEqual(parseCsvString('"a","b","c"'), ['a', 'b', 'c']);
65
+ assert.deepEqual(parseCsvString('"a", "b", "c"'), ['a', 'b', 'c']);
66
+ assert.deepEqual(parseCsvString('"a", "b", ""'), ['a', 'b', '']);
67
+
68
+ assert.deepEqual(parseCsvString('"r2""c1","r2c2","r2c3"'), ['r2"c1', 'r2c2', 'r2c3']);
69
+ assert.deepEqual(parseCsvString('"r2""c1",r2c2,r2c3'), ['r2"c1', 'r2c2', 'r2c3']);
70
+ assert.deepEqual(parseCsvString('r1c1,"r1,c2",r1c3'), ['r1c1', 'r1,c2', 'r1c3']);
71
+ assert.deepEqual(parseCsvString('"r2""c1",r2c2,"r2""""c3"'), ['r2"c1', 'r2c2', 'r2""c3']);
72
+ assert.deepEqual(parseCsvString('r1c1,"r1,c2","r1"",""c3"'), ['r1c1', 'r1,c2', 'r1","c3']);
73
+ });
74
+
75
+ it('parseDate', () => {
76
+ const date1 = new Date('2023/08/11 00:00:00');
77
+ const date2 = new Date('2023/08/11 08:40:50 am');
78
+ const date3 = new Date();
79
+ date3.setHours(8);
80
+ date3.setMinutes(40);
81
+ date3.setSeconds(50);
82
+ date3.setMilliseconds(0);
83
+
84
+ assert.deepEqual(parseDate('11-08-2023'), date1);
85
+ assert.deepEqual(parseDate('11-08-2023 08:40:50'), date2);
86
+ assert.deepEqual(parseDate('11-08-2023 08:40:50 am'), date2);
87
+ assert.deepEqual(parseDate('11/08/2023'), date1);
88
+ assert.deepEqual(parseDate('11/08/2023 08:40:50'), date2);
89
+ assert.deepEqual(parseDate('11/08/2023 08:40:50 am'), date2);
90
+ assert.deepEqual(parseDate('11.08.2023'), date1);
91
+ assert.deepEqual(parseDate('11.08.2023 08:40:50'), date2);
92
+ assert.deepEqual(parseDate('11.08.2023 08:40:50 am'), date2);
93
+
94
+ assert.deepEqual(parseDate('2023-08-11'), date1);
95
+ assert.deepEqual(parseDate('2023-08-11 08:40:50'), date2);
96
+ assert.deepEqual(parseDate('2023-08-11 08:40:50 am'), date2);
97
+ assert.deepEqual(parseDate('2023/08/11'), date1);
98
+ assert.deepEqual(parseDate('2023/08/11 08:40:50'), date2);
99
+ assert.deepEqual(parseDate('2023/08/11 08:40:50 am'), date2);
100
+ assert.deepEqual(parseDate('2023.08.11'), date1);
101
+ assert.deepEqual(parseDate('2023.08.11 08:40:50'), date2);
102
+ assert.deepEqual(parseDate('2023.08.11 08:40:50 am'), date2);
103
+
104
+ assert.deepEqual(parseDate('08:40:50 2023-08-11'), date2);
105
+ assert.deepEqual(parseDate('08:40:50 am 2023-08-11'), date2);
106
+ assert.deepEqual(parseDate('08:40:50 2023/08/11'), date2);
107
+ assert.deepEqual(parseDate('08:40:50 am 2023/08/11'), date2);
108
+ assert.deepEqual(parseDate('08:40:50 2023.08.11'), date2);
109
+ assert.deepEqual(parseDate('08:40:50 am 2023.08.11'), date2);
110
+
111
+ assert.deepEqual(parseDate('08:40:50'), date3);
112
+ assert.deepEqual(parseDate('08:40:50 am'), date3);
113
+ assert.deepEqual(parseDate('08:40:50'), date3);
114
+ assert.deepEqual(parseDate('08:40:50 am'), date3);
115
+ assert.deepEqual(parseDate('08:40:50'), date3);
116
+ assert.deepEqual(parseDate('08:40:50 am'), date3);
117
+ });
118
+
119
+ it('parseDateByFormat', () => {
120
+ const date1 = new Date('2023/08/11 00:00:00');
121
+ const date2 = new Date('2023/08/11 08:40:50 am');
122
+ const date3 = new Date();
123
+ date3.setHours(8);
124
+ date3.setMinutes(40);
125
+ date3.setSeconds(50);
126
+ date3.setMilliseconds(0);
127
+
128
+ assert.deepEqual(parseDateByFormat('08-11-2023', 'm-d-Y'), date1);
129
+ assert.deepEqual(parseDateByFormat('08-11-23', 'm-d-y'), date1);
130
+ assert.deepEqual(parseDateByFormat('08-11-2023 08:40:50', 'm-d-Y H:i:s'), date2);
131
+ assert.deepEqual(parseDateByFormat('08-11-23 08:40:50', 'm-d-y H:i:s'), date2);
132
+ assert.deepEqual(parseDateByFormat('08-11-2023 08:40:50 am', 'm-d-Y H:i:s a'), date2);
133
+ assert.deepEqual(parseDateByFormat('08-11-23 08:40:50 am', 'm-d-y H:i:s a'), date2);
134
+ });
135
+
136
+ it('isDigits', () => {
137
+ assert(isDigits(123));
138
+ assert(isDigits('123'));
139
+ assert(!isDigits('abc'));
140
+ assert(!isDigits('abc123'));
141
+ });
142
+
143
+ it('isEmpty', () => {
144
+ assert(isEmpty(''));
145
+ assert(isEmpty(null));
146
+ assert(isEmpty(undefined));
147
+ assert(!isEmpty(123));
148
+ assert(!isEmpty('abc'));
149
+ assert(!isEmpty({}));
150
+ assert(!isEmpty([]));
151
+ });
152
+
153
+ it('isNumeric', () => {
154
+ assert(isNumeric(123));
155
+ assert(isNumeric('123'));
156
+ assert(!isNumeric('abc'));
157
+ assert(!isNumeric(true));
158
+ });
159
+
160
+ it('isPlainObject', () => {
161
+ assert(isPlainObject({}));
162
+ assert(!isPlainObject([]));
163
+ assert(!isPlainObject(new Date()));
164
+ });
165
+
166
+ it('isValidDate', () => {
167
+ assert(isValidDate(new Date()));
168
+ assert(isValidDate(new Date('2023/08/11 00:00:00')));
169
+ assert(isValidDate(new Date('2023/08/11 08:40:50 am')));
170
+ assert(isValidDate(new Date('08:40:50 am 2023/08/11')));
171
+ assert(!isValidDate(new Date('')));
172
+ assert(!isValidDate(new Date('08:40:50 am')));
173
+ });
174
+ });
@@ -1,20 +1,4 @@
1
1
  import { strict as assert } from 'assert';
2
- import {
3
- escapeRegExp,
4
- flattenObject,
5
- getByPath,
6
- isDigits,
7
- isEmpty,
8
- isNumeric,
9
- isPlainObject,
10
- isValidDate,
11
- parseCsvString,
12
- parseDate,
13
- parseDateByFormat,
14
- setByPath,
15
- toCamelCase,
16
- toSnakeCase,
17
- } from '../src/helpers.js';
18
2
  import Validator from '../src/Validator.js';
19
3
 
20
4
  globalThis.File = class {
@@ -29,163 +13,6 @@ globalThis.File = class {
29
13
  }
30
14
  };
31
15
 
32
- describe('Helpers', () => {
33
- it('toCamelCase', () => {
34
- assert.equal(toCamelCase('a_test_name'), 'aTestName');
35
- assert.equal(toCamelCase('_test_name'), 'testName');
36
- assert.equal(toCamelCase('a-test-name'), 'aTestName');
37
- assert.equal(toCamelCase('-test-name'), 'testName');
38
- assert.equal(toCamelCase('a test name'), 'aTestName');
39
- assert.equal(toCamelCase(' test name'), 'testName');
40
- });
41
-
42
- it('toSnakeCase', () => {
43
- assert.equal(toSnakeCase('aTestName'), 'a_test_name');
44
- assert.equal(toSnakeCase('a_testName'), 'a_test_name');
45
- assert.equal(toSnakeCase('ATESTNAME'), 'a_t_e_s_t_n_a_m_e');
46
- });
47
-
48
- it('escapeRegExp', () => {
49
- assert.equal(escapeRegExp('.*+?^${}()|[]\\'), '\\.\\*\\+\\?\\^\\$\\{\\}\\(\\)\\|\\[\\]\\\\');
50
- });
51
-
52
- it('getByPath', () => {
53
- assert.equal(getByPath({ a: { b: 1 } }, 'a.b'), 1);
54
- assert.equal(getByPath({ a: [1, { c: 2 }] }, 'a.1.c'), 2);
55
- });
56
-
57
- it('setByPath', () => {
58
- let obj = { a: { b: 1 } };
59
- setByPath(obj, 'a.b', 3);
60
-
61
- assert.deepEqual(obj, { a: { b: 3 } });
62
-
63
- obj = { a: [1, { c: 2 }] };
64
- setByPath(obj, 'a.1.c', 5);
65
-
66
- assert.deepEqual(obj, { a: [1, { c: 5 }] });
67
- });
68
-
69
- it('flattenObject', () => {
70
- assert.deepEqual(flattenObject({ a: 1, b: { x: 41, y: 42 } }), { a: 1, 'b.x': 41, 'b.y': 42 });
71
- assert.deepEqual(flattenObject({ a: 1, b: [71, 73, 75] }), { a: 1, 'b.0': 71, 'b.1': 73, 'b.2': 75 });
72
- });
73
-
74
- it('parseCsvString', () => {
75
- assert.deepEqual(parseCsvString('a,b,c'), ['a', 'b', 'c']);
76
- assert.deepEqual(parseCsvString('a, b, c'), ['a', ' b', ' c']);
77
- assert.deepEqual(parseCsvString('"a","b","c"'), ['a', 'b', 'c']);
78
- assert.deepEqual(parseCsvString('"a", "b", "c"'), ['a', 'b', 'c']);
79
- assert.deepEqual(parseCsvString('"a", "b", ""'), ['a', 'b', '']);
80
-
81
- assert.deepEqual(parseCsvString('"r2""c1","r2c2","r2c3"'), ['r2"c1', 'r2c2', 'r2c3']);
82
- assert.deepEqual(parseCsvString('"r2""c1",r2c2,r2c3'), ['r2"c1', 'r2c2', 'r2c3']);
83
- assert.deepEqual(parseCsvString('r1c1,"r1,c2",r1c3'), ['r1c1', 'r1,c2', 'r1c3']);
84
- assert.deepEqual(parseCsvString('"r2""c1",r2c2,"r2""""c3"'), ['r2"c1', 'r2c2', 'r2""c3']);
85
- assert.deepEqual(parseCsvString('r1c1,"r1,c2","r1"",""c3"'), ['r1c1', 'r1,c2', 'r1","c3']);
86
- });
87
-
88
- it('parseDate', () => {
89
- const date1 = new Date('2023/08/11 00:00:00');
90
- const date2 = new Date('2023/08/11 08:40:50 am');
91
- const date3 = new Date();
92
- date3.setHours(8);
93
- date3.setMinutes(40);
94
- date3.setSeconds(50);
95
- date3.setMilliseconds(0);
96
-
97
- assert.deepEqual(parseDate('11-08-2023'), date1);
98
- assert.deepEqual(parseDate('11-08-2023 08:40:50'), date2);
99
- assert.deepEqual(parseDate('11-08-2023 08:40:50 am'), date2);
100
- assert.deepEqual(parseDate('11/08/2023'), date1);
101
- assert.deepEqual(parseDate('11/08/2023 08:40:50'), date2);
102
- assert.deepEqual(parseDate('11/08/2023 08:40:50 am'), date2);
103
- assert.deepEqual(parseDate('11.08.2023'), date1);
104
- assert.deepEqual(parseDate('11.08.2023 08:40:50'), date2);
105
- assert.deepEqual(parseDate('11.08.2023 08:40:50 am'), date2);
106
-
107
- assert.deepEqual(parseDate('2023-08-11'), date1);
108
- assert.deepEqual(parseDate('2023-08-11 08:40:50'), date2);
109
- assert.deepEqual(parseDate('2023-08-11 08:40:50 am'), date2);
110
- assert.deepEqual(parseDate('2023/08/11'), date1);
111
- assert.deepEqual(parseDate('2023/08/11 08:40:50'), date2);
112
- assert.deepEqual(parseDate('2023/08/11 08:40:50 am'), date2);
113
- assert.deepEqual(parseDate('2023.08.11'), date1);
114
- assert.deepEqual(parseDate('2023.08.11 08:40:50'), date2);
115
- assert.deepEqual(parseDate('2023.08.11 08:40:50 am'), date2);
116
-
117
- assert.deepEqual(parseDate('08:40:50 2023-08-11'), date2);
118
- assert.deepEqual(parseDate('08:40:50 am 2023-08-11'), date2);
119
- assert.deepEqual(parseDate('08:40:50 2023/08/11'), date2);
120
- assert.deepEqual(parseDate('08:40:50 am 2023/08/11'), date2);
121
- assert.deepEqual(parseDate('08:40:50 2023.08.11'), date2);
122
- assert.deepEqual(parseDate('08:40:50 am 2023.08.11'), date2);
123
-
124
- assert.deepEqual(parseDate('08:40:50'), date3);
125
- assert.deepEqual(parseDate('08:40:50 am'), date3);
126
- assert.deepEqual(parseDate('08:40:50'), date3);
127
- assert.deepEqual(parseDate('08:40:50 am'), date3);
128
- assert.deepEqual(parseDate('08:40:50'), date3);
129
- assert.deepEqual(parseDate('08:40:50 am'), date3);
130
- });
131
-
132
- it('parseDateByFormat', () => {
133
- const date1 = new Date('2023/08/11 00:00:00');
134
- const date2 = new Date('2023/08/11 08:40:50 am');
135
- const date3 = new Date();
136
- date3.setHours(8);
137
- date3.setMinutes(40);
138
- date3.setSeconds(50);
139
- date3.setMilliseconds(0);
140
-
141
- assert.deepEqual(parseDateByFormat('08-11-2023', 'm-d-Y'), date1);
142
- assert.deepEqual(parseDateByFormat('08-11-23', 'm-d-y'), date1);
143
- assert.deepEqual(parseDateByFormat('08-11-2023 08:40:50', 'm-d-Y H:i:s'), date2);
144
- assert.deepEqual(parseDateByFormat('08-11-23 08:40:50', 'm-d-y H:i:s'), date2);
145
- assert.deepEqual(parseDateByFormat('08-11-2023 08:40:50 am', 'm-d-Y H:i:s a'), date2);
146
- assert.deepEqual(parseDateByFormat('08-11-23 08:40:50 am', 'm-d-y H:i:s a'), date2);
147
- });
148
-
149
- it('isDigits', () => {
150
- assert(isDigits(123));
151
- assert(isDigits('123'));
152
- assert(!isDigits('abc'));
153
- assert(!isDigits('abc123'));
154
- });
155
-
156
- it('isEmpty', () => {
157
- assert(isEmpty(''));
158
- assert(isEmpty(null));
159
- assert(isEmpty(undefined));
160
- assert(!isEmpty(123));
161
- assert(!isEmpty('abc'));
162
- assert(!isEmpty({}));
163
- assert(!isEmpty([]));
164
- });
165
-
166
- it('isNumeric', () => {
167
- assert(isNumeric(123));
168
- assert(isNumeric('123'));
169
- assert(!isNumeric('abc'));
170
- assert(!isNumeric(true));
171
- });
172
-
173
- it('isPlainObject', () => {
174
- assert(isPlainObject({}));
175
- assert(!isPlainObject([]));
176
- assert(!isPlainObject(new Date()));
177
- });
178
-
179
- it('isValidDate', () => {
180
- assert(isValidDate(new Date()));
181
- assert(isValidDate(new Date('2023/08/11 00:00:00')));
182
- assert(isValidDate(new Date('2023/08/11 08:40:50 am')));
183
- assert(isValidDate(new Date('08:40:50 am 2023/08/11')));
184
- assert(!isValidDate(new Date('')));
185
- assert(!isValidDate(new Date('08:40:50 am')));
186
- });
187
- });
188
-
189
16
  describe('Validation', () => {
190
17
  describe(`Empty rule`, () => {
191
18
  it(`Passes when the rule is empty`, async () => {
@@ -445,6 +272,16 @@ describe('Validation', () => {
445
272
  });
446
273
  });
447
274
 
275
+ describe(`Rule 'bail'`, () => {
276
+ it(`Passes when the field is null`, async () => {
277
+ const validator = new Validator({ field: '@bc' }, { field: 'bail|string|alpha|min:5' });
278
+
279
+ assert.deepEqual((await validator.validate()).messages(), {
280
+ field: ['validation.alpha'],
281
+ });
282
+ });
283
+ });
284
+
448
285
  describe(`Rule 'before'`, () => {
449
286
  const date = '2022-01-01';
450
287
  const rules1 = { field: `before:${date}` };
@@ -1259,56 +1096,65 @@ describe('Validation', () => {
1259
1096
 
1260
1097
  describe(`Rule 'hex_color'`, () => {
1261
1098
  it(`Passes when the field is a valid color`, async () => {
1262
- const validator = new Validator({
1263
- field_1: '#abc',
1264
- field_2: '#abcd',
1265
- field_3: '#abcabc',
1266
- field_4: '#abcdabcd',
1267
- }, {
1268
- field_1: 'hex_color',
1269
- field_2: 'hex_color',
1270
- field_3: 'hex_color',
1271
- field_4: 'hex_color',
1272
- });
1099
+ const validator = new Validator(
1100
+ {
1101
+ field_1: '#abc',
1102
+ field_2: '#abcd',
1103
+ field_3: '#abcabc',
1104
+ field_4: '#abcdabcd',
1105
+ },
1106
+ {
1107
+ field_1: 'hex_color',
1108
+ field_2: 'hex_color',
1109
+ field_3: 'hex_color',
1110
+ field_4: 'hex_color',
1111
+ },
1112
+ );
1273
1113
 
1274
1114
  assert(await validator.passes());
1275
1115
  });
1276
1116
 
1277
1117
  it(`Fails when the field is not a valid color`, async () => {
1278
- const validator = new Validator({
1279
- field_1: '#ghi',
1280
- field_2: '#ghij',
1281
- field_3: '#ghighi',
1282
- field_4: '#ghijghij',
1283
- field_5: 'abc',
1284
- field_6: 123,
1285
- field_7: [1, 2, 3],
1286
- }, {
1287
- field_1: 'hex_color',
1288
- field_2: 'hex_color',
1289
- field_3: 'hex_color',
1290
- field_4: 'hex_color',
1291
- field_5: 'hex_color',
1292
- field_6: 'hex_color',
1293
- field_7: 'hex_color',
1294
- });
1118
+ const validator = new Validator(
1119
+ {
1120
+ field_1: '#ghi',
1121
+ field_2: '#ghij',
1122
+ field_3: '#ghighi',
1123
+ field_4: '#ghijghij',
1124
+ field_5: 'abc',
1125
+ field_6: 123,
1126
+ field_7: [1, 2, 3],
1127
+ },
1128
+ {
1129
+ field_1: 'hex_color',
1130
+ field_2: 'hex_color',
1131
+ field_3: 'hex_color',
1132
+ field_4: 'hex_color',
1133
+ field_5: 'hex_color',
1134
+ field_6: 'hex_color',
1135
+ field_7: 'hex_color',
1136
+ },
1137
+ );
1295
1138
 
1296
1139
  assert(await validator.fails());
1297
1140
  });
1298
1141
 
1299
1142
  it(`Fails when the color's value is not 3, 4, 6 or 8 digits.`, async () => {
1300
- const validator = new Validator({
1301
- field_1: '#1',
1302
- field_2: '#12',
1303
- field_3: '#12345',
1304
- field_4: '#1234567',
1305
- field_4: '#123456789',
1306
- }, {
1307
- field_1: 'hex_color',
1308
- field_2: 'hex_color',
1309
- field_3: 'hex_color',
1310
- field_4: 'hex_color',
1311
- });
1143
+ const validator = new Validator(
1144
+ {
1145
+ field_1: '#1',
1146
+ field_2: '#12',
1147
+ field_3: '#12345',
1148
+ field_4: '#1234567',
1149
+ field_4: '#123456789',
1150
+ },
1151
+ {
1152
+ field_1: 'hex_color',
1153
+ field_2: 'hex_color',
1154
+ field_3: 'hex_color',
1155
+ field_4: 'hex_color',
1156
+ },
1157
+ );
1312
1158
 
1313
1159
  assert(await validator.fails());
1314
1160
  });
@@ -1487,6 +1333,26 @@ describe('Validation', () => {
1487
1333
  });
1488
1334
  });
1489
1335
 
1336
+ describe(`Rule 'list'`, () => {
1337
+ const rules = { field: 'list' };
1338
+
1339
+ it(`Passes when the field is a list`, async () => {
1340
+ const validator = new Validator({ field: [1, 2, 3] }, rules);
1341
+ assert(await validator.passes());
1342
+ });
1343
+
1344
+ it(`Fails when the field is not a list`, async () => {
1345
+ const validator = new Validator({ field: { a: 1, b: 2, c: 3 } }, rules);
1346
+ assert(await validator.fails());
1347
+
1348
+ validator.setData({ field: 123 });
1349
+ assert(await validator.fails());
1350
+
1351
+ validator.setData({ field: 'abc' });
1352
+ assert(await validator.fails());
1353
+ });
1354
+ });
1355
+
1490
1356
  describe(`Rule 'lowercase'`, () => {
1491
1357
  const rules = { field: 'lowercase' };
1492
1358