user_cleanup_handler_test.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. package admin
  2. import (
  3. "bytes"
  4. "net/http"
  5. "net/http/httptest"
  6. "testing"
  7. "github.com/Wei-Shaw/sub2api/internal/server/middleware"
  8. "github.com/gin-gonic/gin"
  9. "github.com/stretchr/testify/require"
  10. )
  11. func TestUserCleanupHandlerDeniesUnauthorizedRoles(t *testing.T) {
  12. gin.SetMode(gin.TestMode)
  13. for _, role := range []string{"", "user", "system"} {
  14. for _, endpoint := range []string{"summary", "preview", "execute", "get-guard", "put-guard"} {
  15. t.Run(role+"/"+endpoint, func(t *testing.T) {
  16. h := NewUserCleanupHandler(nil)
  17. r := gin.New()
  18. if role != "" {
  19. r.Use(func(c *gin.Context) {
  20. c.Set(string(middleware.ContextKeyUser), middleware.AuthSubject{UserID: 9})
  21. c.Set(string(middleware.ContextKeyUserRole), role)
  22. })
  23. }
  24. handlers := map[string]gin.HandlerFunc{"summary": h.Summary, "preview": h.Preview, "execute": h.Execute, "get-guard": h.GetGuard, "put-guard": h.UpdateGuard}
  25. r.POST("/test", handlers[endpoint])
  26. rec := httptest.NewRecorder()
  27. r.ServeHTTP(rec, httptest.NewRequest(http.MethodPost, "/test", nil))
  28. status := http.StatusForbidden
  29. if role == "" {
  30. status = http.StatusUnauthorized
  31. }
  32. require.Equal(t, status, rec.Code)
  33. })
  34. }
  35. }
  36. }
  37. func TestUserCleanupHandlerRequiresConfirmation(t *testing.T) {
  38. gin.SetMode(gin.TestMode)
  39. r := gin.New()
  40. r.Use(func(c *gin.Context) {
  41. c.Set(string(middleware.ContextKeyUser), middleware.AuthSubject{UserID: 9})
  42. c.Set(string(middleware.ContextKeyUserRole), "admin")
  43. })
  44. h := NewUserCleanupHandler(nil)
  45. r.POST("/execute", h.Execute)
  46. for _, body := range []string{`{}`, `{"preview_id":"xxxxxxxx","confirm":true,"expected_count":1}`, `{"preview_id":"11111111-1111-4111-8111-111111111111","confirm":false,"expected_count":1}`, `{"preview_id":"11111111-1111-4111-8111-111111111111","confirm":true,"expected_count":501}`} {
  47. rec := httptest.NewRecorder()
  48. req := httptest.NewRequest(http.MethodPost, "/execute", bytes.NewBufferString(body))
  49. req.Header.Set("Content-Type", "application/json")
  50. r.ServeHTTP(rec, req)
  51. require.Equal(t, http.StatusBadRequest, rec.Code)
  52. }
  53. }