user_group_rate_resolver_test.go 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package service
  2. import (
  3. "context"
  4. "testing"
  5. "time"
  6. gocache "github.com/patrickmn/go-cache"
  7. "github.com/stretchr/testify/require"
  8. )
  9. type userGroupRateResolverRepoStub struct {
  10. UserGroupRateRepository
  11. rate *float64
  12. err error
  13. calls int
  14. }
  15. func (s *userGroupRateResolverRepoStub) GetByUserAndGroup(ctx context.Context, userID, groupID int64) (*float64, error) {
  16. s.calls++
  17. if s.err != nil {
  18. return nil, s.err
  19. }
  20. return s.rate, nil
  21. }
  22. func TestNewUserGroupRateResolver_Defaults(t *testing.T) {
  23. resolver := newUserGroupRateResolver(nil, nil, 0, nil, "")
  24. require.NotNil(t, resolver)
  25. require.NotNil(t, resolver.cache)
  26. require.Equal(t, defaultUserGroupRateCacheTTL, resolver.cacheTTL)
  27. require.NotNil(t, resolver.sf)
  28. require.Equal(t, "service.gateway", resolver.logComponent)
  29. }
  30. func TestUserGroupRateResolverResolve_FallbackForNilResolverAndInvalidIDs(t *testing.T) {
  31. var nilResolver *userGroupRateResolver
  32. require.Equal(t, 1.4, nilResolver.Resolve(context.Background(), 101, 202, 1.4))
  33. resolver := newUserGroupRateResolver(nil, nil, time.Second, nil, "service.test")
  34. require.Equal(t, 1.4, resolver.Resolve(context.Background(), 0, 202, 1.4))
  35. require.Equal(t, 1.4, resolver.Resolve(context.Background(), 101, 0, 1.4))
  36. }
  37. func TestUserGroupRateResolverResolve_InvalidCacheEntryLoadsRepoAndCaches(t *testing.T) {
  38. resetGatewayHotpathStatsForTest()
  39. rate := 1.7
  40. repo := &userGroupRateResolverRepoStub{rate: &rate}
  41. cache := gocache.New(time.Minute, time.Minute)
  42. cache.Set("101:202", "bad-cache", time.Minute)
  43. resolver := newUserGroupRateResolver(repo, cache, time.Minute, nil, "service.test")
  44. got := resolver.Resolve(context.Background(), 101, 202, 1.2)
  45. require.Equal(t, rate, got)
  46. require.Equal(t, 1, repo.calls)
  47. cached, ok := cache.Get("101:202")
  48. require.True(t, ok)
  49. require.Equal(t, rate, cached)
  50. hit, miss, load, _, fallback := GatewayUserGroupRateCacheStats()
  51. require.Equal(t, int64(0), hit)
  52. require.Equal(t, int64(1), miss)
  53. require.Equal(t, int64(1), load)
  54. require.Equal(t, int64(0), fallback)
  55. }
  56. func TestGatewayServiceGetUserGroupRateMultiplier_FallbacksAndUsesExistingResolver(t *testing.T) {
  57. var nilSvc *GatewayService
  58. require.Equal(t, 1.3, nilSvc.getUserGroupRateMultiplier(context.Background(), 101, 202, 1.3))
  59. rate := 1.9
  60. repo := &userGroupRateResolverRepoStub{rate: &rate}
  61. resolver := newUserGroupRateResolver(repo, nil, time.Minute, nil, "service.gateway")
  62. svc := &GatewayService{userGroupRateResolver: resolver}
  63. got := svc.getUserGroupRateMultiplier(context.Background(), 101, 202, 1.2)
  64. require.Equal(t, rate, got)
  65. require.Equal(t, 1, repo.calls)
  66. }