package main import ( "context" "strings" "testing" "time" "github.com/novox/mesh-controller/internal/conditions" ) // The serving controller's bus, with the mesh's streams, for the verb to read and act on. func askDeadLetters(t *testing.T, args map[string]any) (any, error) { t.Helper() a, err := readArguments("dead-letters", args) if err != nil { return nil, err } return deadLettersAnswer(context.Background(), a) } // Open while DEAD_LETTERS holds a message for the consumer, in words the operator reads in one pass: // what is held, and where to act. func TestAConsumersDeadLettersAreSaidUntilActedOn(t *testing.T) { f := &signalFacts{now: time.Now(), deadLetters: map[string]int{"EVENTS.media_sonarr": 4, "EVENTS.controller": 1}} found := watchDeadLetters(f) if len(found) != 2 { t.Fatalf("said %d conditions", len(found)) } for _, o := range found { if o.Kind != "max-deliveries" || o.Severity != conditions.Warning || o.Needs == "" { t.Errorf("%+v", o) } if why, ok := conditions.PlainWords(conditions.Words{Headline: o.Headline, Needs: o.Needs, Explanation: o.Explanation, Resolved: o.Resolved}, "media"); !ok { t.Errorf("%q is not plain: %s", o.Headline, why) } if !strings.Contains(o.Needs, "mesh MCP server") { t.Errorf("does not say where to act: %q", o.Needs) } } sonarr := found[1] if sonarr.ID != "EVENTS.media_sonarr" || sonarr.Machine != "media" || sonarr.Headline != "Sonarr on media could not handle 4 messages" || !strings.Contains(sonarr.Summary, "DEAD_LETTERS") { t.Errorf("%+v", sonarr) } if found[0].Headline != "The controller could not handle a message" { t.Errorf("%q", found[0].Headline) } // None held, none said: it clears when they are delivered again or dropped. if left := watchDeadLetters(&signalFacts{now: time.Now()}); len(left) != 0 { t.Fatalf("%v", left) } }