Home Reference Source Test

test/generic/Query.spec.js

describe('Query', () => {
    let backend;

    const setEqual = function(actual, expected) {
        return expected.equals(actual);
    };

    beforeAll((done) => {
        backend = JungleDB.createVolatileObjectStore();

        (async function () {
            backend.createIndex('test', 'test', { multiEntry: false });
            backend.createIndex('multi', 'multi', { multiEntry: true });

            // Add 10 objects.
            for (let i=0; i<10; ++i) {
                const obj = {
                    test: i,
                    multi: [i%2, i]
                };
                await backend.put(`key${i}`, obj);
            }
        })().then(done, done.fail);

        jasmine.addCustomEqualityTester(setEqual);
    });

    it('can process single entry range queries', (done) => {
        (async function () {
            expect(await backend.keys(Query.eq('test', 0))).toEqual(new Set(['key0']));
            expect(await backend.keys(Query.le('test', 1))).toEqual(new Set(['key0', 'key1']));
            expect(await backend.keys(Query.lt('test', 1))).toEqual(new Set(['key0']));
            expect(await backend.keys(Query.ge('test', 8))).toEqual(new Set(['key8', 'key9']));
            expect(await backend.keys(Query.gt('test', 7))).toEqual(new Set(['key8', 'key9']));
            expect(await backend.keys(Query.between('test', 1, 3))).toEqual(new Set(['key2']));
            expect(await backend.keys(Query.within('test', 1, 3))).toEqual(new Set(['key1', 'key2', 'key3']));
        })().then(done, done.fail);
    });

    it('can process single entry min/max queries', (done) => {
        (async function () {
            expect(await backend.keys(Query.max('test'))).toEqual(new Set(['key9']));
            expect(await backend.keys(Query.min('test'))).toEqual(new Set(['key0']));
        })().then(done, done.fail);
    });

    it('can process single entry combined queries', (done) => {
        (async function () {
            expect(await backend.keys(Query.and(Query.ge('test', 3), Query.lt('test', 5)))).toEqual(new Set(['key3', 'key4']));
            expect(await backend.keys(Query.or(Query.within('test', 1, 2), Query.ge('test', 7)))).toEqual(new Set(['key1', 'key2', 'key7', 'key8', 'key9']));
            expect(await backend.keys(Query.or(Query.within('test', 1, 2), Query.and(Query.ge('test', 7), Query.lt('test', 9))))).toEqual(new Set(['key1', 'key2', 'key7', 'key8']));
        })().then(done, done.fail);
    });

    it('can process multi entry range queries', (done) => {
        (async function () {
            expect(await backend.keys(Query.eq('multi', 3))).toEqual(new Set(['key3']));
            expect(await backend.keys(Query.eq('multi', 1))).toEqual(new Set(['key1', 'key3', 'key5', 'key7', 'key9']));
        })().then(done, done.fail);
    });

    it('can process multi entry min/max queries', (done) => {
        (async function () {
            expect(await backend.keys(Query.min('multi'))).toEqual(new Set(['key0', 'key2', 'key4', 'key6', 'key8']));
            expect(await backend.keys(Query.max('multi'))).toEqual(new Set(['key9']));
        })().then(done, done.fail);
    });

    it('can process queries over multiple indices', (done) => {
        (async function () {
            expect(await backend.keys(Query.or(Query.eq('test', 2), Query.eq('multi', 1)))).toEqual(new Set(['key1', 'key2', 'key3', 'key5', 'key7', 'key9']));
            expect(await backend.keys(Query.and(Query.max('test'), Query.eq('multi', 1)))).toEqual(new Set(['key9']));
            expect(await backend.keys(Query.and(Query.min('test'), Query.min('multi')))).toEqual(new Set(['key0']));
        })().then(done, done.fail);
    });
});