84 lines
2.9 KiB
Go
84 lines
2.9 KiB
Go
package openai
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/maximhq/bifrost/core/schemas"
|
|
"github.com/valyala/fasthttp"
|
|
)
|
|
|
|
func TestParseOpenAIError_FallbackMessageWhenProviderBodyIsNonOpenAIShape(t *testing.T) {
|
|
var resp fasthttp.Response
|
|
resp.SetStatusCode(fasthttp.StatusUnprocessableEntity)
|
|
resp.SetBodyString(`{"detail":[{"loc":["body","messages",0,"role"],"msg":"value is not a valid enumeration member"}]}`)
|
|
|
|
errResp := ParseOpenAIError(&resp)
|
|
if errResp == nil || errResp.Error == nil {
|
|
t.Fatal("expected non-nil error response")
|
|
}
|
|
if errResp.Error.Message == "" {
|
|
t.Fatal("expected non-empty error message")
|
|
}
|
|
if errResp.Error.Message != "provider API error (status 422)" {
|
|
t.Fatalf("expected fallback message, got %q", errResp.Error.Message)
|
|
}
|
|
}
|
|
|
|
func TestParseOpenAIError_PreservesProviderMessageWhenPresent(t *testing.T) {
|
|
var resp fasthttp.Response
|
|
resp.SetStatusCode(fasthttp.StatusUnprocessableEntity)
|
|
resp.SetBodyString(`{"error":{"message":"unsupported role: developer","type":"invalid_request_error","param":"messages.0.role","code":"invalid_value"}}`)
|
|
|
|
errResp := ParseOpenAIError(&resp)
|
|
if errResp == nil || errResp.Error == nil {
|
|
t.Fatal("expected non-nil error response")
|
|
}
|
|
if errResp.Error.Message != "unsupported role: developer" {
|
|
t.Fatalf("expected provider message, got %q", errResp.Error.Message)
|
|
}
|
|
}
|
|
|
|
func TestParseOpenAIError_FallbackMessageWhenBodyIsEmpty(t *testing.T) {
|
|
var resp fasthttp.Response
|
|
resp.SetStatusCode(fasthttp.StatusBadRequest)
|
|
resp.SetBody(nil)
|
|
|
|
errResp := ParseOpenAIError(&resp)
|
|
if errResp == nil || errResp.Error == nil {
|
|
t.Fatal("expected non-nil error response")
|
|
}
|
|
// HandleProviderAPIError returns ErrProviderResponseEmpty with HTTP status for empty bodies.
|
|
expectedMsg := schemas.ErrProviderResponseEmpty + " (HTTP 400)"
|
|
if errResp.Error.Message != expectedMsg {
|
|
t.Fatalf("expected %q, got %q", expectedMsg, errResp.Error.Message)
|
|
}
|
|
}
|
|
|
|
func TestParseOpenAIError_WhitespaceProviderMessageFallsBack(t *testing.T) {
|
|
var resp fasthttp.Response
|
|
resp.SetStatusCode(fasthttp.StatusBadRequest)
|
|
resp.SetBodyString(`{"error":{"message":" ","type":"invalid_request_error"}}`)
|
|
|
|
errResp := ParseOpenAIError(&resp)
|
|
if errResp == nil || errResp.Error == nil {
|
|
t.Fatal("expected non-nil error response")
|
|
}
|
|
if errResp.Error.Message != "provider API error (status 400)" {
|
|
t.Fatalf("expected fallback message, got %q", errResp.Error.Message)
|
|
}
|
|
}
|
|
|
|
func TestParseOpenAIError_DefaultStatusCodeFallsBackWithStatusNumber(t *testing.T) {
|
|
var resp fasthttp.Response
|
|
// fasthttp defaults zero-value response status code to 200.
|
|
resp.SetBodyString(`{"error":{"message":""}}`)
|
|
|
|
errResp := ParseOpenAIError(&resp)
|
|
if errResp == nil || errResp.Error == nil {
|
|
t.Fatal("expected non-nil error response")
|
|
}
|
|
if errResp.Error.Message != "provider API error (status 200)" {
|
|
t.Fatalf("expected fallback message with default status, got %q", errResp.Error.Message)
|
|
}
|
|
}
|