data_management_handler_test.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package admin
  2. import (
  3. "encoding/json"
  4. "net/http"
  5. "net/http/httptest"
  6. "path/filepath"
  7. "testing"
  8. "time"
  9. "github.com/Wei-Shaw/sub2api/internal/service"
  10. "github.com/gin-gonic/gin"
  11. "github.com/stretchr/testify/require"
  12. )
  13. type apiEnvelope struct {
  14. Code int `json:"code"`
  15. Message string `json:"message"`
  16. Reason string `json:"reason"`
  17. Data json.RawMessage `json:"data"`
  18. }
  19. func TestDataManagementHandler_AgentHealthAlways200(t *testing.T) {
  20. gin.SetMode(gin.TestMode)
  21. svc := service.NewDataManagementServiceWithOptions(filepath.Join(t.TempDir(), "missing.sock"), 50*time.Millisecond)
  22. h := NewDataManagementHandler(svc)
  23. r := gin.New()
  24. r.GET("/api/v1/admin/data-management/agent/health", h.GetAgentHealth)
  25. rec := httptest.NewRecorder()
  26. req := httptest.NewRequest(http.MethodGet, "/api/v1/admin/data-management/agent/health", nil)
  27. r.ServeHTTP(rec, req)
  28. require.Equal(t, http.StatusOK, rec.Code)
  29. var envelope apiEnvelope
  30. require.NoError(t, json.Unmarshal(rec.Body.Bytes(), &envelope))
  31. require.Equal(t, 0, envelope.Code)
  32. var data struct {
  33. Enabled bool `json:"enabled"`
  34. Reason string `json:"reason"`
  35. SocketPath string `json:"socket_path"`
  36. }
  37. require.NoError(t, json.Unmarshal(envelope.Data, &data))
  38. require.False(t, data.Enabled)
  39. require.Equal(t, service.DataManagementDeprecatedReason, data.Reason)
  40. require.Equal(t, svc.SocketPath(), data.SocketPath)
  41. }
  42. func TestDataManagementHandler_NonHealthRouteReturns503WhenDisabled(t *testing.T) {
  43. gin.SetMode(gin.TestMode)
  44. svc := service.NewDataManagementServiceWithOptions(filepath.Join(t.TempDir(), "missing.sock"), 50*time.Millisecond)
  45. h := NewDataManagementHandler(svc)
  46. r := gin.New()
  47. r.GET("/api/v1/admin/data-management/config", h.GetConfig)
  48. rec := httptest.NewRecorder()
  49. req := httptest.NewRequest(http.MethodGet, "/api/v1/admin/data-management/config", nil)
  50. r.ServeHTTP(rec, req)
  51. require.Equal(t, http.StatusServiceUnavailable, rec.Code)
  52. var envelope apiEnvelope
  53. require.NoError(t, json.Unmarshal(rec.Body.Bytes(), &envelope))
  54. require.Equal(t, http.StatusServiceUnavailable, envelope.Code)
  55. require.Equal(t, service.DataManagementDeprecatedReason, envelope.Reason)
  56. }
  57. func TestNormalizeBackupIdempotencyKey(t *testing.T) {
  58. require.Equal(t, "from-header", normalizeBackupIdempotencyKey("from-header", "from-body"))
  59. require.Equal(t, "from-body", normalizeBackupIdempotencyKey(" ", " from-body "))
  60. require.Equal(t, "", normalizeBackupIdempotencyKey("", ""))
  61. }