feat(internal/controller/pipes/telegram): make basic telegram communication functional
This commit is contained in:
@@ -0,0 +1,85 @@
|
||||
package telegram
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestSplitMessageWithinLimit(t *testing.T) {
|
||||
got := splitMessage("short message", maxMessageLen)
|
||||
if len(got) != 1 || got[0] != "short message" {
|
||||
t.Fatalf("expected single chunk, got %q", got)
|
||||
}
|
||||
}
|
||||
|
||||
func TestSplitMessageChunks(t *testing.T) {
|
||||
// A message longer than the limit must be split, and the rune content must
|
||||
// be preserved exactly when the chunks are re-joined.
|
||||
text := strings.Repeat("a", maxMessageLen+100)
|
||||
got := splitMessage(text, maxMessageLen)
|
||||
if len(got) < 2 {
|
||||
t.Fatalf("expected multiple chunks, got %d", len(got))
|
||||
}
|
||||
for _, c := range got {
|
||||
if len([]rune(c)) > maxMessageLen {
|
||||
t.Fatalf("chunk exceeds %d runes: %d", maxMessageLen, len([]rune(c)))
|
||||
}
|
||||
}
|
||||
if strings.Join(got, "") != text {
|
||||
t.Fatalf("chunks do not reconstruct the original text")
|
||||
}
|
||||
}
|
||||
|
||||
func TestSplitMessageKeepsLines(t *testing.T) {
|
||||
// Splitting must prefer a newline boundary over cutting mid-line.
|
||||
text := strings.Repeat("x", maxMessageLen-50) + "\n" + strings.Repeat("y", 200)
|
||||
got := splitMessage(text, maxMessageLen)
|
||||
if len(got) != 2 {
|
||||
t.Fatalf("expected 2 chunks, got %d", len(got))
|
||||
}
|
||||
if strings.HasSuffix(got[0], "\n") == false {
|
||||
t.Fatalf("first chunk should end at the newline, got %q...", got[0][len(got[0])-10:])
|
||||
}
|
||||
if !strings.HasPrefix(got[1], "y") {
|
||||
t.Fatalf("second chunk should start after the newline, got %q...", got[1][:10])
|
||||
}
|
||||
}
|
||||
|
||||
func TestSplitMessageOverlongLine(t *testing.T) {
|
||||
// A single line longer than the limit falls back to a hard rune cut.
|
||||
text := strings.Repeat("x", maxMessageLen*2+10)
|
||||
got := splitMessage(text, maxMessageLen)
|
||||
if strings.Join(got, "") != text {
|
||||
t.Fatalf("chunks do not reconstruct the original text")
|
||||
}
|
||||
}
|
||||
|
||||
func TestStripCommandBotSuffix(t *testing.T) {
|
||||
cases := map[string]string{
|
||||
"/list": "/list",
|
||||
"/list@MyBot": "/list",
|
||||
"/list@MyBot arg1": "/list arg1",
|
||||
"/status@Bot u1": "/status u1",
|
||||
"not a command": "not a command",
|
||||
}
|
||||
for in, want := range cases {
|
||||
if got := stripCommandBotSuffix(in); got != want {
|
||||
t.Errorf("stripCommandBotSuffix(%q) = %q, want %q", in, got, want)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestTelegramChatType(t *testing.T) {
|
||||
cases := map[string]string{
|
||||
"private": "private",
|
||||
"group": "group",
|
||||
"supergroup": "group",
|
||||
"channel": "",
|
||||
"": "",
|
||||
}
|
||||
for in, want := range cases {
|
||||
if got := telegramChatType(in); got != want {
|
||||
t.Errorf("telegramChatType(%q) = %q, want %q", in, got, want)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user