admin_balance_history_test.go 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. package service
  2. import (
  3. "testing"
  4. "time"
  5. "github.com/Wei-Shaw/sub2api/internal/pkg/pagination"
  6. "github.com/stretchr/testify/require"
  7. )
  8. func TestMergeBalanceHistoryCodesIncludesAffiliateTransfersByDefault(t *testing.T) {
  9. t.Parallel()
  10. now := time.Date(2026, 5, 3, 12, 0, 0, 0, time.UTC)
  11. older := now.Add(-2 * time.Hour)
  12. newer := now.Add(time.Hour)
  13. usedBy := int64(10)
  14. redeemCodes := []RedeemCode{
  15. {
  16. ID: 1,
  17. Type: RedeemTypeBalance,
  18. Value: 8,
  19. Status: StatusUsed,
  20. UsedBy: &usedBy,
  21. UsedAt: &now,
  22. CreatedAt: now,
  23. },
  24. {
  25. ID: 2,
  26. Type: RedeemTypeConcurrency,
  27. Value: 1,
  28. Status: StatusUsed,
  29. UsedBy: &usedBy,
  30. UsedAt: &older,
  31. CreatedAt: older,
  32. },
  33. }
  34. affiliateCodes := []RedeemCode{
  35. {
  36. ID: -20,
  37. Type: RedeemTypeAffiliateBalance,
  38. Value: 3.5,
  39. Status: StatusUsed,
  40. UsedBy: &usedBy,
  41. UsedAt: &newer,
  42. CreatedAt: newer,
  43. },
  44. }
  45. got := mergeBalanceHistoryCodes(redeemCodes, affiliateCodes, pagination.PaginationParams{
  46. Page: 1,
  47. PageSize: 2,
  48. })
  49. require.Len(t, got, 2)
  50. require.Equal(t, RedeemTypeAffiliateBalance, got[0].Type)
  51. require.Equal(t, RedeemTypeBalance, got[1].Type)
  52. }
  53. func TestMergeBalanceHistoryCodesPaginatesAfterCombiningSources(t *testing.T) {
  54. t.Parallel()
  55. base := time.Date(2026, 5, 3, 12, 0, 0, 0, time.UTC)
  56. usedBy := int64(10)
  57. at := func(hours int) *time.Time {
  58. v := base.Add(time.Duration(hours) * time.Hour)
  59. return &v
  60. }
  61. got := mergeBalanceHistoryCodes(
  62. []RedeemCode{
  63. {ID: 1, Type: RedeemTypeBalance, UsedBy: &usedBy, UsedAt: at(4), CreatedAt: *at(4)},
  64. {ID: 2, Type: RedeemTypeConcurrency, UsedBy: &usedBy, UsedAt: at(2), CreatedAt: *at(2)},
  65. },
  66. []RedeemCode{
  67. {ID: -3, Type: RedeemTypeAffiliateBalance, UsedBy: &usedBy, UsedAt: at(3), CreatedAt: *at(3)},
  68. {ID: -4, Type: RedeemTypeAffiliateBalance, UsedBy: &usedBy, UsedAt: at(1), CreatedAt: *at(1)},
  69. },
  70. pagination.PaginationParams{Page: 2, PageSize: 2},
  71. )
  72. require.Len(t, got, 2)
  73. require.Equal(t, RedeemTypeConcurrency, got[0].Type)
  74. require.Equal(t, int64(-4), got[1].ID)
  75. }