From 181e9051ec6fbb5eb7a2ce778ccb5284f3195760 Mon Sep 17 00:00:00 2001 From: Rogee Date: Fri, 21 Aug 2026 13:10:04 +0800 Subject: [PATCH] H-354: cover Captain provider timeout (#67) Co-authored-by: Rogee --- .../api/v1/captain_assistant_handler_test.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/backend/internal/handler/api/v1/captain_assistant_handler_test.go b/backend/internal/handler/api/v1/captain_assistant_handler_test.go index 2a5858d2..4aa5be10 100644 --- a/backend/internal/handler/api/v1/captain_assistant_handler_test.go +++ b/backend/internal/handler/api/v1/captain_assistant_handler_test.go @@ -459,6 +459,20 @@ func TestCaptainAssistantHandler_PlaygroundEmbeddingFailureFailsClosed(t *testin assert.Zero(t, provider.calls) } +func TestCaptainAssistantHandler_PlaygroundProviderTimeoutFailsClosed(t *testing.T) { + provider := &captainPlaygroundFakeProvider{embeddingErr: &net.OpError{Op: "read", Net: "tcp", Err: context.DeadlineExceeded}} + router, db := setupCaptainAssistantHandlerTestWithProvider(t, provider) + account := seedCaptainAssistantAccount(t, db, "Captain Org") + assistant := &model.CaptainAssistant{AccountID: account.ID, Name: "Fin", Status: model.AssistantStatusActive} + require.NoError(t, db.Create(assistant).Error) + + w := captainAssistantJSONRequest(t, router, http.MethodPost, fmt.Sprintf("/api/v1/accounts/%d/captain/assistants/%d/playground", account.ID, assistant.ID), map[string]any{"message_content": "Hello assistant"}) + assert.Equal(t, http.StatusGatewayTimeout, w.Code) + assert.JSONEq(t, `{"success":false,"error":{"code":"COPILOT_PROVIDER_TIMEOUT","message":"Copilot provider request timed out"}}`, w.Body.String()) + assert.Equal(t, 1, provider.embeddingCalls) + assert.Zero(t, provider.calls) +} + func TestCaptainAssistantHandler_PlaygroundEmptyEmbeddingFailsClosed(t *testing.T) { for name, embeddingResponse := range map[string]*llm.EmbeddingResponse{ "nil response": nil,