MCPcopy Create free account
hub / github.com/compozy/agh / TestReadAPIErrorAndHelpers

Function TestReadAPIErrorAndHelpers

internal/cli/client_test.go:2906–3099  ·  view source on GitHub ↗
(t *testing.T)

Source from the content-addressed store, hash-verified

2904}
2905
2906func 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)

Callers

nothing calls this directly

Calls 15

ErrorMethod · 0.95
ResponseMethod · 0.95
readAPIErrorFunction · 0.85
sessionEventValuesFunction · 0.85
sessionListValuesFunction · 0.85
logsListValuesFunction · 0.85
hookCatalogValuesFunction · 0.85
hookRunsValuesFunction · 0.85
hookEventsValuesFunction · 0.85
memorySelectorValuesFunction · 0.85
memoryListValuesFunction · 0.85
memoryHistoryValuesFunction · 0.85

Tested by

no test coverage detected