Skip to content

Commit 16deded

Browse files
committed
Fixing #6, most predicates should return false when testing a
non-existent path, (some cases were returning undefined).
1 parent b8c57f0 commit 16deded

File tree

4 files changed

+176
-6
lines changed

4 files changed

+176
-6
lines changed

CHANGES.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
# 0.9.5
2+
* Fixed https://github.com/MalcolmDwyer/json-predicate/issues/6
3+
- Some cases were returning undefined when test non-existent paths.
4+
15
# 0.9.4
26
* Fixed https://github.com/MalcolmDwyer/json-predicate/issues/5
37
- OR operation with empty apply array now returns true instead of false.

lib/index.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,8 @@ function equals(val1, val2, ignore_case) {
101101
return _.isEqualWith(val1, val2, function(v1, v2) {
102102
if (
103103
ignore_case &&
104-
typeof v1.toLowerCase === 'function' &&
105-
typeof v2.toLowerCase === 'function' &&
104+
v1 && typeof v1.toLowerCase === 'function' &&
105+
v2 && typeof v2.toLowerCase === 'function' &&
106106
v1.toLowerCase() === v2.toLowerCase()
107107
) {
108108
return true;
@@ -179,7 +179,7 @@ function test(data, predicate) {
179179

180180
switch (predicate.op) {
181181
case 'contains': {
182-
return (vut && vut.indexOf(t) >= 0);
182+
return (typeof vut !== 'undefined' && vut.indexOf(t) >= 0);
183183
}
184184
case 'defined': {
185185
return (typeof vut !== 'undefined');
@@ -188,10 +188,10 @@ function test(data, predicate) {
188188
return (typeof vut === 'undefined');
189189
}
190190
case 'ends': {
191-
return (vut && vut.indexOf(t) === (vut.length - t.length));
191+
return (typeof vut !== 'undefined' && vut.indexOf(t) === (vut.length - t.length));
192192
}
193193
case 'starts': {
194-
return (vut && vut.indexOf(t) === 0);
194+
return (typeof vut !== 'undefined' && vut.indexOf(t) === 0);
195195
}
196196
case 'less': {
197197
return (_.isNumber(vut) && (vut < t));

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "json-predicate",
3-
"version": "0.9.4",
3+
"version": "0.9.5",
44
"description": "Javascript implementation of JSON predicate (by Snell)",
55
"main": "lib/index.js",
66
"scripts": {

test/test.js

Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,21 @@ describe('json-predicate', function() {
160160
result = test(in0, pred);
161161
result.should.be.true;
162162
});
163+
164+
it('returns false for undefined value', function() {
165+
pred.value = 'does not matter';
166+
pred.path = '/objZZZ/objZZZZZZZZ';
167+
result = test(in0, pred);
168+
result.should.be.false;
169+
});
170+
171+
it('returns false for undefined value (with ignore_case:true)', function() {
172+
pred.value = 'does not matter';
173+
pred.path = '/objZZZ/objZZZZZZZZ';
174+
pred.ignore_case = true;
175+
result = test(in0, pred);
176+
result.should.be.false;
177+
});
163178
});
164179

165180
describe('matches operation', function() {
@@ -262,6 +277,21 @@ describe('json-predicate', function() {
262277
result = test(in0, pred);
263278
result.should.be.true;
264279
});
280+
281+
it('returns false for undefined value', function() {
282+
pred.value = /[whatever]/;
283+
pred.path = '/objZZZ/objZZZZZZZZ';
284+
result = test(in0, pred);
285+
result.should.be.false;
286+
});
287+
288+
it('returns false for undefined value (with ignore_case:true)', function() {
289+
pred.value = /[whatever]/;
290+
pred.path = '/objZZZ/objZZZZZZZZ';
291+
pred.ignore_case = true;
292+
result = test(in0, pred);
293+
result.should.be.false;
294+
});
265295
});
266296

267297
describe('in operation', function() {
@@ -336,6 +366,22 @@ describe('json-predicate', function() {
336366
result = test(in0, pred);
337367
result.should.be.false;
338368
});
369+
370+
it('returns false for undefined value', function() {
371+
pred.value = ['does not matter'];
372+
pred.path = '/objZZZ/objZZZZZZZZ';
373+
result = test(in0, pred);
374+
result.should.be.false;
375+
});
376+
377+
it('returns false for undefined value (with ignore_case:true)', function() {
378+
pred.value = ['does not matter'];
379+
pred.path = '/objZZZ/objZZZZZZZZ';
380+
pred.ignore_case = true;
381+
result = test(in0, pred);
382+
result.should.be.false;
383+
});
384+
339385
});
340386

341387
describe('test operation', function() {
@@ -437,6 +483,21 @@ describe('json-predicate', function() {
437483
result = test(in0, pred);
438484
result.should.be.false;
439485
});
486+
487+
it('returns false for undefined value', function() {
488+
pred.value = 'does not matter';
489+
pred.path = '/objZZZ/objZZZZZZZZ';
490+
result = test(in0, pred);
491+
result.should.be.false;
492+
});
493+
494+
it('returns false for undefined value (with ignore_case:true)', function() {
495+
pred.value = 'does not matter';
496+
pred.path = '/objZZZ/objZZZZZZZZ';
497+
pred.ignore_case = true;
498+
result = test(in0, pred);
499+
result.should.be.false;
500+
});
440501
});
441502

442503
describe('ends operation', function() {
@@ -482,6 +543,21 @@ describe('json-predicate', function() {
482543
result = test(in0, pred);
483544
result.should.be.true;
484545
});
546+
547+
it('returns false for undefined value', function() {
548+
pred.value = 'does not matter';
549+
pred.path = '/objZZZ/objZZZZZZZZ';
550+
result = test(in0, pred);
551+
result.should.be.false;
552+
});
553+
554+
it('returns false for undefined value (with ignore_case:true)', function() {
555+
pred.value = 'does not matter';
556+
pred.path = '/objZZZ/objZZZZZZZZ';
557+
pred.ignore_case = true;
558+
result = test(in0, pred);
559+
result.should.be.false;
560+
});
485561
});
486562

487563
describe('starts operation', function() {
@@ -527,6 +603,21 @@ describe('json-predicate', function() {
527603
result = test(in0, pred);
528604
result.should.be.true;
529605
});
606+
607+
it('returns false for undefined value', function() {
608+
pred.value = 'does not matter';
609+
pred.path = '/objZZZ/objZZZZZZZZ';
610+
result = test(in0, pred);
611+
result.should.be.false;
612+
});
613+
614+
it('returns false for undefined value (with ignore_case:true)', function() {
615+
pred.value = 'does not matter';
616+
pred.path = '/objZZZ/objZZZZZZZZ';
617+
pred.ignore_case = true;
618+
result = test(in0, pred);
619+
result.should.be.false;
620+
});
530621
});
531622

532623
describe('defined operation', function() {
@@ -669,6 +760,21 @@ describe('json-predicate', function() {
669760
result = test(in0, pred);
670761
result.should.be.false;
671762
});
763+
764+
it('returns false for undefined value', function() {
765+
pred.value = 3;
766+
pred.path = '/objZZZ/objZZZZZZZZ';
767+
result = test(in0, pred);
768+
result.should.be.false;
769+
});
770+
771+
it('returns false for undefined value (with ignore_case:true)', function() {
772+
pred.value = 3;
773+
pred.path = '/objZZZ/objZZZZZZZZ';
774+
pred.ignore_case = true;
775+
result = test(in0, pred);
776+
result.should.be.false;
777+
});
672778
});
673779

674780
describe('more operation', function() {
@@ -723,6 +829,21 @@ describe('json-predicate', function() {
723829
result = test(in0, pred);
724830
result.should.be.false;
725831
});
832+
833+
it('returns false for undefined value', function() {
834+
pred.value = 3;
835+
pred.path = '/objZZZ/objZZZZZZZZ';
836+
result = test(in0, pred);
837+
result.should.be.false;
838+
});
839+
840+
it('returns false for undefined value (with ignore_case:true)', function() {
841+
pred.value = 3;
842+
pred.path = '/objZZZ/objZZZZZZZZ';
843+
pred.ignore_case = true;
844+
result = test(in0, pred);
845+
result.should.be.false;
846+
});
726847
});
727848

728849
describe('type operation', function() {
@@ -942,6 +1063,21 @@ describe('json-predicate', function() {
9421063
result = test(in0, pred);
9431064
result.should.be.false;
9441065
});
1066+
1067+
it('returns false for undefined value', function() {
1068+
pred.value = 'does not matter';
1069+
pred.path = '/objZZZ/objZZZZZZZZ';
1070+
result = test(in0, pred);
1071+
result.should.be.false;
1072+
});
1073+
1074+
it('returns false for undefined value (with ignore_case:true)', function() {
1075+
pred.value = 'does not matter';
1076+
pred.path = '/objZZZ/objZZZZZZZZ';
1077+
pred.ignore_case = true;
1078+
result = test(in0, pred);
1079+
result.should.be.false;
1080+
});
9451081
});
9461082

9471083
describe('contained operation', function() {
@@ -1052,6 +1188,21 @@ describe('json-predicate', function() {
10521188
result = test(in0, pred);
10531189
result.should.be.true;
10541190
});
1191+
1192+
it('returns false for undefined value', function() {
1193+
pred.value = 'does not matter';
1194+
pred.path = '/objZZZ/objZZZZZZZZ';
1195+
result = test(in0, pred);
1196+
result.should.be.false;
1197+
});
1198+
1199+
it('returns false for undefined value (with ignore_case:true)', function() {
1200+
pred.value = 'does not matter';
1201+
pred.path = '/objZZZ/objZZZZZZZZ';
1202+
pred.ignore_case = true;
1203+
result = test(in0, pred);
1204+
result.should.be.false;
1205+
});
10551206
});
10561207

10571208
describe('intersects operation', function() {
@@ -1183,6 +1334,21 @@ describe('json-predicate', function() {
11831334
result = test(in0, pred);
11841335
result.should.be.true;
11851336
});
1337+
1338+
it('returns false for undefined value', function() {
1339+
pred.value = ['does not matter'];
1340+
pred.path = '/objZZZ/objZZZZZZZZ';
1341+
result = test(in0, pred);
1342+
result.should.be.false;
1343+
});
1344+
1345+
it('returns false for undefined value (with ignore_case:true)', function() {
1346+
pred.value = ['does not matter'];
1347+
pred.path = '/objZZZ/objZZZZZZZZ';
1348+
pred.ignore_case = true;
1349+
result = test(in0, pred);
1350+
result.should.be.false;
1351+
});
11861352
});
11871353
});
11881354

0 commit comments

Comments
 (0)