Files
DeskClaw/tests/unit/agents-routes.test.ts
2026-03-20 18:34:20 +08:00

79 lines
2.0 KiB
TypeScript

import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
const originalPlatform = process.platform;
const { mockExec } = vi.hoisted(() => ({
mockExec: vi.fn(),
}));
vi.mock('child_process', () => ({
exec: mockExec,
default: {
exec: mockExec,
},
}));
vi.mock('@electron/utils/agent-config', () => ({
assignChannelToAgent: vi.fn(),
clearChannelBinding: vi.fn(),
createAgent: vi.fn(),
deleteAgentConfig: vi.fn(),
listAgentsSnapshot: vi.fn(),
removeAgentWorkspaceDirectory: vi.fn(),
resolveAccountIdForAgent: vi.fn(),
updateAgentName: vi.fn(),
}));
vi.mock('@electron/utils/channel-config', () => ({
deleteChannelAccountConfig: vi.fn(),
}));
vi.mock('@electron/services/providers/provider-runtime-sync', () => ({
syncAllProviderAuthToRuntime: vi.fn(),
}));
vi.mock('@electron/api/route-utils', () => ({
parseJsonBody: vi.fn(),
sendJson: vi.fn(),
}));
function setPlatform(platform: string): void {
Object.defineProperty(process, 'platform', { value: platform, writable: true });
}
describe('restartGatewayForAgentDeletion', () => {
beforeEach(() => {
vi.resetAllMocks();
vi.resetModules();
mockExec.mockImplementation((_cmd: string, _opts: object, cb: (err: Error | null, stdout: string) => void) => {
cb(null, '');
return {} as never;
});
});
afterEach(() => {
Object.defineProperty(process, 'platform', { value: originalPlatform, writable: true });
});
it('uses taskkill tree strategy on Windows when gateway pid is known', async () => {
setPlatform('win32');
const { restartGatewayForAgentDeletion } = await import('@electron/api/routes/agents');
const restart = vi.fn().mockResolvedValue(undefined);
const getStatus = vi.fn(() => ({ pid: 4321, port: 18789 }));
await restartGatewayForAgentDeletion({
gatewayManager: {
getStatus,
restart,
},
} as never);
expect(mockExec).toHaveBeenCalledWith(
'taskkill /F /PID 4321 /T',
expect.any(Function),
);
expect(restart).toHaveBeenCalledTimes(1);
});
});