nope-js-node
Version:
NoPE Runtime for Nodejs. For Browser-Support please use nope-browser
180 lines (162 loc) • 4.85 kB
text/typescript
/**
* @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 { describe, it } from "mocha";
import "reflect-metadata";
import { getLayer } from "../../communication/getLayer.nodejs";
import { exportAsNopeService, nopeMethod } from "../../decorators";
import { NopeEventEmitter } from "../../eventEmitter";
import { sleep } from "../../helpers/async";
import { NopeBaseModule } from "../../module";
import { NopeObservable } from "../../observables/nopeObservable";
import { NopeInstanceManager } from "./InstanceManager";
describe("NopeInstanceManager", function () {
// Describe the required Test:
let manager: NopeInstanceManager;
manager = new NopeInstanceManager(
{
communicator: getLayer("event", "", false),
logger: false,
},
() => new NopeEventEmitter(),
() => new NopeObservable(),
async () => "test",
"test",
undefined,
undefined,
manager as any
);
it("registering instance", async () => {
let called = false;
let calledService = false;
class TestModule extends NopeBaseModule {
// We can not provide a service.
// @nopeMethod({
// id: "service",
// schema: {},
// })
// public async service() {
// calledService = true;
// return "called";
// }
public async dispose(): Promise<void> {
await super.dispose();
called = true;
}
public async init(p1: string, p2: string): Promise<void> {
this.author = {
forename: "test",
surename: "test",
mail: "test",
};
this.version = {
date: new Date(),
version: 1,
};
this.description = "test";
assert(p1 == "p1" && p2 == "p2", "parameters where matched wrong");
await super.init();
}
}
await manager.ready.waitFor();
// Now we register the Service
await manager.registerConstructor(
"TestModule",
async (core, identifier) => {
assert(
identifier === "instance",
"The identifier has not been transmitted"
);
return new TestModule(core);
}
);
await sleep(10);
// Check the Constructors
const constructors = manager.constructors.extractedKey;
expect(constructors).to.include("TestModule");
assert(
manager.constructors.amountOf.get("TestModule") == 1,
"There should be one Provider for this constructor"
);
assert(
manager.constructors.keyMappingReverse.get("TestModule").size == 1,
"There should be one Provider for this constructor"
);
assert(
manager.constructors.conflicts.size == 0,
"There should be no conflict"
);
assert(
manager.constructorExists("TestModule"),
"Constructor should be known!"
);
assert(
manager.constructorExists("unkown") == false,
"Constructor should not be known!"
);
assert(
Array.from(manager.constructors.keyMappingReverse.get("TestModule"))[0] ==
"test",
"The Provider should be 'test'"
);
const instance = await manager.createInstance<TestModule>({
identifier: "instance",
type: "TestModule",
params: ["p1", "p2"],
});
assert(
manager.instanceExists("instance", false) == true,
"The instance should be known!"
);
assert(
manager.instanceExists("instance", true) == false,
"No external manager is present!"
);
assert(
manager.internalInstances.getContent().includes("instance"),
"The instance should be listed as internal instance."
);
assert(
Array.from(manager.instances.keyMappingReverse.get("instance"))[0] ==
"test",
"The Provider should be 'test'"
);
// Now test the instance wrapper
// assert(
// (await instance.service()) === "called",
// "The result should be called"
// );
// assert(calledService, "The service flag should be different now.");
assert(
(await instance.listEvents()).length === 0,
"No event has been defined"
);
assert(
(await instance.listProperties()).length === 0,
"No property has been defined"
);
assert(
(await instance.listMethods()).length === 0,
"No Method should be known"
);
assert(
Object.keys(instance.dynamicInstanceMethods).length === 0,
"No Method should be known"
);
assert(
Object.keys(instance.methods).length === 0,
"No Method should be known"
);
await instance.dispose();
await sleep(100);
assert(
!manager.instances.amountOf.has("instance"),
"The Provider should be 'test'"
);
});
});