proxy_partial_update_test.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. //go:build unit
  2. package admin
  3. import (
  4. "context"
  5. "net/http"
  6. "net/http/httptest"
  7. "strings"
  8. "testing"
  9. "github.com/Wei-Shaw/sub2api/internal/service"
  10. "github.com/gin-gonic/gin"
  11. "github.com/stretchr/testify/require"
  12. )
  13. type proxyPartialUpdateService struct {
  14. service.AdminService
  15. input *service.UpdateProxyInput
  16. }
  17. func (s *proxyPartialUpdateService) UpdateProxy(_ context.Context, _ int64, input *service.UpdateProxyInput) (*service.Proxy, error) {
  18. s.input = input
  19. return &service.Proxy{ID: 9}, nil
  20. }
  21. func TestProxyHandlerUpdatePreservesFieldPresence(t *testing.T) {
  22. gin.SetMode(gin.TestMode)
  23. for _, tc := range []struct {
  24. name, body string
  25. set, clear, warn bool
  26. }{
  27. {name: "omitted", body: `{"status":"inactive"}`},
  28. {name: "null clears", body: `{"expires_at":null,"backup_proxy_id":null,"fallback_mode":"none","expiry_warn_days":0}`, set: true, clear: true, warn: true},
  29. {name: "zero clears expiry", body: `{"expires_at":0,"backup_proxy_id":null}`, set: true, clear: true},
  30. {name: "values", body: `{"expires_at":1800000000,"backup_proxy_id":10,"fallback_mode":"proxy","expiry_warn_days":7}`, set: true, warn: true},
  31. } {
  32. t.Run(tc.name, func(t *testing.T) {
  33. svc := &proxyPartialUpdateService{}
  34. router := gin.New()
  35. router.PUT("/proxies/:id", NewProxyHandler(svc).Update)
  36. w := httptest.NewRecorder()
  37. req := httptest.NewRequest(http.MethodPut, "/proxies/9", strings.NewReader(tc.body))
  38. req.Header.Set("Content-Type", "application/json")
  39. router.ServeHTTP(w, req)
  40. require.Equal(t, http.StatusOK, w.Code, w.Body.String())
  41. require.NotNil(t, svc.input)
  42. require.Equal(t, tc.set, svc.input.ExpiresAt != nil || svc.input.ClearExpiresAt)
  43. require.Equal(t, tc.set, svc.input.BackupProxyID != nil || svc.input.ClearBackupID)
  44. require.Equal(t, tc.warn, svc.input.ExpiryWarnDays != nil)
  45. if !tc.set || tc.clear {
  46. require.Nil(t, svc.input.ExpiresAt)
  47. require.Nil(t, svc.input.BackupProxyID)
  48. } else {
  49. require.Equal(t, int64(1800000000), svc.input.ExpiresAt.Unix())
  50. require.Equal(t, int64(10), *svc.input.BackupProxyID)
  51. }
  52. })
  53. }
  54. }