refactor(cli): integrate real config loading into async test utils (#23040)

This commit is contained in:
Tommaso Sciortino
2026-03-19 17:05:33 +00:00
committed by GitHub
parent 7de0616229
commit 23264ced9a
103 changed files with 1806 additions and 1541 deletions
@@ -375,7 +375,7 @@ describe('useGeminiStream', () => {
setValue: vi.fn(),
} as unknown as LoadedSettings;
const renderTestHook = (
const renderTestHook = async (
initialToolCalls: TrackedToolCall[] = [],
geminiClient?: any,
loadedSettings: LoadedSettings = mockLoadedSettings,
@@ -436,7 +436,7 @@ describe('useGeminiStream', () => {
];
});
const { result, rerender } = renderHookWithProviders(
const { result, rerender } = await renderHookWithProviders(
(props: typeof initialProps) =>
useGeminiStream(
props.client,
@@ -518,7 +518,7 @@ describe('useGeminiStream', () => {
});
// Helper to render hook with default parameters - reduces boilerplate
const renderHookWithDefaults = (
const renderHookWithDefaults = async (
options: {
shellModeActive?: boolean;
onCancelSubmit?: () => void;
@@ -562,7 +562,7 @@ describe('useGeminiStream', () => {
);
};
it('should not submit tool responses if not all tool calls are completed', () => {
it('should not submit tool responses if not all tool calls are completed', async () => {
const toolCalls: TrackedToolCall[] = [
{
request: {
@@ -617,7 +617,7 @@ describe('useGeminiStream', () => {
];
const { mockMarkToolsAsSubmitted, mockSendMessageStream } =
renderTestHook(toolCalls);
await renderTestHook(toolCalls);
// Effect for submitting tool responses depends on toolCalls and isResponding
// isResponding is initially false, so the effect should run.
@@ -626,7 +626,7 @@ describe('useGeminiStream', () => {
expect(mockSendMessageStream).not.toHaveBeenCalled(); // submitQuery uses this
});
it('should expose activePtyId for non-shell executing tools that report an execution ID', () => {
it('should expose activePtyId for non-shell executing tools that report an execution ID', async () => {
const remoteExecutingTool: TrackedExecutingToolCall = {
request: {
callId: 'remote-call-1',
@@ -651,7 +651,7 @@ describe('useGeminiStream', () => {
pid: 4242,
};
const { result } = renderTestHook([remoteExecutingTool]);
const { result } = await renderTestHook([remoteExecutingTool]);
expect(result.current.activePtyId).toBe(4242);
});
@@ -716,7 +716,7 @@ describe('useGeminiStream', () => {
];
});
renderHookWithProviders(() =>
await renderHookWithProviders(() =>
useGeminiStream(
new MockedGeminiClientClass(mockConfig),
[],
@@ -817,7 +817,7 @@ describe('useGeminiStream', () => {
];
});
renderHookWithProviders(() =>
await renderHookWithProviders(() =>
useGeminiStream(
new MockedGeminiClientClass(mockConfig),
[],
@@ -927,7 +927,7 @@ describe('useGeminiStream', () => {
];
});
renderHookWithProviders(() =>
await renderHookWithProviders(() =>
useGeminiStream(
client,
[],
@@ -998,7 +998,7 @@ describe('useGeminiStream', () => {
];
const client = new MockedGeminiClientClass(mockConfig);
const { result } = renderTestHook([], client);
const { result } = await renderTestHook([], client);
// Trigger the onComplete callback with STOP_EXECUTION tool
await act(async () => {
@@ -1077,7 +1077,7 @@ describe('useGeminiStream', () => {
} as LoadedSettings;
const client = new MockedGeminiClientClass(mockConfig);
const { result } = renderTestHook([], client, lowVerbositySettings);
const { result } = await renderTestHook([], client, lowVerbositySettings);
await act(async () => {
if (capturedOnComplete) {
@@ -1190,7 +1190,7 @@ describe('useGeminiStream', () => {
];
});
renderHookWithProviders(() =>
await renderHookWithProviders(() =>
useGeminiStream(
client,
[],
@@ -1307,7 +1307,7 @@ describe('useGeminiStream', () => {
];
});
const { result, rerender } = renderHookWithProviders(() =>
const { result, rerender } = await renderHookWithProviders(() =>
useGeminiStream(
new MockedGeminiClientClass(mockConfig),
[],
@@ -1408,7 +1408,7 @@ describe('useGeminiStream', () => {
})();
mockSendMessageStream.mockReturnValue(mockStream);
const { result } = renderTestHook();
const { result } = await renderTestHook();
// Start a query
await act(async () => {
@@ -1445,7 +1445,7 @@ describe('useGeminiStream', () => {
})();
mockSendMessageStream.mockReturnValue(mockStream);
const { result } = renderHookWithProviders(() =>
const { result } = await renderHookWithProviders(() =>
useGeminiStream(
mockConfig.getGeminiClient(),
[],
@@ -1486,7 +1486,7 @@ describe('useGeminiStream', () => {
})();
mockSendMessageStream.mockReturnValue(mockStream);
const { result } = renderHookWithProviders(() =>
const { result } = await renderHookWithProviders(() =>
useGeminiStream(
mockConfig.getGeminiClient(),
[],
@@ -1519,8 +1519,8 @@ describe('useGeminiStream', () => {
expect(setShellInputFocusedSpy).toHaveBeenCalledWith(false);
});
it('should not do anything if escape is pressed when not responding', () => {
const { result } = renderTestHook();
it('should not do anything if escape is pressed when not responding', async () => {
const { result } = await renderTestHook();
expect(result.current.streamingState).toBe(StreamingState.Idle);
@@ -1548,7 +1548,7 @@ describe('useGeminiStream', () => {
})();
mockSendMessageStream.mockReturnValue(mockStream);
const { result } = renderTestHook();
const { result } = await renderTestHook();
await act(async () => {
// eslint-disable-next-line @typescript-eslint/no-floating-promises
@@ -1600,7 +1600,7 @@ describe('useGeminiStream', () => {
} as TrackedExecutingToolCall,
];
const { result } = renderTestHook(toolCalls);
const { result } = await renderTestHook(toolCalls);
// State is `Responding` because a tool is running
expect(result.current.streamingState).toBe(StreamingState.Responding);
@@ -1648,7 +1648,7 @@ describe('useGeminiStream', () => {
} as TrackedWaitingToolCall,
];
const { result } = renderTestHook(toolCalls);
const { result } = await renderTestHook(toolCalls);
// State is `WaitingForConfirmation` because a tool is awaiting approval
expect(result.current.streamingState).toBe(
@@ -1677,7 +1677,7 @@ describe('useGeminiStream', () => {
describe('Retry Handling', () => {
it('should update retryStatus when CoreEvent.RetryAttempt is emitted', async () => {
const { result } = renderHookWithDefaults();
const { result } = await renderHookWithDefaults();
const retryPayload = {
model: 'gemini-2.5-pro',
@@ -1694,7 +1694,7 @@ describe('useGeminiStream', () => {
});
it('should reset retryStatus when isResponding becomes false', async () => {
const { result } = renderTestHook();
const { result } = await renderTestHook();
const retryPayload = {
model: 'gemini-2.5-pro',
@@ -1744,7 +1744,7 @@ describe('useGeminiStream', () => {
};
mockHandleSlashCommand.mockResolvedValue(clientToolRequest);
const { result } = renderTestHook();
const { result } = await renderTestHook();
await act(async () => {
await result.current.submitQuery('/memory add "test fact"');
@@ -1771,7 +1771,7 @@ describe('useGeminiStream', () => {
};
mockHandleSlashCommand.mockResolvedValue(uiOnlyCommandResult);
const { result } = renderTestHook();
const { result } = await renderTestHook();
await act(async () => {
await result.current.submitQuery('/help');
@@ -1792,7 +1792,7 @@ describe('useGeminiStream', () => {
mockHandleSlashCommand.mockResolvedValue(customCommandResult);
const { result, mockSendMessageStream: localMockSendMessageStream } =
renderTestHook();
await renderTestHook();
await act(async () => {
await result.current.submitQuery('/my-custom-command');
@@ -1830,7 +1830,7 @@ describe('useGeminiStream', () => {
mockHandleSlashCommand.mockResolvedValue(emptyPromptResult);
const { result, mockSendMessageStream: localMockSendMessageStream } =
renderTestHook();
await renderTestHook();
await act(async () => {
await result.current.submitQuery('/emptycmd');
@@ -1851,7 +1851,7 @@ describe('useGeminiStream', () => {
it('should not call handleSlashCommand for line comments', async () => {
const { result, mockSendMessageStream: localMockSendMessageStream } =
renderTestHook();
await renderTestHook();
await act(async () => {
await result.current.submitQuery('// This is a line comment');
@@ -1872,7 +1872,7 @@ describe('useGeminiStream', () => {
it('should not call handleSlashCommand for block comments', async () => {
const { result, mockSendMessageStream: localMockSendMessageStream } =
renderTestHook();
await renderTestHook();
await act(async () => {
await result.current.submitQuery('/* This is a block comment */');
@@ -1892,7 +1892,7 @@ describe('useGeminiStream', () => {
});
it('should not call handleSlashCommand is shell mode is active', async () => {
const { result } = renderHookWithProviders(() =>
const { result } = await renderHookWithProviders(() =>
useGeminiStream(
new MockedGeminiClientClass(mockConfig),
[],
@@ -1972,7 +1972,7 @@ describe('useGeminiStream', () => {
];
});
renderHookWithProviders(() =>
await renderHookWithProviders(() =>
useGeminiStream(
new MockedGeminiClientClass(mockConfig),
[],
@@ -2031,7 +2031,7 @@ describe('useGeminiStream', () => {
getModel: vi.fn(() => 'gemini-2.5-pro'),
} as unknown as Config;
const { result } = renderHookWithProviders(() =>
const { result } = await renderHookWithProviders(() =>
useGeminiStream(
new MockedGeminiClientClass(testConfig),
[],
@@ -2078,7 +2078,7 @@ describe('useGeminiStream', () => {
createMockToolCall('read_file', 'call2', 'info'),
];
const { result } = renderTestHook(awaitingApprovalToolCalls);
const { result } = await renderTestHook(awaitingApprovalToolCalls);
await act(async () => {
await result.current.handleApprovalModeChange(ApprovalMode.YOLO);
@@ -2108,7 +2108,7 @@ describe('useGeminiStream', () => {
createMockToolCall('read_file', 'call3', 'info'),
];
const { result } = renderTestHook(awaitingApprovalToolCalls);
const { result } = await renderTestHook(awaitingApprovalToolCalls);
await act(async () => {
await result.current.handleApprovalModeChange(ApprovalMode.AUTO_EDIT);
@@ -2132,7 +2132,7 @@ describe('useGeminiStream', () => {
createMockToolCall('replace', 'call1', 'edit'),
];
const { result } = renderTestHook(awaitingApprovalToolCalls);
const { result } = await renderTestHook(awaitingApprovalToolCalls);
await act(async () => {
await result.current.handleApprovalModeChange(ApprovalMode.DEFAULT);
@@ -2154,7 +2154,7 @@ describe('useGeminiStream', () => {
createMockToolCall('write_file', 'call2', 'edit'),
];
const { result } = renderTestHook(awaitingApprovalToolCalls);
const { result } = await renderTestHook(awaitingApprovalToolCalls);
await act(async () => {
await result.current.handleApprovalModeChange(ApprovalMode.YOLO);
@@ -2196,7 +2196,7 @@ describe('useGeminiStream', () => {
} as unknown as TrackedWaitingToolCall,
];
const { result } = renderTestHook(awaitingApprovalToolCalls);
const { result } = await renderTestHook(awaitingApprovalToolCalls);
// Should not throw an error
await act(async () => {
@@ -2239,7 +2239,7 @@ describe('useGeminiStream', () => {
} as TrackedExecutingToolCall,
];
const { result } = renderTestHook(mixedStatusToolCalls);
const { result } = await renderTestHook(mixedStatusToolCalls);
await act(async () => {
await result.current.handleApprovalModeChange(ApprovalMode.YOLO);
@@ -2260,7 +2260,7 @@ describe('useGeminiStream', () => {
(mockConfig.getApprovalMode as Mock).mockReturnValue(ApprovalMode.PLAN);
// Render the hook, which will initialize the previousApprovalModeRef with PLAN
const { result, client } = renderTestHook([]);
const { result, client } = await renderTestHook([]);
// Update mockConfig to return DEFAULT mode (new mode)
(mockConfig.getApprovalMode as Mock).mockReturnValue(
@@ -2300,7 +2300,7 @@ describe('useGeminiStream', () => {
})(),
);
const { result } = renderHookWithProviders(() =>
const { result } = await renderHookWithProviders(() =>
useGeminiStream(
new MockedGeminiClientClass(mockConfig),
[],
@@ -2374,7 +2374,7 @@ describe('useGeminiStream', () => {
})(),
);
const { result } = renderHookWithDefaults();
const { result } = await renderHookWithDefaults();
await act(async () => {
await result.current.submitQuery('Test overflow');
@@ -2405,7 +2405,7 @@ describe('useGeminiStream', () => {
})(),
);
const { result } = renderHookWithProviders(() =>
const { result } = await renderHookWithProviders(() =>
useGeminiStream(
new MockedGeminiClientClass(mockConfig),
[],
@@ -2454,7 +2454,7 @@ describe('useGeminiStream', () => {
})(),
);
const { result } = renderHookWithDefaults();
const { result } = await renderHookWithDefaults();
// Submit a query
await act(async () => {
@@ -2541,7 +2541,7 @@ describe('useGeminiStream', () => {
})(),
);
const { result } = renderHookWithDefaults();
const { result } = await renderHookWithDefaults();
await act(async () => {
await result.current.submitQuery(`Test ${reason}`);
@@ -2613,7 +2613,7 @@ describe('useGeminiStream', () => {
];
});
const { result } = renderHookWithProviders(() =>
const { result } = await renderHookWithProviders(() =>
useGeminiStream(
new MockedGeminiClientClass(mockConfig),
[],
@@ -2684,7 +2684,7 @@ describe('useGeminiStream', () => {
shouldProceed: true,
});
const { result } = renderHookWithProviders(() =>
const { result } = await renderHookWithProviders(() =>
useGeminiStream(
mockConfig.getGeminiClient(),
[],
@@ -2777,7 +2777,7 @@ describe('useGeminiStream', () => {
})(),
);
const { result } = renderTestHook();
const { result } = await renderTestHook();
await act(async () => {
await result.current.submitQuery(userQuery);
@@ -2849,7 +2849,7 @@ describe('useGeminiStream', () => {
})(),
);
const { result } = renderHookWithProviders(() =>
const { result } = await renderHookWithProviders(() =>
useGeminiStream(
new MockedGeminiClientClass(mockConfig),
[],
@@ -2904,7 +2904,7 @@ describe('useGeminiStream', () => {
})(),
);
const { result } = renderTestHook();
const { result } = await renderTestHook();
await act(async () => {
await result.current.submitQuery('Test query');
@@ -2949,7 +2949,7 @@ describe('useGeminiStream', () => {
})(),
);
const { result } = renderHookWithProviders(() =>
const { result } = await renderHookWithProviders(() =>
useGeminiStream(
new MockedGeminiClientClass(mockConfig),
[],
@@ -3021,7 +3021,7 @@ describe('useGeminiStream', () => {
});
});
it('should memoize pendingHistoryItems', () => {
it('should memoize pendingHistoryItems', async () => {
mockUseToolScheduler.mockReturnValue([
[],
mockScheduleToolCalls,
@@ -3031,7 +3031,7 @@ describe('useGeminiStream', () => {
0,
]);
const { result, rerender } = renderHookWithProviders(() =>
const { result, rerender } = await renderHookWithProviders(() =>
useGeminiStream(
mockConfig.getGeminiClient(),
[],
@@ -3102,7 +3102,7 @@ describe('useGeminiStream', () => {
})(),
);
const { result } = renderHookWithProviders(() =>
const { result } = await renderHookWithProviders(() =>
useGeminiStream(
new MockedGeminiClientClass(mockConfig),
[],
@@ -3159,7 +3159,7 @@ describe('useGeminiStream', () => {
})(),
);
const { result } = renderHookWithProviders(() =>
const { result } = await renderHookWithProviders(() =>
useGeminiStream(
new MockedGeminiClientClass(mockConfig),
[],
@@ -3227,7 +3227,7 @@ describe('useGeminiStream', () => {
})(),
);
const { result } = renderHookWithProviders(() =>
const { result } = await renderHookWithProviders(() =>
useGeminiStream(
new MockedGeminiClientClass(mockConfig),
[],
@@ -3287,7 +3287,7 @@ describe('useGeminiStream', () => {
})(),
);
const { result } = renderTestHook();
const { result } = await renderTestHook();
await act(async () => {
await result.current.submitQuery('test query');
@@ -3334,7 +3334,7 @@ describe('useGeminiStream', () => {
})(),
);
const { result } = renderTestHook();
const { result } = await renderTestHook();
await act(async () => {
await result.current.submitQuery('test query');
@@ -3399,7 +3399,7 @@ describe('useGeminiStream', () => {
})(),
);
const { result } = renderTestHook();
const { result } = await renderTestHook();
await act(async () => {
await result.current.submitQuery('test query');
@@ -3434,7 +3434,7 @@ describe('useGeminiStream', () => {
});
it('should handle multiple loop detection events properly', async () => {
const { result } = renderTestHook();
const { result } = await renderTestHook();
// First loop detection - set up fresh mock for first call
mockSendMessageStream.mockReturnValueOnce(
@@ -3544,7 +3544,7 @@ describe('useGeminiStream', () => {
})(),
);
const { result } = renderTestHook();
const { result } = await renderTestHook();
await act(async () => {
await result.current.submitQuery('test query');
@@ -3581,7 +3581,7 @@ describe('useGeminiStream', () => {
})(),
);
const { result } = renderTestHook();
const { result } = await renderTestHook();
// Start first query without awaiting (fire-and-forget, like existing tests)
await act(async () => {
@@ -3637,7 +3637,7 @@ describe('useGeminiStream', () => {
})(),
);
const { result } = renderTestHook();
const { result } = await renderTestHook();
await act(async () => {
await result.current.submitQuery('test query');
@@ -3692,7 +3692,7 @@ describe('useGeminiStream', () => {
})(),
);
const { result } = renderTestHook();
const { result } = await renderTestHook();
await act(async () => {
await result.current.submitQuery('test stop');
@@ -3720,7 +3720,7 @@ describe('useGeminiStream', () => {
})(),
);
const { result } = renderTestHook();
const { result } = await renderTestHook();
await act(async () => {
await result.current.submitQuery('test stop');
@@ -3751,7 +3751,7 @@ describe('useGeminiStream', () => {
})(),
);
const { result } = renderTestHook();
const { result } = await renderTestHook();
await act(async () => {
await result.current.submitQuery('test block');
@@ -3778,7 +3778,7 @@ describe('useGeminiStream', () => {
})(),
);
const { result } = renderTestHook();
const { result } = await renderTestHook();
await act(async () => {
await result.current.submitQuery('test block');
@@ -3807,7 +3807,7 @@ describe('useGeminiStream', () => {
})(),
);
const { result } = renderTestHook();
const { result } = await renderTestHook();
await act(async () => {
await result.current.submitQuery('user query');
@@ -3855,7 +3855,7 @@ describe('useGeminiStream', () => {
})(),
);
const { result } = renderTestHook();
const { result } = await renderTestHook();
await act(async () => {
await result.current.submitQuery('user query');
@@ -3881,7 +3881,7 @@ describe('useGeminiStream', () => {
});
it('should trace UserPrompt telemetry on submitQuery', async () => {
const { result } = renderTestHook();
const { result } = await renderTestHook();
mockSendMessageStream.mockReturnValue(
(async function* () {