refactor: Fix race condition in chaos service and update Redis rate limiter test mocks

- Add copy method to Experiment struct to create deep copy with proper Finished pointer handling
- Return experiment copy from RunExperiment to prevent race condition with JSON marshaling
- Update mock Eval calls to use float64 for window parameter instead of int64 in redis_ratelimit_test.go
- Update comments to reflect correct parameter types: now (int64), window (float64), limit (int64)
This commit is contained in:
nutcas3
2026-04-25 06:54:29 +03:00
parent 0220dc5b52
commit f6ec659fe9
2 changed files with 27 additions and 6 deletions
@@ -64,8 +64,8 @@ func TestRedisRateLimiter_Allow(t *testing.T) {
cmd := redis.NewCmd(context.Background())
cmd.SetVal(mockResult)
// Match the actual call signature: script, key, now, window, limit
mockClient.On("Eval", mock.AnythingOfType("string"), mock.AnythingOfType("string"), mock.AnythingOfType("int64"), mock.AnythingOfType("int64"), mock.AnythingOfType("int64")).Return(cmd)
// Match the actual call signature: script, key, now (int64), window (float64), limit (int64)
mockClient.On("Eval", mock.AnythingOfType("string"), mock.AnythingOfType("string"), mock.AnythingOfType("int64"), mock.AnythingOfType("float64"), mock.AnythingOfType("int64")).Return(cmd)
// Create rate limiter with mock client
limiter := NewRedisRateLimiter(mockClient, "test", tt.limit, tt.window)
@@ -116,7 +116,7 @@ func TestRedisRateLimitMiddleware(t *testing.T) {
// Mock successful rate limit check
cmd := redis.NewCmd(context.Background())
cmd.SetVal([]any{int64(1), int64(4), int64(time.Now().Unix() + 60)})
mockClient.On("Eval", mock.AnythingOfType("string"), mock.AnythingOfType("string"), mock.AnythingOfType("int64"), mock.AnythingOfType("int64"), mock.AnythingOfType("int64")).Return(cmd)
mockClient.On("Eval", mock.AnythingOfType("string"), mock.AnythingOfType("string"), mock.AnythingOfType("int64"), mock.AnythingOfType("float64"), mock.AnythingOfType("int64")).Return(cmd)
// Create rate limiter with mock client
limiter := NewRedisRateLimiter(mockClient, "test", 5, time.Minute)
@@ -272,8 +272,8 @@ func TestMultiTierRateLimiter(t *testing.T) {
premiumCmd := redis.NewCmd(context.Background())
premiumCmd.SetVal([]any{int64(1), int64(99), int64(time.Now().Unix() + 60)})
mockClient.On("Eval", mock.AnythingOfType("string"), mock.AnythingOfType("string"), mock.AnythingOfType("int64"), mock.AnythingOfType("int64"), mock.AnythingOfType("int64")).Return(freeCmd).Once()
mockClient.On("Eval", mock.AnythingOfType("string"), mock.AnythingOfType("string"), mock.AnythingOfType("int64"), mock.AnythingOfType("int64"), mock.AnythingOfType("int64")).Return(premiumCmd).Once()
mockClient.On("Eval", mock.AnythingOfType("string"), mock.AnythingOfType("string"), mock.AnythingOfType("int64"), mock.AnythingOfType("float64"), mock.AnythingOfType("int64")).Return(freeCmd).Once()
mockClient.On("Eval", mock.AnythingOfType("string"), mock.AnythingOfType("string"), mock.AnythingOfType("int64"), mock.AnythingOfType("float64"), mock.AnythingOfType("int64")).Return(premiumCmd).Once()
// Create multi-tier rate limiter with mock client
tiers := map[string]struct {