@e22m4u/js-repository 0.0.33 → 0.0.35
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.
- package/package.json +1 -1
- package/src/adapter/adapter-loader.js +1 -1
- package/src/adapter/adapter-loader.spec.js +1 -1
- package/src/adapter/decorator/data-sanitizing-decorator.js +1 -1
- package/src/adapter/decorator/data-validation-decorator.js +1 -1
- package/src/adapter/decorator/default-values-decorator.js +1 -1
- package/src/adapter/decorator/fields-filtering-decorator.js +1 -1
- package/src/adapter/decorator/inclusion-decorator.js +1 -1
- package/src/definition/model/model-data-sanitizer.js +2 -2
- package/src/definition/model/model-data-validator.js +1 -1
- package/src/definition/model/model-data-validator.spec.js +1 -1
- package/src/definition/model/model-definition-utils.js +1 -1
- package/src/definition/model/model-definition-utils.spec.js +1 -1
- package/src/definition/model/properties/default-values-definition-validator.js +1 -1
- package/src/definition/model/properties/default-values-definition-validator.spec.js +1 -1
- package/src/definition/model/properties/properties-definition-validator.js +2 -2
- package/src/definition/model/properties/properties-definition-validator.spec.js +1 -1
- package/src/definition/model/relations/relations-definition-validator.js +2 -2
- package/src/definition/model/relations/relations-definition-validator.spec.js +1 -1
- package/src/filter/fields-clause-tool.d.ts +2 -2
- package/src/filter/fields-clause-tool.js +32 -21
- package/src/filter/fields-clause-tool.spec.js +479 -100
- package/src/filter/include-clause-tool.js +50 -42
- package/src/filter/include-clause-tool.spec.js +4391 -291
- package/src/filter/operator-clause-tool.js +13 -13
- package/src/filter/operator-clause-tool.spec.js +13 -13
- package/src/filter/order-clause-tool.js +20 -17
- package/src/filter/order-clause-tool.spec.js +621 -362
- package/src/filter/slice-clause-tool.js +5 -5
- package/src/filter/slice-clause-tool.spec.js +92 -51
- package/src/filter/where-clause-tool.js +7 -7
- package/src/filter/where-clause-tool.spec.js +79 -55
- package/src/utils/select-object-keys.js +3 -3
- package/src/utils/select-object-keys.spec.js +3 -3
|
@@ -11,123 +11,502 @@ const T = S.getService(FieldsClauseTool);
|
|
|
11
11
|
|
|
12
12
|
describe('FieldsClauseTool', function () {
|
|
13
13
|
describe('filter', function () {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
14
|
+
describe('object', function () {
|
|
15
|
+
describe('single field', function () {
|
|
16
|
+
it('does not throw an error if the given field is not exist', function () {
|
|
17
|
+
const object = {foo: 'a1', bar: 'a2', baz: 'a3'};
|
|
18
|
+
const res = T.filter(object, MODEL_NAME, 'qux');
|
|
19
|
+
expect(res).to.be.eql({});
|
|
20
|
+
});
|
|
20
21
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
22
|
+
it('requires the first argument to be an object', function () {
|
|
23
|
+
const throwable = v => () => T.filter(v, MODEL_NAME, 'bar');
|
|
24
|
+
const error = v =>
|
|
25
|
+
format(
|
|
26
|
+
'The first argument of FieldsClauseTool.filter should be an Object or ' +
|
|
27
|
+
'an Array of Object, but %s given.',
|
|
28
|
+
v,
|
|
29
|
+
);
|
|
30
|
+
expect(throwable('str')).to.throw(error('"str"'));
|
|
31
|
+
expect(throwable('')).to.throw(error('""'));
|
|
32
|
+
expect(throwable(10)).to.throw(error('10'));
|
|
33
|
+
expect(throwable(0)).to.throw(error('0'));
|
|
34
|
+
expect(throwable(true)).to.throw(error('true'));
|
|
35
|
+
expect(throwable(false)).to.throw(error('false'));
|
|
36
|
+
expect(throwable(undefined)).to.throw(error('undefined'));
|
|
37
|
+
expect(throwable(null)).to.throw(error('null'));
|
|
38
|
+
expect(throwable({foo: 'a1', bar: 'a2'})()).to.be.eql({bar: 'a2'});
|
|
39
|
+
expect(throwable({})()).to.be.eql({});
|
|
40
|
+
});
|
|
33
41
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
42
|
+
it('requires the second argument to be a non-empty string', function () {
|
|
43
|
+
const entity = {foo: 'a1', bar: 'a2', baz: 'a3'};
|
|
44
|
+
const throwable = v => () => T.filter(entity, v, 'bar');
|
|
45
|
+
const error = v =>
|
|
46
|
+
format(
|
|
47
|
+
'The second argument of FieldsClauseTool.filter should be ' +
|
|
48
|
+
'a non-empty String, but %s given.',
|
|
49
|
+
v,
|
|
50
|
+
);
|
|
51
|
+
expect(throwable('')).to.throw(error('""'));
|
|
52
|
+
expect(throwable(10)).to.throw(error('10'));
|
|
53
|
+
expect(throwable(0)).to.throw(error('0'));
|
|
54
|
+
expect(throwable(true)).to.throw(error('true'));
|
|
55
|
+
expect(throwable(false)).to.throw(error('false'));
|
|
56
|
+
expect(throwable(undefined)).to.throw(error('undefined'));
|
|
57
|
+
expect(throwable(null)).to.throw(error('null'));
|
|
58
|
+
expect(throwable('model')()).to.be.eql({bar: 'a2'});
|
|
59
|
+
});
|
|
40
60
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
61
|
+
it('requires the third argument to be a non-empty string', function () {
|
|
62
|
+
const entity = {foo: 'a1', bar: 'a2', baz: 'a3'};
|
|
63
|
+
const throwable = v => () => T.filter(entity, MODEL_NAME, v);
|
|
64
|
+
const error = v =>
|
|
65
|
+
format(
|
|
66
|
+
'The provided option "fields" should be a non-empty String ' +
|
|
67
|
+
'or an Array of non-empty String, but %s given.',
|
|
68
|
+
v,
|
|
69
|
+
);
|
|
70
|
+
expect(throwable('')).to.throw(error('""'));
|
|
71
|
+
expect(throwable(10)).to.throw(error('10'));
|
|
72
|
+
expect(throwable(0)).to.throw(error('0'));
|
|
73
|
+
expect(throwable(true)).to.throw(error('true'));
|
|
74
|
+
expect(throwable(false)).to.throw(error('false'));
|
|
75
|
+
expect(throwable({})).to.throw(error('Object'));
|
|
76
|
+
expect(throwable('bar')()).to.be.eql({bar: 'a2'});
|
|
77
|
+
expect(throwable(undefined)()).to.be.eq(entity);
|
|
78
|
+
expect(throwable(null)()).to.be.eq(entity);
|
|
79
|
+
});
|
|
48
80
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
81
|
+
it('picks field of the given object', function () {
|
|
82
|
+
const value = {foo: 'a1', bar: 'a2', baz: 'a3'};
|
|
83
|
+
const result = T.filter(value, MODEL_NAME, 'bar');
|
|
84
|
+
expect(result).to.be.eql({bar: 'a2'});
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
it('includes the primary key of the given object', function () {
|
|
88
|
+
const value = {[DEF_PK]: 10, foo: 'a1', bar: 'a2', baz: 'a3'};
|
|
89
|
+
const result = T.filter(value, MODEL_NAME, 'bar');
|
|
90
|
+
expect(result).to.be.eql({[DEF_PK]: 10, bar: 'a2'});
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
describe('multiple fields', function () {
|
|
95
|
+
it('does not throw an error if multiple fields is not exist', function () {
|
|
96
|
+
const object = {foo: 'a1', bar: 'a2', baz: 'a3'};
|
|
97
|
+
const res = T.filter(object, MODEL_NAME, ['bar', 'qux']);
|
|
98
|
+
expect(res).to.be.eql({bar: 'a2'});
|
|
99
|
+
});
|
|
56
100
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
101
|
+
it('requires the first argument to be an object', function () {
|
|
102
|
+
const throwable = v => () => T.filter(v, MODEL_NAME, ['bar', 'baz']);
|
|
103
|
+
const error = v =>
|
|
104
|
+
format(
|
|
105
|
+
'The first argument of FieldsClauseTool.filter should be an Object or ' +
|
|
106
|
+
'an Array of Object, but %s given.',
|
|
107
|
+
v,
|
|
108
|
+
);
|
|
109
|
+
expect(throwable('str')).to.throw(error('"str"'));
|
|
110
|
+
expect(throwable('')).to.throw(error('""'));
|
|
111
|
+
expect(throwable(10)).to.throw(error('10'));
|
|
112
|
+
expect(throwable(0)).to.throw(error('0'));
|
|
113
|
+
expect(throwable(true)).to.throw(error('true'));
|
|
114
|
+
expect(throwable(false)).to.throw(error('false'));
|
|
115
|
+
expect(throwable(undefined)).to.throw(error('undefined'));
|
|
116
|
+
expect(throwable(null)).to.throw(error('null'));
|
|
117
|
+
expect(throwable({foo: 'a1', bar: 'a2'})()).to.be.eql({bar: 'a2'});
|
|
118
|
+
expect(throwable({})()).to.be.eql({});
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
it('requires the second argument to be a non-empty string', function () {
|
|
122
|
+
const entity = {foo: 'a1', bar: 'a2', baz: 'a3'};
|
|
123
|
+
const throwable = v => () => T.filter(entity, v, ['bar', 'baz']);
|
|
124
|
+
const error = v =>
|
|
125
|
+
format(
|
|
126
|
+
'The second argument of FieldsClauseTool.filter should be ' +
|
|
127
|
+
'a non-empty String, but %s given.',
|
|
128
|
+
v,
|
|
129
|
+
);
|
|
130
|
+
expect(throwable('')).to.throw(error('""'));
|
|
131
|
+
expect(throwable(10)).to.throw(error('10'));
|
|
132
|
+
expect(throwable(0)).to.throw(error('0'));
|
|
133
|
+
expect(throwable(true)).to.throw(error('true'));
|
|
134
|
+
expect(throwable(false)).to.throw(error('false'));
|
|
135
|
+
expect(throwable(undefined)).to.throw(error('undefined'));
|
|
136
|
+
expect(throwable(null)).to.throw(error('null'));
|
|
137
|
+
expect(throwable('model')()).to.be.eql({bar: 'a2', baz: 'a3'});
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
it('requires the third argument to be an array of non-empty strings', function () {
|
|
141
|
+
const entity = {foo: 'a1', bar: 'a2', baz: 'a3'};
|
|
142
|
+
const throwable = v => () => T.filter(entity, MODEL_NAME, v);
|
|
143
|
+
const error = v =>
|
|
144
|
+
format(
|
|
145
|
+
'The provided option "fields" should be a non-empty String ' +
|
|
146
|
+
'or an Array of non-empty String, but %s given.',
|
|
147
|
+
v,
|
|
148
|
+
);
|
|
149
|
+
expect(throwable([''])).to.throw(error('""'));
|
|
150
|
+
expect(throwable([10])).to.throw(error('10'));
|
|
151
|
+
expect(throwable([0])).to.throw(error('0'));
|
|
152
|
+
expect(throwable([true])).to.throw(error('true'));
|
|
153
|
+
expect(throwable([false])).to.throw(error('false'));
|
|
154
|
+
expect(throwable([{}])).to.throw(error('Object'));
|
|
155
|
+
expect(throwable([undefined])).to.throw(error('undefined'));
|
|
156
|
+
expect(throwable([null])).to.throw(error('null'));
|
|
157
|
+
expect(throwable(['bar', 'baz'])()).to.be.eql({bar: 'a2', baz: 'a3'});
|
|
158
|
+
expect(throwable([])()).to.be.eq(entity);
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
it('picks fields of the given object', function () {
|
|
162
|
+
const value = {foo: 'a1', bar: 'a2', baz: 'a3'};
|
|
163
|
+
const result = T.filter(value, MODEL_NAME, ['bar', 'baz']);
|
|
164
|
+
expect(result).to.be.eql({bar: 'a2', baz: 'a3'});
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
it('includes the primary key of the given object', function () {
|
|
168
|
+
const value = {[DEF_PK]: 10, foo: 'a1', bar: 'a2', baz: 'a3'};
|
|
169
|
+
const result = T.filter(value, MODEL_NAME, ['bar', 'baz']);
|
|
170
|
+
expect(result).to.be.eql({[DEF_PK]: 10, bar: 'a2', baz: 'a3'});
|
|
171
|
+
});
|
|
172
|
+
});
|
|
63
173
|
});
|
|
64
174
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
175
|
+
describe('array', function () {
|
|
176
|
+
describe('single field', function () {
|
|
177
|
+
it('does not throw an error if the given field is not exist', function () {
|
|
178
|
+
const objects = [
|
|
179
|
+
{foo: 'a1', bar: 'a2', baz: 'a3'},
|
|
180
|
+
{foo: 'b1', bar: 'b2', baz: 'b3'},
|
|
181
|
+
{foo: 'c1', bar: 'c2', baz: 'c3'},
|
|
182
|
+
];
|
|
183
|
+
const res = T.filter(objects, MODEL_NAME, 'qux');
|
|
184
|
+
expect(res).to.be.eql([{}, {}, {}]);
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
it('requires the first argument to be an array of objects', function () {
|
|
188
|
+
const throwable = v => () => T.filter(v, MODEL_NAME, 'bar');
|
|
189
|
+
const error = v =>
|
|
190
|
+
format(
|
|
191
|
+
'The first argument of FieldsClauseTool.filter should be an Object or ' +
|
|
192
|
+
'an Array of Object, but %s given.',
|
|
193
|
+
v,
|
|
194
|
+
);
|
|
195
|
+
expect(throwable(['str'])).to.throw(error('"str"'));
|
|
196
|
+
expect(throwable([''])).to.throw(error('""'));
|
|
197
|
+
expect(throwable([10])).to.throw(error('10'));
|
|
198
|
+
expect(throwable([0])).to.throw(error('0'));
|
|
199
|
+
expect(throwable([true])).to.throw(error('true'));
|
|
200
|
+
expect(throwable([false])).to.throw(error('false'));
|
|
201
|
+
expect(throwable([undefined])).to.throw(error('undefined'));
|
|
202
|
+
expect(throwable([null])).to.throw(error('null'));
|
|
203
|
+
expect(throwable([{foo: 'a1', bar: 'a2'}])()).to.be.eql([
|
|
204
|
+
{bar: 'a2'},
|
|
205
|
+
]);
|
|
206
|
+
expect(throwable([{}])()).to.be.eql([{}]);
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
it('requires the second argument to be a non-empty string', function () {
|
|
210
|
+
const entities = [
|
|
211
|
+
{foo: 'a1', bar: 'a2', baz: 'a3'},
|
|
212
|
+
{foo: 'b1', bar: 'b2', baz: 'b3'},
|
|
213
|
+
{foo: 'c1', bar: 'c2', baz: 'c3'},
|
|
214
|
+
];
|
|
215
|
+
const throwable = v => () => T.filter(entities, v, 'bar');
|
|
216
|
+
const error = v =>
|
|
217
|
+
format(
|
|
218
|
+
'The second argument of FieldsClauseTool.filter should be ' +
|
|
219
|
+
'a non-empty String, but %s given.',
|
|
220
|
+
v,
|
|
221
|
+
);
|
|
222
|
+
expect(throwable('')).to.throw(error('""'));
|
|
223
|
+
expect(throwable(10)).to.throw(error('10'));
|
|
224
|
+
expect(throwable(0)).to.throw(error('0'));
|
|
225
|
+
expect(throwable(true)).to.throw(error('true'));
|
|
226
|
+
expect(throwable(false)).to.throw(error('false'));
|
|
227
|
+
expect(throwable(undefined)).to.throw(error('undefined'));
|
|
228
|
+
expect(throwable(null)).to.throw(error('null'));
|
|
229
|
+
expect(throwable('model')()).to.be.eql([
|
|
230
|
+
{bar: 'a2'},
|
|
231
|
+
{bar: 'b2'},
|
|
232
|
+
{bar: 'c2'},
|
|
233
|
+
]);
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
it('requires the third argument to be a non-empty string', function () {
|
|
237
|
+
const entities = [
|
|
238
|
+
{foo: 'a1', bar: 'a2', baz: 'a3'},
|
|
239
|
+
{foo: 'b1', bar: 'b2', baz: 'b3'},
|
|
240
|
+
{foo: 'c1', bar: 'c2', baz: 'c3'},
|
|
241
|
+
];
|
|
242
|
+
const throwable = v => () => T.filter(entities, MODEL_NAME, v);
|
|
243
|
+
const error = v =>
|
|
244
|
+
format(
|
|
245
|
+
'The provided option "fields" should be a non-empty String ' +
|
|
246
|
+
'or an Array of non-empty String, but %s given.',
|
|
247
|
+
v,
|
|
248
|
+
);
|
|
249
|
+
expect(throwable('')).to.throw(error('""'));
|
|
250
|
+
expect(throwable(10)).to.throw(error('10'));
|
|
251
|
+
expect(throwable(0)).to.throw(error('0'));
|
|
252
|
+
expect(throwable(true)).to.throw(error('true'));
|
|
253
|
+
expect(throwable(false)).to.throw(error('false'));
|
|
254
|
+
expect(throwable({})).to.throw(error('Object'));
|
|
255
|
+
expect(throwable('bar')()).to.be.eql([
|
|
256
|
+
{bar: 'a2'},
|
|
257
|
+
{bar: 'b2'},
|
|
258
|
+
{bar: 'c2'},
|
|
259
|
+
]);
|
|
260
|
+
expect(throwable(undefined)()).to.be.eq(entities);
|
|
261
|
+
expect(throwable(null)()).to.be.eq(entities);
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
it('picks field of the given object', function () {
|
|
265
|
+
const entities = [
|
|
266
|
+
{foo: 'a1', bar: 'a2', baz: 'a3'},
|
|
267
|
+
{foo: 'b1', bar: 'b2', baz: 'b3'},
|
|
268
|
+
{foo: 'c1', bar: 'c2', baz: 'c3'},
|
|
269
|
+
];
|
|
270
|
+
const result = T.filter(entities, MODEL_NAME, 'bar');
|
|
271
|
+
expect(result).to.have.lengthOf(3);
|
|
272
|
+
expect(result[0]).to.be.eql({bar: 'a2'});
|
|
273
|
+
expect(result[1]).to.be.eql({bar: 'b2'});
|
|
274
|
+
expect(result[2]).to.be.eql({bar: 'c2'});
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
it('includes the primary key of the given object', function () {
|
|
278
|
+
const entities = [
|
|
279
|
+
{[DEF_PK]: 1, foo: 'a1', bar: 'a2', baz: 'a3'},
|
|
280
|
+
{[DEF_PK]: 2, foo: 'b1', bar: 'b2', baz: 'b3'},
|
|
281
|
+
{[DEF_PK]: 3, foo: 'c1', bar: 'c2', baz: 'c3'},
|
|
282
|
+
];
|
|
283
|
+
const result = T.filter(entities, MODEL_NAME, 'bar');
|
|
284
|
+
expect(result).to.have.lengthOf(3);
|
|
285
|
+
expect(result[0]).to.be.eql({[DEF_PK]: 1, bar: 'a2'});
|
|
286
|
+
expect(result[1]).to.be.eql({[DEF_PK]: 2, bar: 'b2'});
|
|
287
|
+
expect(result[2]).to.be.eql({[DEF_PK]: 3, bar: 'c2'});
|
|
288
|
+
});
|
|
289
|
+
});
|
|
290
|
+
|
|
291
|
+
describe('multiple fields', function () {
|
|
292
|
+
it('does not throw an error if multiple fields is not exist', function () {
|
|
293
|
+
const object = [
|
|
294
|
+
{foo: 'a1', bar: 'a2', baz: 'a3'},
|
|
295
|
+
{foo: 'b1', bar: 'b2', baz: 'b3'},
|
|
296
|
+
{foo: 'c1', bar: 'c2', baz: 'c3'},
|
|
297
|
+
];
|
|
298
|
+
const res = T.filter(object, MODEL_NAME, ['bar', 'qux']);
|
|
299
|
+
expect(res[0]).to.be.eql({bar: 'a2'});
|
|
300
|
+
expect(res[1]).to.be.eql({bar: 'b2'});
|
|
301
|
+
expect(res[2]).to.be.eql({bar: 'c2'});
|
|
302
|
+
});
|
|
303
|
+
|
|
304
|
+
it('requires the first argument to be an array of objects', function () {
|
|
305
|
+
const throwable = v => () => T.filter(v, MODEL_NAME, ['bar', 'baz']);
|
|
306
|
+
const error = v =>
|
|
307
|
+
format(
|
|
308
|
+
'The first argument of FieldsClauseTool.filter should be an Object or ' +
|
|
309
|
+
'an Array of Object, but %s given.',
|
|
310
|
+
v,
|
|
311
|
+
);
|
|
312
|
+
expect(throwable(['str'])).to.throw(error('"str"'));
|
|
313
|
+
expect(throwable([''])).to.throw(error('""'));
|
|
314
|
+
expect(throwable([10])).to.throw(error('10'));
|
|
315
|
+
expect(throwable([0])).to.throw(error('0'));
|
|
316
|
+
expect(throwable([true])).to.throw(error('true'));
|
|
317
|
+
expect(throwable([false])).to.throw(error('false'));
|
|
318
|
+
expect(throwable([undefined])).to.throw(error('undefined'));
|
|
319
|
+
expect(throwable([null])).to.throw(error('null'));
|
|
320
|
+
expect(throwable([{foo: 'a1', bar: 'a2'}])()).to.be.eql([
|
|
321
|
+
{bar: 'a2'},
|
|
322
|
+
]);
|
|
323
|
+
expect(throwable([{}])()).to.be.eql([{}]);
|
|
324
|
+
});
|
|
325
|
+
|
|
326
|
+
it('requires the second argument to be a non-empty string', function () {
|
|
327
|
+
const entities = [
|
|
328
|
+
{foo: 'a1', bar: 'a2', baz: 'a3'},
|
|
329
|
+
{foo: 'b1', bar: 'b2', baz: 'b3'},
|
|
330
|
+
{foo: 'c1', bar: 'c2', baz: 'c3'},
|
|
331
|
+
];
|
|
332
|
+
const throwable = v => () => T.filter(entities, v, ['bar', 'baz']);
|
|
333
|
+
const error = v =>
|
|
334
|
+
format(
|
|
335
|
+
'The second argument of FieldsClauseTool.filter should be ' +
|
|
336
|
+
'a non-empty String, but %s given.',
|
|
337
|
+
v,
|
|
338
|
+
);
|
|
339
|
+
expect(throwable('')).to.throw(error('""'));
|
|
340
|
+
expect(throwable(10)).to.throw(error('10'));
|
|
341
|
+
expect(throwable(0)).to.throw(error('0'));
|
|
342
|
+
expect(throwable(true)).to.throw(error('true'));
|
|
343
|
+
expect(throwable(false)).to.throw(error('false'));
|
|
344
|
+
expect(throwable(undefined)).to.throw(error('undefined'));
|
|
345
|
+
expect(throwable(null)).to.throw(error('null'));
|
|
346
|
+
expect(throwable('model')()).to.be.eql([
|
|
347
|
+
{bar: 'a2', baz: 'a3'},
|
|
348
|
+
{bar: 'b2', baz: 'b3'},
|
|
349
|
+
{bar: 'c2', baz: 'c3'},
|
|
350
|
+
]);
|
|
351
|
+
});
|
|
352
|
+
|
|
353
|
+
it('requires the third argument to be a non-empty string', function () {
|
|
354
|
+
const entities = [
|
|
355
|
+
{foo: 'a1', bar: 'a2', baz: 'a3'},
|
|
356
|
+
{foo: 'b1', bar: 'b2', baz: 'b3'},
|
|
357
|
+
{foo: 'c1', bar: 'c2', baz: 'c3'},
|
|
358
|
+
];
|
|
359
|
+
const throwable = v => () => T.filter(entities, MODEL_NAME, v);
|
|
360
|
+
const error = v =>
|
|
361
|
+
format(
|
|
362
|
+
'The provided option "fields" should be a non-empty String ' +
|
|
363
|
+
'or an Array of non-empty String, but %s given.',
|
|
364
|
+
v,
|
|
365
|
+
);
|
|
366
|
+
expect(throwable([''])).to.throw(error('""'));
|
|
367
|
+
expect(throwable([10])).to.throw(error('10'));
|
|
368
|
+
expect(throwable([0])).to.throw(error('0'));
|
|
369
|
+
expect(throwable([true])).to.throw(error('true'));
|
|
370
|
+
expect(throwable([false])).to.throw(error('false'));
|
|
371
|
+
expect(throwable([{}])).to.throw(error('Object'));
|
|
372
|
+
expect(throwable([undefined])).to.throw(error('undefined'));
|
|
373
|
+
expect(throwable([null])).to.throw(error('null'));
|
|
374
|
+
expect(throwable(['bar', 'baz'])()).to.be.eql([
|
|
375
|
+
{bar: 'a2', baz: 'a3'},
|
|
376
|
+
{bar: 'b2', baz: 'b3'},
|
|
377
|
+
{bar: 'c2', baz: 'c3'},
|
|
378
|
+
]);
|
|
379
|
+
});
|
|
380
|
+
|
|
381
|
+
it('picks field of the given object', function () {
|
|
382
|
+
const entities = [
|
|
383
|
+
{foo: 'a1', bar: 'a2', baz: 'a3'},
|
|
384
|
+
{foo: 'b1', bar: 'b2', baz: 'b3'},
|
|
385
|
+
{foo: 'c1', bar: 'c2', baz: 'c3'},
|
|
386
|
+
];
|
|
387
|
+
const result = T.filter(entities, MODEL_NAME, ['bar', 'baz']);
|
|
388
|
+
expect(result).to.have.lengthOf(3);
|
|
389
|
+
expect(result[0]).to.be.eql({bar: 'a2', baz: 'a3'});
|
|
390
|
+
expect(result[1]).to.be.eql({bar: 'b2', baz: 'b3'});
|
|
391
|
+
expect(result[2]).to.be.eql({bar: 'c2', baz: 'c3'});
|
|
392
|
+
});
|
|
393
|
+
|
|
394
|
+
it('includes the primary key of the given object', function () {
|
|
395
|
+
const entities = [
|
|
396
|
+
{[DEF_PK]: 1, foo: 'a1', bar: 'a2', baz: 'a3'},
|
|
397
|
+
{[DEF_PK]: 2, foo: 'b1', bar: 'b2', baz: 'b3'},
|
|
398
|
+
{[DEF_PK]: 3, foo: 'c1', bar: 'c2', baz: 'c3'},
|
|
399
|
+
];
|
|
400
|
+
const result = T.filter(entities, MODEL_NAME, ['bar', 'baz']);
|
|
401
|
+
expect(result).to.have.lengthOf(3);
|
|
402
|
+
expect(result[0]).to.be.eql({[DEF_PK]: 1, bar: 'a2', baz: 'a3'});
|
|
403
|
+
expect(result[1]).to.be.eql({[DEF_PK]: 2, bar: 'b2', baz: 'b3'});
|
|
404
|
+
expect(result[2]).to.be.eql({[DEF_PK]: 3, bar: 'c2', baz: 'c3'});
|
|
405
|
+
});
|
|
406
|
+
});
|
|
71
407
|
});
|
|
72
408
|
});
|
|
73
409
|
|
|
74
410
|
describe('validateFieldsClause', function () {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
'
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
411
|
+
describe('single field', function () {
|
|
412
|
+
it('requires the first argument to be a non-empty string', function () {
|
|
413
|
+
const throwable = v => () => FieldsClauseTool.validateFieldsClause(v);
|
|
414
|
+
const error = v =>
|
|
415
|
+
format(
|
|
416
|
+
'The provided option "fields" should be a non-empty String ' +
|
|
417
|
+
'or an Array of non-empty String, but %s given.',
|
|
418
|
+
v,
|
|
419
|
+
);
|
|
420
|
+
expect(throwable('')).to.throw(error('""'));
|
|
421
|
+
expect(throwable(10)).to.throw(error('10'));
|
|
422
|
+
expect(throwable(0)).to.throw(error('0'));
|
|
423
|
+
expect(throwable(true)).to.throw(error('true'));
|
|
424
|
+
expect(throwable(false)).to.throw(error('false'));
|
|
425
|
+
expect(throwable({})).to.throw(error('Object'));
|
|
426
|
+
throwable('field')();
|
|
427
|
+
throwable(undefined)();
|
|
428
|
+
throwable(null)();
|
|
429
|
+
});
|
|
430
|
+
});
|
|
431
|
+
|
|
432
|
+
describe('multiple fields', function () {
|
|
433
|
+
it('requires the first argument to be an array of non-empty strings', function () {
|
|
434
|
+
const throwable = v => () => FieldsClauseTool.validateFieldsClause(v);
|
|
435
|
+
const error = v =>
|
|
436
|
+
format(
|
|
437
|
+
'The provided option "fields" should be a non-empty String ' +
|
|
438
|
+
'or an Array of non-empty String, but %s given.',
|
|
439
|
+
v,
|
|
440
|
+
);
|
|
441
|
+
expect(throwable([''])).to.throw(error('""'));
|
|
442
|
+
expect(throwable([10])).to.throw(error('10'));
|
|
443
|
+
expect(throwable([0])).to.throw(error('0'));
|
|
444
|
+
expect(throwable([true])).to.throw(error('true'));
|
|
445
|
+
expect(throwable([false])).to.throw(error('false'));
|
|
446
|
+
expect(throwable([{}])).to.throw(error('Object'));
|
|
447
|
+
expect(throwable([undefined])).to.throw(error('undefined'));
|
|
448
|
+
expect(throwable([null])).to.throw(error('null'));
|
|
449
|
+
throwable(['field'])();
|
|
450
|
+
throwable([])();
|
|
451
|
+
});
|
|
98
452
|
});
|
|
99
453
|
});
|
|
100
454
|
|
|
101
455
|
describe('normalizeFieldsClause', function () {
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
456
|
+
describe('single field', function () {
|
|
457
|
+
it('requires the first argument to be a non-empty string', function () {
|
|
458
|
+
const throwable = clause => () =>
|
|
459
|
+
FieldsClauseTool.normalizeFieldsClause(clause);
|
|
460
|
+
const error = v =>
|
|
461
|
+
format(
|
|
462
|
+
'The provided option "fields" should be a non-empty String ' +
|
|
463
|
+
'or an Array of non-empty String, but %s given.',
|
|
464
|
+
v,
|
|
465
|
+
);
|
|
466
|
+
expect(throwable('')).to.throw(error('""'));
|
|
467
|
+
expect(throwable(10)).to.throw(error('10'));
|
|
468
|
+
expect(throwable(0)).to.throw(error('0'));
|
|
469
|
+
expect(throwable(true)).to.throw(error('true'));
|
|
470
|
+
expect(throwable(false)).to.throw(error('false'));
|
|
471
|
+
expect(throwable({})).to.throw(error('Object'));
|
|
472
|
+
expect(throwable('field')()).to.be.eql(['field']);
|
|
473
|
+
expect(throwable(undefined)()).to.be.undefined;
|
|
474
|
+
expect(throwable(null)()).to.be.undefined;
|
|
475
|
+
});
|
|
476
|
+
|
|
477
|
+
it('returns an array of strings', function () {
|
|
478
|
+
const fn = FieldsClauseTool.normalizeFieldsClause;
|
|
479
|
+
expect(fn('foo')).to.be.eql(['foo']);
|
|
480
|
+
});
|
|
106
481
|
});
|
|
107
482
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
483
|
+
describe('multiple fields', function () {
|
|
484
|
+
it('requires the first argument to be an array of non-empty strings', function () {
|
|
485
|
+
const throwable = clause => () =>
|
|
486
|
+
FieldsClauseTool.normalizeFieldsClause(clause);
|
|
487
|
+
const error = v =>
|
|
488
|
+
format(
|
|
489
|
+
'The provided option "fields" should be a non-empty String ' +
|
|
490
|
+
'or an Array of non-empty String, but %s given.',
|
|
491
|
+
v,
|
|
492
|
+
);
|
|
493
|
+
expect(throwable([''])).to.throw(error('""'));
|
|
494
|
+
expect(throwable([10])).to.throw(error('10'));
|
|
495
|
+
expect(throwable([0])).to.throw(error('0'));
|
|
496
|
+
expect(throwable([true])).to.throw(error('true'));
|
|
497
|
+
expect(throwable([false])).to.throw(error('false'));
|
|
498
|
+
expect(throwable([{}])).to.throw(error('Object'));
|
|
499
|
+
expect(throwable([undefined])).to.throw(error('undefined'));
|
|
500
|
+
expect(throwable([null])).to.throw(error('null'));
|
|
501
|
+
expect(throwable(['field'])()).to.be.eql(['field']);
|
|
502
|
+
expect(throwable([])()).to.be.undefined;
|
|
503
|
+
});
|
|
504
|
+
|
|
505
|
+
it('returns an array of strings', function () {
|
|
506
|
+
const fn = FieldsClauseTool.normalizeFieldsClause;
|
|
507
|
+
expect(fn(['foo'])).to.be.eql(['foo']);
|
|
508
|
+
expect(fn(['foo', 'bar'])).to.be.eql(['foo', 'bar']);
|
|
509
|
+
});
|
|
131
510
|
});
|
|
132
511
|
});
|
|
133
512
|
});
|