adaptor_test.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. package minimax
  2. import (
  3. "encoding/json"
  4. "net/http"
  5. "net/http/httptest"
  6. "strings"
  7. "testing"
  8. "time"
  9. "github.com/QuantumNous/new-api/dto"
  10. relaycommon "github.com/QuantumNous/new-api/relay/common"
  11. relayconstant "github.com/QuantumNous/new-api/relay/constant"
  12. "github.com/gin-gonic/gin"
  13. )
  14. func TestGetRequestURLForImageGeneration(t *testing.T) {
  15. t.Parallel()
  16. info := &relaycommon.RelayInfo{
  17. RelayMode: relayconstant.RelayModeImagesGenerations,
  18. ChannelMeta: &relaycommon.ChannelMeta{
  19. ChannelBaseUrl: "https://api.minimax.chat",
  20. },
  21. }
  22. got, err := GetRequestURL(info)
  23. if err != nil {
  24. t.Fatalf("GetRequestURL returned error: %v", err)
  25. }
  26. want := "https://api.minimax.chat/v1/image_generation"
  27. if got != want {
  28. t.Fatalf("GetRequestURL() = %q, want %q", got, want)
  29. }
  30. }
  31. func TestConvertImageRequest(t *testing.T) {
  32. t.Parallel()
  33. adaptor := &Adaptor{}
  34. info := &relaycommon.RelayInfo{
  35. RelayMode: relayconstant.RelayModeImagesGenerations,
  36. OriginModelName: "image-01",
  37. }
  38. request := dto.ImageRequest{
  39. Model: "image-01",
  40. Prompt: "a red fox in snowfall",
  41. Size: "1536x1024",
  42. ResponseFormat: "url",
  43. N: uintPtr(2),
  44. }
  45. got, err := adaptor.ConvertImageRequest(gin.CreateTestContextOnly(httptest.NewRecorder(), gin.New()), info, request)
  46. if err != nil {
  47. t.Fatalf("ConvertImageRequest returned error: %v", err)
  48. }
  49. body, err := json.Marshal(got)
  50. if err != nil {
  51. t.Fatalf("json.Marshal returned error: %v", err)
  52. }
  53. var payload map[string]any
  54. if err := json.Unmarshal(body, &payload); err != nil {
  55. t.Fatalf("json.Unmarshal returned error: %v", err)
  56. }
  57. if payload["model"] != "image-01" {
  58. t.Fatalf("model = %#v, want %q", payload["model"], "image-01")
  59. }
  60. if payload["prompt"] != request.Prompt {
  61. t.Fatalf("prompt = %#v, want %q", payload["prompt"], request.Prompt)
  62. }
  63. if payload["n"] != float64(2) {
  64. t.Fatalf("n = %#v, want 2", payload["n"])
  65. }
  66. if payload["aspect_ratio"] != "3:2" {
  67. t.Fatalf("aspect_ratio = %#v, want %q", payload["aspect_ratio"], "3:2")
  68. }
  69. if payload["response_format"] != "url" {
  70. t.Fatalf("response_format = %#v, want %q", payload["response_format"], "url")
  71. }
  72. }
  73. func TestDoResponseForImageGeneration(t *testing.T) {
  74. t.Parallel()
  75. gin.SetMode(gin.TestMode)
  76. recorder := httptest.NewRecorder()
  77. c, _ := gin.CreateTestContext(recorder)
  78. info := &relaycommon.RelayInfo{
  79. RelayMode: relayconstant.RelayModeImagesGenerations,
  80. StartTime: time.Unix(1700000000, 0),
  81. }
  82. resp := &http.Response{
  83. StatusCode: http.StatusOK,
  84. Header: make(http.Header),
  85. Body: httptest.NewRecorder().Result().Body,
  86. }
  87. resp.Body = ioNopCloser(`{"data":{"image_urls":["https://example.com/minimax.png"]}}`)
  88. adaptor := &Adaptor{}
  89. usage, err := adaptor.DoResponse(c, resp, info)
  90. if err != nil {
  91. t.Fatalf("DoResponse returned error: %v", err)
  92. }
  93. if usage == nil {
  94. t.Fatalf("DoResponse returned nil usage")
  95. }
  96. body := recorder.Body.String()
  97. if !strings.Contains(body, `"url":"https://example.com/minimax.png"`) {
  98. t.Fatalf("response body = %s, want OpenAI image response with image URL", body)
  99. }
  100. if strings.Contains(body, `"image_urls"`) {
  101. t.Fatalf("response body = %s, should not expose raw MiniMax image_urls payload", body)
  102. }
  103. }
  104. type nopReadCloser struct {
  105. *strings.Reader
  106. }
  107. func (n nopReadCloser) Close() error {
  108. return nil
  109. }
  110. func ioNopCloser(body string) nopReadCloser {
  111. return nopReadCloser{Reader: strings.NewReader(body)}
  112. }
  113. func uintPtr(v uint) *uint {
  114. return &v
  115. }