admin_service_proxy_quality_test.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. package service
  2. import (
  3. "context"
  4. "net/http"
  5. "net/http/httptest"
  6. "testing"
  7. "github.com/stretchr/testify/require"
  8. )
  9. func TestFinalizeProxyQualityResult_ScoreAndGrade(t *testing.T) {
  10. result := &ProxyQualityCheckResult{
  11. PassedCount: 2,
  12. WarnCount: 1,
  13. FailedCount: 1,
  14. ChallengeCount: 1,
  15. }
  16. finalizeProxyQualityResult(result)
  17. require.Equal(t, 38, result.Score)
  18. require.Equal(t, "F", result.Grade)
  19. require.Contains(t, result.Summary, "通过 2 项")
  20. require.Contains(t, result.Summary, "告警 1 项")
  21. require.Contains(t, result.Summary, "失败 1 项")
  22. require.Contains(t, result.Summary, "挑战 1 项")
  23. }
  24. func TestRunProxyQualityTarget_CloudflareChallenge(t *testing.T) {
  25. server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
  26. w.Header().Set("Content-Type", "text/html")
  27. w.Header().Set("cf-ray", "test-ray-123")
  28. w.WriteHeader(http.StatusForbidden)
  29. _, _ = w.Write([]byte("<!DOCTYPE html><title>Just a moment...</title><script>window._cf_chl_opt={};</script>"))
  30. }))
  31. defer server.Close()
  32. target := proxyQualityTarget{
  33. Target: "openai",
  34. URL: server.URL,
  35. Method: http.MethodGet,
  36. AllowedStatuses: map[int]struct{}{
  37. http.StatusUnauthorized: {},
  38. },
  39. }
  40. item := runProxyQualityTarget(context.Background(), server.Client(), target)
  41. require.Equal(t, "challenge", item.Status)
  42. require.Equal(t, http.StatusForbidden, item.HTTPStatus)
  43. require.Equal(t, "test-ray-123", item.CFRay)
  44. }
  45. func TestRunProxyQualityTarget_AllowedStatusPass(t *testing.T) {
  46. server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
  47. w.WriteHeader(http.StatusOK)
  48. _, _ = w.Write([]byte(`{"models":[]}`))
  49. }))
  50. defer server.Close()
  51. target := proxyQualityTarget{
  52. Target: "gemini",
  53. URL: server.URL,
  54. Method: http.MethodGet,
  55. AllowedStatuses: map[int]struct{}{
  56. http.StatusOK: {},
  57. },
  58. }
  59. item := runProxyQualityTarget(context.Background(), server.Client(), target)
  60. require.Equal(t, "pass", item.Status)
  61. require.Equal(t, http.StatusOK, item.HTTPStatus)
  62. }
  63. func TestRunProxyQualityTarget_AllowedStatusPassForUnauthorized(t *testing.T) {
  64. server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
  65. w.WriteHeader(http.StatusUnauthorized)
  66. _, _ = w.Write([]byte(`{"error":"unauthorized"}`))
  67. }))
  68. defer server.Close()
  69. target := proxyQualityTarget{
  70. Target: "openai",
  71. URL: server.URL,
  72. Method: http.MethodGet,
  73. AllowedStatuses: map[int]struct{}{
  74. http.StatusUnauthorized: {},
  75. },
  76. }
  77. item := runProxyQualityTarget(context.Background(), server.Client(), target)
  78. require.Equal(t, "pass", item.Status)
  79. require.Equal(t, http.StatusUnauthorized, item.HTTPStatus)
  80. require.Contains(t, item.Message, "目标可达")
  81. }
  82. func TestProxyQualityTargets_IncludesGrok(t *testing.T) {
  83. var grokTarget *proxyQualityTarget
  84. for i := range proxyQualityTargets {
  85. if proxyQualityTargets[i].Target == "grok" {
  86. grokTarget = &proxyQualityTargets[i]
  87. break
  88. }
  89. }
  90. require.NotNil(t, grokTarget)
  91. require.Equal(t, "https://api.x.ai/v1/models", grokTarget.URL)
  92. require.Equal(t, http.MethodGet, grokTarget.Method)
  93. require.Contains(t, grokTarget.AllowedStatuses, http.StatusUnauthorized)
  94. }
  95. func TestRunProxyQualityTarget_GrokUnauthorizedPasses(t *testing.T) {
  96. server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  97. if r.Method != http.MethodGet {
  98. t.Errorf("unexpected method: %s", r.Method)
  99. }
  100. w.WriteHeader(http.StatusUnauthorized)
  101. _, _ = w.Write([]byte(`{"error":"unauthorized"}`))
  102. }))
  103. defer server.Close()
  104. target := proxyQualityTarget{
  105. Target: "grok",
  106. URL: server.URL,
  107. Method: http.MethodGet,
  108. AllowedStatuses: map[int]struct{}{
  109. http.StatusUnauthorized: {},
  110. },
  111. }
  112. item := runProxyQualityTarget(context.Background(), server.Client(), target)
  113. require.Equal(t, "grok", item.Target)
  114. require.Equal(t, "pass", item.Status)
  115. require.Equal(t, http.StatusUnauthorized, item.HTTPStatus)
  116. require.Contains(t, item.Message, "目标可达")
  117. }