From a13a6113dd05f20fb1147dcf5952437796cf41b1 Mon Sep 17 00:00:00 2001 From: Heatherm Huang Date: Tue, 14 Jul 2026 13:33:42 +0800 Subject: [PATCH 1/2] fix(grok): route generic account refresh correctly --- backend/cmd/server/wire_gen.go | 2 +- .../admin/account_codex_import_test.go | 14 +-- .../admin/account_data_handler_test.go | 1 + .../internal/handler/admin/account_handler.go | 16 +++ .../account_handler_available_models_test.go | 4 +- .../account_handler_grok_refresh_test.go | 99 +++++++++++++++++++ .../admin/account_handler_list_test.go | 2 +- ...count_handler_long_context_billing_test.go | 6 +- .../account_handler_mixed_channel_test.go | 2 +- .../admin/account_handler_passthrough_test.go | 1 + .../admin/batch_update_credentials_test.go | 2 +- .../handler/admin/grok_import_probe.go | 2 + .../admin/grok_import_probe_handler_test.go | 2 +- backend/internal/server/api_contract_test.go | 2 +- 14 files changed, 137 insertions(+), 18 deletions(-) create mode 100644 backend/internal/handler/admin/account_handler_grok_refresh_test.go diff --git a/backend/cmd/server/wire_gen.go b/backend/cmd/server/wire_gen.go index 75786b9c70..9cae353c78 100644 --- a/backend/cmd/server/wire_gen.go +++ b/backend/cmd/server/wire_gen.go @@ -196,7 +196,7 @@ func initializeApplication(buildInfo handler.BuildInfo) (*Application, error) { accountUsageService := service.NewAccountUsageService(accountRepository, usageLogRepository, claudeUsageFetcher, geminiQuotaService, antigravityQuotaFetcher, grokQuotaFetcher, grokQuotaService, openAIQuotaService, usageCache, identityCache, tlsFingerprintProfileService) accountTestService := service.NewAccountTestService(accountRepository, geminiTokenProvider, claudeTokenProvider, grokTokenProvider, antigravityGatewayService, httpUpstream, configConfig, tlsFingerprintProfileService) crsSyncService := service.NewCRSSyncService(accountRepository, proxyRepository, oAuthService, openAIOAuthService, geminiOAuthService, configConfig) - accountHandler := admin.ProvideAccountHandler(adminService, oAuthService, openAIOAuthService, geminiOAuthService, antigravityOAuthService, rateLimitService, accountUsageService, accountTestService, concurrencyService, crsSyncService, sessionLimitCache, rpmCache, compositeTokenCacheInvalidator, grokQuotaService) + accountHandler := admin.ProvideAccountHandler(adminService, oAuthService, openAIOAuthService, geminiOAuthService, antigravityOAuthService, grokOAuthService, rateLimitService, accountUsageService, accountTestService, concurrencyService, crsSyncService, sessionLimitCache, rpmCache, compositeTokenCacheInvalidator, grokQuotaService) adminAnnouncementHandler := admin.NewAnnouncementHandler(announcementService) dataManagementService := service.NewDataManagementService() dataManagementHandler := admin.NewDataManagementHandler(dataManagementService) diff --git a/backend/internal/handler/admin/account_codex_import_test.go b/backend/internal/handler/admin/account_codex_import_test.go index 96a033d8c3..8e47ccb425 100644 --- a/backend/internal/handler/admin/account_codex_import_test.go +++ b/backend/internal/handler/admin/account_codex_import_test.go @@ -559,7 +559,7 @@ func TestNormalizeCodexImportUsesJWTSubForAccessTokenOnlyIdentity(t *testing.T) func TestImportCodexSessionsAccessTokenOnlySameWorkspaceDifferentUsersCreatesTwoAccounts(t *testing.T) { svc := newCodexImportMemoryAdminService(nil) - handler := NewAccountHandler(svc, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil) + handler := NewAccountHandler(svc, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil) req := CodexSessionImportRequest{SkipDefaultGroupBind: boolPtr(true)} entries := []codexImportEntry{ {Index: 1, Value: buildCodexAccessOnlyImportValue(t, "workspace-1", "user-1")}, @@ -583,7 +583,7 @@ func TestImportCodexSessionsAccessTokenOnlySameWorkspaceDifferentUsersCreatesTwo func TestImportCodexSessionsAccessTokenOnlySameWorkspaceAndUserDifferentTokensCreatesTwoAccounts(t *testing.T) { svc := newCodexImportMemoryAdminService(nil) - handler := NewAccountHandler(svc, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil) + handler := NewAccountHandler(svc, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil) req := CodexSessionImportRequest{SkipDefaultGroupBind: boolPtr(true)} entries := []codexImportEntry{ {Index: 1, Value: map[string]any{ @@ -632,7 +632,7 @@ func TestImportCodexSessionsAccessTokenOnlySameUserUpdatesExisting(t *testing.T) }, Extra: map[string]any{"openai_long_context_billing_enabled": false}, }}) - handler := NewAccountHandler(svc, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil) + handler := NewAccountHandler(svc, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil) req := CodexSessionImportRequest{SkipDefaultGroupBind: boolPtr(true)} entries := []codexImportEntry{ {Index: 1, Value: map[string]any{"access_token": existingToken}}, @@ -670,7 +670,7 @@ func TestImportCodexSessionsUpgradesAccessTokenOnlyAccountWithRefreshToken(t *te "access_token": oldToken, }, }}) - handler := NewAccountHandler(svc, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil) + handler := NewAccountHandler(svc, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil) req := CodexSessionImportRequest{SkipDefaultGroupBind: boolPtr(true)} entries := []codexImportEntry{ {Index: 1, Value: map[string]any{ @@ -709,7 +709,7 @@ func TestImportCodexSessionsAccessTokenOnlyPreservesExistingRefreshToken(t *test "client_id": "client-old", }, }}) - handler := NewAccountHandler(svc, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil) + handler := NewAccountHandler(svc, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil) req := CodexSessionImportRequest{SkipDefaultGroupBind: boolPtr(true)} entries := []codexImportEntry{ {Index: 1, Value: map[string]any{"access_token": existingToken}}, @@ -752,7 +752,7 @@ func TestImportCodexSessionsBatchOldAccessTokenDoesNotRollbackRefreshToken(t *te "refresh_token": "refresh-old", }, }}) - handler := NewAccountHandler(svc, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil) + handler := NewAccountHandler(svc, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil) req := CodexSessionImportRequest{SkipDefaultGroupBind: boolPtr(true)} entries := []codexImportEntry{ {Index: 1, Value: map[string]any{ @@ -798,7 +798,7 @@ func TestImportCodexSessionsWithRefreshTokenKeepsExistingDedup(t *testing.T) { "refresh_token": "refresh-old", }, }}) - handler := NewAccountHandler(svc, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil) + handler := NewAccountHandler(svc, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil) req := CodexSessionImportRequest{SkipDefaultGroupBind: boolPtr(true)} entries := []codexImportEntry{ {Index: 1, Value: buildCodexRefreshImportValue(t, "workspace-1", "user-1", "refresh-new")}, diff --git a/backend/internal/handler/admin/account_data_handler_test.go b/backend/internal/handler/admin/account_data_handler_test.go index ecf17a8471..1df59537b5 100644 --- a/backend/internal/handler/admin/account_data_handler_test.go +++ b/backend/internal/handler/admin/account_data_handler_test.go @@ -66,6 +66,7 @@ func setupAccountDataRouter() (*gin.Engine, *stubAdminService) { nil, nil, nil, + nil, ) router.GET("/api/v1/admin/accounts/data", h.ExportData) diff --git a/backend/internal/handler/admin/account_handler.go b/backend/internal/handler/admin/account_handler.go index e4ed5b46b0..b451613c3e 100644 --- a/backend/internal/handler/admin/account_handler.go +++ b/backend/internal/handler/admin/account_handler.go @@ -52,6 +52,7 @@ type AccountHandler struct { openaiOAuthService *service.OpenAIOAuthService geminiOAuthService *service.GeminiOAuthService antigravityOAuthService *service.AntigravityOAuthService + grokOAuthService service.GrokOAuthTokenService rateLimitService *service.RateLimitService accountUsageService *service.AccountUsageService accountTestService *service.AccountTestService @@ -70,6 +71,7 @@ func NewAccountHandler( openaiOAuthService *service.OpenAIOAuthService, geminiOAuthService *service.GeminiOAuthService, antigravityOAuthService *service.AntigravityOAuthService, + grokOAuthService service.GrokOAuthTokenService, rateLimitService *service.RateLimitService, accountUsageService *service.AccountUsageService, accountTestService *service.AccountTestService, @@ -85,6 +87,7 @@ func NewAccountHandler( openaiOAuthService: openaiOAuthService, geminiOAuthService: geminiOAuthService, antigravityOAuthService: antigravityOAuthService, + grokOAuthService: grokOAuthService, rateLimitService: rateLimitService, accountUsageService: accountUsageService, accountTestService: accountTestService, @@ -1179,6 +1182,19 @@ func (h *AccountHandler) refreshSingleAccount(ctx context.Context, account *serv return nil, "", fmt.Errorf("failed to clear account error: %w", clearErr) } } + } else if account.Platform == service.PlatformGrok { + if h.grokOAuthService == nil { + return nil, "", fmt.Errorf("grok oauth service is not configured") + } + tokenInfo, err := h.grokOAuthService.RefreshAccountToken(ctx, account) + if err != nil { + return nil, "", fmt.Errorf("failed to refresh Grok credentials: %w", err) + } + + newCredentials = service.MergeCredentials(account.Credentials, h.grokOAuthService.BuildAccountCredentials(tokenInfo)) + if baseURL := strings.TrimSpace(account.GetCredential("base_url")); baseURL != "" { + newCredentials["base_url"] = baseURL + } } else { // Use Anthropic/Claude OAuth service to refresh token tokenInfo, err := h.oauthService.RefreshAccountToken(ctx, account) diff --git a/backend/internal/handler/admin/account_handler_available_models_test.go b/backend/internal/handler/admin/account_handler_available_models_test.go index ec6a69280e..685592084a 100644 --- a/backend/internal/handler/admin/account_handler_available_models_test.go +++ b/backend/internal/handler/admin/account_handler_available_models_test.go @@ -32,7 +32,7 @@ func (s *availableModelsAdminService) GetAccount(_ context.Context, id int64) (* 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) + handler := NewAccountHandler(adminSvc, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil) router.GET("/api/v1/admin/accounts/:id/models", handler.GetAvailableModels) return router } @@ -66,7 +66,7 @@ func setupSyncUpstreamModelsRouter(adminSvc service.AdminService, upstream servi &config.Config{Security: config.SecurityConfig{URLAllowlist: config.URLAllowlistConfig{Enabled: false}}}, nil, ) - handler := NewAccountHandler(adminSvc, nil, nil, nil, nil, nil, nil, accountTestSvc, nil, nil, nil, nil, nil) + handler := NewAccountHandler(adminSvc, nil, nil, nil, nil, nil, nil, nil, accountTestSvc, nil, nil, nil, nil, nil) router.POST("/api/v1/admin/accounts/:id/models/sync-upstream", handler.SyncUpstreamModels) return router } diff --git a/backend/internal/handler/admin/account_handler_grok_refresh_test.go b/backend/internal/handler/admin/account_handler_grok_refresh_test.go new file mode 100644 index 0000000000..2341087724 --- /dev/null +++ b/backend/internal/handler/admin/account_handler_grok_refresh_test.go @@ -0,0 +1,99 @@ +//go:build unit + +package admin + +import ( + "context" + "testing" + + "github.com/Wei-Shaw/sub2api/internal/service" + "github.com/stretchr/testify/require" +) + +type grokRefreshOAuthStub struct { + account *service.Account + info *service.GrokTokenInfo + calls int +} + +func (s *grokRefreshOAuthStub) RefreshAccountToken(_ context.Context, account *service.Account) (*service.GrokTokenInfo, error) { + s.calls++ + s.account = account + return s.info, nil +} + +func (s *grokRefreshOAuthStub) BuildAccountCredentials(info *service.GrokTokenInfo) map[string]any { + return map[string]any{ + "access_token": info.AccessToken, + "refresh_token": info.RefreshToken, + "expires_at": info.ExpiresAt, + "base_url": "https://api.x.ai/v1", + } +} + +type grokRefreshAdminService struct { + *stubAdminService + updatedCredentials map[string]any +} + +func (s *grokRefreshAdminService) UpdateAccount(_ context.Context, id int64, input *service.UpdateAccountInput) (*service.Account, error) { + s.updatedCredentials = input.Credentials + return &service.Account{ + ID: id, + Platform: service.PlatformGrok, + Type: service.AccountTypeOAuth, + Status: service.StatusActive, + Credentials: input.Credentials, + }, nil +} + +func TestRefreshSingleAccountRoutesGrokThroughGrokOAuthService(t *testing.T) { + t.Parallel() + + adminSvc := &grokRefreshAdminService{stubAdminService: newStubAdminService()} + grokOAuth := &grokRefreshOAuthStub{info: &service.GrokTokenInfo{ + AccessToken: "new-access", + RefreshToken: "new-refresh", + ExpiresAt: 1_800_000_000, + }} + handler := NewAccountHandler( + adminSvc, + nil, + nil, + nil, + nil, + grokOAuth, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + ) + account := &service.Account{ + ID: 4227, + Platform: service.PlatformGrok, + Type: service.AccountTypeOAuth, + Credentials: map[string]any{ + "access_token": "old-access", + "refresh_token": "old-refresh", + "base_url": "https://example.invalid/v1", + "subscription_tier": "SUPER_GROK", + "entitlement_status": "ACTIVE", + }, + } + + updated, warning, err := handler.refreshSingleAccount(context.Background(), account) + require.NoError(t, err) + require.Empty(t, warning) + require.Equal(t, 1, grokOAuth.calls) + require.Same(t, account, grokOAuth.account) + require.Equal(t, "new-access", adminSvc.updatedCredentials["access_token"]) + require.Equal(t, "new-refresh", adminSvc.updatedCredentials["refresh_token"]) + require.Equal(t, "https://example.invalid/v1", adminSvc.updatedCredentials["base_url"]) + require.Equal(t, "SUPER_GROK", adminSvc.updatedCredentials["subscription_tier"]) + require.Equal(t, "ACTIVE", adminSvc.updatedCredentials["entitlement_status"]) + require.Equal(t, adminSvc.updatedCredentials, updated.Credentials) +} diff --git a/backend/internal/handler/admin/account_handler_list_test.go b/backend/internal/handler/admin/account_handler_list_test.go index 4b1bd7224c..6a10bb4dcc 100644 --- a/backend/internal/handler/admin/account_handler_list_test.go +++ b/backend/internal/handler/admin/account_handler_list_test.go @@ -17,7 +17,7 @@ func setupAccountListRouter() (*gin.Engine, *stubAdminService) { gin.SetMode(gin.TestMode) router := gin.New() adminSvc := newStubAdminService() - handler := NewAccountHandler(adminSvc, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil) + handler := NewAccountHandler(adminSvc, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil) router.GET("/api/v1/admin/accounts", handler.List) return router, adminSvc } diff --git a/backend/internal/handler/admin/account_handler_long_context_billing_test.go b/backend/internal/handler/admin/account_handler_long_context_billing_test.go index d50513a3e8..b3d3db9667 100644 --- a/backend/internal/handler/admin/account_handler_long_context_billing_test.go +++ b/backend/internal/handler/admin/account_handler_long_context_billing_test.go @@ -78,7 +78,7 @@ func TestAccountAdminBoundariesRejectMalformedOpenAILongContextBillingValue(t *t if tt.setup != nil { tt.setup(stub) } - handler := NewAccountHandler(stub, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil) + handler := NewAccountHandler(stub, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil) router := gin.New() tt.mount(router, handler) recorder := httptest.NewRecorder() @@ -99,7 +99,7 @@ func TestAccountAdminBoundariesRejectMalformedOpenAILongContextBillingValue(t *t func TestAccountCreateBoundaryDoesNotApplyOpenAIValidationToOtherPlatforms(t *testing.T) { gin.SetMode(gin.TestMode) - handler := NewAccountHandler(newStubAdminService(), nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil) + handler := NewAccountHandler(newStubAdminService(), nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil) router := gin.New() router.POST("/accounts", handler.Create) recorder := httptest.NewRecorder() @@ -121,7 +121,7 @@ func TestApplyOAuthCredentialsRejectsMalformedOpenAILongContextBillingBeforeMuta Platform: service.PlatformOpenAI, Type: service.AccountTypeOAuth, } - handler := NewAccountHandler(stub, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil) + handler := NewAccountHandler(stub, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil) router := gin.New() router.POST("/accounts/:id/apply-oauth-credentials", handler.ApplyOAuthCredentials) recorder := httptest.NewRecorder() diff --git a/backend/internal/handler/admin/account_handler_mixed_channel_test.go b/backend/internal/handler/admin/account_handler_mixed_channel_test.go index 929dc240f6..a1dc25124e 100644 --- a/backend/internal/handler/admin/account_handler_mixed_channel_test.go +++ b/backend/internal/handler/admin/account_handler_mixed_channel_test.go @@ -15,7 +15,7 @@ import ( func setupAccountMixedChannelRouter(adminSvc *stubAdminService) *gin.Engine { gin.SetMode(gin.TestMode) router := gin.New() - accountHandler := NewAccountHandler(adminSvc, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil) + accountHandler := NewAccountHandler(adminSvc, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil) router.POST("/api/v1/admin/accounts/check-mixed-channel", accountHandler.CheckMixedChannel) router.POST("/api/v1/admin/accounts", accountHandler.Create) router.PUT("/api/v1/admin/accounts/:id", accountHandler.Update) diff --git a/backend/internal/handler/admin/account_handler_passthrough_test.go b/backend/internal/handler/admin/account_handler_passthrough_test.go index d86501c047..a11f2c5195 100644 --- a/backend/internal/handler/admin/account_handler_passthrough_test.go +++ b/backend/internal/handler/admin/account_handler_passthrough_test.go @@ -29,6 +29,7 @@ func TestAccountHandler_Create_AnthropicAPIKeyPassthroughExtraForwarded(t *testi nil, nil, nil, + nil, ) router := gin.New() diff --git a/backend/internal/handler/admin/batch_update_credentials_test.go b/backend/internal/handler/admin/batch_update_credentials_test.go index 0b1b669174..f2cd1e3a1c 100644 --- a/backend/internal/handler/admin/batch_update_credentials_test.go +++ b/backend/internal/handler/admin/batch_update_credentials_test.go @@ -36,7 +36,7 @@ func (f *failingAdminService) UpdateAccount(ctx context.Context, id int64, input func setupAccountHandlerWithService(adminSvc service.AdminService) (*gin.Engine, *AccountHandler) { gin.SetMode(gin.TestMode) router := gin.New() - handler := NewAccountHandler(adminSvc, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil) + handler := NewAccountHandler(adminSvc, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil) router.POST("/api/v1/admin/accounts/batch-update-credentials", handler.BatchUpdateCredentials) return router, handler } diff --git a/backend/internal/handler/admin/grok_import_probe.go b/backend/internal/handler/admin/grok_import_probe.go index f1df15bba9..b42957ce63 100644 --- a/backend/internal/handler/admin/grok_import_probe.go +++ b/backend/internal/handler/admin/grok_import_probe.go @@ -173,6 +173,7 @@ func ProvideAccountHandler( openaiOAuthService *service.OpenAIOAuthService, geminiOAuthService *service.GeminiOAuthService, antigravityOAuthService *service.AntigravityOAuthService, + grokOAuthService service.GrokOAuthTokenService, rateLimitService *service.RateLimitService, accountUsageService *service.AccountUsageService, accountTestService *service.AccountTestService, @@ -189,6 +190,7 @@ func ProvideAccountHandler( openaiOAuthService, geminiOAuthService, antigravityOAuthService, + grokOAuthService, rateLimitService, accountUsageService, accountTestService, diff --git a/backend/internal/handler/admin/grok_import_probe_handler_test.go b/backend/internal/handler/admin/grok_import_probe_handler_test.go index 489a13ae6d..8eeebb23a8 100644 --- a/backend/internal/handler/admin/grok_import_probe_handler_test.go +++ b/backend/internal/handler/admin/grok_import_probe_handler_test.go @@ -101,7 +101,7 @@ func TestAccountCreateWithoutAutomaticGrokProbeServiceStillSucceeds(t *testing.T gin.SetMode(gin.TestMode) handler := NewAccountHandler( newGrokImportAdminService(), - nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ) router := gin.New() diff --git a/backend/internal/server/api_contract_test.go b/backend/internal/server/api_contract_test.go index a5e3fde155..fc6b48d6db 100644 --- a/backend/internal/server/api_contract_test.go +++ b/backend/internal/server/api_contract_test.go @@ -1377,7 +1377,7 @@ func newContractDeps(t *testing.T) *contractDeps { apiKeyHandler := handler.NewAPIKeyHandler(apiKeyService) usageHandler := handler.NewUsageHandler(usageService, apiKeyService, nil, nil) adminSettingHandler := adminhandler.NewSettingHandler(settingService, nil, nil, nil, nil, nil, nil) - adminAccountHandler := adminhandler.NewAccountHandler(adminService, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil) + adminAccountHandler := adminhandler.NewAccountHandler(adminService, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil) jwtAuth := func(c *gin.Context) { c.Set(string(middleware.ContextKeyUser), middleware.AuthSubject{ From 4e4ce440b32cbc86dcf2c4696dcd5994b1d09b49 Mon Sep 17 00:00:00 2001 From: shaw Date: Wed, 15 Jul 2026 16:13:22 +0800 Subject: [PATCH 2/2] fix(test): align duplicate account test with new NewAccountHandler signature --- .../internal/handler/admin/account_handler_duplicate_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/internal/handler/admin/account_handler_duplicate_test.go b/backend/internal/handler/admin/account_handler_duplicate_test.go index c99e882b1c..852c38f654 100644 --- a/backend/internal/handler/admin/account_handler_duplicate_test.go +++ b/backend/internal/handler/admin/account_handler_duplicate_test.go @@ -101,7 +101,7 @@ func setupDuplicateAccountRouter(t *testing.T, svc service.AdminService) *gin.En c.Set(string(middleware2.ContextKeyUser), middleware2.AuthSubject{UserID: 77}) c.Next() }) - handler := NewAccountHandler(svc, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil) + handler := NewAccountHandler(svc, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil) router.POST("/api/v1/admin/accounts/:id/duplicate", handler.Duplicate) return router }