(t *testing.T)
| 2904 | } |
| 2905 | |
| 2906 | func TestReadAPIErrorAndHelpers(t *testing.T) { |
| 2907 | t.Parallel() |
| 2908 | |
| 2909 | resp := newHTTPResponse(http.StatusBadRequest, `{"error":"boom"}`) |
| 2910 | defer func() { |
| 2911 | _ = resp.Body.Close() |
| 2912 | }() |
| 2913 | err := readAPIError(resp) |
| 2914 | if err == nil || !strings.Contains(err.Error(), "boom") { |
| 2915 | t.Fatalf("readAPIError() = %v, want boom", err) |
| 2916 | } |
| 2917 | |
| 2918 | toolResp := newHTTPResponse( |
| 2919 | http.StatusAccepted, |
| 2920 | `{"error":{"code":"tool_approval_required","message":"tool approval token=super-secret is required","tool_id":"agh__skill_view","reason_codes":["approval_token_missing"],"layer":"approval","details":{"approval_token":"approval-token-secret"}}}`, |
| 2921 | ) |
| 2922 | defer func() { |
| 2923 | _ = toolResp.Body.Close() |
| 2924 | }() |
| 2925 | err = readAPIError(toolResp) |
| 2926 | var toolErr *toolAPIError |
| 2927 | if !errors.As(err, &toolErr) { |
| 2928 | t.Fatalf("readAPIError(tool) = %T %[1]v, want toolAPIError", err) |
| 2929 | } |
| 2930 | toolPayload := toolErr.Response() |
| 2931 | if toolPayload.Error.Code != toolspkg.ErrorCodeApprovalRequired || |
| 2932 | len(toolPayload.Error.ReasonCodes) != 1 || |
| 2933 | toolPayload.Error.ReasonCodes[0] != toolspkg.ReasonApprovalTokenMissing { |
| 2934 | t.Fatalf("tool error payload = %#v, want approval required", toolPayload.Error) |
| 2935 | } |
| 2936 | if strings.Contains(toolErr.Error(), "super-secret") || |
| 2937 | strings.Contains(string(mustJSON(t, toolPayload)), "approval-token-secret") { |
| 2938 | t.Fatalf("tool error leaked sensitive material: error=%q payload=%s", toolErr.Error(), mustJSON(t, toolPayload)) |
| 2939 | } |
| 2940 | |
| 2941 | if got := sessionEventValues(SessionEventQuery{ |
| 2942 | Type: "agent_message", |
| 2943 | AgentName: "coder", |
| 2944 | TurnID: "turn-1", |
| 2945 | Since: fixedTestNow, |
| 2946 | Last: 3, |
| 2947 | AfterSequence: 9, |
| 2948 | }); got.Get("after_sequence") != "9" || got.Get("limit") != "3" { |
| 2949 | t.Fatalf("sessionEventValues() = %v, want limit/after_sequence", got) |
| 2950 | } |
| 2951 | |
| 2952 | if got := sessionListValues(SessionListQuery{Workspace: "ws-1"}); got.Get("workspace") != "ws-1" { |
| 2953 | t.Fatalf("sessionListValues() = %v, want workspace filter", got) |
| 2954 | } |
| 2955 | |
| 2956 | if got := logsListValues(LogsListQuery{ |
| 2957 | SessionID: "sess-1", |
| 2958 | AgentName: "coder", |
| 2959 | Type: "done", |
| 2960 | Since: fixedTestNow, |
| 2961 | Last: 2, |
| 2962 | }); got.Get("session_id") != "sess-1" || got.Get("limit") != "2" { |
| 2963 | t.Fatalf("logsListValues() = %v, want session_id/limit", got) |
nothing calls this directly
no test coverage detected