admin_service_batch_limits_test.go 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. //go:build unit
  2. package service
  3. import (
  4. "context"
  5. "errors"
  6. "testing"
  7. "github.com/stretchr/testify/require"
  8. )
  9. type batchLimitsUserRepoStub struct {
  10. *userRepoStub
  11. calls int
  12. userIDs []int64
  13. concurrency *int
  14. rpmLimit *int
  15. affected int
  16. err error
  17. }
  18. func (s *batchLimitsUserRepoStub) BatchUpdateLimits(_ context.Context, userIDs []int64, concurrency, rpmLimit *int) (int, error) {
  19. s.calls++
  20. s.userIDs = append([]int64(nil), userIDs...)
  21. s.concurrency = cloneBatchLimitValue(concurrency)
  22. s.rpmLimit = cloneBatchLimitValue(rpmLimit)
  23. return s.affected, s.err
  24. }
  25. func cloneBatchLimitValue(value *int) *int {
  26. if value == nil {
  27. return nil
  28. }
  29. cloned := *value
  30. return &cloned
  31. }
  32. func TestAdminServiceBatchUpdateLimitsPassesOnlyProvidedFields(t *testing.T) {
  33. concurrency := 0
  34. repo := &batchLimitsUserRepoStub{
  35. userRepoStub: &userRepoStub{},
  36. affected: 2,
  37. }
  38. invalidator := &authCacheInvalidatorStub{}
  39. service := &adminServiceImpl{userRepo: repo, authCacheInvalidator: invalidator}
  40. affected, err := service.BatchUpdateLimits(
  41. context.Background(),
  42. []int64{3, 0, 3, 7, -1},
  43. &concurrency,
  44. nil,
  45. )
  46. require.NoError(t, err)
  47. require.Equal(t, 2, affected)
  48. require.Equal(t, []int64{3, 7}, repo.userIDs)
  49. require.Equal(t, pointerToInt(0), repo.concurrency)
  50. require.Nil(t, repo.rpmLimit)
  51. require.Equal(t, []int64{3, 7}, invalidator.userIDs)
  52. }
  53. func TestAdminServiceBatchUpdateLimitsDoesNotInvalidateCacheOnRepositoryError(t *testing.T) {
  54. rpmLimit := 60
  55. repo := &batchLimitsUserRepoStub{
  56. userRepoStub: &userRepoStub{},
  57. err: errors.New("database unavailable"),
  58. }
  59. invalidator := &authCacheInvalidatorStub{}
  60. service := &adminServiceImpl{userRepo: repo, authCacheInvalidator: invalidator}
  61. affected, err := service.BatchUpdateLimits(context.Background(), []int64{1, 2}, nil, &rpmLimit)
  62. require.EqualError(t, err, "database unavailable")
  63. require.Zero(t, affected)
  64. require.Empty(t, invalidator.userIDs)
  65. }
  66. func TestAdminServiceBatchUpdateLimitsRequiresAField(t *testing.T) {
  67. repo := &batchLimitsUserRepoStub{userRepoStub: &userRepoStub{}}
  68. service := &adminServiceImpl{userRepo: repo, authCacheInvalidator: &authCacheInvalidatorStub{}}
  69. affected, err := service.BatchUpdateLimits(context.Background(), []int64{1}, nil, nil)
  70. require.Error(t, err)
  71. require.Zero(t, affected)
  72. require.Zero(t, repo.calls)
  73. }
  74. func pointerToInt(value int) *int {
  75. return &value
  76. }