@bluelibs/runner 3.4.2 → 4.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AI.md +621 -0
- package/README.md +1024 -577
- package/dist/context.d.ts +4 -8
- package/dist/context.js +5 -12
- package/dist/context.js.map +1 -1
- package/dist/define.d.ts +9 -113
- package/dist/define.js +29 -358
- package/dist/define.js.map +1 -1
- package/dist/definers/defineEvent.d.ts +2 -0
- package/dist/definers/defineEvent.js +23 -0
- package/dist/definers/defineEvent.js.map +1 -0
- package/dist/definers/defineHook.d.ts +6 -0
- package/dist/definers/defineHook.js +24 -0
- package/dist/definers/defineHook.js.map +1 -0
- package/dist/definers/defineOverride.d.ts +14 -0
- package/dist/definers/defineOverride.js +13 -0
- package/dist/definers/defineOverride.js.map +1 -0
- package/dist/definers/defineResource.d.ts +2 -0
- package/dist/definers/defineResource.js +69 -0
- package/dist/definers/defineResource.js.map +1 -0
- package/dist/definers/defineResourceMiddleware.d.ts +2 -0
- package/dist/definers/defineResourceMiddleware.js +42 -0
- package/dist/definers/defineResourceMiddleware.js.map +1 -0
- package/dist/definers/defineTag.d.ts +12 -0
- package/dist/definers/defineTag.js +106 -0
- package/dist/definers/defineTag.js.map +1 -0
- package/dist/definers/defineTask.d.ts +15 -0
- package/dist/definers/defineTask.js +42 -0
- package/dist/definers/defineTask.js.map +1 -0
- package/dist/definers/defineTaskMiddleware.d.ts +2 -0
- package/dist/definers/defineTaskMiddleware.js +42 -0
- package/dist/definers/defineTaskMiddleware.js.map +1 -0
- package/dist/definers/tools.d.ts +45 -0
- package/dist/definers/tools.js +75 -0
- package/dist/definers/tools.js.map +1 -0
- package/dist/defs.d.ts +16 -424
- package/dist/defs.js +26 -38
- package/dist/defs.js.map +1 -1
- package/dist/errors.d.ts +23 -8
- package/dist/errors.js +50 -10
- package/dist/errors.js.map +1 -1
- package/dist/globals/globalEvents.d.ts +15 -39
- package/dist/globals/globalEvents.js +20 -81
- package/dist/globals/globalEvents.js.map +1 -1
- package/dist/globals/globalMiddleware.d.ts +24 -17
- package/dist/globals/globalMiddleware.js +12 -4
- package/dist/globals/globalMiddleware.js.map +1 -1
- package/dist/globals/globalResources.d.ts +13 -28
- package/dist/globals/globalResources.js +15 -7
- package/dist/globals/globalResources.js.map +1 -1
- package/dist/globals/globalTags.d.ts +9 -0
- package/dist/globals/globalTags.js +23 -0
- package/dist/globals/globalTags.js.map +1 -0
- package/dist/globals/middleware/cache.middleware.d.ts +10 -17
- package/dist/globals/middleware/cache.middleware.js +4 -16
- package/dist/globals/middleware/cache.middleware.js.map +1 -1
- package/dist/globals/middleware/requireContext.middleware.d.ts +1 -1
- package/dist/globals/middleware/requireContext.middleware.js +5 -14
- package/dist/globals/middleware/requireContext.middleware.js.map +1 -1
- package/dist/globals/middleware/retry.middleware.d.ts +2 -1
- package/dist/globals/middleware/retry.middleware.js +32 -5
- package/dist/globals/middleware/retry.middleware.js.map +1 -1
- package/dist/globals/middleware/timeout.middleware.d.ts +2 -1
- package/dist/globals/middleware/timeout.middleware.js +31 -5
- package/dist/globals/middleware/timeout.middleware.js.map +1 -1
- package/dist/globals/resources/debug/debug.resource.d.ts +7 -0
- package/dist/globals/resources/debug/debug.resource.js +29 -0
- package/dist/globals/resources/debug/debug.resource.js.map +1 -0
- package/dist/globals/resources/debug/debug.tag.d.ts +2 -0
- package/dist/globals/resources/debug/debug.tag.js +12 -0
- package/dist/globals/resources/debug/debug.tag.js.map +1 -0
- package/dist/globals/resources/debug/debugConfig.resource.d.ts +22 -0
- package/dist/globals/resources/debug/debugConfig.resource.js +20 -0
- package/dist/globals/resources/debug/debugConfig.resource.js.map +1 -0
- package/dist/globals/resources/debug/executionTracker.middleware.d.ts +50 -0
- package/dist/globals/resources/debug/executionTracker.middleware.js +87 -0
- package/dist/globals/resources/debug/executionTracker.middleware.js.map +1 -0
- package/dist/globals/resources/debug/globalEvent.hook.d.ts +27 -0
- package/dist/globals/resources/debug/globalEvent.hook.js +38 -0
- package/dist/globals/resources/debug/globalEvent.hook.js.map +1 -0
- package/dist/globals/resources/debug/hook.hook.d.ts +25 -0
- package/dist/globals/resources/debug/hook.hook.js +42 -0
- package/dist/globals/resources/debug/hook.hook.js.map +1 -0
- package/dist/globals/resources/debug/index.d.ts +6 -0
- package/dist/{types → globals/resources/debug}/index.js +6 -11
- package/dist/globals/resources/debug/index.js.map +1 -0
- package/dist/globals/resources/debug/middleware.hook.d.ts +25 -0
- package/dist/globals/resources/debug/middleware.hook.js +71 -0
- package/dist/globals/resources/debug/middleware.hook.js.map +1 -0
- package/dist/globals/resources/debug/types.d.ts +25 -0
- package/dist/globals/resources/debug/types.js +65 -0
- package/dist/globals/resources/debug/types.js.map +1 -0
- package/dist/globals/resources/debug/utils.d.ts +2 -0
- package/dist/globals/resources/debug/utils.js +9 -0
- package/dist/globals/resources/debug/utils.js.map +1 -0
- package/dist/globals/resources/queue.resource.d.ts +3 -3
- package/dist/globals/resources/queue.resource.js.map +1 -1
- package/dist/globals/types.d.ts +1 -0
- package/dist/{task.types.js → globals/types.js} +2 -7
- package/dist/globals/types.js.map +1 -0
- package/dist/index.d.ts +58 -85
- package/dist/index.js +23 -10
- package/dist/index.js.map +1 -1
- package/dist/models/DependencyProcessor.d.ts +8 -6
- package/dist/models/DependencyProcessor.js +116 -33
- package/dist/models/DependencyProcessor.js.map +1 -1
- package/dist/models/EventManager.d.ts +127 -7
- package/dist/models/EventManager.js +251 -78
- package/dist/models/EventManager.js.map +1 -1
- package/dist/models/LogPrinter.d.ts +55 -0
- package/dist/models/LogPrinter.js +196 -0
- package/dist/models/LogPrinter.js.map +1 -0
- package/dist/models/Logger.d.ts +47 -27
- package/dist/models/Logger.js +133 -155
- package/dist/models/Logger.js.map +1 -1
- package/dist/models/MiddlewareManager.d.ts +86 -0
- package/dist/models/MiddlewareManager.js +409 -0
- package/dist/models/MiddlewareManager.js.map +1 -0
- package/dist/models/OverrideManager.d.ts +3 -3
- package/dist/models/OverrideManager.js +22 -7
- package/dist/models/OverrideManager.js.map +1 -1
- package/dist/models/ResourceInitializer.d.ts +4 -3
- package/dist/models/ResourceInitializer.js +12 -68
- package/dist/models/ResourceInitializer.js.map +1 -1
- package/dist/models/RunResult.d.ts +35 -0
- package/dist/models/RunResult.js +68 -0
- package/dist/models/RunResult.js.map +1 -0
- package/dist/models/Store.d.ts +30 -17
- package/dist/models/Store.js +87 -25
- package/dist/models/Store.js.map +1 -1
- package/dist/models/StoreRegistry.d.ts +34 -19
- package/dist/models/StoreRegistry.js +248 -100
- package/dist/models/StoreRegistry.js.map +1 -1
- package/dist/models/StoreValidator.d.ts +5 -7
- package/dist/models/StoreValidator.js +50 -17
- package/dist/models/StoreValidator.js.map +1 -1
- package/dist/models/TaskRunner.d.ts +3 -2
- package/dist/models/TaskRunner.js +6 -103
- package/dist/models/TaskRunner.js.map +1 -1
- package/dist/models/UnhandledError.d.ts +11 -0
- package/dist/models/UnhandledError.js +30 -0
- package/dist/models/UnhandledError.js.map +1 -0
- package/dist/models/index.d.ts +3 -0
- package/dist/models/index.js +3 -0
- package/dist/models/index.js.map +1 -1
- package/dist/{tools → models/utils}/findCircularDependencies.js +8 -16
- package/dist/models/utils/findCircularDependencies.js.map +1 -0
- package/dist/models/utils/safeStringify.d.ts +3 -0
- package/dist/models/utils/safeStringify.js +45 -0
- package/dist/models/utils/safeStringify.js.map +1 -0
- package/dist/processHooks.d.ts +2 -0
- package/dist/processHooks.js +70 -0
- package/dist/processHooks.js.map +1 -0
- package/dist/run.d.ts +14 -27
- package/dist/run.js +100 -36
- package/dist/run.js.map +1 -1
- package/dist/testing.d.ts +5 -4
- package/dist/testing.js +3 -2
- package/dist/testing.js.map +1 -1
- package/dist/tools/getCallerFile.d.ts +0 -8
- package/dist/tools/getCallerFile.js +0 -51
- package/dist/tools/getCallerFile.js.map +1 -1
- package/dist/types/contracts.d.ts +55 -0
- package/dist/types/contracts.js +4 -0
- package/dist/types/contracts.js.map +1 -0
- package/dist/types/event.d.ts +26 -7
- package/dist/types/event.js +1 -1
- package/dist/types/event.js.map +1 -1
- package/dist/types/hook.d.ts +21 -0
- package/dist/{models/StoreTypes.js → types/hook.js} +2 -1
- package/dist/types/hook.js.map +1 -0
- package/dist/types/meta.d.ts +6 -1
- package/dist/types/meta.js +4 -2
- package/dist/types/meta.js.map +1 -1
- package/dist/types/resource.d.ts +40 -52
- package/dist/types/resource.js +1 -0
- package/dist/types/resource.js.map +1 -1
- package/dist/types/resourceMiddleware.d.ts +47 -0
- package/dist/{middleware.types.js → types/resourceMiddleware.js} +1 -1
- package/dist/types/resourceMiddleware.js.map +1 -0
- package/dist/types/runner.d.ts +37 -0
- package/dist/types/{base.js → runner.js} +1 -1
- package/dist/types/runner.js.map +1 -0
- package/dist/types/storeTypes.d.ts +40 -0
- package/dist/types/{metadata.js → storeTypes.js} +1 -1
- package/dist/types/storeTypes.js.map +1 -0
- package/dist/types/symbols.d.ts +10 -21
- package/dist/types/symbols.js +17 -22
- package/dist/types/symbols.js.map +1 -1
- package/dist/types/tag.d.ts +46 -0
- package/dist/{resource.types.js → types/tag.js} +2 -1
- package/dist/types/tag.js.map +1 -0
- package/dist/types/task.d.ts +28 -52
- package/dist/types/task.js +1 -0
- package/dist/types/task.js.map +1 -1
- package/dist/types/taskMiddleware.d.ts +48 -0
- package/dist/{event.types.js → types/taskMiddleware.js} +1 -1
- package/dist/types/taskMiddleware.js.map +1 -0
- package/dist/types/utilities.d.ts +105 -6
- package/dist/types/utilities.js +16 -2
- package/dist/types/utilities.js.map +1 -1
- package/package.json +14 -5
- package/dist/cli/extract-docs.d.ts +0 -2
- package/dist/cli/extract-docs.js +0 -88
- package/dist/cli/extract-docs.js.map +0 -1
- package/dist/common.types.d.ts +0 -20
- package/dist/common.types.js +0 -4
- package/dist/common.types.js.map +0 -1
- package/dist/defs/core.d.ts +0 -144
- package/dist/defs/core.js +0 -6
- package/dist/defs/core.js.map +0 -1
- package/dist/defs/symbols.d.ts +0 -42
- package/dist/defs/symbols.js +0 -45
- package/dist/defs/symbols.js.map +0 -1
- package/dist/defs/tags.d.ts +0 -70
- package/dist/defs/tags.js +0 -6
- package/dist/defs/tags.js.map +0 -1
- package/dist/defs.returnTag.d.ts +0 -36
- package/dist/defs.returnTag.js +0 -4
- package/dist/defs.returnTag.js.map +0 -1
- package/dist/docs/introspect.d.ts +0 -7
- package/dist/docs/introspect.js +0 -199
- package/dist/docs/introspect.js.map +0 -1
- package/dist/docs/markdown.d.ts +0 -2
- package/dist/docs/markdown.js +0 -148
- package/dist/docs/markdown.js.map +0 -1
- package/dist/docs/model.d.ts +0 -62
- package/dist/docs/model.js +0 -33
- package/dist/docs/model.js.map +0 -1
- package/dist/event.types.d.ts +0 -18
- package/dist/event.types.js.map +0 -1
- package/dist/examples/express-mongo/index.d.ts +0 -0
- package/dist/examples/express-mongo/index.js +0 -3
- package/dist/examples/express-mongo/index.js.map +0 -1
- package/dist/examples/registrator-example.d.ts +0 -122
- package/dist/examples/registrator-example.js +0 -147
- package/dist/examples/registrator-example.js.map +0 -1
- package/dist/express/docsRouter.d.ts +0 -12
- package/dist/express/docsRouter.js +0 -54
- package/dist/express/docsRouter.js.map +0 -1
- package/dist/globalEvents.d.ts +0 -40
- package/dist/globalEvents.js +0 -94
- package/dist/globalEvents.js.map +0 -1
- package/dist/globalResources.d.ts +0 -10
- package/dist/globalResources.js +0 -43
- package/dist/globalResources.js.map +0 -1
- package/dist/middleware.types.d.ts +0 -40
- package/dist/middleware.types.js.map +0 -1
- package/dist/models/StoreConstants.d.ts +0 -14
- package/dist/models/StoreConstants.js +0 -19
- package/dist/models/StoreConstants.js.map +0 -1
- package/dist/models/StoreTypes.d.ts +0 -21
- package/dist/models/StoreTypes.js.map +0 -1
- package/dist/models/VarStore.d.ts +0 -17
- package/dist/models/VarStore.js +0 -60
- package/dist/models/VarStore.js.map +0 -1
- package/dist/resource.types.d.ts +0 -31
- package/dist/resource.types.js.map +0 -1
- package/dist/symbols.d.ts +0 -24
- package/dist/symbols.js +0 -29
- package/dist/symbols.js.map +0 -1
- package/dist/t1.d.ts +0 -1
- package/dist/t1.js +0 -13
- package/dist/t1.js.map +0 -1
- package/dist/task.types.d.ts +0 -55
- package/dist/task.types.js.map +0 -1
- package/dist/tools/findCircularDependencies.js.map +0 -1
- package/dist/tools/registratorId.d.ts +0 -4
- package/dist/tools/registratorId.js +0 -40
- package/dist/tools/registratorId.js.map +0 -1
- package/dist/tools/simpleHash.d.ts +0 -9
- package/dist/tools/simpleHash.js +0 -34
- package/dist/tools/simpleHash.js.map +0 -1
- package/dist/types/base-interfaces.d.ts +0 -18
- package/dist/types/base-interfaces.js +0 -6
- package/dist/types/base-interfaces.js.map +0 -1
- package/dist/types/base.d.ts +0 -13
- package/dist/types/base.js.map +0 -1
- package/dist/types/dependencies.d.ts +0 -51
- package/dist/types/dependencies.js +0 -3
- package/dist/types/dependencies.js.map +0 -1
- package/dist/types/dependency-core.d.ts +0 -14
- package/dist/types/dependency-core.js +0 -5
- package/dist/types/dependency-core.js.map +0 -1
- package/dist/types/events.d.ts +0 -52
- package/dist/types/events.js +0 -6
- package/dist/types/events.js.map +0 -1
- package/dist/types/hooks.d.ts +0 -16
- package/dist/types/hooks.js +0 -5
- package/dist/types/hooks.js.map +0 -1
- package/dist/types/index.d.ts +0 -8
- package/dist/types/index.js.map +0 -1
- package/dist/types/metadata.d.ts +0 -75
- package/dist/types/metadata.js.map +0 -1
- package/dist/types/middleware.d.ts +0 -63
- package/dist/types/middleware.js +0 -3
- package/dist/types/middleware.js.map +0 -1
- package/dist/types/registerable.d.ts +0 -10
- package/dist/types/registerable.js +0 -5
- package/dist/types/registerable.js.map +0 -1
- package/dist/types/resources.d.ts +0 -44
- package/dist/types/resources.js +0 -5
- package/dist/types/resources.js.map +0 -1
- package/dist/types/tasks.d.ts +0 -41
- package/dist/types/tasks.js +0 -5
- package/dist/types/tasks.js.map +0 -1
- package/src/__tests__/benchmark/benchmark.test.ts +0 -148
- package/src/__tests__/benchmark/task-benchmark.test.ts +0 -132
- package/src/__tests__/context.test.ts +0 -91
- package/src/__tests__/createTestResource.test.ts +0 -139
- package/src/__tests__/errors.test.ts +0 -341
- package/src/__tests__/globalEvents.test.ts +0 -542
- package/src/__tests__/globals/cache.middleware.test.ts +0 -772
- package/src/__tests__/globals/queue.resource.test.ts +0 -141
- package/src/__tests__/globals/requireContext.middleware.test.ts +0 -98
- package/src/__tests__/globals/retry.middleware.test.ts +0 -157
- package/src/__tests__/globals/timeout.middleware.test.ts +0 -88
- package/src/__tests__/index.helper.test.ts +0 -55
- package/src/__tests__/models/EventManager.test.ts +0 -585
- package/src/__tests__/models/Logger.test.ts +0 -519
- package/src/__tests__/models/Queue.test.ts +0 -189
- package/src/__tests__/models/ResourceInitializer.test.ts +0 -148
- package/src/__tests__/models/Semaphore.test.ts +0 -713
- package/src/__tests__/models/Store.test.ts +0 -227
- package/src/__tests__/models/TaskRunner.test.ts +0 -221
- package/src/__tests__/override.test.ts +0 -104
- package/src/__tests__/recursion/README.md +0 -3
- package/src/__tests__/recursion/a.resource.ts +0 -25
- package/src/__tests__/recursion/b.resource.ts +0 -33
- package/src/__tests__/recursion/c.resource.ts +0 -18
- package/src/__tests__/run.anonymous.test.ts +0 -706
- package/src/__tests__/run.dynamic-register-and-dependencies.test.ts +0 -1185
- package/src/__tests__/run.middleware.test.ts +0 -549
- package/src/__tests__/run.overrides.test.ts +0 -424
- package/src/__tests__/run.test.ts +0 -1040
- package/src/__tests__/setOutput.test.ts +0 -244
- package/src/__tests__/tags.test.ts +0 -396
- package/src/__tests__/tools/findCircularDependencies.test.ts +0 -217
- package/src/__tests__/tools/getCallerFile.test.ts +0 -179
- package/src/__tests__/typesafety.test.ts +0 -423
- package/src/__tests__/validation-edge-cases.test.ts +0 -111
- package/src/__tests__/validation-interface.test.ts +0 -428
- package/src/context.ts +0 -86
- package/src/define.ts +0 -480
- package/src/defs.returnTag.ts +0 -91
- package/src/defs.ts +0 -596
- package/src/errors.ts +0 -105
- package/src/globals/globalEvents.ts +0 -125
- package/src/globals/globalMiddleware.ts +0 -16
- package/src/globals/globalResources.ts +0 -53
- package/src/globals/middleware/cache.middleware.ts +0 -115
- package/src/globals/middleware/requireContext.middleware.ts +0 -36
- package/src/globals/middleware/retry.middleware.ts +0 -56
- package/src/globals/middleware/timeout.middleware.ts +0 -46
- package/src/globals/resources/queue.resource.ts +0 -34
- package/src/index.ts +0 -39
- package/src/models/DependencyProcessor.ts +0 -257
- package/src/models/EventManager.ts +0 -210
- package/src/models/Logger.ts +0 -282
- package/src/models/OverrideManager.ts +0 -79
- package/src/models/Queue.ts +0 -66
- package/src/models/ResourceInitializer.ts +0 -165
- package/src/models/Semaphore.ts +0 -208
- package/src/models/Store.ts +0 -193
- package/src/models/StoreConstants.ts +0 -18
- package/src/models/StoreRegistry.ts +0 -253
- package/src/models/StoreTypes.ts +0 -47
- package/src/models/StoreValidator.ts +0 -43
- package/src/models/TaskRunner.ts +0 -203
- package/src/models/index.ts +0 -8
- package/src/run.ts +0 -116
- package/src/testing.ts +0 -66
- package/src/tools/findCircularDependencies.ts +0 -69
- package/src/tools/getCallerFile.ts +0 -96
- /package/dist/{tools → models/utils}/findCircularDependencies.d.ts +0 -0
|
@@ -1,585 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
IEvent,
|
|
3
|
-
IEventEmission,
|
|
4
|
-
symbolEvent,
|
|
5
|
-
symbolFilePath,
|
|
6
|
-
} from "../../defs";
|
|
7
|
-
import { EventManager } from "../../models/EventManager";
|
|
8
|
-
|
|
9
|
-
describe("EventManager", () => {
|
|
10
|
-
let eventManager: EventManager;
|
|
11
|
-
let eventDefinition: IEvent<string>;
|
|
12
|
-
|
|
13
|
-
beforeEach(() => {
|
|
14
|
-
eventManager = new EventManager();
|
|
15
|
-
eventDefinition = {
|
|
16
|
-
id: "testEvent",
|
|
17
|
-
[symbolEvent]: true,
|
|
18
|
-
[symbolFilePath]: "test.ts",
|
|
19
|
-
};
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
it("should add and emit event listener", async () => {
|
|
23
|
-
const handler = jest.fn();
|
|
24
|
-
eventManager.addListener(eventDefinition, handler);
|
|
25
|
-
|
|
26
|
-
await eventManager.emit(eventDefinition, "testData", "test");
|
|
27
|
-
|
|
28
|
-
expect(handler).toHaveBeenCalledTimes(1);
|
|
29
|
-
expect(handler).toHaveBeenCalledWith(
|
|
30
|
-
expect.objectContaining({
|
|
31
|
-
id: "testEvent",
|
|
32
|
-
data: "testData",
|
|
33
|
-
timestamp: expect.any(Date),
|
|
34
|
-
})
|
|
35
|
-
);
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
it("should respect listener order", async () => {
|
|
39
|
-
const results: number[] = [];
|
|
40
|
-
|
|
41
|
-
eventManager.addListener(
|
|
42
|
-
eventDefinition,
|
|
43
|
-
() => {
|
|
44
|
-
results.push(1);
|
|
45
|
-
},
|
|
46
|
-
{ order: 2 }
|
|
47
|
-
);
|
|
48
|
-
|
|
49
|
-
eventManager.addListener(
|
|
50
|
-
eventDefinition,
|
|
51
|
-
() => {
|
|
52
|
-
results.push(0);
|
|
53
|
-
},
|
|
54
|
-
{ order: 1 }
|
|
55
|
-
);
|
|
56
|
-
|
|
57
|
-
eventManager.addListener(
|
|
58
|
-
eventDefinition,
|
|
59
|
-
() => {
|
|
60
|
-
results.push(3);
|
|
61
|
-
},
|
|
62
|
-
{ order: 4 }
|
|
63
|
-
);
|
|
64
|
-
|
|
65
|
-
eventManager.addListener(
|
|
66
|
-
eventDefinition,
|
|
67
|
-
() => {
|
|
68
|
-
results.push(2);
|
|
69
|
-
},
|
|
70
|
-
{ order: 3 }
|
|
71
|
-
);
|
|
72
|
-
|
|
73
|
-
await eventManager.emit(eventDefinition, "testData", "test");
|
|
74
|
-
|
|
75
|
-
expect(results).toEqual([0, 1, 2, 3]);
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
it("should apply filters correctly", async () => {
|
|
79
|
-
const handler = jest.fn();
|
|
80
|
-
const filter = (event: IEventEmission<string>) => event.data === "allowed";
|
|
81
|
-
|
|
82
|
-
eventManager.addListener(eventDefinition, handler, { filter });
|
|
83
|
-
|
|
84
|
-
await eventManager.emit(eventDefinition, "blocked", "test");
|
|
85
|
-
expect(handler).not.toHaveBeenCalled();
|
|
86
|
-
|
|
87
|
-
await eventManager.emit(eventDefinition, "allowed", "test");
|
|
88
|
-
expect(handler).toHaveBeenCalledTimes(1);
|
|
89
|
-
expect(handler).toHaveBeenCalledWith(
|
|
90
|
-
expect.objectContaining({
|
|
91
|
-
data: "allowed",
|
|
92
|
-
})
|
|
93
|
-
);
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
it("should add and emit global listener", async () => {
|
|
97
|
-
const handler = jest.fn();
|
|
98
|
-
|
|
99
|
-
eventManager.addGlobalListener(handler);
|
|
100
|
-
|
|
101
|
-
await eventManager.emit(eventDefinition, "testData", "test");
|
|
102
|
-
|
|
103
|
-
expect(handler).toHaveBeenCalledTimes(1);
|
|
104
|
-
expect(handler).toHaveBeenCalledWith(
|
|
105
|
-
expect.objectContaining({
|
|
106
|
-
id: "testEvent",
|
|
107
|
-
data: "testData",
|
|
108
|
-
timestamp: expect.any(Date),
|
|
109
|
-
})
|
|
110
|
-
);
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
it("global listeners should respect order with event listeners", async () => {
|
|
114
|
-
const results: string[] = [];
|
|
115
|
-
|
|
116
|
-
eventManager.addListener(
|
|
117
|
-
eventDefinition,
|
|
118
|
-
() => {
|
|
119
|
-
results.push("eventListener1");
|
|
120
|
-
},
|
|
121
|
-
{ order: 2 }
|
|
122
|
-
);
|
|
123
|
-
|
|
124
|
-
eventManager.addGlobalListener(
|
|
125
|
-
() => {
|
|
126
|
-
results.push("globalListener1");
|
|
127
|
-
},
|
|
128
|
-
{ order: 1 }
|
|
129
|
-
);
|
|
130
|
-
|
|
131
|
-
eventManager.addListener(
|
|
132
|
-
eventDefinition,
|
|
133
|
-
() => {
|
|
134
|
-
results.push("eventListener2");
|
|
135
|
-
},
|
|
136
|
-
{ order: 4 }
|
|
137
|
-
);
|
|
138
|
-
|
|
139
|
-
eventManager.addGlobalListener(
|
|
140
|
-
() => {
|
|
141
|
-
results.push("globalListener2");
|
|
142
|
-
},
|
|
143
|
-
{ order: 3 }
|
|
144
|
-
);
|
|
145
|
-
|
|
146
|
-
await eventManager.emit(eventDefinition, "testData", "test");
|
|
147
|
-
|
|
148
|
-
expect(results).toEqual([
|
|
149
|
-
"globalListener1",
|
|
150
|
-
"eventListener1",
|
|
151
|
-
"globalListener2",
|
|
152
|
-
"eventListener2",
|
|
153
|
-
]);
|
|
154
|
-
});
|
|
155
|
-
|
|
156
|
-
it("should lock and prevent adding new listeners", () => {
|
|
157
|
-
eventManager.lock();
|
|
158
|
-
|
|
159
|
-
expect(eventManager.isLocked).toBe(true);
|
|
160
|
-
|
|
161
|
-
const handler = jest.fn();
|
|
162
|
-
|
|
163
|
-
expect(() => {
|
|
164
|
-
eventManager.addListener(eventDefinition, handler);
|
|
165
|
-
}).toThrowError("Cannot modify the EventManager when it is locked.");
|
|
166
|
-
|
|
167
|
-
expect(() => {
|
|
168
|
-
eventManager.addGlobalListener(handler);
|
|
169
|
-
}).toThrowError("Cannot modify the EventManager when it is locked.");
|
|
170
|
-
});
|
|
171
|
-
|
|
172
|
-
it("should handle multiple events", async () => {
|
|
173
|
-
const eventDef1: IEvent<string> = {
|
|
174
|
-
id: "event1",
|
|
175
|
-
[symbolEvent]: true,
|
|
176
|
-
[symbolFilePath]: "test.ts",
|
|
177
|
-
};
|
|
178
|
-
const eventDef2: IEvent<string> = {
|
|
179
|
-
id: "event2",
|
|
180
|
-
[symbolEvent]: true,
|
|
181
|
-
[symbolFilePath]: "test.ts",
|
|
182
|
-
};
|
|
183
|
-
|
|
184
|
-
const handler1 = jest.fn();
|
|
185
|
-
const handler2 = jest.fn();
|
|
186
|
-
|
|
187
|
-
eventManager.addListener(eventDef1, handler1);
|
|
188
|
-
eventManager.addListener(eventDef2, handler2);
|
|
189
|
-
|
|
190
|
-
await eventManager.emit(eventDef1, "data1", "test");
|
|
191
|
-
await eventManager.emit(eventDef2, "data2", "test");
|
|
192
|
-
|
|
193
|
-
expect(handler1).toHaveBeenCalledTimes(1);
|
|
194
|
-
expect(handler1).toHaveBeenCalledWith(
|
|
195
|
-
expect.objectContaining({
|
|
196
|
-
id: "event1",
|
|
197
|
-
data: "data1",
|
|
198
|
-
timestamp: expect.any(Date),
|
|
199
|
-
})
|
|
200
|
-
);
|
|
201
|
-
|
|
202
|
-
expect(handler2).toHaveBeenCalledTimes(1);
|
|
203
|
-
expect(handler2).toHaveBeenCalledWith(
|
|
204
|
-
expect.objectContaining({
|
|
205
|
-
id: "event2",
|
|
206
|
-
data: "data2",
|
|
207
|
-
})
|
|
208
|
-
);
|
|
209
|
-
});
|
|
210
|
-
|
|
211
|
-
it("should allow adding multiple listeners to the same event", async () => {
|
|
212
|
-
const handler1 = jest.fn();
|
|
213
|
-
const handler2 = jest.fn();
|
|
214
|
-
|
|
215
|
-
eventManager.addListener(eventDefinition, handler1);
|
|
216
|
-
eventManager.addListener(eventDefinition, handler2);
|
|
217
|
-
|
|
218
|
-
await eventManager.emit(eventDefinition, "testData", "test");
|
|
219
|
-
|
|
220
|
-
expect(handler1).toHaveBeenCalledTimes(1);
|
|
221
|
-
expect(handler2).toHaveBeenCalledTimes(1);
|
|
222
|
-
});
|
|
223
|
-
|
|
224
|
-
it("should handle listeners added to multiple events", async () => {
|
|
225
|
-
const eventDef1: IEvent<string> = {
|
|
226
|
-
id: "event1",
|
|
227
|
-
[symbolEvent]: true,
|
|
228
|
-
[symbolFilePath]: "test.ts",
|
|
229
|
-
};
|
|
230
|
-
const eventDef2: IEvent<string> = {
|
|
231
|
-
id: "event2",
|
|
232
|
-
[symbolEvent]: true,
|
|
233
|
-
[symbolFilePath]: "test.ts",
|
|
234
|
-
};
|
|
235
|
-
|
|
236
|
-
const handler = jest.fn();
|
|
237
|
-
|
|
238
|
-
eventManager.addListener([eventDef1, eventDef2], handler);
|
|
239
|
-
|
|
240
|
-
await eventManager.emit(eventDef1, "data1", "test");
|
|
241
|
-
await eventManager.emit(eventDef2, "data2", "test");
|
|
242
|
-
|
|
243
|
-
expect(handler).toHaveBeenCalledTimes(2);
|
|
244
|
-
expect(handler).toHaveBeenNthCalledWith(
|
|
245
|
-
1,
|
|
246
|
-
expect.objectContaining({
|
|
247
|
-
id: "event1",
|
|
248
|
-
data: "data1",
|
|
249
|
-
})
|
|
250
|
-
);
|
|
251
|
-
expect(handler).toHaveBeenNthCalledWith(
|
|
252
|
-
2,
|
|
253
|
-
expect.objectContaining({
|
|
254
|
-
id: "event2",
|
|
255
|
-
data: "data2",
|
|
256
|
-
})
|
|
257
|
-
);
|
|
258
|
-
});
|
|
259
|
-
|
|
260
|
-
it("should not affect other events when emitting one", async () => {
|
|
261
|
-
const eventDef1: IEvent<string> = {
|
|
262
|
-
id: "event1",
|
|
263
|
-
[symbolEvent]: true,
|
|
264
|
-
[symbolFilePath]: "test.ts",
|
|
265
|
-
};
|
|
266
|
-
const eventDef2: IEvent<string> = {
|
|
267
|
-
id: "event2",
|
|
268
|
-
[symbolEvent]: true,
|
|
269
|
-
[symbolFilePath]: "test.ts",
|
|
270
|
-
};
|
|
271
|
-
|
|
272
|
-
const handler1 = jest.fn();
|
|
273
|
-
const handler2 = jest.fn();
|
|
274
|
-
|
|
275
|
-
eventManager.addListener(eventDef1, handler1);
|
|
276
|
-
eventManager.addListener(eventDef2, handler2);
|
|
277
|
-
|
|
278
|
-
await eventManager.emit(eventDef1, "data1", "test");
|
|
279
|
-
|
|
280
|
-
expect(handler1).toHaveBeenCalledTimes(1);
|
|
281
|
-
expect(handler2).not.toHaveBeenCalled();
|
|
282
|
-
});
|
|
283
|
-
|
|
284
|
-
it("should handle asynchronous handlers", async () => {
|
|
285
|
-
const results: number[] = [];
|
|
286
|
-
|
|
287
|
-
eventManager.addListener(
|
|
288
|
-
eventDefinition,
|
|
289
|
-
async () => {
|
|
290
|
-
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
291
|
-
results.push(1);
|
|
292
|
-
},
|
|
293
|
-
{ order: 1 }
|
|
294
|
-
);
|
|
295
|
-
|
|
296
|
-
eventManager.addListener(
|
|
297
|
-
eventDefinition,
|
|
298
|
-
() => {
|
|
299
|
-
results.push(0);
|
|
300
|
-
},
|
|
301
|
-
{ order: 0 }
|
|
302
|
-
);
|
|
303
|
-
|
|
304
|
-
await eventManager.emit(eventDefinition, "testData", "test");
|
|
305
|
-
|
|
306
|
-
expect(results).toEqual([0, 1]);
|
|
307
|
-
});
|
|
308
|
-
|
|
309
|
-
it("should handle handler throwing an error", async () => {
|
|
310
|
-
const handler = jest.fn().mockImplementation(() => {
|
|
311
|
-
throw new Error("Handler error");
|
|
312
|
-
});
|
|
313
|
-
|
|
314
|
-
eventManager.addListener(eventDefinition, handler);
|
|
315
|
-
|
|
316
|
-
await expect(
|
|
317
|
-
eventManager.emit(eventDefinition, "testData", "test")
|
|
318
|
-
).rejects.toThrow("Handler error");
|
|
319
|
-
});
|
|
320
|
-
|
|
321
|
-
it("should continue calling other handlers if one fails", async () => {
|
|
322
|
-
const handler1 = jest.fn().mockImplementation(() => {
|
|
323
|
-
throw new Error("Handler error");
|
|
324
|
-
});
|
|
325
|
-
const handler2 = jest.fn();
|
|
326
|
-
|
|
327
|
-
eventManager.addListener(eventDefinition, handler1);
|
|
328
|
-
eventManager.addListener(eventDefinition, handler2);
|
|
329
|
-
|
|
330
|
-
await expect(
|
|
331
|
-
eventManager.emit(eventDefinition, "testData", "test")
|
|
332
|
-
).rejects.toThrow("Handler error");
|
|
333
|
-
|
|
334
|
-
// The second handler should have been called despite the error in the first
|
|
335
|
-
expect(handler2).toHaveBeenCalledTimes(1);
|
|
336
|
-
});
|
|
337
|
-
|
|
338
|
-
it("should not allow modification after lock", () => {
|
|
339
|
-
const handler = jest.fn();
|
|
340
|
-
eventManager.addListener(eventDefinition, handler);
|
|
341
|
-
eventManager.lock();
|
|
342
|
-
|
|
343
|
-
expect(() => {
|
|
344
|
-
eventManager.addListener(eventDefinition, handler);
|
|
345
|
-
}).toThrowError("Cannot modify the EventManager when it is locked.");
|
|
346
|
-
});
|
|
347
|
-
|
|
348
|
-
it("should not throw when emitting after lock", async () => {
|
|
349
|
-
const handler = jest.fn();
|
|
350
|
-
eventManager.addListener(eventDefinition, handler);
|
|
351
|
-
eventManager.lock();
|
|
352
|
-
|
|
353
|
-
await expect(
|
|
354
|
-
eventManager.emit(eventDefinition, "testData", "test")
|
|
355
|
-
).resolves.toBeUndefined();
|
|
356
|
-
|
|
357
|
-
expect(handler).toHaveBeenCalledTimes(1);
|
|
358
|
-
});
|
|
359
|
-
|
|
360
|
-
it("should correctly merge global and event listeners with same order", async () => {
|
|
361
|
-
const results: string[] = [];
|
|
362
|
-
|
|
363
|
-
eventManager.addListener(
|
|
364
|
-
eventDefinition,
|
|
365
|
-
() => {
|
|
366
|
-
results.push("eventListener");
|
|
367
|
-
},
|
|
368
|
-
{ order: 1 }
|
|
369
|
-
);
|
|
370
|
-
|
|
371
|
-
eventManager.addGlobalListener(
|
|
372
|
-
() => {
|
|
373
|
-
results.push("globalListener");
|
|
374
|
-
},
|
|
375
|
-
{ order: 1 }
|
|
376
|
-
);
|
|
377
|
-
|
|
378
|
-
await eventManager.emit(eventDefinition, "testData", "test");
|
|
379
|
-
|
|
380
|
-
// According to the merge logic, event listeners come before global listeners when orders are equal
|
|
381
|
-
expect(results).toEqual(["eventListener", "globalListener"]);
|
|
382
|
-
});
|
|
383
|
-
|
|
384
|
-
it("should handle filters in global listeners", async () => {
|
|
385
|
-
const handler = jest.fn();
|
|
386
|
-
const filter = (event: IEventEmission<string>) => event.data === "allowed";
|
|
387
|
-
|
|
388
|
-
eventManager.addGlobalListener(handler, { filter });
|
|
389
|
-
|
|
390
|
-
await eventManager.emit(eventDefinition, "blocked", "test");
|
|
391
|
-
expect(handler).not.toHaveBeenCalled();
|
|
392
|
-
|
|
393
|
-
await eventManager.emit(eventDefinition, "allowed", "test");
|
|
394
|
-
expect(handler).toHaveBeenCalledTimes(1);
|
|
395
|
-
});
|
|
396
|
-
|
|
397
|
-
it("should handle emitting with no listeners", async () => {
|
|
398
|
-
await expect(
|
|
399
|
-
eventManager.emit(eventDefinition, "testData", "test")
|
|
400
|
-
).resolves.toBeUndefined();
|
|
401
|
-
});
|
|
402
|
-
|
|
403
|
-
it("should handle listeners with no data", async () => {
|
|
404
|
-
const handler = jest.fn();
|
|
405
|
-
|
|
406
|
-
const voidEventDefinition: IEvent<void> = {
|
|
407
|
-
id: "voidEvent",
|
|
408
|
-
[symbolEvent]: true,
|
|
409
|
-
[symbolFilePath]: "test.ts",
|
|
410
|
-
};
|
|
411
|
-
|
|
412
|
-
eventManager.addListener(voidEventDefinition, handler);
|
|
413
|
-
|
|
414
|
-
await eventManager.emit(voidEventDefinition, undefined, "test");
|
|
415
|
-
|
|
416
|
-
expect(handler).toHaveBeenCalledTimes(1);
|
|
417
|
-
expect(handler).toHaveBeenCalledWith(
|
|
418
|
-
expect.objectContaining({
|
|
419
|
-
id: "voidEvent",
|
|
420
|
-
data: undefined,
|
|
421
|
-
timestamp: expect.any(Date),
|
|
422
|
-
})
|
|
423
|
-
);
|
|
424
|
-
});
|
|
425
|
-
|
|
426
|
-
describe("Performance Optimizations", () => {
|
|
427
|
-
it("should cache merged listeners for repeated emits", async () => {
|
|
428
|
-
const handler1 = jest.fn();
|
|
429
|
-
const handler2 = jest.fn();
|
|
430
|
-
|
|
431
|
-
eventManager.addListener(eventDefinition, handler1, { order: 1 });
|
|
432
|
-
eventManager.addGlobalListener(handler2, { order: 2 });
|
|
433
|
-
|
|
434
|
-
// First emit should build cache
|
|
435
|
-
await eventManager.emit(eventDefinition, "test1", "source");
|
|
436
|
-
// Second emit should use cache
|
|
437
|
-
await eventManager.emit(eventDefinition, "test2", "source");
|
|
438
|
-
|
|
439
|
-
expect(handler1).toHaveBeenCalledTimes(2);
|
|
440
|
-
expect(handler2).toHaveBeenCalledTimes(2);
|
|
441
|
-
});
|
|
442
|
-
|
|
443
|
-
it("should invalidate cache when adding event listeners", async () => {
|
|
444
|
-
const handler1 = jest.fn();
|
|
445
|
-
const handler2 = jest.fn();
|
|
446
|
-
const handler3 = jest.fn();
|
|
447
|
-
|
|
448
|
-
eventManager.addListener(eventDefinition, handler1, { order: 2 });
|
|
449
|
-
await eventManager.emit(eventDefinition, "test1", "source");
|
|
450
|
-
|
|
451
|
-
// Add new listener - should invalidate cache for this event
|
|
452
|
-
eventManager.addListener(eventDefinition, handler2, { order: 1 });
|
|
453
|
-
eventManager.addGlobalListener(handler3, { order: 3 });
|
|
454
|
-
|
|
455
|
-
await eventManager.emit(eventDefinition, "test2", "source");
|
|
456
|
-
|
|
457
|
-
expect(handler1).toHaveBeenCalledTimes(2);
|
|
458
|
-
expect(handler2).toHaveBeenCalledTimes(1);
|
|
459
|
-
expect(handler3).toHaveBeenCalledTimes(1);
|
|
460
|
-
});
|
|
461
|
-
|
|
462
|
-
it("should invalidate all caches when adding global listeners", async () => {
|
|
463
|
-
const event1: IEvent<string> = {
|
|
464
|
-
id: "event1",
|
|
465
|
-
[symbolEvent]: true,
|
|
466
|
-
[symbolFilePath]: "test.ts",
|
|
467
|
-
};
|
|
468
|
-
const event2: IEvent<string> = {
|
|
469
|
-
id: "event2",
|
|
470
|
-
[symbolEvent]: true,
|
|
471
|
-
[symbolFilePath]: "test.ts",
|
|
472
|
-
};
|
|
473
|
-
|
|
474
|
-
const handler1 = jest.fn();
|
|
475
|
-
const handler2 = jest.fn();
|
|
476
|
-
const globalHandler = jest.fn();
|
|
477
|
-
|
|
478
|
-
eventManager.addListener(event1, handler1);
|
|
479
|
-
eventManager.addListener(event2, handler2);
|
|
480
|
-
|
|
481
|
-
// Emit to build caches
|
|
482
|
-
await eventManager.emit(event1, "test1", "source");
|
|
483
|
-
await eventManager.emit(event2, "test2", "source");
|
|
484
|
-
|
|
485
|
-
// Add global listener - should invalidate all caches
|
|
486
|
-
eventManager.addGlobalListener(globalHandler);
|
|
487
|
-
|
|
488
|
-
// Emit again - global handler should be called
|
|
489
|
-
await eventManager.emit(event1, "test3", "source");
|
|
490
|
-
await eventManager.emit(event2, "test4", "source");
|
|
491
|
-
|
|
492
|
-
expect(globalHandler).toHaveBeenCalledTimes(2);
|
|
493
|
-
});
|
|
494
|
-
|
|
495
|
-
it("should optimize for empty listener scenarios", async () => {
|
|
496
|
-
const emptyEventDef: IEvent<string> = {
|
|
497
|
-
id: "emptyEvent",
|
|
498
|
-
[symbolEvent]: true,
|
|
499
|
-
[symbolFilePath]: "test.ts",
|
|
500
|
-
};
|
|
501
|
-
|
|
502
|
-
// Should return immediately without creating event object
|
|
503
|
-
await eventManager.emit(emptyEventDef, "test", "source");
|
|
504
|
-
|
|
505
|
-
// No errors should occur
|
|
506
|
-
expect(true).toBe(true);
|
|
507
|
-
});
|
|
508
|
-
|
|
509
|
-
it("should handle high-frequency emissions efficiently", async () => {
|
|
510
|
-
const handler = jest.fn();
|
|
511
|
-
eventManager.addListener(eventDefinition, handler);
|
|
512
|
-
eventManager.addGlobalListener(jest.fn());
|
|
513
|
-
|
|
514
|
-
const emitCount = 1000;
|
|
515
|
-
const startTime = Date.now();
|
|
516
|
-
|
|
517
|
-
for (let i = 0; i < emitCount; i++) {
|
|
518
|
-
await eventManager.emit(eventDefinition, `test${i}`, "source");
|
|
519
|
-
}
|
|
520
|
-
|
|
521
|
-
const endTime = Date.now();
|
|
522
|
-
const duration = endTime - startTime;
|
|
523
|
-
|
|
524
|
-
expect(handler).toHaveBeenCalledTimes(emitCount);
|
|
525
|
-
// Should complete reasonably fast (adjust threshold as needed)
|
|
526
|
-
expect(duration).toBeLessThan(5000); // 5 seconds max for 1000 emissions
|
|
527
|
-
});
|
|
528
|
-
|
|
529
|
-
it("should efficiently handle mixed event and global listeners", async () => {
|
|
530
|
-
const results: string[] = [];
|
|
531
|
-
|
|
532
|
-
// Add many listeners with different orders
|
|
533
|
-
for (let i = 0; i < 10; i++) {
|
|
534
|
-
eventManager.addListener(
|
|
535
|
-
eventDefinition,
|
|
536
|
-
() => results.push(`event${i}`),
|
|
537
|
-
{ order: i * 2 }
|
|
538
|
-
);
|
|
539
|
-
eventManager.addGlobalListener(() => results.push(`global${i}`), {
|
|
540
|
-
order: i * 2 + 1,
|
|
541
|
-
});
|
|
542
|
-
}
|
|
543
|
-
|
|
544
|
-
await eventManager.emit(eventDefinition, "test", "source");
|
|
545
|
-
|
|
546
|
-
// Should maintain correct order and call all listeners
|
|
547
|
-
expect(results).toHaveLength(20);
|
|
548
|
-
expect(results[0]).toBe("event0");
|
|
549
|
-
expect(results[1]).toBe("global0");
|
|
550
|
-
expect(results[18]).toBe("event9");
|
|
551
|
-
expect(results[19]).toBe("global9");
|
|
552
|
-
});
|
|
553
|
-
|
|
554
|
-
it("should reuse cached results across different event types", async () => {
|
|
555
|
-
const event1: IEvent<string> = {
|
|
556
|
-
id: "event1",
|
|
557
|
-
[symbolEvent]: true,
|
|
558
|
-
[symbolFilePath]: "test.ts",
|
|
559
|
-
};
|
|
560
|
-
const event2: IEvent<string> = {
|
|
561
|
-
id: "event2",
|
|
562
|
-
[symbolEvent]: true,
|
|
563
|
-
[symbolFilePath]: "test.ts",
|
|
564
|
-
};
|
|
565
|
-
|
|
566
|
-
const handler1 = jest.fn();
|
|
567
|
-
const handler2 = jest.fn();
|
|
568
|
-
const globalHandler = jest.fn();
|
|
569
|
-
|
|
570
|
-
eventManager.addListener(event1, handler1);
|
|
571
|
-
eventManager.addListener(event2, handler2);
|
|
572
|
-
eventManager.addGlobalListener(globalHandler);
|
|
573
|
-
|
|
574
|
-
// Multiple emits should use cached merged listeners
|
|
575
|
-
await eventManager.emit(event1, "test1", "source");
|
|
576
|
-
await eventManager.emit(event2, "test2", "source");
|
|
577
|
-
await eventManager.emit(event1, "test3", "source");
|
|
578
|
-
await eventManager.emit(event2, "test4", "source");
|
|
579
|
-
|
|
580
|
-
expect(handler1).toHaveBeenCalledTimes(2);
|
|
581
|
-
expect(handler2).toHaveBeenCalledTimes(2);
|
|
582
|
-
expect(globalHandler).toHaveBeenCalledTimes(4);
|
|
583
|
-
});
|
|
584
|
-
});
|
|
585
|
-
});
|