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