90 lines
3.6 KiB
Go
90 lines
3.6 KiB
Go
package main
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
// novox/hq issue 1083: mesh-controller #375's delivery was stopped by a person, then #375 was closed and the same commit
|
|
// opened as #376 from another branch. The delivery is named repository@commit; it was Stopped before its pull request
|
|
// closed, so it was not ClosedUnmerged, and #376 got no delivery of its own: its Approve was never asked. A new pull
|
|
// request at a commit whose delivery is Stopped and unmerged, under another number, takes that record over (the key stays
|
|
// repository@commit); the take-over is said in its transitions, with who stopped it and why.
|
|
|
|
const (
|
|
head1083 = "e375e375e375e375"
|
|
branch1083 = "feat/backup-before-send"
|
|
)
|
|
|
|
func TestAPullRequestAtACommitWhoseDeliveryAPersonStoppedTakesItOver(t *testing.T) {
|
|
w := newWorld(t)
|
|
id := IDOf(catalog783, head1083)
|
|
|
|
w.h.PullUpdated(pr(catalog783, 375, head1083, branch1083, "src/a.go"))
|
|
w.h.Checked(verdict(catalog783, 375, head1083, "pass"))
|
|
if w.state(id) != Ready {
|
|
t.Fatalf("its passing verdict left it %s", w.state(id))
|
|
}
|
|
if _, err := w.h.Stop(id, "to break the loop", "jochen"); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
// The person stopped it first; the pull request closed afterwards: a final state is not moved by the close.
|
|
w.h.PullClosed(pr(catalog783, 375, head1083, branch1083))
|
|
if d := w.delivery(id); d.State != Stopped || d.ClosedUnmerged {
|
|
t.Fatalf("setup: %s, closed unmerged %v; wanted stopped by the person alone", d.State, d.ClosedUnmerged)
|
|
}
|
|
|
|
w.h.PullUpdated(pr(catalog783, 376, head1083, branch1083+"-2", "src/a.go"))
|
|
d := w.delivery(id)
|
|
if d.State != Proposed || d.Number != 376 {
|
|
t.Fatalf("#376 at the same commit left it %s, Number %d; wanted proposed under #376", d.State, d.Number)
|
|
}
|
|
why := d.Transitions[len(d.Transitions)-1].Why
|
|
if !strings.Contains(why, "#375 with the same head was stopped by jochen: to break the loop") {
|
|
t.Fatalf("the take-over is not said, with who stopped it and why: %q", why)
|
|
}
|
|
w.h.Checked(verdict(catalog783, 376, head1083, "pass"))
|
|
if w.state(id) != Ready {
|
|
t.Fatalf("a passing verdict for #376 left it %s", w.state(id))
|
|
}
|
|
}
|
|
|
|
// A stopped record that was merged is not taken over, and the same pull request announced again stays stopped.
|
|
func TestAStoppedRecordThatWasMergedIsNotTakenOverByAnotherPullRequest(t *testing.T) {
|
|
w := newWorld(t)
|
|
id := IDOf(catalog783, head783c+"1")
|
|
w.h.PullUpdated(pr(catalog783, 400, head783c+"1", branch1083, "src/a.go"))
|
|
w.h.PullMerged(merged(catalog783, 400, head783c+"1", "f400f400f400f400"))
|
|
w.h.PullUpdated(pr(catalog783, 401, head783c+"1", branch1083+"-2", "src/a.go"))
|
|
if d := w.delivery(id); d.Number != 400 || d.MergedAs == "" {
|
|
t.Fatalf("a merged record was taken over: Number %d, merged as %q", d.Number, d.MergedAs)
|
|
}
|
|
}
|
|
|
|
// The take-over leaves the stopped record's group: the new record joins its own group by its branch.
|
|
func TestATakenOverRecordLeavesTheGroupItWasStoppedIn(t *testing.T) {
|
|
w := newWorld(t)
|
|
w.h.PullUpdated(pr(gCtl, 1, gHc, "feat/g", "internal/a.go"))
|
|
w.h.PullUpdated(pr(gCat, 2, gHk, "feat/g", "modules/app/module.json"))
|
|
id := IDOf(gCtl, gHc)
|
|
if _, err := w.h.Stop(id, "no", "jochen"); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
w.h.PullClosed(pr(gCtl, 1, gHc, "feat/g"))
|
|
w.h.PullUpdated(pr(gCtl, 9, gHc, "feat/other", "internal/a.go"))
|
|
w.h.mu.Lock()
|
|
defer w.h.mu.Unlock()
|
|
for _, g := range w.h.groups {
|
|
if g.ID == "feat/g" {
|
|
for _, m := range g.Members {
|
|
if m == id {
|
|
t.Fatalf("group feat/g still lists %s, now #9 on feat/other: %v", id, g.Members)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if d := w.h.deliveries[id]; d.Number != 9 || d.State != Proposed || d.Group == "feat/g" {
|
|
t.Fatalf("taken over: Number %d, %s, group %q", d.Number, d.State, d.Group)
|
|
}
|
|
}
|