UNPKG

nope-js-node

Version:

NoPE Runtime for Nodejs. For Browser-Support please use nope-browser

445 lines (375 loc) 11.6 kB
/** * @author Martin Karkowski * @email m.karkowski@zema.de * @create date 2022-01-05 17:50:44 * @modify date 2022-01-05 17:50:44 * @desc [description] */ import { expect, assert } from "chai"; import { beforeEach, describe, it } from "mocha"; import "reflect-metadata"; import { getLayer } from "../../communication/getLayer.nodejs"; import { sleep } from "../../helpers/async"; import { NopeObservable } from "../../observables/nopeObservable"; import { NopeRpcManager } from "./NopeRpcManager"; describe("NopeRpcManager", function () { // Describe the required Test: let manager = new NopeRpcManager( { communicator: getLayer("event", "", false), logger: false, }, () => new NopeObservable(), async () => "test", "test" ); describe("serviceHandeling", function () { beforeEach((done) => { // Create a new Observer manager = new NopeRpcManager( { communicator: getLayer("event", "", false), logger: false, }, () => new NopeObservable(), async () => "test", "test" ); manager.ready.waitFor().then(() => done()); }); const helloworld = async (greetings: string) => { return "Hello " + greetings + "!"; }; const delay = async (greetings: string) => { await sleep(1000); return "Hello " + greetings + "!"; }; it("registering service", async () => { await manager.ready.waitFor(); // Now we register the Service await manager.registerService(helloworld, { id: "helloworld", schema: { description: "Hello World Service", }, }); await sleep(10); // Get the Services const services = manager.services.extractedKey; expect(services).to.include("helloworld"); assert( manager.services.amountOf.get("helloworld") == 1, "There should be one Provider for this service" ); assert( manager.services.keyMappingReverse.get("helloworld").size == 1, "There should be one Provider for this service" ); assert( manager.services.conflicts.size == 0, "There should be no conflict" ); assert(manager.serviceExists("helloworld"), "Service should be known!"); assert( manager.serviceExists("helloworld2") == false, "Service should not be known!" ); assert( Array.from(manager.services.keyMappingReverse.get("helloworld"))[0] == "test", "The Provider should be 'test'" ); }); it("call service", async () => { await manager.ready.waitFor(); await manager.registerService(helloworld, { id: "helloworld", schema: { description: "Hello World Service", }, }); await sleep(10); const result = await manager.performCall("helloworld", ["Mocha"]); expect(result).to.equal("Hello Mocha!", "result is not matching"); }); it("call service via methodInterface", async () => { await manager.ready.waitFor(); await manager.registerService(helloworld, { id: "helloworld", schema: { description: "Hello World Service", }, }); await sleep(10); const result = await manager.methodInterface.helloworld("Mocha"); expect(result).to.equal("Hello Mocha!", "result is not matching"); }); it("call service with a timeout", async () => { await manager.ready.waitFor(); await manager.registerService(delay, { id: "helloworld", schema: { description: "Hello World Service", }, }); await sleep(10); const err = Error("Error not thrown"); try { const result = await manager.methodInterfaceWithOptions.helloworld( { timeout: 50, }, "Mocha" ); throw err; } catch (e) { if (e == err) { throw err; } } }); it("multi-call", async () => { await manager.ready.waitFor(); await manager.registerService(helloworld, { id: "helloworld_00", schema: { description: "Hello World Service", }, }); await manager.registerService(helloworld, { id: "helloworld_01", schema: { description: "Hello World Service", }, }); await sleep(10); const result: string[] = await manager.performCall( ["helloworld_00", "helloworld_01"], ["test"] ); expect(result.length).to.eq(2); }); }); describe("RpcManager Communication", function () { let caller = new NopeRpcManager( { communicator: getLayer("event", "", false), logger: false, }, () => new NopeObservable(), async () => "test", "caller" ); beforeEach(() => { const communicator = getLayer("event", "", false); if (manager) { manager.dispose(); } // Create a new Observer manager = new NopeRpcManager( { communicator, logger: false, }, () => new NopeObservable(), async () => "test", "test" ); if (caller) { caller.dispose(); } caller = new NopeRpcManager( { communicator, logger: false, }, () => new NopeObservable(), async () => "test", "caller" ); }); const helloworld = async (greetings: string) => { return "Hello " + greetings + "!"; }; const delay = async (greetings: string) => { await sleep(1000); return "Hello " + greetings + "!"; }; it("registering service - static id", async () => { await manager.ready.waitFor(); await caller.ready.waitFor(); await manager.registerService(helloworld, { id: "helloworld", schema: { description: "Hello World Service", }, }); await sleep(10); // Get the Services const services = caller.services.extractedKey; expect(caller.services.extractedKey).to.include("helloworld"); assert( caller.services.amountOf.get("helloworld") == 1, "There should be one Provider for this service" ); assert( caller.services.keyMappingReverse.get("helloworld").size == 1, "There should be one Provider for this service" ); assert( caller.services.conflicts.size == 0, "There should be no conflict" ); assert(caller.serviceExists("helloworld"), "Service should be known!"); assert( caller.serviceExists("helloworld2") == false, "Service should not be known!" ); assert( Array.from(caller.services.keyMappingReverse.get("helloworld"))[0] == "test", "The Provider should be 'test'" ); }); it("registering service - dynamic id", async () => { await manager.ready.waitFor(); await caller.ready.waitFor(); const r = await manager.registerService(helloworld, { schema: {}, }); assert((r as any).id !== "helloworld", "There should be an dynamic id"); await sleep(10); // Get the Services const services = caller.services.extractedKey; expect(services).to.include((r as any).id); }); it("call service", async () => { await manager.ready.waitFor(); await caller.ready.waitFor(); await manager.registerService(helloworld, { id: "helloworld", schema: { description: "Hello World Service", }, }); await sleep(10); const result = await caller.performCall("helloworld", ["Mocha"]); expect(result).to.equal("Hello Mocha!", "result is not matching"); }); it("call service via methodInterface", async () => { await manager.ready.waitFor(); await caller.ready.waitFor(); await manager.registerService(helloworld, { id: "helloworld", schema: { description: "Hello World Service", }, }); await sleep(10); const result = await caller.methodInterface.helloworld("Mocha"); expect(result).to.equal("Hello Mocha!", "result is not matching"); }); it("call service with a timeout", async () => { await manager.ready.waitFor(); await caller.ready.waitFor(); await manager.registerService(delay, { id: "helloworld", schema: { description: "Hello World Service", }, }); await sleep(10); const err = Error("Error not thrown"); try { const result = await caller.methodInterfaceWithOptions.helloworld( { timeout: 50, }, "Mocha" ); throw err; } catch (e) { if (e == err) { throw err; } } }); it("providing multiple providers", async () => { await manager.ready.waitFor(); await caller.ready.waitFor(); await manager.registerService(delay, { id: "helloworld", schema: { description: "Hello World Service", }, }); await caller.registerService(delay, { id: "helloworld", schema: { description: "Hello World Service", }, }); await sleep(10); expect(manager.services.extractedKey).to.include("helloworld"); assert( manager.services.amountOf.get("helloworld") == 2, "There should be two Provider for this service" ); assert( manager.services.keyMappingReverse.get("helloworld").size == 2, "There should be two Provider for this service" ); assert( manager.services.conflicts.size == 0, "There should be no conflict" ); assert(manager.serviceExists("helloworld"), "Service should be known!"); assert( manager.serviceExists("helloworld2") == false, "Service should not be known!" ); let providers = Array.from( manager.services.keyMappingReverse.get("helloworld") ); assert(providers.includes("test"), "The Provider should be 'test'"); assert(providers.includes("caller"), "The Provider should be 'test'"); expect(caller.services.extractedKey).to.include("helloworld"); assert( caller.services.amountOf.get("helloworld") == 2, "There should be two Provider for this service" ); assert( caller.services.keyMappingReverse.get("helloworld").size == 2, "There should be two Provider for this service" ); assert( caller.services.conflicts.size == 0, "There should be no conflict" ); assert(caller.serviceExists("helloworld"), "Service should be known!"); assert( caller.serviceExists("helloworld2") == false, "Service should not be known!" ); providers = Array.from( caller.services.keyMappingReverse.get("helloworld") ); assert(providers.includes("test"), "The Provider should be 'test'"); assert(providers.includes("caller"), "The Provider should be 'test'"); const err = Error("Error not thrown"); try { const result = await caller.methodInterfaceWithOptions.helloworld( { timeout: 50, }, "Mocha" ); throw err; } catch (e) { if (e == err) { throw err; } } }); }); });