| 12345678910111213141516171819202122232425262728293031323334353637383940 |
- //go:build protectionintegration
- package repository
- import (
- "context"
- "github.com/Wei-Shaw/sub2api/internal/service"
- "github.com/stretchr/testify/require"
- "sync"
- "testing"
- "time"
- )
- func TestRateLimitObservationCannotShortenConcurrentCooldown(t *testing.T) {
- client, db := protectionTestDatabase(t)
- repo := newAccountRepositoryWithSQL(client, db, nil)
- ctx := context.Background()
- a := &service.Account{Name: "cooldown-observation", Platform: service.PlatformOpenAI, Type: service.AccountTypeOAuth, Status: service.StatusActive, Concurrency: 4}
- require.NoError(t, repo.Create(ctx, a))
- later := time.Now().Add(time.Hour).UTC().Truncate(time.Second)
- require.NoError(t, repo.SetRateLimited(ctx, a.ID, later))
- var wg sync.WaitGroup
- errors := make(chan error, 8)
- for i := 0; i < 8; i++ {
- wg.Add(1)
- go func() { defer wg.Done(); errors <- repo.SetRateLimited(ctx, a.ID, time.Now().Add(5*time.Second)) }()
- }
- wg.Wait()
- close(errors)
- for err := range errors {
- require.NoError(t, err)
- }
- current, err := repo.GetByID(ctx, a.ID)
- require.NoError(t, err)
- require.True(t, later.Equal(*current.RateLimitResetAt), "the longest cooldown instant must survive regardless of database timezone")
- require.NoError(t, repo.ClearRateLimit(ctx, a.ID), "explicit administrator recovery remains available")
- current, err = repo.GetByID(ctx, a.ID)
- require.NoError(t, err)
- require.Nil(t, current.RateLimitResetAt)
- }
|