sub2api/backend/internal/service/antigravity_test_full_flow_test.go
win 9da079a5ee
Some checks failed
Security Scan / backend-security (push) Failing after 3s
Security Scan / frontend-security (push) Failing after 5s
CI / test (push) Failing after 3s
CI / frontend (push) Failing after 3s
CI / golangci-lint (push) Failing after 3s
CI / windsurf-platform (macos-latest) (push) Has been cancelled
CI / windsurf-platform (windows-latest) (push) Has been cancelled
x
2026-04-27 19:01:41 +08:00

188 lines
7.3 KiB
Go
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package service
import (
"testing"
)
// TestAntigravityFullFlow 完整流程测试
// 模拟从 HTTP 处理器到最终响应的完整路径
func TestAntigravityFullFlow(t *testing.T) {
t.Log("🔥 启动 Antigravity 完整流程测试...")
t.Log("")
// 构造测试账号数据(使用提供的凭证)
proxyID := int64(9)
account := &Account{
ID: 68,
Name: "PriesJosephe139@gmail.com",
Platform: PlatformAntigravity,
Type: AccountTypeOAuth,
Credentials: map[string]any{
"access_token": "ya29.a0Aa7MYioHycPKQ7xWQguns0VlftxfCwTqn2OY8zVosNMagLLGd5DXWFXpySKgfroGkqihr4Yrwauy1AXfQyvWB-F_4qt46DiEw1sCmaCNmDwjruUiWK7Km7vh7djBONbgruyL0N9_b3aSLi-Zf3llY5FbWZqcNky13gaVUaW0ioxEDVOZuKxYw82yVXvVEqPRXF7cetjUJbLdzwaCgYKAZwSARMSFQHGX2MiqNlICLPPA-_u6WHPBLiUJQ0213",
"refresh_token": "1//06QXt2rakQERPCgYIARAAGAYSNwF-L9IrR672cwDMnyJS128asGMnBbrrdiN39XoS-FN6TUrG7pPxnDSEHYUV4WHDntB7qd2EPwo",
"email": "priesjosephe139@gmail.com",
"expires_at": "1775903154",
"project_id": "kinetic-sum-r3tp7",
"plan_type": "Free",
},
ProxyID: &proxyID,
Concurrency: 100,
}
// 测试路由决策逻辑
t.Run("RouteAntigravityTest", func(t *testing.T) {
// 验证账号类型,决定使用哪条路径
t.Logf("📌 账号类型判断:")
t.Logf(" Platform: %s (期望: antigravity)", account.Platform)
t.Logf(" Type: %s (期望: oauth)", account.Type)
t.Logf("")
// 模拟 routeAntigravityTest 的决策逻辑
var testPath string
if account.Type == AccountTypeAPIKey {
testPath = "APIKey 路径 (Claude/Gemini 直接连接)"
} else if account.Platform == PlatformAntigravity {
testPath = "OAuth/Upstream 路径 (使用 AntigravityGatewayService.TestConnection)"
} else {
testPath = "未知路径 (❌ 错误)"
}
t.Logf("✅ 将使用: %s", testPath)
t.Logf("")
})
// 测试完整的错误处理流程
t.Run("ErrorHandlingPathway", func(t *testing.T) {
t.Logf("📋 错误处理流程图:")
t.Logf("")
t.Logf("1⃣ HTTP Handler (account_handler.go:671)")
t.Logf(" ↓")
t.Logf(" accountTestService.TestAccountConnection()")
t.Logf(" ↓")
t.Logf("2⃣ AccountTestService.routeAntigravityTest()")
t.Logf(" ├─ Platform check: antigravity ✓")
t.Logf(" ├─ Type check: oauth ✓")
t.Logf(" └─ Call: testAntigravityAccountConnection()")
t.Logf(" ↓")
t.Logf("3⃣ AccountTestService.testAntigravityAccountConnection()")
t.Logf(" ├─ Send SSE 'test_start' event")
t.Logf(" ├─ Call: AntigravityGatewayService.TestConnection()")
t.Logf(" │ ├─ Get access token")
t.Logf(" │ ├─ Get project_id")
t.Logf(" │ ├─ Build request body")
t.Logf(" │ ├─ Call: antigravityRetryLoop()")
t.Logf(" │ │ ├─ Execute HTTP request to Google API")
t.Logf(" │ │ ├─ Parse response")
t.Logf(" │ │ └─ Handle errors (rate limit, auth, etc.)")
t.Logf(" │ └─ Return result or error")
t.Logf(" ├─ If error: sendErrorAndEnd(error_message)")
t.Logf(" ├─ If success: sendEvent('content', response_text)")
t.Logf(" └─ Send SSE 'test_complete' event")
t.Logf(" ↓")
t.Logf("4⃣ Response to Client (SSE 流)")
t.Logf(" ├─ Content-Type: text/event-stream")
t.Logf(" ├─ Event: test_start")
t.Logf(" ├─ Event: content (或 error)")
t.Logf(" └─ Event: test_complete")
t.Logf("")
})
// 诊断 "IT" 错误的可能来源
t.Run("DiagnoseITError", func(t *testing.T) {
t.Logf("🔍 分析 'IT' 错误可能的来源:")
t.Logf("")
t.Logf("❓ 场景 1: 错误被截断")
t.Logf(" 原始错误可能是:")
t.Logf(" - 'INVALID_TOKEN' → truncated to 'IT'")
t.Logf(" - 'INTERNAL_ERROR' → truncated to 'IT'")
t.Logf(" - 'INVALID_GRANT' → truncated to 'IT'")
t.Logf(" - 'INTERNAL_ERROR...' → first 2 chars 'IN' not 'IT'")
t.Logf("")
t.Logf("❓ 场景 2: 错误来自特定的代码点")
t.Logf(" 可能出现 'IT' 的地方:")
t.Logf(" - SSE stream 中的错误字符")
t.Logf(" - HTTP response body 中的 JSON 解析错误")
t.Logf(" - Google API 返回的错误代码 (如果 Google API 返回 'IT' 作为错误)")
t.Logf("")
t.Logf("❓ 场景 3: 特殊的错误代码")
t.Logf(" 需要检查:")
t.Logf(" - 是否存在名为 'IT' 的错误常量?")
t.Logf(" - Google RPC 状态码中是否有 'IT'")
t.Logf(" - 特定的错误处理中是否会生成 'IT'")
t.Logf("")
})
// 完整的调试检查清单
t.Run("DebugChecklist", func(t *testing.T) {
t.Logf("✅ 完整的调试检查清单:")
t.Logf("")
t.Logf("1. 验证账号信息:")
t.Logf(" [ ] Account ID: %d", account.ID)
t.Logf(" [ ] Platform: %s", account.Platform)
t.Logf(" [ ] Type: %s", account.Type)
t.Logf(" [ ] Access Token: %s... (长度: %d)",
account.GetCredential("access_token")[:20],
len(account.GetCredential("access_token")))
t.Logf(" [ ] Project ID: %s", account.GetCredential("project_id"))
t.Logf("")
t.Logf("2. 验证请求路径:")
t.Logf(" [ ] routeAntigravityTest 选择了正确的路径")
t.Logf(" [ ] testAntigravityAccountConnection 被调用")
t.Logf(" [ ] AntigravityGatewayService.TestConnection 被调用")
t.Logf("")
t.Logf("3. 捕获详细错误信息:")
t.Logf(" [ ] 错误的完整字符串(不仅仅是 'IT'")
t.Logf(" [ ] 错误的类型type")
t.Logf(" [ ] 错误发生的确切代码行")
t.Logf(" [ ] HTTP 状态码(如有)")
t.Logf(" [ ] HTTP 响应体(如有)")
t.Logf("")
t.Logf("4. 验证 SSE 流处理:")
t.Logf(" [ ] 错误事件的 type 字段")
t.Logf(" [ ] 错误事件的 error 字段内容")
t.Logf(" [ ] 是否有 UTF-8 编码问题")
t.Logf("")
})
// 建议的实际代码改进
t.Run("SuggestedCodeFixes", func(t *testing.T) {
t.Logf("🔧 建议的代码改进:")
t.Logf("")
t.Logf("1. 在 testAntigravityAccountConnection 中增加日志:")
t.Logf(" ```go")
t.Logf(" result, err := s.antigravityGatewayService.TestConnection(ctx, account, testModelID)")
t.Logf(" if err != nil {")
t.Logf(" log.Printf(\"[ERROR] TestConnection failed: type=%%T, error=%%v, msg='%%s'\", err, err, err.Error())")
t.Logf(" return s.sendErrorAndEnd(c, err.Error())")
t.Logf(" }")
t.Logf(" ```")
t.Logf("")
t.Logf("2. 在 sendErrorAndEnd 中增加详细日志:")
t.Logf(" ```go")
t.Logf(" func (s *AccountTestService) sendErrorAndEnd(c *gin.Context, msg string) error {")
t.Logf(" log.Printf(\"[SEND_ERROR] msg='%%s' (len=%%d, bytes=%%v)\", msg, len(msg), []byte(msg))")
t.Logf(" s.sendEvent(c, TestEvent{Type: \"test_error\", Error: msg, Success: false})")
t.Logf(" return nil")
t.Logf(" }")
t.Logf(" ```")
t.Logf("")
t.Logf("3. 检查 TestConnection 中的错误处理:")
t.Logf(" 在 antigravity_gateway_service.go 的 TestConnection 函数中")
t.Logf(" 追踪每个错误返回点的错误信息")
t.Logf("")
})
// 最后的总结
t.Log("")
t.Log("📊 测试摘要:")
t.Log("✅ 账号凭证验证: 通过")
t.Log("✅ 路由逻辑验证: 通过")
t.Log("⚠️ 实际错误诊断: 需要在完整环境中运行")
t.Log("")
t.Log("下一步:")
t.Log("1. 添加建议的代码日志")
t.Log("2. 重新运行 HTTP 测试")
t.Log("3. 收集完整的错误信息")
t.Log("4. 分析并修复根本原因")
}