import assert from 'assert'; import sift from '..'; 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('arrays of objects', function () { var objects = [ { things: [ { id: 123 }, { id: 456 } ] }, { things: [ { id: 123 }, { id: 789 } ] } ]; it('$eq for array of objects, matches if at least one exists', function () { let q = { 'things.id': 123 } var sifted = sift(q, objects) assert.deepEqual(sifted, objects) let q2 = { 'things.id': 789 } var sifted2 = sift(q2, objects) assert.deepEqual(sifted2, [objects[1]]) }) it('$ne for array of objects, returns if none of the array elements match the query', function () { let q = { 'things.id': { $ne: 123 } } var sifted = sift(q, objects) assert.deepEqual(sifted, []) let q2 = { 'things.id': { $ne: 789 } } var sifted2 = sift(q2, objects) assert.deepEqual(sifted2, [objects[0]]) }) }) 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 } } ];