package main import ( "strings" "testing" "time" "github.com/novox/mesh-controller/internal/link" ) // **A check that ran again says so on the pull request** (novox/hq issue 594): a build agent replaced // mid-check leaves the ask to be handed out again, and the verdict that finally comes is from a second // run. Each layer's summary — what the forge shows as the check's line — names the restart. func TestARestartedCheckSaysSoOnEveryLayer(t *testing.T) { asked := &link.CheckRequest{Owner: "novox", Repo: "mesh-controller", Number: 279} gate := &link.CheckLayer{Verdict: "pass", Summary: "every node composes"} repo := &link.CheckLayer{Verdict: "pass", Summary: "merge-check.sh passed"} c := checkedOf(link.BuildResult{ID: "b", Ref: "abc", On: "shanks", Checked: asked, Delivery: 2, Check: &link.CheckOutcome{Verdict: "pass", Summary: "every node composes", Gate: gate, RepoCheck: repo}}) for name, said := range map[string]string{"summary": c.Summary, "gate": c.Gate.Summary, "repository check": c.RepoCheck.Summary} { // The verdict's own words first, then the marker: the forge clips a status to a few words. if !strings.HasSuffix(said, " (run 2)") || strings.HasPrefix(said, "(run") { t.Errorf("the %s says %q: a check run twice reads as run once, or its marker pushes its words out", name, said) } } if !strings.HasPrefix(c.Report, "restarted: handed out 2 times") { t.Errorf("the report does not open with the restart: %q", c.Report) } if gate.Summary != "every node composes" { t.Errorf("the build's own outcome was changed under it: %q", gate.Summary) } // Taken once, nothing is added. once := checkedOf(link.BuildResult{ID: "b", Ref: "abc", Checked: asked, Delivery: 1, Check: &link.CheckOutcome{Verdict: "pass", Summary: "every node composes"}}) if strings.Contains(once.Summary, "(run") || strings.Contains(once.Report, "restarted") { t.Errorf("a check run once says %q", once.Summary) } } // And the queue says it of the ask in flight. func TestTheQueueSaysAnAskInFlightRestarted(t *testing.T) { now := time.Date(2026, 10, 13, 0, 16, 0, 0, time.UTC) q := link.Queue{Seat: link.TheBuildMachine, Delivered: 1, AckPending: 1, MaxDeliver: 5, Asks: []link.QueuedAsk{ {Seq: 1, ID: "build-279", Repository: "ssh://forge/novox/mesh-controller", AskedAt: now.Add(-7 * time.Minute), State: link.AskInFlight, On: "shanks", Started: now.Add(-time.Minute), Delivery: 2}, }} text := queueText(q, now) if !strings.Contains(text, "handed out 2 times") { t.Fatalf("the queue does not say the ask was handed out again:\n%s", text) } if a := queueAnswerOf(q, now).Asks[0]; a.Delivery != 2 { t.Errorf("the queue's data says delivery %d, want 2", a.Delivery) } }