gateway_cache_integration_test.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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/stretchr/testify/require"
  9. "github.com/stretchr/testify/suite"
  10. )
  11. type GatewayCacheSuite struct {
  12. IntegrationRedisSuite
  13. cache service.GatewayCache
  14. }
  15. func (s *GatewayCacheSuite) SetupTest() {
  16. s.IntegrationRedisSuite.SetupTest()
  17. s.cache = NewGatewayCache(s.rdb)
  18. }
  19. func (s *GatewayCacheSuite) TestGetSessionAccountID_Missing() {
  20. _, err := s.cache.GetSessionAccountID(s.ctx, 1, "nonexistent")
  21. require.True(s.T(), errors.Is(err, service.ErrStickySessionNotFound), "expected ErrStickySessionNotFound for missing session")
  22. }
  23. func (s *GatewayCacheSuite) TestSetAndGetSessionAccountID() {
  24. sessionID := "s1"
  25. accountID := int64(99)
  26. groupID := int64(1)
  27. sessionTTL := 1 * time.Minute
  28. require.NoError(s.T(), s.cache.SetSessionAccountID(s.ctx, groupID, sessionID, accountID, sessionTTL), "SetSessionAccountID")
  29. sid, err := s.cache.GetSessionAccountID(s.ctx, groupID, sessionID)
  30. require.NoError(s.T(), err, "GetSessionAccountID")
  31. require.Equal(s.T(), accountID, sid, "session id mismatch")
  32. }
  33. func (s *GatewayCacheSuite) TestSessionAccountID_TTL() {
  34. sessionID := "s2"
  35. accountID := int64(100)
  36. groupID := int64(1)
  37. sessionTTL := 1 * time.Minute
  38. require.NoError(s.T(), s.cache.SetSessionAccountID(s.ctx, groupID, sessionID, accountID, sessionTTL), "SetSessionAccountID")
  39. sessionKey := buildSessionKey(groupID, sessionID)
  40. ttl, err := s.rdb.TTL(s.ctx, sessionKey).Result()
  41. require.NoError(s.T(), err, "TTL sessionKey after Set")
  42. s.AssertTTLWithin(ttl, 1*time.Second, sessionTTL)
  43. }
  44. func (s *GatewayCacheSuite) TestRefreshSessionTTL() {
  45. sessionID := "s3"
  46. accountID := int64(101)
  47. groupID := int64(1)
  48. initialTTL := 1 * time.Minute
  49. refreshTTL := 3 * time.Minute
  50. require.NoError(s.T(), s.cache.SetSessionAccountID(s.ctx, groupID, sessionID, accountID, initialTTL), "SetSessionAccountID")
  51. require.NoError(s.T(), s.cache.RefreshSessionTTL(s.ctx, groupID, sessionID, refreshTTL), "RefreshSessionTTL")
  52. sessionKey := buildSessionKey(groupID, sessionID)
  53. ttl, err := s.rdb.TTL(s.ctx, sessionKey).Result()
  54. require.NoError(s.T(), err, "TTL after Refresh")
  55. s.AssertTTLWithin(ttl, 1*time.Second, refreshTTL)
  56. }
  57. func (s *GatewayCacheSuite) TestRefreshSessionTTL_MissingKey() {
  58. // RefreshSessionTTL on a missing key should not error (no-op)
  59. err := s.cache.RefreshSessionTTL(s.ctx, 1, "missing-session", 1*time.Minute)
  60. require.NoError(s.T(), err, "RefreshSessionTTL on missing key should not error")
  61. }
  62. func (s *GatewayCacheSuite) TestDeleteSessionAccountID() {
  63. sessionID := "openai:s4"
  64. accountID := int64(102)
  65. groupID := int64(1)
  66. sessionTTL := 1 * time.Minute
  67. require.NoError(s.T(), s.cache.SetSessionAccountID(s.ctx, groupID, sessionID, accountID, sessionTTL), "SetSessionAccountID")
  68. require.NoError(s.T(), s.cache.DeleteSessionAccountID(s.ctx, groupID, sessionID), "DeleteSessionAccountID")
  69. _, err := s.cache.GetSessionAccountID(s.ctx, groupID, sessionID)
  70. require.True(s.T(), errors.Is(err, service.ErrStickySessionNotFound), "expected ErrStickySessionNotFound after delete")
  71. }
  72. func (s *GatewayCacheSuite) TestGetSessionAccountID_CorruptedValue() {
  73. sessionID := "corrupted"
  74. groupID := int64(1)
  75. sessionKey := buildSessionKey(groupID, sessionID)
  76. // Set a non-integer value
  77. require.NoError(s.T(), s.rdb.Set(s.ctx, sessionKey, "not-a-number", 1*time.Minute).Err(), "Set invalid value")
  78. _, err := s.cache.GetSessionAccountID(s.ctx, groupID, sessionID)
  79. require.Error(s.T(), err, "expected error for corrupted value")
  80. require.False(s.T(), errors.Is(err, service.ErrStickySessionNotFound), "expected parsing error, not a miss")
  81. }
  82. func TestGatewayCacheSuite(t *testing.T) {
  83. suite.Run(t, new(GatewayCacheSuite))
  84. }