UNPKG

moleculer-api

Version:

A dynamic API Gateway for MoleculerJS which updates REST endpoints and aggregated GraphQL schema, access control policy for each action calls from metadata of remote services schema without restart or deployment.

157 lines 6.18 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); const test_1 = require("../../test"); const moleculer = { namespace: "test-schema-branch-update-2", transporter: { type: "TCP", options: { udpPeriod: 1, }, }, }; const schema = test_1.getSchemaRegistry({ logger: { level: "error", label: "gateway" }, delegator: { moleculer: Object.assign(Object.assign({}, moleculer), { nodeID: "gateway" }) }, }); const remote1 = test_1.getMoleculerServiceBroker({ logger: { level: "error", label: "remote" }, moleculer: Object.assign(Object.assign({}, moleculer), { nodeID: "remote" }), services: [ test_1.MoleculerServiceSchemaFactory.echo("master", "master-a"), test_1.MoleculerServiceSchemaFactory.echo("master", "conflict-a", { protocol: { REST: { routes: [ { method: "GET", path: "/echo", description: "", call: { action: `/conflict-a/echo`, params: {}, }, }, { method: "GET", path: "/echo2", description: "", call: { action: `/conflict-a/echo`, params: {}, }, }, { method: "GET", path: "/echo3", description: "", call: { action: `/conflict-a/echo`, params: {}, }, }, { method: "GET", path: "/echo4", description: "", call: { action: `/conflict-a/echo`, params: {}, }, }, { method: "GET", path: "/echo5", description: "", call: { action: `/conflict-a/echo`, params: {}, }, }, ], }, }, }), ], }); const remote2 = test_1.getMoleculerServiceBroker({ logger: { level: "error", label: "remote2" }, moleculer: Object.assign(Object.assign({}, moleculer), { nodeID: "remote2" }), services: [ test_1.MoleculerServiceSchemaFactory.echo("dev", "conflict-a", { protocol: { REST: { routes: [ { method: "GET", path: "/echo", description: "", call: { action: `/conflict-a/echo`, params: {}, }, }, ], }, }, }), ], }); jest.setTimeout(1000 * 20); const mocks = { master: jest.fn().mockName("listeners.updated.master"), dev: jest.fn().mockName("listeners.updated.dev"), }; beforeAll(() => tslib_1.__awaiter(void 0, void 0, void 0, function* () { yield Promise.all([ remote1.start(), remote2.start(), schema.start({ updated: branch => mocks[branch.name](), removed: jest.fn(), }), ]); yield test_1.sleepUntil(() => { const dev = schema.getBranch("dev"); return dev && dev.services.length >= 2 || false; }); yield remote2.stop(); yield test_1.sleepUntil(() => { const dev = schema.getBranch("dev"); return dev && dev.latestVersion.routes.length >= 9 || false; }); })); describe("Schema registry update", () => { it("master branch should gathered master/non-branched services", () => { const serviceIds = schema.getBranch("master").services.map(s => s.id); expect(serviceIds).toEqual(expect.arrayContaining([ "master-a", "conflict-a", ])); expect(serviceIds).toHaveLength(2); }); it("dev should gathered dev/master/non-branched services and fall back to master branched service when dev branched service removed", () => { const serviceIds = schema.getBranch("dev").services.map(s => s.id); expect(serviceIds).toEqual(expect.arrayContaining([ "master-a", "conflict-a", ])); expect(serviceIds).toHaveLength(2); }); it("master branch should have 1+5+3 route by 4 updates", () => { expect(mocks.master).toBeCalledTimes(4); // created + initial + master-a + conflict-a expect(schema.getBranch("master").latestVersion.routes.length).toEqual(10); // +master-a + conflict-a/master + graphql(3) + introspection }); it("dev branch should have same routes by at least 3 updates", () => { expect(mocks.dev.mock.calls.length).toBeGreaterThanOrEqual(3); // min: forked(+master-a +conflict-a/master) +conflict-a/dev -conflict-a/dev expect(mocks.dev.mock.calls.length).toBeLessThanOrEqual(5); // max: forked() +conflict-a/master +conflict-a/dev +master-a/master -conflict-a/dev expect(schema.getBranch("dev").latestVersion.routes.length).toEqual(10); // master-a + conflict-a/master + graphql(3) + introspection }); }); afterAll(() => tslib_1.__awaiter(void 0, void 0, void 0, function* () { yield Promise.all([ schema.stop(), remote1.stop(), remote2.stop(), ]); })); //# sourceMappingURL=schema.branch.update2.spec.js.map