Files
mesh-delivery/modules/mesh-delivery-view/internal/view/backlog_test.go
T

88 lines
2.9 KiB
Go

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)
}
}