|
1 | 1 | import { EventEmitter } from "events" |
2 | 2 | import { waitSubscribersExecution } from "../events" |
| 3 | +import { setTimeout } from "timers/promises" |
| 4 | + |
| 5 | +jest.setTimeout(30000) |
3 | 6 |
|
4 | 7 | // Mock the IEventBusModuleService |
5 | 8 | class MockEventBus { |
@@ -31,11 +34,12 @@ describe("waitSubscribersExecution", () => { |
31 | 34 | describe("with no existing listeners", () => { |
32 | 35 | it("should resolve when event is fired before timeout", async () => { |
33 | 36 | const waitPromise = waitSubscribersExecution(TEST_EVENT, eventBus as any) |
34 | | - setTimeout(() => eventBus.emit(TEST_EVENT, "test-data"), 100).unref() |
| 37 | + await setTimeout(100) |
| 38 | + eventBus.emit(TEST_EVENT, "test-data") |
35 | 39 |
|
36 | 40 | jest.advanceTimersByTime(100) |
37 | 41 |
|
38 | | - await expect(waitPromise).resolves.toEqual(["test-data"]) |
| 42 | + await expect(waitPromise).resolves.toEqual([["test-data"]]) |
39 | 43 | }) |
40 | 44 |
|
41 | 45 | it("should reject when timeout is reached before event is fired", async () => { |
@@ -70,12 +74,29 @@ describe("waitSubscribersExecution", () => { |
70 | 74 | `Timeout of ${customTimeout}ms exceeded while waiting for event "${TEST_EVENT}"` |
71 | 75 | ) |
72 | 76 | }) |
| 77 | + |
| 78 | + it("should resolve when event is fired multiple times", async () => { |
| 79 | + const waitPromise = waitSubscribersExecution( |
| 80 | + TEST_EVENT, |
| 81 | + eventBus as any, |
| 82 | + { triggerCount: 2 } |
| 83 | + ) |
| 84 | + eventBus.emit(TEST_EVENT, "test-data") |
| 85 | + eventBus.emit(TEST_EVENT, "test-data") |
| 86 | + |
| 87 | + const promisesRes = await waitPromise |
| 88 | + const res = promisesRes.pop() |
| 89 | + expect(res).toHaveLength(2) |
| 90 | + expect(res[0]).toEqual(["test-data"]) |
| 91 | + expect(res[1]).toEqual(["test-data"]) |
| 92 | + }) |
73 | 93 | }) |
74 | 94 |
|
75 | 95 | describe("with existing listeners", () => { |
76 | 96 | it("should resolve when all listeners complete successfully", async () => { |
77 | | - const listener = jest.fn().mockImplementation(() => { |
78 | | - return new Promise((resolve) => setTimeout(resolve, 200).unref()) |
| 97 | + const listener = jest.fn().mockImplementation(async () => { |
| 98 | + await setTimeout(200) |
| 99 | + return "res" |
79 | 100 | }) |
80 | 101 |
|
81 | 102 | eventBus.eventEmitter_.on(TEST_EVENT, listener) |
@@ -132,20 +153,49 @@ describe("waitSubscribersExecution", () => { |
132 | 153 |
|
133 | 154 | expect(listener).not.toHaveBeenCalled() |
134 | 155 | }) |
| 156 | + |
| 157 | + it("should resolve when event is fired multiple times", async () => { |
| 158 | + const listener = jest.fn().mockImplementation(async () => { |
| 159 | + await setTimeout(200) |
| 160 | + return "res" |
| 161 | + }) |
| 162 | + |
| 163 | + eventBus.eventEmitter_.on(TEST_EVENT, listener) |
| 164 | + |
| 165 | + const waitPromise = waitSubscribersExecution( |
| 166 | + TEST_EVENT, |
| 167 | + eventBus as any, |
| 168 | + { |
| 169 | + triggerCount: 2, |
| 170 | + } |
| 171 | + ) |
| 172 | + |
| 173 | + eventBus.emit(TEST_EVENT, "test-data") |
| 174 | + eventBus.emit(TEST_EVENT, "test-data") |
| 175 | + |
| 176 | + const promisesRes = await waitPromise |
| 177 | + const res = promisesRes.pop() |
| 178 | + expect(res).toHaveLength(2) |
| 179 | + expect(res[0]).toEqual("res") |
| 180 | + expect(res[1]).toEqual("res") |
| 181 | + }) |
135 | 182 | }) |
136 | 183 |
|
137 | 184 | describe("with multiple listeners", () => { |
138 | 185 | it("should resolve when all listeners complete", async () => { |
139 | | - const listener1 = jest.fn().mockImplementation(() => { |
140 | | - return new Promise((resolve) => setTimeout(resolve, 100).unref()) |
| 186 | + const listener1 = jest.fn().mockImplementation(async () => { |
| 187 | + await setTimeout(100) |
| 188 | + return "res" |
141 | 189 | }) |
142 | 190 |
|
143 | | - const listener2 = jest.fn().mockImplementation(() => { |
144 | | - return new Promise((resolve) => setTimeout(resolve, 200).unref()) |
| 191 | + const listener2 = jest.fn().mockImplementation(async () => { |
| 192 | + await setTimeout(200) |
| 193 | + return "res" |
145 | 194 | }) |
146 | 195 |
|
147 | | - const listener3 = jest.fn().mockImplementation(() => { |
148 | | - return new Promise((resolve) => setTimeout(resolve, 300).unref()) |
| 196 | + const listener3 = jest.fn().mockImplementation(async () => { |
| 197 | + await setTimeout(300) |
| 198 | + return "res" |
149 | 199 | }) |
150 | 200 |
|
151 | 201 | eventBus.eventEmitter_.on(TEST_EVENT, listener1) |
|
0 commit comments