(fix): observer lifecycle
Golang lint / lint (push) Successful in 1m5s

(tests): webhook runtime

(doc): logger options
This commit is contained in:
2026-04-29 13:11:54 +03:00
parent 667fa3cc61
commit 4807dec6ae
8 changed files with 127 additions and 7 deletions
+42 -1
View File
@@ -10,6 +10,7 @@ import (
)
type recordingObserver struct {
received []UpdateReceivedEvent
started []HandlerStartedEvent
finished []HandlerFinishedEvent
errors []ErrorEvent
@@ -19,7 +20,9 @@ type recordingObserver struct {
retries []PollingRetryEvent
}
func (*recordingObserver) OnReceiveUpdate(context.Context, UpdateReceivedEvent) {}
func (o *recordingObserver) OnReceiveUpdate(_ context.Context, ev UpdateReceivedEvent) {
o.received = append(o.received, ev)
}
func (o *recordingObserver) OnHandledUpdate(_ context.Context, ev UpdateHandledEvent) {
o.handled = append(o.handled, ev)
}
@@ -587,6 +590,44 @@ func TestHandleUpdateObserverEmitsUpdateErrors(t *testing.T) {
}
}
func TestHandleObserverCompletesUpdateWhenBotMiddlewareBlocks(t *testing.T) {
observer := &recordingObserver{}
bot := &Bot[NoData]{
logger: sneklog.NewLogger(),
observer: observer,
middlewares: []Middleware[NoData]{
NewMiddleware("block", func(ctx *MsgContext, db NoData) bool {
return false
}),
},
}
bot.handle(context.Background(), &tgapi.Update{
UpdateID: 8,
Type: tgapi.UpdateTypeMessage,
Message: &tgapi.Message{
MessageID: 1,
Date: 1,
Chat: &tgapi.Chat{ID: 42, Type: tgapi.ChatTypePrivate},
Text: "/start",
},
})
if len(observer.received) != 1 {
t.Fatalf("expected one received event, got %d", len(observer.received))
}
if len(observer.handled) != 1 {
t.Fatalf("expected one handled event, got %d", len(observer.handled))
}
got := observer.handled[0]
if got.UpdateID != 8 || got.UpdateType != tgapi.UpdateTypeMessage || got.ChatID != 42 || got.Handled {
t.Fatalf("unexpected handled event: %#v", got)
}
if len(observer.started) != 0 || len(observer.finished) != 0 || len(observer.errors) != 0 {
t.Fatalf("middleware block should not emit handler lifecycle or errors: started=%d finished=%d errors=%d", len(observer.started), len(observer.finished), len(observer.errors))
}
}
func TestHandleMessageFallbackRunsAfterCommandMiss(t *testing.T) {
observer := &recordingObserver{}
called := false