internal/check/rate/limiter_test.go

package rate

import (
	"context"
	"testing"
	"time"
)

func TestLimiter_zeroUnlimited(t *testing.T) {
	l := New(0)
	ctx := context.Background()
	for i := 0; i < 100; i++ {
		if err := l.Wait(ctx); err != nil {
			t.Fatalf("wait: %v", err)
		}
	}
}

func TestLimiter_rateShape(t *testing.T) {
	l := New(20)
	ctx := context.Background()
	start := time.Now()
	for i := 0; i < 10; i++ {
		if err := l.Wait(ctx); err != nil {
			t.Fatalf("wait: %v", err)
		}
	}
	if elapsed := time.Since(start); elapsed > 500*time.Millisecond {
		t.Errorf("10 tokens took %v, rate too slow", elapsed)
	}
}

func TestLimiter_cancel(t *testing.T) {
	l := New(1)
	ctx, cancel := context.WithCancel(context.Background())
	_ = l.Wait(ctx)
	cancel()
	if err := l.Wait(ctx); err == nil {
		t.Errorf("wait after cancel returned nil")
	}
}