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("<3"))
gomega.Expect(payload.Text).
To(gomega.ContainSubstring("Cool & stuff"))
gomega.Expect(payload.Text).To(gomega.ContainSubstring("->"))
})
})
})
})
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
}
|