From 6e0fdad612aff9e6f67cafd3318e4862a1dbc2ed Mon Sep 17 00:00:00 2001 From: iliya Date: Tue, 3 Mar 2026 01:25:07 +0200 Subject: [PATCH] fix: avoid unhandled rejection in TeamProvisioningService warmup test probeClaudeRuntime spawns two probes in parallel; both called spawnCli. Mock threw on every call, leaving pingAttempt1Promise rejected and unhandled. Now throw only on first call, return fake child on second. Made-with: Cursor --- .../team/TeamProvisioningService.test.ts | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/test/main/services/team/TeamProvisioningService.test.ts b/test/main/services/team/TeamProvisioningService.test.ts index 37b4ac0d..9915cf97 100644 --- a/test/main/services/team/TeamProvisioningService.test.ts +++ b/test/main/services/team/TeamProvisioningService.test.ts @@ -1,3 +1,5 @@ +import { EventEmitter } from 'events'; + import { beforeEach, describe, expect, it, vi } from 'vitest'; vi.mock('@main/services/team/ClaudeBinaryResolver', () => ({ @@ -17,6 +19,17 @@ function allowConsoleLogs() { vi.spyOn(console, 'warn').mockImplementation(() => {}); } +function createFakeChild(exitCode: number): NodeJS.Process { + const child = new EventEmitter() as NodeJS.Process & { + stdout: EventEmitter; + stderr: EventEmitter; + }; + child.stdout = new EventEmitter(); + child.stderr = new EventEmitter(); + setImmediate(() => child.emit('close', exitCode)); + return child; +} + describe('TeamProvisioningService', () => { beforeEach(() => { vi.clearAllMocks(); @@ -26,8 +39,13 @@ describe('TeamProvisioningService', () => { it('does not throw when spawnCli rejects', async () => { allowConsoleLogs(); vi.mocked(ClaudeBinaryResolver.resolve).mockResolvedValue('C:\\path\\claude'); + let callCount = 0; vi.mocked(spawnCli).mockImplementation(() => { - throw new Error('spawn EINVAL'); + callCount++; + if (callCount === 1) { + throw new Error('spawn EINVAL'); + } + return createFakeChild(0) as ReturnType; }); const svc = new TeamProvisioningService();