moleculerjs/moleculer-db

View on GitHub
packages/moleculer-db/test/unit/memory-adapter.spec.js

Summary

Maintainability
A
0 mins
Test Coverage
"use strict";

const { ServiceBroker } = require("moleculer");
const Adapter = require("../../src/memory-adapter");

const Datastore = require('@seald-io/nedb');

function protectReject(err) {
    if (err && err.stack) {
        console.error(err);
        console.error(err.stack);
    }
    expect(err).toBe(true);
}

describe("Test Adapter constructor", () => {
    it("should be created", () => {
        const adapter = new Adapter();
        expect(adapter).toBeDefined();
    });

    it("should be created with opts", () => {
        const opts = {};
        const adapter = new Adapter(opts);
        expect(adapter).toBeDefined();
        expect(adapter.opts).toBe(opts);
    });

    it('should use preconfigured Datastore', () => {
        const ds = new Datastore();
        const adapter = new Adapter(ds);
        adapter.connect();
        expect(adapter).toBeDefined();
        expect(adapter.db).toBe(ds);
    });

});

describe("Test Adapter methods", () => {
    const broker = new ServiceBroker({ logger: false });
    const service = broker.createService({
        name: "test"
    });

    const opts = {};

    const adapter = new Adapter(opts);
    adapter.init(broker, service);

    it("should connect", () => {
        return expect(adapter.connect()).resolves.toBeUndefined();
    });

    const doc = {
        name: "Walter White",
        age: 48,
        email: "heisenberg@gmail.com"
    };

    let savedDoc;

    it("should insert a document", () => {
        return adapter.insert(doc)
            .then(res => {
                expect(res).toEqual(Object.assign({}, doc, { _id: expect.any(String) }));
                savedDoc = res;
            })
            .catch(protectReject);
    });

    let multipleDocs;
    it("should insert multiple document", () => {
        return adapter.insertMany([{ name: "John Doe", c: true, age: 41 }, { name: "Jane Doe", b: "Hello", age: 35 }, { name: "Adam Smith", email: "adam.smith@gmail.com", age: 35 }])
            .then(res => {
                expect(res.length).toBe(3);
                expect(res[0]._id).toBeDefined();
                expect(res[0].name).toBe("John Doe");
                expect(res[0].age).toBe(41);

                expect(res[1]._id).toBeDefined();
                expect(res[1].name).toBe("Jane Doe");
                expect(res[1].age).toBe(35);

                expect(res[2]._id).toBeDefined();
                expect(res[2].name).toBe("Adam Smith");
                expect(res[2].email).toBe("adam.smith@gmail.com");
                expect(res[2].age).toBe(35);

                multipleDocs = res;
            })
            .catch(protectReject);
    });

    it("should find by ID", () => {
        return expect(adapter.findById(savedDoc._id)).resolves.toEqual(savedDoc);
    });

    it("should find one", () => {
        return expect(adapter.findOne({ age: 48 })).resolves.toEqual(savedDoc);
    });

    it("should find by multiple ID", () => {
        return expect(adapter.findByIds([multipleDocs[0]._id, multipleDocs[1]._id, ])).resolves.toEqual([multipleDocs[0], multipleDocs[1]]);
    });

    it("should find all without filter", () => {
        return adapter.find().then(res => {
            expect(res.length).toBe(4);
        }).catch(protectReject);
    });

    it("should find all 'name' with raw query", () => {
        return expect(adapter.find({ query: { name: "John Doe" }})).resolves.toEqual([multipleDocs[0]]);
    });

    it("should find all 'age: 35'", () => {
        return adapter.find({ query: { age: 35 }}).then(res => {
            expect(res.length).toBe(2);
            expect(res[0].age).toEqual(35);
            expect(res[1].age).toEqual(35);

        }).catch(protectReject);
    });

    it("should find all 'Doe'", () => {
        return adapter.find({ search: "Doe" }).then(res => {
            expect(res.length).toBe(2);
            expect(res[0].name).toMatch("Doe");
            expect(res[1].name).toMatch("Doe");

        }).catch(protectReject);
    });

    it("should find all 'Doe' in filtered fields", () => {
        return adapter.find({ search: "Doe", searchFields: ["email"] }).then(res => {
            expect(res.length).toBe(0);
        }).catch(protectReject);
    });

    it("should find all 'walter' in filtered fields", () => {
        return adapter.find({ search: "walter", searchFields: "email name" }).then(res => {
            expect(res.length).toBe(1);
            expect(res[0]).toEqual(savedDoc);

        }).catch(protectReject);
    });

    it("should count all 'walter' in filtered fields", () => {
        return expect(adapter.count({ search: "walter", searchFields: "email name" })).resolves.toBe(1);
    });

    it("should sort the result", () => {
        return expect(adapter.find({ sort: ["name"] })).resolves.toEqual([
            multipleDocs[2],
            multipleDocs[1],
            multipleDocs[0],
            savedDoc,
        ]);
    });

    it("should sort by two fields in array", () => {
        return expect(adapter.find({ sort: ["-age", "-name"] })).resolves.toEqual([
            savedDoc,
            multipleDocs[0],
            multipleDocs[1],
            multipleDocs[2],
        ]);
    });

    it("should limit & skip the result", () => {
        return expect(adapter.find({ sort: ["-age", "-name"], limit: 2, offset: 1 })).resolves.toEqual([
            multipleDocs[0],
            multipleDocs[1],
        ]);
    });

    it("should count all entities", () => {
        return expect(adapter.count()).resolves.toBe(4);
    });

    it("should count filtered entities", () => {
        return expect(adapter.count({ query: { email: { $exists: true } }})).resolves.toBe(2);
    });

    it("should update a document", () => {
        return expect(adapter.updateById(savedDoc._id, { $set: { e: 1234 } })).resolves.toEqual(Object.assign({}, savedDoc, { e: 1234 }));
    });

    it("should update many documents", () => {
        return expect(adapter.updateMany({ age: 35 }, { $set: { gender: "male" } })).resolves.toBe(2);
    });

    it("should remove by ID", () => {
        return expect(adapter.removeById(multipleDocs[0]._id)).resolves.toBe(1);
    });

    it("should remove many documents", () => {
        return expect(adapter.removeMany({ name: { $regex: /Doe/ } })).resolves.toBe(1);
    });

    it("should count all entities", () => {
        return expect(adapter.count()).resolves.toBe(2);
    });

    it("should clear all documents", () => {
        return expect(adapter.clear()).resolves.toBe(2);
    });

    it("should disconnect", () => {
        return expect(adapter.disconnect()).resolves.toBeUndefined();
    });
});