153 lines
4.9 KiB
Go
153 lines
4.9 KiB
Go
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
|
|
}
|