user_handler_activity_test.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. //go:build unit
  2. package admin
  3. import (
  4. "encoding/json"
  5. "net/http"
  6. "net/http/httptest"
  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. func TestUserHandlerListIncludesActivityFieldsAndSortParams(t *testing.T) {
  14. gin.SetMode(gin.TestMode)
  15. lastLoginAt := time.Date(2026, 4, 20, 8, 0, 0, 0, time.UTC)
  16. lastActiveAt := lastLoginAt.Add(30 * time.Minute)
  17. lastUsedAt := lastLoginAt.Add(90 * time.Minute)
  18. adminSvc := newStubAdminService()
  19. adminSvc.users = []service.User{
  20. {
  21. ID: 7,
  22. Email: "activity@example.com",
  23. Username: "activity-user",
  24. Role: service.RoleUser,
  25. Status: service.StatusActive,
  26. LastActiveAt: &lastActiveAt,
  27. LastUsedAt: &lastUsedAt,
  28. CreatedAt: lastLoginAt.Add(-24 * time.Hour),
  29. UpdatedAt: lastLoginAt,
  30. },
  31. }
  32. handler := NewUserHandler(adminSvc, nil, nil, nil, nil, nil, nil)
  33. recorder := httptest.NewRecorder()
  34. c, _ := gin.CreateTestContext(recorder)
  35. c.Request = httptest.NewRequest(
  36. http.MethodGet,
  37. "/api/v1/admin/users?sort_by=last_used_at&sort_order=asc&search=activity",
  38. nil,
  39. )
  40. handler.List(c)
  41. require.Equal(t, http.StatusOK, recorder.Code)
  42. require.Equal(t, "last_used_at", adminSvc.lastListUsers.sortBy)
  43. require.Equal(t, "asc", adminSvc.lastListUsers.sortOrder)
  44. require.Equal(t, "activity", adminSvc.lastListUsers.filters.Search)
  45. var resp struct {
  46. Code int `json:"code"`
  47. Data struct {
  48. Items []struct {
  49. LastActiveAt *time.Time `json:"last_active_at"`
  50. LastUsedAt *time.Time `json:"last_used_at"`
  51. } `json:"items"`
  52. } `json:"data"`
  53. }
  54. require.NoError(t, json.Unmarshal(recorder.Body.Bytes(), &resp))
  55. require.Equal(t, 0, resp.Code)
  56. require.Len(t, resp.Data.Items, 1)
  57. require.WithinDuration(t, lastActiveAt, *resp.Data.Items[0].LastActiveAt, time.Second)
  58. require.WithinDuration(t, lastUsedAt, *resp.Data.Items[0].LastUsedAt, time.Second)
  59. }
  60. func TestUserHandlerGetByIDIncludesActivityFields(t *testing.T) {
  61. gin.SetMode(gin.TestMode)
  62. lastLoginAt := time.Date(2026, 4, 20, 8, 0, 0, 0, time.UTC)
  63. lastActiveAt := lastLoginAt.Add(30 * time.Minute)
  64. lastUsedAt := lastLoginAt.Add(90 * time.Minute)
  65. adminSvc := newStubAdminService()
  66. adminSvc.users = []service.User{
  67. {
  68. ID: 8,
  69. Email: "detail@example.com",
  70. Username: "detail-user",
  71. Role: service.RoleUser,
  72. Status: service.StatusActive,
  73. LastActiveAt: &lastActiveAt,
  74. LastUsedAt: &lastUsedAt,
  75. CreatedAt: lastLoginAt.Add(-24 * time.Hour),
  76. UpdatedAt: lastLoginAt,
  77. },
  78. }
  79. handler := NewUserHandler(adminSvc, nil, nil, nil, nil, nil, nil)
  80. recorder := httptest.NewRecorder()
  81. c, _ := gin.CreateTestContext(recorder)
  82. c.Params = gin.Params{{Key: "id", Value: "8"}}
  83. c.Request = httptest.NewRequest(http.MethodGet, "/api/v1/admin/users/8", nil)
  84. handler.GetByID(c)
  85. require.Equal(t, http.StatusOK, recorder.Code)
  86. var resp struct {
  87. Code int `json:"code"`
  88. Data struct {
  89. LastActiveAt *time.Time `json:"last_active_at"`
  90. LastUsedAt *time.Time `json:"last_used_at"`
  91. } `json:"data"`
  92. }
  93. require.NoError(t, json.Unmarshal(recorder.Body.Bytes(), &resp))
  94. require.Equal(t, 0, resp.Code)
  95. require.WithinDuration(t, lastActiveAt, *resp.Data.LastActiveAt, time.Second)
  96. require.WithinDuration(t, lastUsedAt, *resp.Data.LastUsedAt, time.Second)
  97. }