Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 
 

150 rindas
4.0 KiB

  1. package middleware
  2. import (
  3. "net/http"
  4. "net/http/httptest"
  5. "testing"
  6. "github.com/QuantumNous/new-api/setting/system_setting"
  7. "github.com/gin-gonic/gin"
  8. "github.com/stretchr/testify/assert"
  9. )
  10. func TestSyncAuth_Disabled(t *testing.T) {
  11. gin.SetMode(gin.TestMode)
  12. router := gin.New()
  13. router.Use(SyncAuth())
  14. router.GET("/test", func(c *gin.Context) {
  15. c.JSON(http.StatusOK, gin.H{"success": true})
  16. })
  17. // 未启用区域同步
  18. settings := system_setting.GetRegionSyncSettings()
  19. settings.Enabled = false
  20. req, _ := http.NewRequest("GET", "/test", nil)
  21. req.Header.Set("X-Sync-API-Key", "test-key")
  22. req.Header.Set("X-Sync-Node", "slave-1")
  23. w := httptest.NewRecorder()
  24. router.ServeHTTP(w, req)
  25. assert.Equal(t, http.StatusForbidden, w.Code)
  26. assert.Contains(t, w.Body.String(), "region sync is not enabled")
  27. }
  28. func TestSyncAuth_MissingAPIKey(t *testing.T) {
  29. gin.SetMode(gin.TestMode)
  30. router := gin.New()
  31. router.Use(SyncAuth())
  32. router.GET("/test", func(c *gin.Context) {
  33. c.JSON(http.StatusOK, gin.H{"success": true})
  34. })
  35. settings := system_setting.GetRegionSyncSettings()
  36. settings.Enabled = true
  37. settings.SyncApiKey = "test-key"
  38. req, _ := http.NewRequest("GET", "/test", nil)
  39. req.Header.Set("X-Sync-Node", "slave-1")
  40. w := httptest.NewRecorder()
  41. router.ServeHTTP(w, req)
  42. assert.Equal(t, http.StatusUnauthorized, w.Code)
  43. assert.Contains(t, w.Body.String(), "missing sync API key")
  44. }
  45. func TestSyncAuth_InvalidAPIKey(t *testing.T) {
  46. gin.SetMode(gin.TestMode)
  47. router := gin.New()
  48. router.Use(SyncAuth())
  49. router.GET("/test", func(c *gin.Context) {
  50. c.JSON(http.StatusOK, gin.H{"success": true})
  51. })
  52. settings := system_setting.GetRegionSyncSettings()
  53. settings.Enabled = true
  54. settings.SyncApiKey = "correct-key"
  55. req, _ := http.NewRequest("GET", "/test", nil)
  56. req.Header.Set("X-Sync-API-Key", "wrong-key")
  57. req.Header.Set("X-Sync-Node", "slave-1")
  58. w := httptest.NewRecorder()
  59. router.ServeHTTP(w, req)
  60. assert.Equal(t, http.StatusUnauthorized, w.Code)
  61. assert.Contains(t, w.Body.String(), "invalid sync API key")
  62. }
  63. func TestSyncAuth_MissingNode(t *testing.T) {
  64. gin.SetMode(gin.TestMode)
  65. router := gin.New()
  66. router.Use(SyncAuth())
  67. router.GET("/test", func(c *gin.Context) {
  68. c.JSON(http.StatusOK, gin.H{"success": true})
  69. })
  70. settings := system_setting.GetRegionSyncSettings()
  71. settings.Enabled = true
  72. settings.SyncApiKey = "test-key"
  73. req, _ := http.NewRequest("GET", "/test", nil)
  74. req.Header.Set("X-Sync-API-Key", "test-key")
  75. w := httptest.NewRecorder()
  76. router.ServeHTTP(w, req)
  77. assert.Equal(t, http.StatusBadRequest, w.Code)
  78. assert.Contains(t, w.Body.String(), "missing sync node identifier")
  79. }
  80. func TestSyncAuth_Valid(t *testing.T) {
  81. gin.SetMode(gin.TestMode)
  82. router := gin.New()
  83. router.Use(SyncAuth())
  84. router.GET("/test", func(c *gin.Context) {
  85. node := GetSyncNode(c)
  86. c.JSON(http.StatusOK, gin.H{
  87. "success": true,
  88. "node": node,
  89. })
  90. })
  91. settings := system_setting.GetRegionSyncSettings()
  92. settings.Enabled = true
  93. settings.SyncApiKey = "test-key"
  94. req, _ := http.NewRequest("GET", "/test", nil)
  95. req.Header.Set("X-Sync-API-Key", "test-key")
  96. req.Header.Set("X-Sync-Node", "slave-1")
  97. w := httptest.NewRecorder()
  98. router.ServeHTTP(w, req)
  99. assert.Equal(t, http.StatusOK, w.Code)
  100. assert.Contains(t, w.Body.String(), "slave-1")
  101. }
  102. func TestValidateSyncAPIKey_Single(t *testing.T) {
  103. assert.True(t, validateSyncAPIKey("test-key", "test-key"))
  104. assert.False(t, validateSyncAPIKey("test-key", "different-key"))
  105. assert.False(t, validateSyncAPIKey("", ""))
  106. }
  107. func TestValidateSyncAPIKey_Multiple(t *testing.T) {
  108. // 支持逗号分隔的多个 key
  109. assert.True(t, validateSyncAPIKey("key1", "key1,key2,key3"))
  110. assert.True(t, validateSyncAPIKey("key2", "key1,key2,key3"))
  111. assert.True(t, validateSyncAPIKey("key3", "key1,key2,key3"))
  112. assert.False(t, validateSyncAPIKey("key4", "key1,key2,key3"))
  113. }
  114. func TestValidateSyncAPIKey_TrimSpace(t *testing.T) {
  115. // 去除前后空格
  116. assert.True(t, validateSyncAPIKey("test-key", " test-key "))
  117. assert.True(t, validateSyncAPIKey("test-key", " test-key"))
  118. assert.True(t, validateSyncAPIKey("test-key", "test-key "))
  119. }