57 lines
1.8 KiB
Go
57 lines
1.8 KiB
Go
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)
|
|
}
|
|
}
|