package web import ( "context" "errors" "fmt" "strings" "testing" "go.uber.org/goleak" ) func TestJobOutputRelayDrainsBeforeCompletion(t *testing.T) { defer goleak.VerifyNone(t) manager := NewJobManager() job := manager.CreateJob("install", "test-method", "Test App") _, relay := newJobCommandRunner(context.Background(), manager, job.ID, 2) const outputLines = 50 done := make(chan struct{}) go func() { defer close(done) for i := 0; i < outputLines; i++ { relay.output <- fmt.Sprintf("line-%d", i) } relay.errors <- errors.New("expected failure detail") }() <-done relay.Close() relay.Close() // Closing twice must remain safe. manager.CompleteJob(job.ID) recent := manager.GetRecentJobs() if len(recent) != 1 { t.Fatal("completed job not found in recent history") } archived := recent[0] if got, want := len(archived.Output), outputLines+1; got != want { t.Fatalf("archived output length = %d, want %d", got, want) } errorFound := false for _, line := range archived.Output { if strings.Contains(line, "ERROR: expected failure detail") { errorFound = true break } } if !errorFound { t.Fatal("error output missing from archived job") } }