70 lines
2.4 KiB
Go
70 lines
2.4 KiB
Go
package main
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
// novox/hq issue 403, ADR 0313: the issue tracker measures a fix's time from the move to fixing to delivered and
|
|
// splits it at the pull request's opening and its merge. A transition says what it reads them by: when the pull
|
|
// request was first heard (its first head, not a later one), when it merged, and the class of what it moves —
|
|
// core, leaf, or none for a change that moves no module. `checks` says the same for a fix the tracker hears of late.
|
|
|
|
// transitionsTo are the transition events said for a delivery that moved to a state.
|
|
func transitionsTo(w *world, id string, to State) []map[string]any {
|
|
var out []map[string]any
|
|
for _, e := range w.said {
|
|
if e["event-kind"] == "transition" && e["id"] == id && e["to"] == string(to) {
|
|
out = append(out, e)
|
|
}
|
|
}
|
|
return out
|
|
}
|
|
|
|
func TestATransitionSaysWhenItsPullRequestOpenedAndMerged(t *testing.T) {
|
|
w := newWorld(t)
|
|
repo := "novox/mesh-catalog"
|
|
opened := w.now
|
|
first := pr(repo, 9, "head9first", "fix/403-x", "modules/app/a.go")
|
|
w.h.PullUpdated(first)
|
|
w.later(3 * time.Minute)
|
|
second := pr(repo, 9, "head9second", "fix/403-x", "modules/app/a.go")
|
|
w.h.PullUpdated(second)
|
|
w.h.Checked(verdictMoving(repo, 9, "head9second", "app"))
|
|
w.later(2 * time.Minute)
|
|
mergedWhen := w.now
|
|
w.h.PullMerged(mergedAt(second, "merge9aaaaaa", mergedWhen))
|
|
w.settleAll()
|
|
|
|
id := IDOf(repo, "head9second")
|
|
if s := w.state(id); s != Merged {
|
|
t.Fatalf("the merge is %s, not merged", s)
|
|
}
|
|
said := transitionsTo(w, id, Merged)
|
|
if len(said) == 0 {
|
|
t.Fatalf("no transition to merged was said: %v", w.said)
|
|
}
|
|
e := said[len(said)-1]
|
|
if e["opened"] != opened.UTC().Format(time.RFC3339) {
|
|
t.Errorf("opened %v, want the first head's %s (not the second head's)", e["opened"], opened.Format(time.RFC3339))
|
|
}
|
|
if e["merged_at"] != mergedWhen.UTC().Format(time.RFC3339) {
|
|
t.Errorf("merged_at %v, want %s", e["merged_at"], mergedWhen.Format(time.RFC3339))
|
|
}
|
|
if _, has := e["class"]; has {
|
|
t.Errorf("the transition names a class %v: the gate plans nothing", e["class"])
|
|
}
|
|
if _, has := e["plan"]; has {
|
|
t.Errorf("the transition names a plan %v", e["plan"])
|
|
}
|
|
|
|
a, err := w.h.Checks(repo, 9, "")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if a.Delivery == nil || a.Delivery.Opened != opened.UTC().Format(time.RFC3339) ||
|
|
a.Delivery.MergedAt != mergedWhen.UTC().Format(time.RFC3339) || a.Delivery.MergedAs != "merge9aaaaaa" {
|
|
t.Errorf("checks says %+v", a.Delivery)
|
|
}
|
|
}
|