mesh-issues keeps each design's milestone in the state milestones (history 5), says milestone-set and milestone-moved, and serves milestones, milestone-set and milestone-move. An issue's milestone is its own link of kind milestone, so at most one milestone per issue is checked inside the issue's own write; kind commit links a fixing commit. The triage links no milestone, pull request or commit. import with milestones=N seeds a design's table once. mesh-knowledge's progress reads issue-tracker.milestones and its table parse is gone. Squashed from four commits so the branch history does not carry a compiled bundle that was committed by mistake (6 MB); the path is now in .gitignore.
70 lines
2.5 KiB
Go
70 lines
2.5 KiB
Go
//go:build integration
|
|
|
|
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"strconv"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/nats-io/nats.go"
|
|
)
|
|
|
|
// 1947/AC1: the knowledge base running whole, as the runtime launches it, answers progress over the bus: it reads
|
|
// design 47 through the records module, its milestones from the issue tracker (issue 1781), and asks the issue tracker and mesh-delivery on their seats' subjects,
|
|
// played here from what the live seats answered (testdata/progress).
|
|
func TestProgressOverTheBus(t *testing.T) {
|
|
w := newBusWorld(t)
|
|
seats := newSeatsWorld(t)
|
|
for _, key := range []string{"seat:issue-tracker.list", "seat:issue-tracker.get", MilestonesVerb, "seat:mesh-delivery.deliveries",
|
|
"seat:mesh-delivery.groups", "seat:mesh-delivery.show"} {
|
|
key := key
|
|
if _, err := w.nc.Subscribe("ask."+key, func(m *nats.Msg) {
|
|
var body map[string]any
|
|
_ = json.Unmarshal(m.Data, &body)
|
|
out, err := seats.ask(key, body)
|
|
if err != nil {
|
|
_ = m.Respond([]byte(`{"error":` + strconv.Quote(err.Error()) + `}`))
|
|
return
|
|
}
|
|
raw, _ := json.Marshal(map[string]any{"result": json.RawMessage(out)})
|
|
_ = m.Respond(raw)
|
|
}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
b, _ := w.start(t)
|
|
raw, err := b.call(Seat+".progress", map[string]any{"of": "design 47"})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
var p Progress
|
|
if err := json.Unmarshal(raw, &p); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
lines := strings.Split(p.Tree, "\n")
|
|
if len(raw) > DefaultBound || p.Detail != DetailMinimal || !strings.HasPrefix(lines[0], "✗ design 47 · Delivery: from a commit to delivered — ") ||
|
|
!strings.Contains(p.Tree, "✗ R6 4/7 1945 fixing since") || !strings.Contains(p.Source, "the issue tracker's milestone records of design 47") {
|
|
t.Fatalf("%d bytes:\n%s\n%v", len(raw), p.Tree, p.Warnings)
|
|
}
|
|
raw, err = b.call(Seat+".progress", map[string]any{"of": "milestone 47/R6", "detail": "detailed"})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
_ = json.Unmarshal(raw, &p)
|
|
for _, want := range []string{"✗ milestone 47/R6 · ", "▶ 1945 ", "jschoubben/car-hunter@cc4c8ce12901 ready since", "depends on 1943", "▶ 1946 "} {
|
|
if !strings.Contains(p.Tree, want) {
|
|
t.Errorf("detailed: no %q in\n%s", want, p.Tree)
|
|
}
|
|
}
|
|
if _, err := b.call(Seat+".progress", map[string]any{"of": "design 47", "by": "someone@else"}); err == nil {
|
|
t.Error("an argument naming the caller was taken")
|
|
}
|
|
seats.mu.Lock()
|
|
defer seats.mu.Unlock()
|
|
if seats.asked["seat:issue-tracker.list"] != 2 || seats.asked["seat:mesh-delivery.groups"] != 1 || seats.asked[MilestonesVerb] != 2 {
|
|
t.Fatalf("asked %v", seats.asked)
|
|
}
|
|
}
|