package view import ( "fmt" "net/http" "net/http/httptest" "strings" "testing" "time" "git.novox.be/novox/mesh-sdk/go/delivery" ) func stepAsk(t *testing.T, id, kind string, at time.Time) []byte { t.Helper() b, err := delivery.EncodeStepAsk(delivery.StepAsk{ID: id, Kind: kind, Language: delivery.AskGo, Asker: "mesh-delivery-checker", At: at, Check: &delivery.CheckJob{Fetch: map[string]any{"repository": "novox/x", "commit": "0123456789abcdef0123456789abcdef01234567"}, Levels: []string{delivery.LevelUnit}}}) if err != nil { t.Fatal(err) } return b } // fakeSeats is the check worker of the go seat with three asks waiting and one held, the oldest at t0. func fakeSeats(t *testing.T, now time.Time) *Backlog { worker, _ := delivery.AskWorker(delivery.AskGo, delivery.AskCheck) subject, _ := delivery.AskSubject(delivery.AskGo, delivery.AskCheck) oldest := stepAsk(t, "m0000001aaaaaa", delivery.AskCheck, now.Add(-90*time.Second)) return &Backlog{Now: func() time.Time { return now }, Info: func(stream, w string) (uint64, uint64, uint64, error) { switch w { case worker: return 3, 1, 42, nil case "SEAT_NODE_BUILD_IMAGE_DELIVERY_worker": return 0, 0, 1, fmt.Errorf("the worker is not there") } return 0, 0, 1, nil }, Message: func(stream, s string, seq uint64) ([]byte, error) { if s != subject || seq != 42 { return nil, fmt.Errorf("asked %s at %d", s, seq) } return oldest, nil }} } func TestThreeWaitingAsksAreShownWithTheOldestsAge(t *testing.T) { // 1887/A8a AC now := time.Date(2026, 10, 23, 12, 0, 0, 0, time.UTC) m := New() m.SetBacklog(fakeSeats(t, now)) rows := m.Snapshot().Backlog var check, image *BacklogRow for i := range rows { switch { case rows[i].Language == "go" && rows[i].Kind == "check": check = &rows[i] case rows[i].Language == "image" && rows[i].Kind == "delivery": image = &rows[i] default: t.Errorf("a quiet seat is listed: %+v", rows[i]) } } if check == nil || check.Waiting != 3 || check.Held != 1 || check.OldestSecs != 90 || !check.Oldest.Equal(now.Add(-90*time.Second)) || check.Error != "" { t.Fatalf("check row = %+v", check) } if image == nil || image.Error == "" { t.Errorf("a worker that cannot be read is dropped: %+v", rows) } var out strings.Builder Table(&out, m.Snapshot()) for _, w := range []string{"BACKLOG OF BUILD ASKS", "go", "check", "3", "1m30s", "unreadable"} { if !strings.Contains(out.String(), w) { t.Errorf("table lacks %q:\n%s", w, out.String()) } } rec := httptest.NewRecorder() Web(m).ServeHTTP(rec, httptest.NewRequest(http.MethodGet, "/", nil)) if !strings.Contains(rec.Body.String(), "BACKLOG OF BUILD ASKS") || !strings.Contains(rec.Body.String(), "1m30s") { t.Errorf("page lacks the backlog:\n%s", rec.Body.String()) } } func TestNoBacklogReaderGivesNoRows(t *testing.T) { if got := New().Snapshot().Backlog; got == nil || len(got) != 0 { t.Errorf("backlog = %#v", got) } }