update_cache_integration_test.go 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. //go:build integration
  2. package repository
  3. import (
  4. "errors"
  5. "testing"
  6. "time"
  7. "github.com/redis/go-redis/v9"
  8. "github.com/stretchr/testify/require"
  9. "github.com/stretchr/testify/suite"
  10. )
  11. type UpdateCacheSuite struct {
  12. IntegrationRedisSuite
  13. cache *updateCache
  14. }
  15. func (s *UpdateCacheSuite) SetupTest() {
  16. s.IntegrationRedisSuite.SetupTest()
  17. s.cache = NewUpdateCache(s.rdb).(*updateCache)
  18. }
  19. func (s *UpdateCacheSuite) TestGetUpdateInfo_Missing() {
  20. _, err := s.cache.GetUpdateInfo(s.ctx)
  21. require.True(s.T(), errors.Is(err, redis.Nil), "expected redis.Nil for missing update info")
  22. }
  23. func (s *UpdateCacheSuite) TestSetAndGetUpdateInfo() {
  24. updateTTL := 5 * time.Minute
  25. require.NoError(s.T(), s.cache.SetUpdateInfo(s.ctx, "v1.2.3", updateTTL), "SetUpdateInfo")
  26. info, err := s.cache.GetUpdateInfo(s.ctx)
  27. require.NoError(s.T(), err, "GetUpdateInfo")
  28. require.Equal(s.T(), "v1.2.3", info, "update info mismatch")
  29. }
  30. func (s *UpdateCacheSuite) TestSetUpdateInfo_TTL() {
  31. updateTTL := 5 * time.Minute
  32. require.NoError(s.T(), s.cache.SetUpdateInfo(s.ctx, "v1.2.3", updateTTL))
  33. ttl, err := s.rdb.TTL(s.ctx, updateCacheKey).Result()
  34. require.NoError(s.T(), err, "TTL updateCacheKey")
  35. s.AssertTTLWithin(ttl, 1*time.Second, updateTTL)
  36. }
  37. func (s *UpdateCacheSuite) TestSetUpdateInfo_Overwrite() {
  38. require.NoError(s.T(), s.cache.SetUpdateInfo(s.ctx, "v1.0.0", 5*time.Minute))
  39. require.NoError(s.T(), s.cache.SetUpdateInfo(s.ctx, "v2.0.0", 5*time.Minute))
  40. info, err := s.cache.GetUpdateInfo(s.ctx)
  41. require.NoError(s.T(), err)
  42. require.Equal(s.T(), "v2.0.0", info, "expected overwritten value")
  43. }
  44. func (s *UpdateCacheSuite) TestSetUpdateInfo_ZeroTTL() {
  45. // TTL=0 means persist forever (no expiry) in Redis SET command
  46. require.NoError(s.T(), s.cache.SetUpdateInfo(s.ctx, "v0.0.0", 0))
  47. info, err := s.cache.GetUpdateInfo(s.ctx)
  48. require.NoError(s.T(), err)
  49. require.Equal(s.T(), "v0.0.0", info)
  50. ttl, err := s.rdb.TTL(s.ctx, updateCacheKey).Result()
  51. require.NoError(s.T(), err)
  52. // TTL=-1 means no expiry, TTL=-2 means key doesn't exist
  53. require.Equal(s.T(), time.Duration(-1), ttl, "expected TTL=-1 for key with no expiry")
  54. }
  55. func TestUpdateCacheSuite(t *testing.T) {
  56. suite.Run(t, new(UpdateCacheSuite))
  57. }