package poller import ( "context" "testing" "time" "supply-intelligence/internal/domain" "supply-intelligence/internal/gatewayconsumer" "supply-intelligence/internal/repository" ) func TestRuntimeStartsBackgroundPolling(t *testing.T) { repo := repository.NewMemoryRepository() repo.AppendPackageEvent(domain.PackageChangeEvent{ EventID: "evt-runtime-1", EventType: "supply_package_published", PackageID: 1, Platform: "openai", Model: "gpt-4.1-mini", OccurredAt: time.Unix(1, 0).UTC(), Version: 1, GatewaySyncStatus: domain.GatewaySyncStatusPending, }) service := gatewayconsumer.NewService(repo) poller := NewGatewayPackagePoller(service) runtime := NewRuntime(poller, 10*time.Millisecond) ctx, cancel := context.WithCancel(context.Background()) defer cancel() if !runtime.Start(ctx) { t.Fatalf("expected runtime to start") } defer runtime.Stop() deadline := time.Now().Add(500 * time.Millisecond) for time.Now().Before(deadline) { items, _ := repo.ListPackageEventsAfter("") if len(items) == 1 && items[0].GatewaySyncStatus == domain.GatewaySyncStatusApplied { return } time.Sleep(10 * time.Millisecond) } items, _ := repo.ListPackageEventsAfter("") t.Fatalf("expected background polling to apply event, got %+v", items) } func TestRuntimeStartRequiresPoller(t *testing.T) { if (&Runtime{}).Start(context.Background()) { t.Fatalf("expected runtime without poller to refuse start") } }