File: telegram_internal_test.go

package info (click to toggle)
golang-github-nicholas-fedor-shoutrrr 0.12.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 5,680 kB
  • sloc: sh: 74; makefile: 58
file content (153 lines) | stat: -rw-r--r-- 5,010 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
package telegram

import (
	"encoding/json"
	"errors"
	"log"
	"net/url"

	"github.com/onsi/ginkgo/v2"
	"github.com/onsi/gomega"
	"github.com/onsi/gomega/gstruct"
)

var _ = ginkgo.Describe("the telegram service", func() {
	var logger *log.Logger

	ginkgo.BeforeEach(func() {
		logger = log.New(ginkgo.GinkgoWriter, "Test", log.LstdFlags)
	})

	ginkgo.Describe("creating configurations", func() {
		ginkgo.When("given an url", func() {
			ginkgo.When("a parse mode is not supplied", func() {
				ginkgo.It("no parse_mode should be present in payload", func() {
					payload, err := getPayloadStringFromURL(
						"telegram://12345:mock-token@telegram/?channels=channel-1",
						"Message",
						logger,
					)
					gomega.Expect(err).NotTo(gomega.HaveOccurred())
					gomega.Expect(payload).NotTo(gomega.ContainSubstring("parse_mode"))
				})
			})

			ginkgo.When("a parse mode is supplied", func() {
				ginkgo.When("it's set to a valid mode and not None", func() {
					ginkgo.It("parse_mode should be present in payload", func() {
						payload, err := getPayloadStringFromURL(
							"telegram://12345:mock-token@telegram/?channels=channel-1&parsemode=Markdown",
							"Message",
							logger,
						)
						gomega.Expect(err).NotTo(gomega.HaveOccurred())
						gomega.Expect(payload).To(gomega.ContainSubstring("parse_mode"))
					})
				})
				ginkgo.When("it's set to None", func() {
					ginkgo.When("no title has been provided", func() {
						ginkgo.It("no parse_mode should be present in payload", func() {
							payload, err := getPayloadStringFromURL(
								"telegram://12345:mock-token@telegram/?channels=channel-1&parsemode=None",
								"Message",
								logger,
							)
							gomega.Expect(err).NotTo(gomega.HaveOccurred())
							gomega.Expect(payload).NotTo(gomega.ContainSubstring("parse_mode"))
						})
					})
					ginkgo.When("a title has been provided", func() {
						payload, err := getPayloadFromURL(
							"telegram://12345:mock-token@telegram/?channels=channel-1&title=MessageTitle",
							`Oh wow! <3 Cool & stuff ->`,
							logger,
						)
						gomega.Expect(err).NotTo(gomega.HaveOccurred())
						ginkgo.It("should have parse_mode set to HTML", func() {
							gomega.Expect(payload.ParseMode).To(gomega.Equal("HTML"))
						})
						ginkgo.It("should contain the title prepended in the message", func() {
							gomega.Expect(payload.Text).To(gomega.ContainSubstring("MessageTitle"))
						})
						ginkgo.It("should escape the message HTML tags", func() {
							gomega.Expect(payload.Text).To(gomega.ContainSubstring("&lt;3"))
							gomega.Expect(payload.Text).
								To(gomega.ContainSubstring("Cool &amp; stuff"))
							gomega.Expect(payload.Text).To(gomega.ContainSubstring("-&gt;"))
						})
					})
				})
			})

			ginkgo.When("parsing URL that might have a message thread id", func() {
				ginkgo.When("no thread id is provided", func() {
					payload, err := getPayloadFromURL(
						"telegram://12345:mock-token@telegram/?channels=channel-1&title=MessageTitle",
						`Oh wow! <3 Cool & stuff ->`,
						logger,
					)
					gomega.Expect(err).NotTo(gomega.HaveOccurred())
					ginkgo.It("should have message_thread_id set to nil", func() {
						gomega.Expect(payload.MessageThreadID).To(gomega.BeNil())
					})
				})
				ginkgo.When("a numeric thread id is provided", func() {
					payload, err := getPayloadFromURL(
						"telegram://12345:mock-token@telegram/?channels=channel-1:10&title=MessageTitle",
						`Oh wow! <3 Cool & stuff ->`,
						logger,
					)
					gomega.Expect(err).NotTo(gomega.HaveOccurred())
					ginkgo.It("should have message_thread_id set to 10", func() {
						gomega.Expect(payload.MessageThreadID).To(gstruct.PointTo(gomega.Equal(10)))
					})
				})
				ginkgo.When("non-numeric thread id is provided", func() {
					payload, err := getPayloadFromURL(
						"telegram://12345:mock-token@telegram/?channels=channel-1:invalid&title=MessageTitle",
						`Oh wow! <3 Cool & stuff ->`,
						logger,
					)
					gomega.Expect(err).NotTo(gomega.HaveOccurred())
					ginkgo.It("should have message_thread_id set to nil", func() {
						gomega.Expect(payload.MessageThreadID).To(gomega.BeNil())
					})
				})
			})
		})
	})
})

func getPayloadFromURL(
	testURL string,
	message string,
	logger *log.Logger,
) (SendMessagePayload, error) {
	telegram := &Service{}

	serviceURL, err := url.Parse(testURL)
	if err != nil {
		return SendMessagePayload{}, err
	}

	if err = telegram.Initialize(serviceURL, logger); err != nil {
		return SendMessagePayload{}, err
	}

	if len(telegram.Config.Chats) < 1 {
		return SendMessagePayload{}, errors.New("no channels were supplied")
	}

	return createSendMessagePayload(message, telegram.Config.Chats[0], telegram.Config), nil
}

func getPayloadStringFromURL(testURL string, message string, logger *log.Logger) ([]byte, error) {
	payload, err := getPayloadFromURL(testURL, message, logger)
	if err != nil {
		return nil, err
	}

	raw, err := json.Marshal(payload)

	return raw, err
}