package application import ( "context" "errors" "testing" ) func TestRuntimePublish(t *testing.T) { runtime := NewRuntime(1) event := Event{ Type: EventDownloadStarted, RequestID: "request-1", AppID: "json-parser", } if err := runtime.Publish(context.Background(), event); err != nil { t.Fatalf("Publish() error = %v", err) } got := <-runtime.Events() if got != event { t.Fatalf("Events() got %#v, want %#v", got, event) } } func TestRuntimeRejectsInvalidEvent(t *testing.T) { runtime := NewRuntime(1) err := runtime.Publish(context.Background(), Event{Type: EventType("Unknown")}) if !errors.Is(err, ErrInvalidEvent) { t.Fatalf("Publish() error = %v, want %v", err, ErrInvalidEvent) } } func TestRuntimePublishHonorsContextCancellation(t *testing.T) { runtime := NewRuntime(1) if err := runtime.Publish(context.Background(), Event{Type: EventDownloadStarted}); err != nil { t.Fatalf("first Publish() error = %v", err) } ctx, cancel := context.WithCancel(context.Background()) cancel() err := runtime.Publish(ctx, Event{Type: EventDownloadProgress}) if !errors.Is(err, context.Canceled) { t.Fatalf("blocked Publish() error = %v, want %v", err, context.Canceled) } } func TestRuntimeClose(t *testing.T) { runtime := NewRuntime(1) runtime.Close() runtime.Close() select { case <-runtime.Done(): default: t.Fatal("Done() should be closed") } err := runtime.Publish(context.Background(), Event{Type: EventDownloadStarted}) if !errors.Is(err, ErrRuntimeClosed) { t.Fatalf("Publish() error = %v, want %v", err, ErrRuntimeClosed) } }