(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
+39
View File
@@ -9,6 +9,17 @@ import (
"git.scuroneko.dev/scuroneko/sneklog/v2"
)
type sequenceDraftIDGenerator struct {
ids []uint64
pos int
}
func (g *sequenceDraftIDGenerator) Next() uint64 {
id := g.ids[g.pos]
g.pos++
return id
}
func TestDraftFlushRequiresChatID(t *testing.T) {
draft := NewRandomDraftProvider(&tgapi.API{}).NewDraft(tgapi.ParseNone)
draft.Message = "hello"
@@ -38,6 +49,34 @@ func TestMsgContextNewDraftWorksWithoutLimiter(t *testing.T) {
}
}
func TestDraftProviderSkipsZeroAndCollidingIDs(t *testing.T) {
provider := &DraftProvider{
api: &tgapi.API{},
drafts: make(map[uint64]*Draft),
generator: &sequenceDraftIDGenerator{ids: []uint64{0, 7, 7, 8}},
}
first := provider.NewDraft(tgapi.ParseNone)
second := provider.NewDraft(tgapi.ParseNone)
if first.ID != 7 || second.ID != 8 {
t.Fatalf("unexpected draft IDs: first=%d second=%d", first.ID, second.ID)
}
if got := len(provider.drafts); got != 2 {
t.Fatalf("collision overwrote a draft: got %d drafts", got)
}
}
func TestDraftReturnsErrorWhenAPIIsNil(t *testing.T) {
draft := NewLinearDraftProvider(nil, 0).NewDraft(tgapi.ParseNone).SetChat(42, 0)
if err := draft.Push("hello"); !errors.Is(err, ErrAPIIsNil) {
t.Fatalf("expected ErrAPIIsNil from Push, got %v", err)
}
draft.Message = "hello"
if err := draft.Flush(); !errors.Is(err, ErrAPIIsNil) {
t.Fatalf("expected ErrAPIIsNil from Flush, got %v", err)
}
}
func TestDraftFlushRejectsLongMessage(t *testing.T) {
draft := NewRandomDraftProvider(&tgapi.API{}).NewDraft(tgapi.ParseNone).SetChat(42, 0)
draft.Message = strings.Repeat("a", maxMessageTextLen+1)