redeem_code_test.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. package service
  2. import (
  3. "testing"
  4. "time"
  5. "github.com/stretchr/testify/require"
  6. )
  7. func TestRedeemCodeExpiry(t *testing.T) {
  8. now := time.Now().UTC()
  9. past := now.Add(-time.Hour)
  10. future := now.Add(time.Hour)
  11. tests := []struct {
  12. name string
  13. code RedeemCode
  14. wantExpired bool
  15. wantCanUse bool
  16. }{
  17. {
  18. name: "unused without expiry can be used",
  19. code: RedeemCode{Status: StatusUnused},
  20. wantExpired: false,
  21. wantCanUse: true,
  22. },
  23. {
  24. name: "unused before expiry can be used",
  25. code: RedeemCode{Status: StatusUnused, ExpiresAt: &future},
  26. wantExpired: false,
  27. wantCanUse: true,
  28. },
  29. {
  30. name: "unused after expiry cannot be used",
  31. code: RedeemCode{Status: StatusUnused, ExpiresAt: &past},
  32. wantExpired: true,
  33. wantCanUse: false,
  34. },
  35. {
  36. name: "explicit expired status is expired",
  37. code: RedeemCode{Status: StatusExpired},
  38. wantExpired: true,
  39. wantCanUse: false,
  40. },
  41. {
  42. name: "used code remains used even after expiry time",
  43. code: RedeemCode{Status: StatusUsed, ExpiresAt: &past},
  44. wantExpired: false,
  45. wantCanUse: false,
  46. },
  47. }
  48. for _, tt := range tests {
  49. t.Run(tt.name, func(t *testing.T) {
  50. require.Equal(t, tt.wantExpired, tt.code.IsExpiredAt(now))
  51. require.Equal(t, tt.wantCanUse, tt.code.CanUse())
  52. })
  53. }
  54. }