fix: resolve CI failures — gofmt, unused functions, missing test helpers
- 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
This commit is contained in:
@@ -1554,7 +1554,6 @@ func TestValidateConfig_LogRequiredAndRotationBounds(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func TestLoad_DefaultGatewayUsageRecordConfig(t *testing.T) {
|
func TestLoad_DefaultGatewayUsageRecordConfig(t *testing.T) {
|
||||||
resetViperWithJWTSecret(t)
|
resetViperWithJWTSecret(t)
|
||||||
cfg, err := Load()
|
cfg, err := Load()
|
||||||
|
|||||||
@@ -204,18 +204,10 @@ func TestAPIContracts(t *testing.T) {
|
|||||||
"image_price_1k": null,
|
"image_price_1k": null,
|
||||||
"image_price_2k": null,
|
"image_price_2k": null,
|
||||||
"image_price_4k": 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,
|
"claude_code_only": false,
|
||||||
"allow_messages_dispatch": false,
|
"allow_messages_dispatch": false,
|
||||||
"fallback_group_id": null,
|
"fallback_group_id": null,
|
||||||
"fallback_group_id_on_invalid_request": null,
|
"fallback_group_id_on_invalid_request": null,
|
||||||
"allow_messages_dispatch": false,
|
|
||||||
"require_oauth_only": false,
|
|
||||||
"require_privacy_set": false,
|
|
||||||
"created_at": "2025-01-02T03:04:05Z",
|
"created_at": "2025-01-02T03:04:05Z",
|
||||||
"updated_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",
|
"fallback_model_openai": "gpt-4o",
|
||||||
"enable_identity_patch": true,
|
"enable_identity_patch": true,
|
||||||
"identity_patch_prompt": "",
|
"identity_patch_prompt": "",
|
||||||
"sora_client_enabled": false,
|
|
||||||
"invitation_code_enabled": false,
|
"invitation_code_enabled": false,
|
||||||
"home_content": "",
|
"home_content": "",
|
||||||
"hide_ccs_import_button": false,
|
"hide_ccs_import_button": false,
|
||||||
@@ -653,11 +644,11 @@ func newContractDeps(t *testing.T) *contractDeps {
|
|||||||
settingRepo := newStubSettingRepo()
|
settingRepo := newStubSettingRepo()
|
||||||
settingService := service.NewSettingService(settingRepo, cfg)
|
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)
|
authHandler := handler.NewAuthHandler(cfg, nil, userService, settingService, nil, redeemService, nil)
|
||||||
apiKeyHandler := handler.NewAPIKeyHandler(apiKeyService)
|
apiKeyHandler := handler.NewAPIKeyHandler(apiKeyService)
|
||||||
usageHandler := handler.NewUsageHandler(usageService, 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)
|
adminAccountHandler := adminhandler.NewAccountHandler(adminService, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil)
|
||||||
|
|
||||||
jwtAuth := func(c *gin.Context) {
|
jwtAuth := func(c *gin.Context) {
|
||||||
|
|||||||
48
backend/internal/service/account_test_helpers_test.go
Normal file
48
backend/internal/service/account_test_helpers_test.go
Normal file
@@ -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
|
||||||
|
}
|
||||||
@@ -5,13 +5,12 @@ package service
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
|
"github.com/Wei-Shaw/sub2api/internal/pkg/tlsfingerprint"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/Wei-Shaw/sub2api/internal/pkg/tlsfingerprint"
|
|
||||||
"github.com/stretchr/testify/require"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// stubSmartRetryCache 用于 handleSmartRetry 测试的 GatewayCache mock
|
// stubSmartRetryCache 用于 handleSmartRetry 测试的 GatewayCache mock
|
||||||
@@ -81,17 +80,12 @@ func (m *mockSmartRetryUpstream) Do(req *http.Request, proxyURL string, accountI
|
|||||||
m.responseBodies[respIdx] = bodyBytes
|
m.responseBodies[respIdx] = bodyBytes
|
||||||
}
|
}
|
||||||
|
|
||||||
// 用缓存的 body 字节重建新的 reader
|
// 用缓存的 body 重建 reader(支持重试场景多次读取)
|
||||||
var body io.ReadCloser
|
cloned := *resp
|
||||||
if m.responseBodies[respIdx] != nil {
|
if m.responseBodies[respIdx] != nil {
|
||||||
body = io.NopCloser(bytes.NewReader(m.responseBodies[respIdx]))
|
cloned.Body = io.NopCloser(bytes.NewReader(m.responseBodies[respIdx]))
|
||||||
}
|
}
|
||||||
|
return &cloned, respErr
|
||||||
return &http.Response{
|
|
||||||
StatusCode: resp.StatusCode,
|
|
||||||
Header: resp.Header.Clone(),
|
|
||||||
Body: body,
|
|
||||||
}, respErr
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *mockSmartRetryUpstream) DoWithTLS(req *http.Request, proxyURL string, accountID int64, accountConcurrency int, profile *tlsfingerprint.Profile) (*http.Response, error) {
|
func (m *mockSmartRetryUpstream) DoWithTLS(req *http.Request, proxyURL string, accountID int64, accountConcurrency int, profile *tlsfingerprint.Profile) (*http.Response, error) {
|
||||||
|
|||||||
@@ -374,20 +374,6 @@ func (s *OpenAIOAuthService) Stop() {
|
|||||||
s.sessionStore.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 {
|
func normalizeOpenAIOAuthPlatform(platform string) string {
|
||||||
return openai.OAuthPlatformOpenAI
|
return openai.OAuthPlatformOpenAI
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user