(new): rich message support
Golang lint / lint (pull_request) Successful in 1m20s
Golang lint / lint (push) Successful in 4m8s

(fix): runtime reliability
(tests): regression coverage
(doc): v1.1 release notes
This commit is contained in:
2026-08-12 16:34:44 +03:00
parent 48ddf66540
commit f03a081ed6
83 changed files with 6122 additions and 1925 deletions
+55
View File
@@ -1,10 +1,65 @@
package laniakea
import (
"context"
"errors"
"testing"
"time"
"git.scuroneko.dev/scuroneko/laniakea/tgapi"
)
type middlewareErrorObserver struct {
testObserver
errors chan ErrorEvent
}
func (o *middlewareErrorObserver) OnError(_ context.Context, event ErrorEvent) {
o.errors <- event
}
func TestAsyncMiddlewareRecoversPanic(t *testing.T) {
observer := &middlewareErrorObserver{errors: make(chan ErrorEvent, 1)}
ctx := &MessageContext{
Update: tgapi.Update{UpdateID: 7, Type: tgapi.UpdateTypeMessage},
FromID: 42,
ChatID: 100,
observer: observer,
}
middleware := NewMiddleware[NoData]("panic", func(ctx *MessageContext, db NoData) bool {
panic("boom")
}).SetAsync(true)
if !middleware.Execute(ctx, NoData{}) {
t.Fatal("async middleware blocked execution")
}
select {
case event := <-observer.errors:
if event.HandlerKind != HandlerMiddlewareKind || event.HandlerName != "panic" {
t.Fatalf("unexpected error event: %#v", event)
}
if event.Err == nil {
t.Fatal("panic error was not reported")
}
case <-time.After(time.Second):
t.Fatal("timed out waiting for async middleware error")
}
}
func TestMiddlewareRejectsNilExecutor(t *testing.T) {
observer := &middlewareErrorObserver{errors: make(chan ErrorEvent, 1)}
ctx := &MessageContext{observer: observer}
middleware := NewMiddleware[NoData]("nil", nil)
if middleware.Execute(ctx, NoData{}) {
t.Fatal("nil middleware executor was accepted")
}
event := <-observer.errors
if !errors.Is(event.Err, ErrMiddlewareExecutorNil) {
t.Fatalf("error = %v, want ErrMiddlewareExecutorNil", event.Err)
}
}
func TestValidateArgsRequiresFullMatch(t *testing.T) {
intCmd := NewCommand("int", func(ctx *MessageContext, db NoData) error { return nil }, NewCommandArg("n").SetValueType(CommandValueInt).SetRequired())
if err := intCmd.validateArgs([]string{"123"}); err != nil {