(t *testing.T)
| 82 | } |
| 83 | |
| 84 | func TestExtractHTTPStatusCode(t *testing.T) { |
| 85 | t.Parallel() |
| 86 | |
| 87 | tests := []struct { |
| 88 | name string |
| 89 | err error |
| 90 | expected int |
| 91 | }{ |
| 92 | {name: "nil error", err: nil, expected: 0}, |
| 93 | {name: "429 in message", err: errors.New("POST /v1/chat/completions: 429 Too Many Requests"), expected: 429}, |
| 94 | {name: "500 in message", err: errors.New("internal server error 500"), expected: 500}, |
| 95 | {name: "502 in message", err: errors.New("502 bad gateway"), expected: 502}, |
| 96 | {name: "401 in message", err: errors.New("401 unauthorized"), expected: 401}, |
| 97 | {name: "no status code", err: errors.New("connection refused"), expected: 0}, |
| 98 | // StatusError structural path |
| 99 | {name: "StatusError 429", err: &StatusError{StatusCode: 429, Err: errors.New("rate limited")}, expected: 429}, |
| 100 | {name: "StatusError 500", err: &StatusError{StatusCode: 500, Err: errors.New("server error")}, expected: 500}, |
| 101 | {name: "wrapped StatusError", err: fmt.Errorf("outer: %w", &StatusError{StatusCode: 503, Err: errors.New("unavailable")}), expected: 503}, |
| 102 | } |
| 103 | |
| 104 | for _, tt := range tests { |
| 105 | t.Run(tt.name, func(t *testing.T) { |
| 106 | t.Parallel() |
| 107 | assert.Equal(t, tt.expected, extractHTTPStatusCode(tt.err), "extractHTTPStatusCode(%v)", tt.err) |
| 108 | }) |
| 109 | } |
| 110 | } |
| 111 | |
| 112 | func TestIsRetryableStatusCode(t *testing.T) { |
| 113 | t.Parallel() |
nothing calls this directly
no test coverage detected