From dcf23fb2ca4d42a34a38596ffc1cf99a4d8c307b Mon Sep 17 00:00:00 2001 From: rcourtman Date: Mon, 29 Jun 2026 23:14:33 +0100 Subject: [PATCH] Test selected provider model from settings --- .../Settings/__tests__/AISettings.test.tsx | 48 +++++++++++++++++-- .../components/Settings/useAISettingsState.ts | 11 ++++- 2 files changed, 55 insertions(+), 4 deletions(-) diff --git a/frontend-modern/src/components/Settings/__tests__/AISettings.test.tsx b/frontend-modern/src/components/Settings/__tests__/AISettings.test.tsx index 0e58acf52..9eca4facb 100644 --- a/frontend-modern/src/components/Settings/__tests__/AISettings.test.tsx +++ b/frontend-modern/src/components/Settings/__tests__/AISettings.test.tsx @@ -853,7 +853,43 @@ describe('AISettings OpenRouter flow', () => { await waitFor(() => { expect(testProviderMock).toHaveBeenCalledTimes(1); - expect(testProviderMock).toHaveBeenCalledWith('openrouter'); + expect(testProviderMock).toHaveBeenCalledWith( + 'openrouter', + 'openrouter:openai/gpt-4o-mini', + ); + }); + }); + + it('tests the pending model selection instead of the previously saved provider model', async () => { + getSettingsMock.mockResolvedValue({ + ...baseSettings(), + configured: true, + enabled: true, + model: 'openrouter:openai/gpt-4o-mini', + openrouter_configured: true, + configured_providers: ['openrouter'], + }); + getModelsMock.mockResolvedValue({ models: [] }); + + renderComponent(); + + await waitFor(() => { + expect(testProviderMock).toHaveBeenCalled(); + }); + + testProviderMock.mockClear(); + fireEvent.input(screen.getByLabelText('Default model identifier'), { + target: { value: 'openrouter:anthropic/claude-sonnet-4' }, + }); + fireEvent.click(screen.getByRole('button', { name: /openrouter/i })); + fireEvent.click(await screen.findByRole('button', { name: /^Test$/ })); + + await waitFor(() => { + expect(testProviderMock).toHaveBeenCalledTimes(1); + expect(testProviderMock).toHaveBeenCalledWith( + 'openrouter', + 'openrouter:anthropic/claude-sonnet-4', + ); }); }); }); @@ -953,7 +989,10 @@ describe('AISettings provider save failure context', () => { renderComponent(); await waitFor(() => { - expect(testProviderMock).toHaveBeenCalledWith('openrouter'); + expect(testProviderMock).toHaveBeenCalledWith( + 'openrouter', + 'openrouter:deepseek/deepseek-r1', + ); }); fireEvent.click(screen.getByRole('button', { name: /Save provider settings/i })); @@ -1039,7 +1078,10 @@ describe('AISettings provider save failure context', () => { renderComponent(); await waitFor(() => { - expect(testProviderMock).toHaveBeenCalledWith('openrouter'); + expect(testProviderMock).toHaveBeenCalledWith( + 'openrouter', + 'openrouter:deepseek/deepseek-r1', + ); }); fireEvent.click(screen.getByRole('button', { name: /Save provider settings/i })); diff --git a/frontend-modern/src/components/Settings/useAISettingsState.ts b/frontend-modern/src/components/Settings/useAISettingsState.ts index fe8f1b384..66673ccf9 100644 --- a/frontend-modern/src/components/Settings/useAISettingsState.ts +++ b/frontend-modern/src/components/Settings/useAISettingsState.ts @@ -553,6 +553,15 @@ export const useAISettingsState = (options: AISettingsStateOptions = {}) => { return `${session.title || 'Untitled'} - ${session.message_count} msgs - ${dateLabel} ${timeLabel}`; }; + const selectedModelForProviderTest = (provider: AIProvider): string | undefined => + compactUnique([ + form.patrolModel, + form.chatModel, + form.discoveryModel, + form.autoFixModel, + form.model, + ]).find((model) => getProviderFromModelId(model) === provider); + const handleCloseSetupModal = () => { setShowSetupModal(false); setSetupApiKey(''); @@ -567,7 +576,7 @@ export const useAISettingsState = (options: AISettingsStateOptions = {}) => { opts: { notify?: boolean; storeManualResult?: boolean } = {}, ): Promise => { try { - const result = await AIAPI.testProvider(provider); + const result = await AIAPI.testProvider(provider, selectedModelForProviderTest(provider)); const message = getProviderTestDiagnosticMessage(result); const normalizedResult: ProviderTestResult = { provider,