package outcome import ( "context" "errors" "testing" domain "proxy-pool/internal/domain/outcome" ) type metricsRecorder struct { events []domain.Event dropped int } func (recorder *metricsRecorder) Observe(event domain.Event) { recorder.events = append(recorder.events, event) } func (recorder *metricsRecorder) ObserveDropped() { recorder.dropped++ } func TestQueueBatchesWithoutBlockingAndCountsOverflow(t *testing.T) { queue, err := NewQueue(QueueOptions{Capacity: 2, MaxBatch: 2}) if err != nil { t.Fatalf("NewQueue() = %v", err) } queue.Record(domain.Event{ProxyID: "proxy-a"}) queue.Record(domain.Event{ProxyID: "proxy-b"}) queue.Record(domain.Event{ProxyID: "proxy-c"}) if queue.Dropped() != 1 { t.Fatalf("Dropped() = %d, want 1", queue.Dropped()) } batch, err := queue.Next(context.Background()) if err != nil || len(batch) != 2 || batch[0].ProxyID != "proxy-a" || batch[1].ProxyID != "proxy-b" { t.Fatalf("Next() = %+v, %v", batch, err) } if batch, ok := queue.TryNext(); ok || batch != nil { t.Fatalf("TryNext() = %+v, %t; want nil, false", batch, ok) } } func TestQueueHonorsCanceledContext(t *testing.T) { queue, err := NewQueue(QueueOptions{Capacity: 1, MaxBatch: 1}) if err != nil { t.Fatalf("NewQueue() = %v", err) } ctx, cancel := context.WithCancel(context.Background()) cancel() if _, err := queue.Next(ctx); !errors.Is(err, context.Canceled) { t.Fatalf("Next(canceled) = %v, want context canceled", err) } } func TestQueueReportsAttemptedOutcomesAndOverflow(t *testing.T) { metrics := &metricsRecorder{} queue, err := NewQueue(QueueOptions{Capacity: 1, MaxBatch: 1, Metrics: metrics}) if err != nil { t.Fatalf("NewQueue() = %v", err) } first := domain.Event{ProxyID: "proxy-a", Stage: domain.StageDial, Success: true} second := domain.Event{ProxyID: "proxy-b", Stage: domain.StageTunnel, Success: false} queue.Record(first) queue.Record(second) if len(metrics.events) != 2 || metrics.events[0] != first || metrics.events[1] != second { t.Fatalf("observed events = %+v, want both attempts", metrics.events) } if metrics.dropped != 1 { t.Fatalf("observed dropped = %d, want 1", metrics.dropped) } }