@@ -45,6 +45,14 @@ function createDeferred<T>() {
|
45 | 45 | return { promise, resolve }; |
46 | 46 | } |
47 | 47 | |
| 48 | +function latestTimeoutHandle(timeoutSpy: ReturnType<typeof vi.spyOn>) { |
| 49 | +const result = timeoutSpy.mock.results.at(-1); |
| 50 | +if (!result || result.type !== "return") { |
| 51 | +throw new Error("Expected setTimeout to return a timer handle"); |
| 52 | +} |
| 53 | +return result.value; |
| 54 | +} |
| 55 | + |
48 | 56 | describe("CronService - timer re-arm when running (#12025)", () => { |
49 | 57 | beforeEach(() => { |
50 | 58 | noopLogger.debug.mockClear(); |
@@ -81,8 +89,8 @@ describe("CronService - timer re-arm when running (#12025)", () => {
|
81 | 89 | |
82 | 90 | // The timer must be re-armed so the scheduler continues ticking, |
83 | 91 | // with a fixed 60s delay to avoid hot-looping. |
84 | | -expect(state.timer).toEqual(expect.anything()); |
85 | 92 | expect(timeoutSpy).toHaveBeenCalled(); |
| 93 | +expect(state.timer).toBe(latestTimeoutHandle(timeoutSpy)); |
86 | 94 | const delays = timeoutSpy.mock.calls |
87 | 95 | .map(([, delay]) => delay) |
88 | 96 | .filter((d): d is number => typeof d === "number"); |
@@ -141,7 +149,7 @@ describe("CronService - timer re-arm when running (#12025)", () => {
|
141 | 149 | await Promise.resolve(); |
142 | 150 | expect(settled).toBe(false); |
143 | 151 | expect(state.running).toBe(true); |
144 | | -expect(state.timer).toEqual(expect.anything()); |
| 152 | +expect(state.timer).toBe(latestTimeoutHandle(timeoutSpy)); |
145 | 153 | |
146 | 154 | const delays = timeoutSpy.mock.calls |
147 | 155 | .map(([, delay]) => delay) |
|