package admin import ( "context" "encoding/json" "net/http" "net/http/httptest" "testing" "github.com/Wei-Shaw/sub2api/internal/service" "github.com/gin-gonic/gin" "github.com/stretchr/testify/require" ) type availableModelsAdminService struct { *stubAdminService account service.Account } func (s *availableModelsAdminService) GetAccount(_ context.Context, id int64) (*service.Account, error) { if s.account.ID == id { acc := s.account return &acc, nil } return s.stubAdminService.GetAccount(context.Background(), id) } func setupAvailableModelsRouter(adminSvc service.AdminService) *gin.Engine { gin.SetMode(gin.TestMode) router := gin.New() handler := NewAccountHandler(adminSvc, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil) router.GET("/api/v1/admin/accounts/:id/models", handler.GetAvailableModels) return router } func TestAccountHandlerGetAvailableModels_OpenAIOAuthUsesExplicitModelMapping(t *testing.T) { svc := &availableModelsAdminService{ stubAdminService: newStubAdminService(), account: service.Account{ ID: 42, Name: "openai-oauth", Platform: service.PlatformOpenAI, Type: service.AccountTypeOAuth, Status: service.StatusActive, Credentials: map[string]any{ "model_mapping": map[string]any{ "gpt-5": "gpt-5.1", }, }, }, } router := setupAvailableModelsRouter(svc) rec := httptest.NewRecorder() req := httptest.NewRequest(http.MethodGet, "/api/v1/admin/accounts/42/models", nil) router.ServeHTTP(rec, req) require.Equal(t, http.StatusOK, rec.Code) var resp struct { Data []struct { ID string `json:"id"` } `json:"data"` } require.NoError(t, json.Unmarshal(rec.Body.Bytes(), &resp)) require.Len(t, resp.Data, 1) require.Equal(t, "gpt-5", resp.Data[0].ID) } func TestAccountHandlerGetAvailableModels_OpenAIOAuthPassthroughFallsBackToDefaults(t *testing.T) { svc := &availableModelsAdminService{ stubAdminService: newStubAdminService(), account: service.Account{ ID: 43, Name: "openai-oauth-passthrough", Platform: service.PlatformOpenAI, Type: service.AccountTypeOAuth, Status: service.StatusActive, Credentials: map[string]any{ "model_mapping": map[string]any{ "gpt-5": "gpt-5.1", }, }, Extra: map[string]any{ "openai_passthrough": true, }, }, } router := setupAvailableModelsRouter(svc) rec := httptest.NewRecorder() req := httptest.NewRequest(http.MethodGet, "/api/v1/admin/accounts/43/models", nil) router.ServeHTTP(rec, req) require.Equal(t, http.StatusOK, rec.Code) var resp struct { Data []struct { ID string `json:"id"` } `json:"data"` } require.NoError(t, json.Unmarshal(rec.Body.Bytes(), &resp)) require.NotEmpty(t, resp.Data) require.NotEqual(t, "gpt-5", resp.Data[0].ID) }