From 93b42ccfeae28ee33f904b5a35b131d9719d348e Mon Sep 17 00:00:00 2001 From: erio Date: Sun, 5 Apr 2026 13:52:48 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20resolve=20CI=20failures=20=E2=80=94=20go?= =?UTF-8?q?fmt,=20unused=20functions,=20missing=20test=20helpers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Run gofmt on user schema, config test, group handler - Remove unused mergeGroupIDs function - Restore shared test helpers (newJSONResponse, queuedHTTPUpstream) that were in deleted Sora test file --- backend/internal/config/config_test.go | 1 - backend/internal/server/api_contract_test.go | 19 ++------ .../service/account_test_helpers_test.go | 48 +++++++++++++++++++ .../service/antigravity_smart_retry_test.go | 18 +++---- .../internal/service/openai_oauth_service.go | 14 ------ 5 files changed, 59 insertions(+), 41 deletions(-) create mode 100644 backend/internal/service/account_test_helpers_test.go diff --git a/backend/internal/config/config_test.go b/backend/internal/config/config_test.go index 2ee8e2bc..2de5451e 100644 --- a/backend/internal/config/config_test.go +++ b/backend/internal/config/config_test.go @@ -1554,7 +1554,6 @@ func TestValidateConfig_LogRequiredAndRotationBounds(t *testing.T) { } } - func TestLoad_DefaultGatewayUsageRecordConfig(t *testing.T) { resetViperWithJWTSecret(t) cfg, err := Load() diff --git a/backend/internal/server/api_contract_test.go b/backend/internal/server/api_contract_test.go index 450c3122..d7aaabfd 100644 --- a/backend/internal/server/api_contract_test.go +++ b/backend/internal/server/api_contract_test.go @@ -204,18 +204,10 @@ func TestAPIContracts(t *testing.T) { "image_price_1k": null, "image_price_2k": null, "image_price_4k": null, - "sora_image_price_360": null, - "sora_image_price_540": null, - "sora_storage_quota_bytes": 0, - "sora_video_price_per_request": null, - "sora_video_price_per_request_hd": null, "claude_code_only": false, - "allow_messages_dispatch": false, - "fallback_group_id": null, - "fallback_group_id_on_invalid_request": null, - "allow_messages_dispatch": false, - "require_oauth_only": false, - "require_privacy_set": false, + "allow_messages_dispatch": false, + "fallback_group_id": null, + "fallback_group_id_on_invalid_request": null, "created_at": "2025-01-02T03:04:05Z", "updated_at": "2025-01-02T03:04:05Z" } @@ -532,7 +524,6 @@ func TestAPIContracts(t *testing.T) { "fallback_model_openai": "gpt-4o", "enable_identity_patch": true, "identity_patch_prompt": "", - "sora_client_enabled": false, "invitation_code_enabled": false, "home_content": "", "hide_ccs_import_button": false, @@ -653,11 +644,11 @@ func newContractDeps(t *testing.T) *contractDeps { settingRepo := newStubSettingRepo() settingService := service.NewSettingService(settingRepo, cfg) - adminService := service.NewAdminService(userRepo, groupRepo, &accountRepo, nil, proxyRepo, apiKeyRepo, redeemRepo, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil) + adminService := service.NewAdminService(userRepo, groupRepo, &accountRepo, proxyRepo, apiKeyRepo, redeemRepo, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil) authHandler := handler.NewAuthHandler(cfg, nil, userService, settingService, nil, redeemService, nil) apiKeyHandler := handler.NewAPIKeyHandler(apiKeyService) usageHandler := handler.NewUsageHandler(usageService, apiKeyService) - adminSettingHandler := adminhandler.NewSettingHandler(settingService, nil, nil, nil, nil) + adminSettingHandler := adminhandler.NewSettingHandler(settingService, nil, nil, nil) adminAccountHandler := adminhandler.NewAccountHandler(adminService, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil) jwtAuth := func(c *gin.Context) { diff --git a/backend/internal/service/account_test_helpers_test.go b/backend/internal/service/account_test_helpers_test.go new file mode 100644 index 00000000..3154b199 --- /dev/null +++ b/backend/internal/service/account_test_helpers_test.go @@ -0,0 +1,48 @@ +package service + +import ( + "fmt" + "io" + "net/http" + "strings" + + "github.com/Wei-Shaw/sub2api/internal/pkg/tlsfingerprint" +) + +// queuedHTTPUpstream is a test helper that serves pre-loaded responses in order. +type queuedHTTPUpstream struct { + responses []*http.Response + requests []*http.Request + tlsFlags []bool +} + +func (u *queuedHTTPUpstream) Do(_ *http.Request, _ string, _ int64, _ int) (*http.Response, error) { + return nil, fmt.Errorf("unexpected Do call") +} + +func (u *queuedHTTPUpstream) DoWithTLS(req *http.Request, _ string, _ int64, _ int, profile *tlsfingerprint.Profile) (*http.Response, error) { + u.requests = append(u.requests, req) + u.tlsFlags = append(u.tlsFlags, profile != nil) + if len(u.responses) == 0 { + return nil, fmt.Errorf("no mocked response") + } + resp := u.responses[0] + u.responses = u.responses[1:] + return resp, nil +} + +// newJSONResponse creates a simple HTTP response for testing. +func newJSONResponse(status int, body string) *http.Response { + return &http.Response{ + StatusCode: status, + Header: make(http.Header), + Body: io.NopCloser(strings.NewReader(body)), + } +} + +// newJSONResponseWithHeader creates a JSON response with a custom header. +func newJSONResponseWithHeader(status int, body, key, value string) *http.Response { + resp := newJSONResponse(status, body) + resp.Header.Set(key, value) + return resp +} diff --git a/backend/internal/service/antigravity_smart_retry_test.go b/backend/internal/service/antigravity_smart_retry_test.go index ecaffcbc..e3b60a27 100644 --- a/backend/internal/service/antigravity_smart_retry_test.go +++ b/backend/internal/service/antigravity_smart_retry_test.go @@ -5,13 +5,12 @@ package service import ( "bytes" "context" + "github.com/Wei-Shaw/sub2api/internal/pkg/tlsfingerprint" + "github.com/stretchr/testify/require" "io" "net/http" "strings" "testing" - - "github.com/Wei-Shaw/sub2api/internal/pkg/tlsfingerprint" - "github.com/stretchr/testify/require" ) // stubSmartRetryCache 用于 handleSmartRetry 测试的 GatewayCache mock @@ -81,17 +80,12 @@ func (m *mockSmartRetryUpstream) Do(req *http.Request, proxyURL string, accountI m.responseBodies[respIdx] = bodyBytes } - // 用缓存的 body 字节重建新的 reader - var body io.ReadCloser + // 用缓存的 body 重建 reader(支持重试场景多次读取) + cloned := *resp if m.responseBodies[respIdx] != nil { - body = io.NopCloser(bytes.NewReader(m.responseBodies[respIdx])) + cloned.Body = io.NopCloser(bytes.NewReader(m.responseBodies[respIdx])) } - - return &http.Response{ - StatusCode: resp.StatusCode, - Header: resp.Header.Clone(), - Body: body, - }, respErr + return &cloned, respErr } func (m *mockSmartRetryUpstream) DoWithTLS(req *http.Request, proxyURL string, accountID int64, accountConcurrency int, profile *tlsfingerprint.Profile) (*http.Response, error) { diff --git a/backend/internal/service/openai_oauth_service.go b/backend/internal/service/openai_oauth_service.go index 202df8e8..dc094d43 100644 --- a/backend/internal/service/openai_oauth_service.go +++ b/backend/internal/service/openai_oauth_service.go @@ -374,20 +374,6 @@ func (s *OpenAIOAuthService) Stop() { s.sessionStore.Stop() } -func (s *OpenAIOAuthService) resolveProxyURL(ctx context.Context, proxyID *int64) (string, error) { - if proxyID == nil { - return "", nil - } - proxy, err := s.proxyRepo.GetByID(ctx, *proxyID) - if err != nil { - return "", infraerrors.Newf(http.StatusBadRequest, "OPENAI_OAUTH_PROXY_NOT_FOUND", "proxy not found: %v", err) - } - if proxy == nil { - return "", nil - } - return proxy.URL(), nil -} - func normalizeOpenAIOAuthPlatform(platform string) string { return openai.OAuthPlatformOpenAI }