moleculerjs/moleculer-db

View on GitHub
packages/moleculer-db/test/unit/index.actions.spec.js

Summary

Maintainability
A
0 mins
Test Coverage
"use strict";

const { ServiceBroker, Service, Context } = require("moleculer");
const { ValidationError } = require("moleculer").Errors;
const DbService = require("../../src");

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

describe("Test DbService actions", () => {
    const doc = { id : 1 };
    const docs = [doc];

    const adapter = {
        init: jest.fn(() => Promise.resolve()),
        connect: jest.fn(() => Promise.resolve()),
        disconnect: jest.fn(() => Promise.resolve()),
        find: jest.fn(() => Promise.resolve(docs)),
        findById: jest.fn(() => Promise.resolve(doc)),
        findByIds: jest.fn(() => Promise.resolve(docs)),
        count: jest.fn(() => Promise.resolve(3)),
        insert: jest.fn(() => Promise.resolve(doc)),
        insertMany: jest.fn(() => Promise.resolve(docs)),
        updateMany: jest.fn(() => Promise.resolve(docs)),
        updateById: jest.fn(() => Promise.resolve(doc)),
        removeMany: jest.fn(() => Promise.resolve(5)),
        removeById: jest.fn(() => Promise.resolve(3)),
        clear: jest.fn(() => Promise.resolve(3)),
        entityToObject: jest.fn(obj => obj),
        beforeSaveTransformID: jest.fn(obj => obj)
    };

    const broker = new ServiceBroker({ logger: false, validation: false });
    const service = broker.createService(DbService, {
        name: "store",
        adapter,
    });

    service.sanitizeParams = jest.fn((ctx, p) => p);
    service.transformDocuments = jest.fn((ctx, params, docs) => Promise.resolve(docs));

    service._find = jest.fn((ctx, p) => ctx);
    service._count = jest.fn((ctx, p) => ctx);
    service._list = jest.fn((ctx, p) => ctx);
    service._create = jest.fn((ctx, p) => ctx);
    service._insert = jest.fn((ctx, p) => ctx);
    service._get = jest.fn((ctx, p) => ctx);
    service._update = jest.fn((ctx, p) => ctx);
    service._remove = jest.fn((ctx, p) => ctx);

    it("should set default settings", () => {
        expect(service.adapter).toEqual(adapter);
        expect(service.settings).toEqual({
            entityValidator: null,
            fields: null,
            excludeFields: null,
            idField: "_id",
            maxLimit: -1,
            maxPageSize: 100,
            pageSize: 10,
            populates: null,
            useDotNotation: false,
            cacheCleanEventType: "broadcast"
        });
    });

    it("should called the 'init' method of adapter", () => {
        expect(adapter.init).toHaveBeenCalledTimes(1);
        expect(adapter.init).toHaveBeenCalledWith(broker, service);
    });

    it("should call the 'connect' method", () => {
        service.connect = jest.fn(() => Promise.resolve());

        return broker.start().then(() => {
            expect(service.connect).toHaveBeenCalledTimes(1);
        }).catch(protectReject);
    });

    it("should call the '_find' method", () => {
        service.sanitizeParams.mockClear();
        service._find.mockClear();
        const p = {};

        return broker.call("store.find", p).catch(protectReject).then(ctx => {
            expect(service.sanitizeParams).toHaveBeenCalledTimes(1);
            expect(service.sanitizeParams).toHaveBeenCalledWith(ctx, p);

            expect(service._find).toHaveBeenCalledTimes(1);
            expect(service._find).toHaveBeenCalledWith(ctx, p);
        });
    });

    it("should call the '_find' method with params", () => {
        service._find.mockClear();
        service.sanitizeParams.mockClear();
        const p = {
            limit: 5,
            offset: "3"
        };

        return broker.call("store.find", p).catch(protectReject).then(ctx => {
            expect(service.sanitizeParams).toHaveBeenCalledTimes(1);
            expect(service.sanitizeParams).toHaveBeenCalledWith(ctx, p);

            expect(service._find).toHaveBeenCalledTimes(1);
            expect(service._find).toHaveBeenCalledWith(ctx, p);

        });
    });

    it("should call the 'list' method", () => {
        service.sanitizeParams.mockClear();
        service._list.mockClear();
        const p = {};

        return broker.call("store.list", p).catch(protectReject).then(ctx => {
            expect(service.sanitizeParams).toHaveBeenCalledTimes(1);
            expect(service.sanitizeParams).toHaveBeenCalledWith(ctx, p);

            expect(service._list).toHaveBeenCalledTimes(1);
            expect(service._list).toHaveBeenCalledWith(ctx, p);
        });
    });

    it("should call the 'count' method", () => {
        service.sanitizeParams.mockClear();
        service._count.mockClear();
        const p = {};

        return broker.call("store.count", p).catch(protectReject).then(ctx => {
            expect(service.sanitizeParams).toHaveBeenCalledTimes(1);
            expect(service.sanitizeParams).toHaveBeenCalledWith(ctx, p);

            expect(service._count).toHaveBeenCalledTimes(1);
            expect(service._count).toHaveBeenCalledWith(ctx, p);
        });
    });

    it("should call the 'count' method with pagination params", () => {
        service.sanitizeParams.mockClear();
        service._count.mockClear();
        const p = { limit: 5, offset: 10 };

        return broker.call("store.count", p).catch(protectReject).then(ctx => {
            expect(service.sanitizeParams).toHaveBeenCalledTimes(1);
            expect(service.sanitizeParams).toHaveBeenCalledWith(ctx, p);

            expect(service._count).toHaveBeenCalledTimes(1);
            expect(service._count).toHaveBeenCalledWith(ctx, p);
        });
    });

    it("should call the 'create' method", () => {
        service._create.mockClear();
        const p = { name: "John Smith", age: 45 };

        return broker.call("store.create", p).catch(protectReject).then(ctx => {
            expect(service._create).toHaveBeenCalledTimes(1);
            expect(service._create).toHaveBeenCalledWith(ctx, p);
        });
    });

    it("should call the 'insert' method", () => {
        service.sanitizeParams.mockClear();
        service._insert.mockClear();
        const p = { name: "John Smith", age: 45 };

        return broker.call("store.insert", p).catch(protectReject).then(ctx => {
            // expect(service.sanitizeParams).toHaveBeenCalledTimes(1);
            // expect(service.sanitizeParams).toHaveBeenCalledWith(ctx, p);

            expect(service._insert).toHaveBeenCalledTimes(1);
            expect(service._insert).toHaveBeenCalledWith(ctx, p);
        });
    });

    it("should call the 'get' method", () => {
        service.sanitizeParams.mockClear();
        service._get.mockClear();
        const p = { id: 5 };

        return broker.call("store.get", p).catch(protectReject).then(ctx => {
            expect(service.sanitizeParams).toHaveBeenCalledTimes(1);
            expect(service.sanitizeParams).toHaveBeenCalledWith(ctx, p);

            expect(service._get).toHaveBeenCalledTimes(1);
            expect(service._get).toHaveBeenCalledWith(ctx, p);
        });
    });

    it("should call the 'update' method", () => {
        service._update.mockClear();
        const p = { id: 1, name: "John Smith", age: 45 };

        return broker.call("store.update", p).catch(protectReject).then(ctx => {
            expect(service._update).toHaveBeenCalledTimes(1);
            expect(service._update).toHaveBeenCalledWith(ctx, p);
        });
    });

    it("should call the 'remove' method", () => {
        service.sanitizeParams.mockClear();
        service._remove.mockClear();
        const p = { id: 1 };

        return broker.call("store.remove", p).catch(protectReject).then(ctx => {
            // expect(service.sanitizeParams).toHaveBeenCalledTimes(1);
            // expect(service.sanitizeParams).toHaveBeenCalledWith(ctx, p);

            expect(service._remove).toHaveBeenCalledTimes(1);
            expect(service._remove).toHaveBeenCalledWith(ctx, p);
        });
    });
});