| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- //go:build unit
- package admin
- import (
- "encoding/json"
- "net/http"
- "net/http/httptest"
- "testing"
- "time"
- "github.com/Wei-Shaw/sub2api/internal/service"
- "github.com/gin-gonic/gin"
- "github.com/stretchr/testify/require"
- )
- func TestUserHandlerListIncludesActivityFieldsAndSortParams(t *testing.T) {
- gin.SetMode(gin.TestMode)
- lastLoginAt := time.Date(2026, 4, 20, 8, 0, 0, 0, time.UTC)
- lastActiveAt := lastLoginAt.Add(30 * time.Minute)
- lastUsedAt := lastLoginAt.Add(90 * time.Minute)
- adminSvc := newStubAdminService()
- adminSvc.users = []service.User{
- {
- ID: 7,
- Email: "activity@example.com",
- Username: "activity-user",
- Role: service.RoleUser,
- Status: service.StatusActive,
- LastActiveAt: &lastActiveAt,
- LastUsedAt: &lastUsedAt,
- CreatedAt: lastLoginAt.Add(-24 * time.Hour),
- UpdatedAt: lastLoginAt,
- },
- }
- handler := NewUserHandler(adminSvc, nil, nil, nil, nil, nil, nil)
- recorder := httptest.NewRecorder()
- c, _ := gin.CreateTestContext(recorder)
- c.Request = httptest.NewRequest(
- http.MethodGet,
- "/api/v1/admin/users?sort_by=last_used_at&sort_order=asc&search=activity",
- nil,
- )
- handler.List(c)
- require.Equal(t, http.StatusOK, recorder.Code)
- require.Equal(t, "last_used_at", adminSvc.lastListUsers.sortBy)
- require.Equal(t, "asc", adminSvc.lastListUsers.sortOrder)
- require.Equal(t, "activity", adminSvc.lastListUsers.filters.Search)
- var resp struct {
- Code int `json:"code"`
- Data struct {
- Items []struct {
- LastActiveAt *time.Time `json:"last_active_at"`
- LastUsedAt *time.Time `json:"last_used_at"`
- } `json:"items"`
- } `json:"data"`
- }
- require.NoError(t, json.Unmarshal(recorder.Body.Bytes(), &resp))
- require.Equal(t, 0, resp.Code)
- require.Len(t, resp.Data.Items, 1)
- require.WithinDuration(t, lastActiveAt, *resp.Data.Items[0].LastActiveAt, time.Second)
- require.WithinDuration(t, lastUsedAt, *resp.Data.Items[0].LastUsedAt, time.Second)
- }
- func TestUserHandlerGetByIDIncludesActivityFields(t *testing.T) {
- gin.SetMode(gin.TestMode)
- lastLoginAt := time.Date(2026, 4, 20, 8, 0, 0, 0, time.UTC)
- lastActiveAt := lastLoginAt.Add(30 * time.Minute)
- lastUsedAt := lastLoginAt.Add(90 * time.Minute)
- adminSvc := newStubAdminService()
- adminSvc.users = []service.User{
- {
- ID: 8,
- Email: "detail@example.com",
- Username: "detail-user",
- Role: service.RoleUser,
- Status: service.StatusActive,
- LastActiveAt: &lastActiveAt,
- LastUsedAt: &lastUsedAt,
- CreatedAt: lastLoginAt.Add(-24 * time.Hour),
- UpdatedAt: lastLoginAt,
- },
- }
- handler := NewUserHandler(adminSvc, nil, nil, nil, nil, nil, nil)
- recorder := httptest.NewRecorder()
- c, _ := gin.CreateTestContext(recorder)
- c.Params = gin.Params{{Key: "id", Value: "8"}}
- c.Request = httptest.NewRequest(http.MethodGet, "/api/v1/admin/users/8", nil)
- handler.GetByID(c)
- require.Equal(t, http.StatusOK, recorder.Code)
- var resp struct {
- Code int `json:"code"`
- Data struct {
- LastActiveAt *time.Time `json:"last_active_at"`
- LastUsedAt *time.Time `json:"last_used_at"`
- } `json:"data"`
- }
- require.NoError(t, json.Unmarshal(recorder.Body.Bytes(), &resp))
- require.Equal(t, 0, resp.Code)
- require.WithinDuration(t, lastActiveAt, *resp.Data.LastActiveAt, time.Second)
- require.WithinDuration(t, lastUsedAt, *resp.Data.LastUsedAt, time.Second)
- }
|