mesh/merge-gate pass: builds mesh-sdk, sent nowhere; no bus step; every machine composes with the change as it did without (4 of 4 compose)
mesh/repo-check pass: its merge-check.sh passed
mesh/delivery-group group feat/asks-answered-on-any-channel checking: 2 of 3 member(s) ready
mesh/delivery superseded: a newer head of the same pull request
100 lines
4.1 KiB
Go
100 lines
4.1 KiB
Go
package asks
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
var now = time.Date(2026, 10, 8, 14, 0, 0, 0, time.UTC)
|
|
|
|
func held() Ask {
|
|
return Ask{ID: "d-1", Headline: "openrazer delivery held", Explanation: "Needs you: release it, or stop it.",
|
|
Who: Operator, Expires: now.Add(time.Hour), OnExpiry: "the delivery stays held", About: "delivery.openrazer",
|
|
Options: []Option{
|
|
{ID: "release", Label: "Release", Does: "the delivery goes on", Level: Approve},
|
|
{ID: "stop", Label: "Stop", Does: "the delivery ends", Level: Approve},
|
|
{ID: "silence", Label: "Silence for a week", Does: "nothing more is said for a week", Level: Acknowledge},
|
|
}}
|
|
}
|
|
|
|
func TestASoundAskPasses(t *testing.T) {
|
|
if err := held().Check(now); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
|
|
func TestAnAskIsRefusedInWordsForEachFault(t *testing.T) {
|
|
for want, change := range map[string]func(*Ask){
|
|
"is not letters": func(a *Ask) { a.ID = "a.b" },
|
|
"headline is empty": func(a *Ask) { a.Headline = "" },
|
|
"explains nothing": func(a *Ask) { a.Explanation = " " },
|
|
"only the operator answers": func(a *Ask) { a.Who = "agent" },
|
|
"offers 0 options": func(a *Ask) { a.Options = nil },
|
|
"offers 5 options": func(a *Ask) { a.Options = append(a.Options, a.Options[0], a.Options[1]) },
|
|
"is offered twice": func(a *Ask) { a.Options[1].ID = "release" },
|
|
"does not say what it does": func(a *Ask) { a.Options[0].Does = "" },
|
|
"none of acknowledge": func(a *Ask) { a.Options[0].Level = "admin" },
|
|
"expires before it is asked": func(a *Ask) { a.Expires = now },
|
|
"approves lasts at most": func(a *Ask) { a.Expires = now.Add(25 * time.Hour) },
|
|
"destroys lasts at most": func(a *Ask) { a.Options[0].Level = Destroy },
|
|
"never defaults": func(a *Ask) { a.OnExpiry = "" },
|
|
"is a key, without spaces": func(a *Ask) { a.About = "a b" },
|
|
} {
|
|
a := held()
|
|
change(&a)
|
|
if err := a.Check(now); err == nil || !strings.Contains(err.Error(), want) {
|
|
t.Errorf("want a refusal saying %q, got %v", want, err)
|
|
}
|
|
}
|
|
ack := held()
|
|
ack.Options = ack.Options[2:]
|
|
ack.OnExpiry = ""
|
|
ack.Expires = now.Add(7 * 24 * time.Hour)
|
|
if err := ack.Check(now); err != nil {
|
|
t.Errorf("an ask that only acknowledges needs no expiry words and may last a week: %v", err)
|
|
}
|
|
}
|
|
|
|
func TestAnAskerActsOnlyOnAWarrantForItsOwnAskAndOption(t *testing.T) {
|
|
w := Warrant{Ask: "d-1", Asker: "mesh-delivery", Outcome: OutcomeChosen, Option: "release", Label: "Release",
|
|
Level: Approve, By: &Person{Who: Operator, Kind: "telegram", Identity: "42", Verified: "user id verified"}}
|
|
if o, err := w.For("mesh-delivery", held()); err != nil || o.ID != "release" {
|
|
t.Fatalf("a sound warrant was refused: %v", err)
|
|
}
|
|
if got := w.Says(); got != "the operator, via telegram (user id verified), chose Release" {
|
|
t.Errorf("the warrant says %q", got)
|
|
}
|
|
for why, change := range map[string]func(*Warrant){
|
|
"another asker": func(w *Warrant) { w.Asker = "mesh-controller" },
|
|
"another ask": func(w *Warrant) { w.Ask = "d-2" },
|
|
"no choice": func(w *Warrant) { w.Outcome = OutcomeExpired },
|
|
"nobody": func(w *Warrant) { w.By = nil },
|
|
"not offered": func(w *Warrant) { w.Option = "delete" },
|
|
"a lower level": func(w *Warrant) { w.Level = Acknowledge },
|
|
"another role": func(w *Warrant) { w.By = &Person{Who: "agent"} },
|
|
} {
|
|
c := w
|
|
by := *w.By
|
|
c.By = &by
|
|
change(&c)
|
|
if _, err := c.For("mesh-delivery", held()); err == nil {
|
|
t.Errorf("a warrant with %s was acted on", why)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestTheSubjectsNameTheirPublisher(t *testing.T) {
|
|
for got, want := range map[string]string{
|
|
AskSubject("mesh-delivery"): "mesh.seat.operator-channel.accept.ask.mesh-delivery",
|
|
DecidedSubject("mesh-delivery"): "mesh.seat.operator-channel.event.decided.mesh-delivery",
|
|
ChannelSubject(Show, "telegram"): "mesh.seat.channel.accept.show.telegram",
|
|
IntakeSubject(Chosen, "desktop"): "mesh.seat.intake.event.choice.desktop",
|
|
ProofSubject(CodeProof, "telegram"): "mesh.seat.intake.proof.code.telegram",
|
|
} {
|
|
if got != want {
|
|
t.Errorf("%s, want %s", got, want)
|
|
}
|
|
}
|
|
}
|