all repos

rss-tools @ 19e8c1c

get rss feed from sources that(i need and) dont provide one

rss-tools/sources/telegram/telegram_test.go (view raw)

Oleksandr Smirnov Oleksandr Smirnov
olexsmir@gmail.com
telegram: preserve \n in multiline messages, support multi image messages, 14 days ago
1
package telegram
2
3
import (
4
	"strings"
5
	"testing"
6
	"time"
7
8
	"olexsmir.xyz/x/is"
9
)
10
11
func TestFeedEntryFromMessageWithImage(t *testing.T) {
12
	msg := &Message{
13
		MessageID:     42,
14
		Caption:       "hello <world>",
15
		Date:          time.Date(2026, 4, 22, 19, 38, 0, 0, time.UTC).Unix(),
16
		PhotoBase64:   "YWJj",
17
		PhotoMIMEType: "image/png",
18
	}
19
20
	entry := feedEntryFromMessage(msg)
21
	is.Equal(t, "🖼️ [2026-04-22]", entry.Title)
22
	is.Equal(t, "html", entry.ContentType)
23
	if !strings.Contains(entry.Content, "<p>hello &lt;world&gt;</p>") {
24
		t.Fatalf("expected escaped text in image entry: %s", entry.Content)
25
	}
26
	if !strings.Contains(entry.Content, `src="data:image/png;base64,YWJj"`) {
27
		t.Fatalf("expected image data URI in image entry: %s", entry.Content)
28
	}
29
}
30
31
func TestFeedEntryFromMessageWithMultipleImages(t *testing.T) {
32
	msg := &Message{
33
		MessageID: 55,
34
		Caption:   "multi image",
35
		Date:      time.Date(2026, 4, 23, 12, 15, 0, 0, time.UTC).Unix(),
36
		PhotoAttachments: []PhotoAttachment{
37
			{Base64: "YWJj", MIMEType: "image/png"},
38
			{Base64: "ZGVm", MIMEType: "image/jpeg"},
39
		},
40
	}
41
42
	entry := feedEntryFromMessage(msg)
43
	if !strings.Contains(entry.Content, `src="data:image/png;base64,YWJj"`) {
44
		t.Fatalf("expected first image data URI in image entry: %s", entry.Content)
45
	}
46
	if !strings.Contains(entry.Content, `src="data:image/jpeg;base64,ZGVm"`) {
47
		t.Fatalf("expected second image data URI in image entry: %s", entry.Content)
48
	}
49
}
50
51
func TestFeedEntryFromMessageTextOnly(t *testing.T) {
52
	msg := &Message{
53
		MessageID: 11,
54
		Text:      "plain text",
55
		Date:      time.Date(2026, 4, 22, 19, 38, 0, 0, time.UTC).Unix(),
56
	}
57
58
	entry := feedEntryFromMessage(msg)
59
	is.Equal(t, "plain text", entry.Title)
60
	is.Equal(t, "", entry.ContentType)
61
	is.Equal(t, "plain text", entry.Content)
62
}
63
64
func TestFeedEntryFromMessagePreservesNewlines(t *testing.T) {
65
	msg := &Message{
66
		MessageID: 12,
67
		Text:      "line 1\nline 2",
68
		Date:      time.Date(2026, 4, 22, 19, 38, 0, 0, time.UTC).Unix(),
69
	}
70
71
	entry := feedEntryFromMessage(msg)
72
	is.Equal(t, "html", entry.ContentType)
73
	if !strings.Contains(entry.Content, "line 1<br/>line 2") {
74
		t.Fatalf("expected line breaks preserved in content: %s", entry.Content)
75
	}
76
}
77
78
func TestFeedEntryFromMessageLinkifiesAndAddsAtomLinks(t *testing.T) {
79
	msg := &Message{
80
		MessageID: 15,
81
		Text:      "watch https://example.com and https://youtu.be/dQw4w9WgXcQ.",
82
		Date:      time.Date(2026, 4, 23, 11, 0, 0, 0, time.UTC).Unix(),
83
	}
84
85
	entry := feedEntryFromMessage(msg)
86
	is.Equal(t, "html", entry.ContentType)
87
	if !strings.Contains(entry.Content, `<a href="https://example.com">https://example.com</a>`) {
88
		t.Fatalf("expected generic link in content: %s", entry.Content)
89
	}
90
	if !strings.Contains(entry.Content, `<a href="https://youtu.be/dQw4w9WgXcQ">https://youtu.be/dQw4w9WgXcQ</a>`) {
91
		t.Fatalf("expected youtube link in content: %s", entry.Content)
92
	}
93
94
	is.Equal(t, 2, len(entry.Links))
95
	is.Equal(t, "https://example.com", entry.Links[0].Href)
96
	is.Equal(t, "https://www.youtube.com/watch?v=dQw4w9WgXcQ", entry.Links[1].Href)
97
	is.Equal(t, "yt:video:dQw4w9WgXcQ", entry.ID)
98
}
99
100
func TestFeedEntryFromMessageUsesStoredLinkTitleForSingleLink(t *testing.T) {
101
	msg := &Message{
102
		MessageID: 16,
103
		Text:      "https://example.com/post",
104
		Date:      time.Date(2026, 4, 23, 11, 0, 0, 0, time.UTC).Unix(),
105
		LinkTitles: map[string]string{
106
			"https://example.com/post": "Example Post Title",
107
		},
108
	}
109
110
	entry := feedEntryFromMessage(msg)
111
	is.Equal(t, "Example Post Title", entry.Title)
112
}