(new): rich message support
(fix): runtime reliability (tests): regression coverage (doc): v1.1 release notes
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user