Files
30-seconds-of-code/node_modules/sift/test/objects-test.js
2019-08-20 15:52:05 +02:00

360 lines
8.6 KiB
JavaScript
Executable File

var sift = require(".."),
assert = require("assert");
describe(__filename + "#", function () {
var topic = [
{
name: 'craig',
age: 90001,
tags: ['coder', 'programmer', 'traveler', 'photographer'],
address: {
city: 'Minneapolis',
state: 'MN',
phone: '9999999999'
},
tags: ['photos', 'cook'],
hobbies: [
{
name: 'programming',
description: 'some desc'
},
{
name: 'cooking'
},
{
name: 'photography',
places: ['haiti', 'brazil', 'costa rica']
},
{
name: 'backpacking'
}
]
},
{
name: 'tim',
age: 90001,
tags: ['traveler', 'photographer'],
address: {
city: 'St. Paul',
state: 'MN',
phone: '765765756765'
},
tags: ['dj'],
hobbies: [
{
name: 'biking',
description: 'some desc'
},
{
name: 'DJ'
},
{
name: 'photography',
places: ['costa rica']
}
]
}
];
xit("throws error if $not is incorrect", function () {
assert.throws(function () {
sift({
$not: ['abc']
}, topic);
}, Error);
});
it("has sifted through photography in brazil count of 1", function () {
var sifted = sift({
hobbies: {
name: 'photography',
places: {
$in: ['brazil']
}
}
}, topic);
assert.equal(sifted.length, 1);
});
it("has sifted through photography in brazil, haiti, and costa rica count of 1", function () {
var sifted = sift({
hobbies: {
name: 'photography',
places: {
$all: ['brazil', 'haiti', 'costa rica']
}
}
}, topic);
assert.equal(sifted.length, 1);
assert.equal(sifted[0], topic[0]);
});
it("has a sifted hobbies of photography, cooking, or biking count of 2", function () {
var sifted = sift({
hobbies: {
name: {
$in: ['photography', 'cooking', 'biking']
}
}
}, topic);
assert.equal(sifted.length, 2);
});
it("has sifted to complex count of 2", function () {
var sifted = sift({
hobbies: {
name: 'photography',
places: {
$in: ['costa rica']
}
},
address: {
state: 'MN',
phone: {
$exists: true
}
}
}, topic);
assert.equal(sifted.length, 2);
});
it("has sifted to complex count of 0", function () {
var sifted = sift({
hobbies: {
name: 'photos',
places: {
$in: ['costa rica']
}
}
}, topic);
assert.equal(sifted.length, 0);
});
it("has sifted subobject hobbies count of 3", function () {
var sifted = sift({
"hobbies.name": "photography"
}, topic);
assert.equal(sifted.length, 2);
});
it('has sifted dot-notation hobbies of photography, cooking, and biking count of 3', function () {
var sifted = sift({
"hobbies.name": {
$in: ['photography', 'cooking', 'biking']
}
}, topic);
assert.equal(sifted.length, 2);
});
it("has sifted to complex dot-search count of 2", function () {
var sifted = sift({
"hobbies.name": "photography",
"hobbies.places": {
$in: ['costa rica']
},
"address.state": "MN",
"address.phone": {
$exists: true
}
}, topic);
assert.equal(sifted.length, 2);
});
it("has sifted with selector function count of 2", function () {
var sifted = sift({
"name": "photography",
"places": {
$in: ['costa rica']
}
}, topic, function (item) {
return item.hobbies;
});
assert.equal(sifted.length, 2);
});
describe("nesting", function () {
it("$eq for nested object", function () {
var sifted = sift({'sub.num': {'$eq': 10}}, loremArr);
assert(sifted.length > 0);
sifted.forEach(function (v) {
assert.equal(10, v.sub.num);
});
});
it("$ne for nested object", function () {
var sifted = sift({'sub.num': {'$ne': 10}}, loremArr);
assert(sifted.length > 0);
sifted.forEach(function (v) {
assert.notEqual(10, v.sub.num);
});
});
it("$regex for nested object (one missing key)", function () {
var persons = [{
id: 1,
prof: 'Mr. Moriarty'
}, {
id: 2,
prof: 'Mycroft Holmes'
}, {
id: 3,
name: 'Dr. Watson',
prof: 'Doctor'
}, {
id: 4,
name: 'Mr. Holmes',
prof: 'Detective'
}];
var q = { "name": { "$regex": "n" } };
var sifted = sift(q, persons);
assert.deepEqual(sifted, [{
id: 3,
name: 'Dr. Watson',
prof: 'Doctor'
}]);
});
});
describe("$where", function() {
var couples = [{
name: "SMITH",
person: [{
firstName: "craig",
gender: "female",
age: 29
}, {
firstName: "tim",
gender: "male",
age: 32
}
]
}, {
name: "JOHNSON",
person: [{
firstName: "emily",
gender: "female",
age: 35
}, {
firstName: "jacob",
gender: "male",
age: 32
}
]
}];
it("can filter people", function() {
var results = sift({"person": {$elemMatch: { "gender": "female", "age": {"$lt": 30}}}}, couples);
assert.equal(results[0].name, "SMITH");
var results = sift({"person": {$elemMatch: { "gender": "male", "age": {"$lt": 30}}}}, [couples[0]]);
assert.equal(results.length, 0);
});
});
describe("keypath", function () {
var arr = [
{
a: {
b: {
c: 1,
c2: 1
}
}
}
]
it("can be used", function () {
assert.equal(sift({"a.b.c":1})(arr[0]), true);
});
});
});
var loremArr = [
{
"num": 1,
"pum": 1,
"sub": {
"num": 1,
"pum": 1
}
},
{
"num": 2,
"pum": 2,
"sub": {
"num": 2,
"pum": 2
}
},
{
"num": 3,
"pum": 3,
"sub": {
"num": 3,
"pum": 3
}
},
{
"num": 4,
"pum": 4,
"sub": {
"num": 4,
"pum": 4
}
},
{
"num": 5,
"pum": 5,
"sub": {
"num": 5,
"pum": 5
}
},
{
"num": 6,
"pum": 6,
"sub": {
"num": 6,
"pum": 6
}
},
{
"num": 7,
"pum": 7,
"sub": {
"num": 7,
"pum": 7
}
},
{
"num": 8,
"pum": 8,
"sub": {
"num": 8,
"pum": 8
}
},
{
"num": 9,
"pum": 9,
"sub": {
"num": 9,
"pum": 9
}
},
{
"num": 10,
"pum": 10,
"sub": {
"num": 10,
"pum": 10
}
},
{
"num": 11,
"pum": 11,
"sub": {
"num": 10,
"pum": 10
}
}
];