2026-04-23 12:44:44 +08:00
package service
import (
"context"
"io"
"net/http"
"net/http/httptest"
"strings"
"testing"
2026-04-28 04:53:29 +08:00
"github.com/Wei-Shaw/sub2api/internal/config"
2026-04-23 12:44:44 +08:00
"github.com/gin-gonic/gin"
"github.com/stretchr/testify/require"
)
func TestAccountTestService_OpenAIImageOAuthHandlesOutputItemDoneFallback ( t * testing . T ) {
gin . SetMode ( gin . TestMode )
rec := httptest . NewRecorder ( )
c , _ := gin . CreateTestContext ( rec )
c . Request = httptest . NewRequest ( http . MethodPost , "/api/v1/admin/accounts/1/test" , nil )
upstream := & httpUpstreamRecorder {
resp : & http . Response {
StatusCode : http . StatusOK ,
Header : http . Header {
"Content-Type" : [ ] string { "text/event-stream" } ,
} ,
Body : io . NopCloser ( strings . NewReader (
"data: {\"type\":\"response.output_item.done\",\"item\":{\"id\":\"ig_123\",\"type\":\"image_generation_call\",\"result\":\"aGVsbG8=\",\"revised_prompt\":\"draw a cat\",\"output_format\":\"png\"}}\n\n" +
"data: {\"type\":\"response.completed\",\"response\":{\"created_at\":1710000006,\"tool_usage\":{\"image_gen\":{\"images\":1}},\"output\":[]}}\n\n" +
"data: [DONE]\n\n" ,
) ) ,
} ,
}
svc := & AccountTestService { httpUpstream : upstream }
account := & Account {
ID : 53 ,
Name : "openai-oauth" ,
Platform : PlatformOpenAI ,
Type : AccountTypeOAuth ,
Credentials : map [ string ] any {
"access_token" : "token-123" ,
} ,
}
err := svc . testOpenAIImageOAuth ( c , context . Background ( ) , account , "gpt-image-2" , "draw a cat" )
require . NoError ( t , err )
require . Contains ( t , rec . Body . String ( ) , "Calling Codex /responses image tool" )
require . Contains ( t , rec . Body . String ( ) , "data:image/png;base64,aGVsbG8=" )
require . Contains ( t , rec . Body . String ( ) , "\"success\":true" )
}
2026-04-28 04:53:29 +08:00
func TestAccountTestService_OpenAIImageAPIKeyUsesConfiguredV1BaseURL ( t * testing . T ) {
gin . SetMode ( gin . TestMode )
rec := httptest . NewRecorder ( )
c , _ := gin . CreateTestContext ( rec )
c . Request = httptest . NewRequest ( http . MethodPost , "/api/v1/admin/accounts/1/test" , nil )
upstream := & httpUpstreamRecorder {
resp : & http . Response {
StatusCode : http . StatusOK ,
Header : http . Header {
"Content-Type" : [ ] string { "application/json" } ,
} ,
Body : io . NopCloser ( strings . NewReader ( ` { "data":[ { "b64_json":"aGVsbG8=","revised_prompt":"draw a cat"}]} ` ) ) ,
} ,
}
svc := & AccountTestService {
httpUpstream : upstream ,
cfg : & config . Config { } ,
}
account := & Account {
ID : 54 ,
Name : "openai-apikey" ,
Platform : PlatformOpenAI ,
Type : AccountTypeAPIKey ,
Credentials : map [ string ] any {
"api_key" : "test-api-key" ,
"base_url" : "https://image-upstream.example/v1" ,
} ,
}
err := svc . testOpenAIImageAPIKey ( c , context . Background ( ) , account , "gpt-image-2" , "draw a cat" )
require . NoError ( t , err )
require . NotNil ( t , upstream . lastReq )
require . Equal ( t , "https://image-upstream.example/v1/images/generations" , upstream . lastReq . URL . String ( ) )
require . Equal ( t , "Bearer test-api-key" , upstream . lastReq . Header . Get ( "Authorization" ) )
require . Contains ( t , rec . Body . String ( ) , "data:image/png;base64,aGVsbG8=" )
require . Contains ( t , rec . Body . String ( ) , "\"success\":true" )
}