| 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) |
| } |
|
|