From 0b47f9516d96e6cead01af070d4911821e988f80 Mon Sep 17 00:00:00 2001 From: hongming-codex-laptop Date: Thu, 14 May 2026 06:17:58 -0700 Subject: [PATCH] fix(ci): repair delegation list and merge queue tests --- .gitea/scripts/tests/test_gitea_merge_queue.py | 10 ++++++++-- workspace-server/internal/handlers/delegation.go | 12 +++++++----- .../internal/handlers/delegation_list_test.go | 16 +++++----------- 3 files changed, 20 insertions(+), 18 deletions(-) diff --git a/.gitea/scripts/tests/test_gitea_merge_queue.py b/.gitea/scripts/tests/test_gitea_merge_queue.py index 6aeeb679..b01c6da2 100644 --- a/.gitea/scripts/tests/test_gitea_merge_queue.py +++ b/.gitea/scripts/tests/test_gitea_merge_queue.py @@ -85,7 +85,10 @@ def test_pr_needs_update_when_base_sha_absent_from_commits(): def test_merge_decision_requires_main_green_pr_green_and_current_base(): required = ["CI / all-required (pull_request)"] - main_status = {"state": "success", "statuses": []} + main_status = { + "state": "success", + "statuses": [{"context": "CI / all-required (push)", "status": "success"}], + } pr_status = { "state": "success", "statuses": [{"context": "CI / all-required (pull_request)", "status": "success"}], @@ -104,7 +107,10 @@ def test_merge_decision_requires_main_green_pr_green_and_current_base(): def test_merge_decision_updates_stale_pr_before_merge(): decision = mq.evaluate_merge_readiness( - main_status={"state": "success", "statuses": []}, + main_status={ + "state": "success", + "statuses": [{"context": "CI / all-required (push)", "status": "success"}], + }, pr_status={"state": "success", "statuses": [{"context": "CI / all-required (pull_request)", "status": "success"}]}, required_contexts=["CI / all-required (pull_request)"], pr_has_current_base=False, diff --git a/workspace-server/internal/handlers/delegation.go b/workspace-server/internal/handlers/delegation.go index fefdeee7..beaa88cf 100644 --- a/workspace-server/internal/handlers/delegation.go +++ b/workspace-server/internal/handlers/delegation.go @@ -2,6 +2,7 @@ package handlers import ( "context" + "database/sql" "encoding/json" "log" "net/http" @@ -698,7 +699,8 @@ func (h *DelegationHandler) listDelegationsFromLedger(ctx context.Context, works var result []map[string]interface{} for rows.Next() { - var delegationID, callerID, calleeID, taskPreview, status, resultPreview, errorDetail string + var delegationID, callerID, calleeID, taskPreview, status string + var resultPreview, errorDetail sql.NullString var lastHeartbeat, deadline, createdAt, updatedAt *time.Time if err := rows.Scan( &delegationID, &callerID, &calleeID, &taskPreview, @@ -717,11 +719,11 @@ func (h *DelegationHandler) listDelegationsFromLedger(ctx context.Context, works "updated_at": updatedAt, "_ledger": true, // marker so callers know this row is from the ledger } - if resultPreview != "" { - entry["response_preview"] = textutil.TruncateBytes(resultPreview, 300) + if resultPreview.Valid && resultPreview.String != "" { + entry["response_preview"] = textutil.TruncateBytes(resultPreview.String, 300) } - if errorDetail != "" { - entry["error"] = errorDetail + if errorDetail.Valid && errorDetail.String != "" { + entry["error"] = errorDetail.String } if lastHeartbeat != nil { entry["last_heartbeat"] = lastHeartbeat diff --git a/workspace-server/internal/handlers/delegation_list_test.go b/workspace-server/internal/handlers/delegation_list_test.go index 91416d4b..0cafff4b 100644 --- a/workspace-server/internal/handlers/delegation_list_test.go +++ b/workspace-server/internal/handlers/delegation_list_test.go @@ -145,7 +145,6 @@ func TestListDelegationsFromLedger_MultipleRows(t *testing.T) { } } -======= func TestListDelegationsFromLedger_NullsOmitted(t *testing.T) { // last_heartbeat, deadline, result_preview, error_detail are all NULL. // Handler must not panic and must omit those keys from the map. @@ -158,7 +157,11 @@ func TestListDelegationsFromLedger_NullsOmitted(t *testing.T) { t.Cleanup(func() { mockDB.Close(); db.DB = prevDB }) now := time.Now() - rows := sqlmock.NewRows([]string{}). + rows := sqlmock.NewRows([]string{ + "delegation_id", "caller_id", "callee_id", "task_preview", + "status", "result_preview", "error_detail", + "last_heartbeat", "deadline", "created_at", "updated_at", + }). AddRow("del-1", "ws-1", "ws-2", "task", "queued", nil, nil, nil, nil, now, now) mock.ExpectQuery("SELECT .+ FROM delegations"). WithArgs("ws-1"). @@ -190,7 +193,6 @@ func TestListDelegationsFromLedger_NullsOmitted(t *testing.T) { } } ->>>>>>> 5531b471 (handlers: restore db.DB after each test to fix CI/Platform (Go) race failures) func TestListDelegationsFromLedger_QueryError(t *testing.T) { // Query failure returns nil — graceful fallback, no panic. mockDB, mock, err := sqlmock.New() @@ -484,11 +486,3 @@ func TestListDelegationsFromActivityLogs_RowsErr(t *testing.T) { t.Errorf("sqlmock expectations: %v", err) } } - -<<<<<<< HEAD -// TestListDelegationsFromActivityLogs_ScanErrorSkipped is removed. -// -// Same reason as TestListDelegationsFromLedger_ScanError: Go 1.25 causes -// sqlmock.NewRows([]string{}).AddRow(...) to panic in test SETUP. The handler -// has no recover(), so a scan panic would crash the process — the correct -// behaviour. Real-DB integration tests cover this path.