openai_gateway_passthrough_image_intent_test.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. package service
  2. import (
  3. "context"
  4. "io"
  5. "net/http"
  6. "strings"
  7. "testing"
  8. "github.com/gin-gonic/gin"
  9. "github.com/stretchr/testify/require"
  10. "github.com/tidwall/gjson"
  11. )
  12. func TestOpenAIGatewayService_APIKeyPassthrough_ImageIntentPreservesGateAndBilling(t *testing.T) {
  13. gin.SetMode(gin.TestMode)
  14. body := []byte(`{"model":"gpt-5.4","stream":false,"tools":[{"type":"image_generation","model":"gpt-image-2","size":"2048x1152"}],"input":"draw"}`)
  15. t.Run("disabled group rejects before upstream", func(t *testing.T) {
  16. upstream := &httpUpstreamRecorder{}
  17. svc := newOpenAIImageGenerationControlTestService(upstream)
  18. c, recorder := newOpenAIImageGenerationControlTestContext(false, "curl/8.0")
  19. account := newOpenAIImageGenerationControlTestAccount()
  20. account.Extra = map[string]any{"openai_passthrough": true}
  21. result, err := svc.Forward(context.Background(), c, account, body)
  22. require.Error(t, err)
  23. require.Nil(t, result)
  24. require.Equal(t, http.StatusForbidden, recorder.Code)
  25. require.Equal(t, "permission_error", gjson.GetBytes(recorder.Body.Bytes(), "error.type").String())
  26. require.Nil(t, upstream.lastReq)
  27. })
  28. t.Run("allowed group keeps image billing", func(t *testing.T) {
  29. upstream := &httpUpstreamRecorder{resp: &http.Response{
  30. StatusCode: http.StatusOK,
  31. Header: http.Header{"Content-Type": []string{"application/json"}},
  32. Body: io.NopCloser(strings.NewReader(
  33. `{"output":[{"id":"ig_1","type":"image_generation_call","result":"final-image","size":"2048x1152"}],"usage":{"input_tokens":1,"output_tokens":2}}`,
  34. )),
  35. }}
  36. svc := newOpenAIImageGenerationControlTestService(upstream)
  37. c, _ := newOpenAIImageGenerationControlTestContext(true, "curl/8.0")
  38. account := newOpenAIImageGenerationControlTestAccount()
  39. account.Extra = map[string]any{"openai_passthrough": true}
  40. result, err := svc.Forward(context.Background(), c, account, body)
  41. require.NoError(t, err)
  42. require.NotNil(t, result)
  43. require.NotNil(t, upstream.lastReq)
  44. require.Equal(t, body, upstream.lastBody)
  45. require.Equal(t, 1, result.ImageCount)
  46. require.Equal(t, "gpt-image-2", result.BillingModel)
  47. require.Equal(t, "2K", result.ImageSize)
  48. require.Equal(t, "2048x1152", result.ImageInputSize)
  49. })
  50. }