email_cache_integration_test.go 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. //go:build integration
  2. package repository
  3. import (
  4. "errors"
  5. "testing"
  6. "time"
  7. "github.com/Wei-Shaw/sub2api/internal/service"
  8. "github.com/redis/go-redis/v9"
  9. "github.com/stretchr/testify/require"
  10. "github.com/stretchr/testify/suite"
  11. )
  12. type EmailCacheSuite struct {
  13. IntegrationRedisSuite
  14. cache service.EmailCache
  15. }
  16. func (s *EmailCacheSuite) SetupTest() {
  17. s.IntegrationRedisSuite.SetupTest()
  18. s.cache = NewEmailCache(s.rdb)
  19. }
  20. func (s *EmailCacheSuite) TestGetVerificationCode_Missing() {
  21. _, err := s.cache.GetVerificationCode(s.ctx, "nonexistent@example.com")
  22. require.True(s.T(), errors.Is(err, redis.Nil), "expected redis.Nil for missing verification code")
  23. }
  24. func (s *EmailCacheSuite) TestSetAndGetVerificationCode() {
  25. email := "a@example.com"
  26. emailTTL := 2 * time.Minute
  27. data := &service.VerificationCodeData{Code: "123456", Attempts: 1, CreatedAt: time.Now()}
  28. require.NoError(s.T(), s.cache.SetVerificationCode(s.ctx, email, data, emailTTL), "SetVerificationCode")
  29. got, err := s.cache.GetVerificationCode(s.ctx, email)
  30. require.NoError(s.T(), err, "GetVerificationCode")
  31. require.Equal(s.T(), "123456", got.Code)
  32. require.Equal(s.T(), 1, got.Attempts)
  33. }
  34. func (s *EmailCacheSuite) TestVerificationCode_TTL() {
  35. email := "ttl@example.com"
  36. emailTTL := 2 * time.Minute
  37. data := &service.VerificationCodeData{Code: "654321", Attempts: 0, CreatedAt: time.Now()}
  38. require.NoError(s.T(), s.cache.SetVerificationCode(s.ctx, email, data, emailTTL), "SetVerificationCode")
  39. emailKey := verifyCodeKeyPrefix + email
  40. ttl, err := s.rdb.TTL(s.ctx, emailKey).Result()
  41. require.NoError(s.T(), err, "TTL emailKey")
  42. s.AssertTTLWithin(ttl, 1*time.Second, emailTTL)
  43. }
  44. func (s *EmailCacheSuite) TestDeleteVerificationCode() {
  45. email := "delete@example.com"
  46. data := &service.VerificationCodeData{Code: "999999", Attempts: 0, CreatedAt: time.Now()}
  47. require.NoError(s.T(), s.cache.SetVerificationCode(s.ctx, email, data, 2*time.Minute), "SetVerificationCode")
  48. // Verify it exists
  49. _, err := s.cache.GetVerificationCode(s.ctx, email)
  50. require.NoError(s.T(), err, "GetVerificationCode before delete")
  51. // Delete
  52. require.NoError(s.T(), s.cache.DeleteVerificationCode(s.ctx, email), "DeleteVerificationCode")
  53. // Verify it's gone
  54. _, err = s.cache.GetVerificationCode(s.ctx, email)
  55. require.True(s.T(), errors.Is(err, redis.Nil), "expected redis.Nil after delete")
  56. }
  57. func (s *EmailCacheSuite) TestDeleteVerificationCode_NonExistent() {
  58. // Deleting a non-existent key should not error
  59. require.NoError(s.T(), s.cache.DeleteVerificationCode(s.ctx, "nonexistent@example.com"), "DeleteVerificationCode non-existent")
  60. }
  61. func (s *EmailCacheSuite) TestGetVerificationCode_JSONCorruption() {
  62. emailKey := verifyCodeKeyPrefix + "corrupted@example.com"
  63. require.NoError(s.T(), s.rdb.Set(s.ctx, emailKey, "not-json", 1*time.Minute).Err(), "Set invalid JSON")
  64. _, err := s.cache.GetVerificationCode(s.ctx, "corrupted@example.com")
  65. require.Error(s.T(), err, "expected error for corrupted JSON")
  66. require.False(s.T(), errors.Is(err, redis.Nil), "expected decoding error, not redis.Nil")
  67. }
  68. func TestEmailCacheSuite(t *testing.T) {
  69. suite.Run(t, new(EmailCacheSuite))
  70. }