From 872df8e619e8711ea7e5384ca259ff0d4ee3f3d9 Mon Sep 17 00:00:00 2001 From: Molecule AI Core-BE Date: Fri, 15 May 2026 07:50:43 +0000 Subject: [PATCH] test(handlers): add missing DB-error tests for Record and SessionSearch Cherry-pick of PR #1094 (test/delegate-record-db-errors) test functions onto current staging. Original PR was stale (branched before 4bdb10b5). Closes #1094. New tests: - TestSessionSearch_DBError: verifies SessionSearch returns 500 when the DB query returns an error - TestDelegationRecord_DBInsertFails: verifies Record returns 500 when the activity_logs INSERT fails Co-Authored-By: Claude Opus 4.7 --- .../internal/handlers/activity_test.go | 25 +++++++++++++++++ .../internal/handlers/delegation_test.go | 27 +++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/workspace-server/internal/handlers/activity_test.go b/workspace-server/internal/handlers/activity_test.go index f6611814c..2576c1a74 100644 --- a/workspace-server/internal/handlers/activity_test.go +++ b/workspace-server/internal/handlers/activity_test.go @@ -63,6 +63,31 @@ func TestSessionSearchReturnsActivityAndMemory(t *testing.T) { } } +func TestSessionSearch_DBError(t *testing.T) { + mock := setupTestDB(t) + setupTestRedis(t) + broadcaster := newTestBroadcaster() + handler := NewActivityHandler(broadcaster) + + mock.ExpectQuery("WITH session_items AS"). + WillReturnError(context.DeadlineExceeded) + + w := httptest.NewRecorder() + c, _ := gin.CreateTestContext(w) + c.Request = httptest.NewRequest("GET", "/workspaces/ws-123/session-search?q=test", bytes.NewBufferString("")) + c.Request.Header.Set("Content-Type", "application/json") + c.Params = gin.Params{{Key: "id", Value: "ws-123"}} + + handler.SessionSearch(c) + + if w.Code != http.StatusInternalServerError { + t.Errorf("expected 500 on DB error, got %d", w.Code) + } + if err := mock.ExpectationsWereMet(); err != nil { + t.Errorf("unmet sqlmock expectations: %v", err) + } +} + // ---------- Activity List source filter ---------- func TestActivityList_SourceCanvas(t *testing.T) { diff --git a/workspace-server/internal/handlers/delegation_test.go b/workspace-server/internal/handlers/delegation_test.go index fcd17eec8..cc2b4fe12 100644 --- a/workspace-server/internal/handlers/delegation_test.go +++ b/workspace-server/internal/handlers/delegation_test.go @@ -543,6 +543,33 @@ func TestDelegationRecord_RejectsInvalidUUID(t *testing.T) { } } +func TestDelegationRecord_DBInsertFails(t *testing.T) { + mock := setupTestDB(t) + setupTestRedis(t) + broadcaster := newTestBroadcaster() + wh := NewWorkspaceHandler(broadcaster, nil, "http://localhost:8080", t.TempDir()) + h := NewDelegationHandler(wh, broadcaster) + + mock.ExpectExec("INSERT INTO activity_logs"). + WillReturnError(fmt.Errorf("connection refused")) + + w := httptest.NewRecorder() + c, _ := gin.CreateTestContext(w) + c.Params = gin.Params{{Key: "id", Value: "550e8400-e29b-41d4-a716-446655440000"}} + body := `{"target_id":"550e8400-e29b-41d4-a716-446655440001","task":"hello","delegation_id":"del-xyz"}` + c.Request = httptest.NewRequest("POST", "/delegations/record", bytes.NewBufferString(body)) + c.Request.Header.Set("Content-Type", "application/json") + + h.Record(c) + + if w.Code != http.StatusInternalServerError { + t.Errorf("expected 500 on DB insert failure, got %d", w.Code) + } + if err := mock.ExpectationsWereMet(); err != nil { + t.Errorf("unmet expectations: %v", err) + } +} + func TestDelegationUpdateStatus_CompletedInsertsResultRow(t *testing.T) { mock := setupTestDB(t) setupTestRedis(t) -- 2.52.0