package tgbotapi_test import ( "io/ioutil" "log" "net/http" "os" "testing" "time" "github.com/go-telegram-bot-api/telegram-bot-api" ) const ( TestToken = "153667468:AAHlSHlMqSt1f_uFmVRJbm5gntu2HI4WW8I" ChatID = 76918703 SupergroupChatID = -1001120141283 ReplyToMessageID = 35 ExistingPhotoFileID = "AgADAgADw6cxG4zHKAkr42N7RwEN3IFShCoABHQwXEtVks4EH2wBAAEC" ExistingDocumentFileID = "BQADAgADOQADjMcoCcioX1GrDvp3Ag" ExistingAudioFileID = "BQADAgADRgADjMcoCdXg3lSIN49lAg" ExistingVoiceFileID = "AwADAgADWQADjMcoCeul6r_q52IyAg" ExistingVideoFileID = "BAADAgADZgADjMcoCav432kYe0FRAg" ExistingVideoNoteFileID = "DQADAgADdQAD70cQSUK41dLsRMqfAg" ExistingStickerFileID = "BQADAgADcwADjMcoCbdl-6eB--YPAg" ) func getBot(t *testing.T) (*tgbotapi.BotAPI, error) { bot, err := tgbotapi.NewBotAPI(TestToken) bot.Debug = true if err != nil { t.Error(err) t.Fail() } return bot, err } func TestNewBotAPI_notoken(t *testing.T) { _, err := tgbotapi.NewBotAPI("") if err == nil { t.Error(err) t.Fail() } } func TestGetUpdates(t *testing.T) { bot, _ := getBot(t) u := tgbotapi.NewUpdate(0) _, err := bot.GetUpdates(u) if err != nil { t.Error(err) t.Fail() } } func TestSendWithMessage(t *testing.T) { bot, _ := getBot(t) msg := tgbotapi.NewMessage(ChatID, "A test message from the test library in telegram-bot-api") msg.ParseMode = "markdown" _, err := bot.Send(msg) if err != nil { t.Error(err) t.Fail() } } func TestSendWithMessageReply(t *testing.T) { bot, _ := getBot(t) msg := tgbotapi.NewMessage(ChatID, "A test message from the test library in telegram-bot-api") msg.ReplyToMessageID = ReplyToMessageID _, err := bot.Send(msg) if err != nil { t.Error(err) t.Fail() } } func TestSendWithMessageForward(t *testing.T) { bot, _ := getBot(t) msg := tgbotapi.NewForward(ChatID, ChatID, ReplyToMessageID) _, err := bot.Send(msg) if err != nil { t.Error(err) t.Fail() } } func TestSendWithNewPhoto(t *testing.T) { bot, _ := getBot(t) msg := tgbotapi.NewPhotoUpload(ChatID, "tests/image.jpg") msg.Caption = "Test" _, err := bot.Send(msg) if err != nil { t.Error(err) t.Fail() } } func TestSendWithNewPhotoWithFileBytes(t *testing.T) { bot, _ := getBot(t) data, _ := ioutil.ReadFile("tests/image.jpg") b := tgbotapi.FileBytes{Name: "image.jpg", Bytes: data} msg := tgbotapi.NewPhotoUpload(ChatID, b) msg.Caption = "Test" _, err := bot.Send(msg) if err != nil { t.Error(err) t.Fail() } } func TestSendWithNewPhotoWithFileReader(t *testing.T) { bot, _ := getBot(t) f, _ := os.Open("tests/image.jpg") reader := tgbotapi.FileReader{Name: "image.jpg", Reader: f, Size: -1} msg := tgbotapi.NewPhotoUpload(ChatID, reader) msg.Caption = "Test" _, err := bot.Send(msg) if err != nil { t.Error(err) t.Fail() } } func TestSendWithNewPhotoReply(t *testing.T) { bot, _ := getBot(t) msg := tgbotapi.NewPhotoUpload(ChatID, "tests/image.jpg") msg.ReplyToMessageID = ReplyToMessageID _, err := bot.Send(msg) if err != nil { t.Error(err) t.Fail() } } func TestSendWithExistingPhoto(t *testing.T) { bot, _ := getBot(t) msg := tgbotapi.NewPhotoShare(ChatID, ExistingPhotoFileID) msg.Caption = "Test" _, err := bot.Send(msg) if err != nil { t.Error(err) t.Fail() } } func TestSendWithNewDocument(t *testing.T) { bot, _ := getBot(t) msg := tgbotapi.NewDocumentUpload(ChatID, "tests/image.jpg") _, err := bot.Send(msg) if err != nil { t.Error(err) t.Fail() } } func TestSendWithExistingDocument(t *testing.T) { bot, _ := getBot(t) msg := tgbotapi.NewDocumentShare(ChatID, ExistingDocumentFileID) _, err := bot.Send(msg) if err != nil { t.Error(err) t.Fail() } } func TestSendWithNewAudio(t *testing.T) { bot, _ := getBot(t) msg := tgbotapi.NewAudioUpload(ChatID, "tests/audio.mp3") msg.Title = "TEST" msg.Duration = 10 msg.Performer = "TEST" msg.MimeType = "audio/mpeg" msg.FileSize = 688 _, err := bot.Send(msg) if err != nil { t.Error(err) t.Fail() } } func TestSendWithExistingAudio(t *testing.T) { bot, _ := getBot(t) msg := tgbotapi.NewAudioShare(ChatID, ExistingAudioFileID) msg.Title = "TEST" msg.Duration = 10 msg.Performer = "TEST" _, err := bot.Send(msg) if err != nil { t.Error(err) t.Fail() } } func TestSendWithNewVoice(t *testing.T) { bot, _ := getBot(t) msg := tgbotapi.NewVoiceUpload(ChatID, "tests/voice.ogg") msg.Duration = 10 _, err := bot.Send(msg) if err != nil { t.Error(err) t.Fail() } } func TestSendWithExistingVoice(t *testing.T) { bot, _ := getBot(t) msg := tgbotapi.NewVoiceShare(ChatID, ExistingVoiceFileID) msg.Duration = 10 _, err := bot.Send(msg) if err != nil { t.Error(err) t.Fail() } } func TestSendWithContact(t *testing.T) { bot, _ := getBot(t) contact := tgbotapi.NewContact(ChatID, "5551234567", "Test") if _, err := bot.Send(contact); err != nil { t.Error(err) t.Fail() } } func TestSendWithLocation(t *testing.T) { bot, _ := getBot(t) _, err := bot.Send(tgbotapi.NewLocation(ChatID, 40, 40)) if err != nil { t.Error(err) t.Fail() } } func TestSendWithVenue(t *testing.T) { bot, _ := getBot(t) venue := tgbotapi.NewVenue(ChatID, "A Test Location", "123 Test Street", 40, 40) if _, err := bot.Send(venue); err != nil { t.Error(err) t.Fail() } } func TestSendWithNewVideo(t *testing.T) { bot, _ := getBot(t) msg := tgbotapi.NewVideoUpload(ChatID, "tests/video.mp4") msg.Duration = 10 msg.Caption = "TEST" _, err := bot.Send(msg) if err != nil { t.Error(err) t.Fail() } } func TestSendWithExistingVideo(t *testing.T) { bot, _ := getBot(t) msg := tgbotapi.NewVideoShare(ChatID, ExistingVideoFileID) msg.Duration = 10 msg.Caption = "TEST" _, err := bot.Send(msg) if err != nil { t.Error(err) t.Fail() } } func TestSendWithNewVideoNote(t *testing.T) { bot, _ := getBot(t) msg := tgbotapi.NewVideoNoteUpload(ChatID, 240, "tests/videonote.mp4") msg.Duration = 10 _, err := bot.Send(msg) if err != nil { t.Error(err) t.Fail() } } func TestSendWithExistingVideoNote(t *testing.T) { bot, _ := getBot(t) msg := tgbotapi.NewVideoNoteShare(ChatID, 240, ExistingVideoNoteFileID) msg.Duration = 10 _, err := bot.Send(msg) if err != nil { t.Error(err) t.Fail() } } func TestSendWithNewSticker(t *testing.T) { bot, _ := getBot(t) msg := tgbotapi.NewStickerUpload(ChatID, "tests/image.jpg") _, err := bot.Send(msg) if err != nil { t.Error(err) t.Fail() } } func TestSendWithExistingSticker(t *testing.T) { bot, _ := getBot(t) msg := tgbotapi.NewStickerShare(ChatID, ExistingStickerFileID) _, err := bot.Send(msg) if err != nil { t.Error(err) t.Fail() } } func TestSendWithNewStickerAndKeyboardHide(t *testing.T) { bot, _ := getBot(t) msg := tgbotapi.NewStickerUpload(ChatID, "tests/image.jpg") msg.ReplyMarkup = tgbotapi.ReplyKeyboardRemove{ RemoveKeyboard: true, Selective: false, } _, err := bot.Send(msg) if err != nil { t.Error(err) t.Fail() } } func TestSendWithExistingStickerAndKeyboardHide(t *testing.T) { bot, _ := getBot(t) msg := tgbotapi.NewStickerShare(ChatID, ExistingStickerFileID) msg.ReplyMarkup = tgbotapi.ReplyKeyboardRemove{ RemoveKeyboard: true, Selective: false, } _, err := bot.Send(msg) if err != nil { t.Error(err) t.Fail() } } func TestGetFile(t *testing.T) { bot, _ := getBot(t) file := tgbotapi.FileConfig{ FileID: ExistingPhotoFileID, } _, err := bot.GetFile(file) if err != nil { t.Error(err) t.Fail() } } func TestSendChatConfig(t *testing.T) { bot, _ := getBot(t) _, err := bot.Request(tgbotapi.NewChatAction(ChatID, tgbotapi.ChatTyping)) if err != nil { t.Error(err) t.Fail() } } func TestSendEditMessage(t *testing.T) { bot, _ := getBot(t) msg, err := bot.Send(tgbotapi.NewMessage(ChatID, "Testing editing.")) if err != nil { t.Error(err) t.Fail() } edit := tgbotapi.EditMessageTextConfig{ BaseEdit: tgbotapi.BaseEdit{ ChatID: ChatID, MessageID: msg.MessageID, }, Text: "Updated text.", } _, err = bot.Send(edit) if err != nil { t.Error(err) t.Fail() } } func TestGetUserProfilePhotos(t *testing.T) { bot, _ := getBot(t) _, err := bot.GetUserProfilePhotos(tgbotapi.NewUserProfilePhotos(ChatID)) if err != nil { t.Error(err) t.Fail() } } func TestSetWebhookWithCert(t *testing.T) { bot, _ := getBot(t) time.Sleep(time.Second * 2) bot.Request(tgbotapi.RemoveWebhookConfig{}) wh := tgbotapi.NewWebhookWithCert("https://example.com/tgbotapi-test/"+bot.Token, "tests/cert.pem") _, err := bot.Request(wh) if err != nil { t.Error(err) t.Fail() } info, err := bot.GetWebhookInfo() if err != nil { t.Error(err) } if info.LastErrorDate != 0 { t.Errorf("failed to set webhook: %s", info.LastErrorMessage) } bot.Request(tgbotapi.RemoveWebhookConfig{}) } func TestSetWebhookWithoutCert(t *testing.T) { bot, _ := getBot(t) time.Sleep(time.Second * 2) bot.Request(tgbotapi.RemoveWebhookConfig{}) wh := tgbotapi.NewWebhook("https://example.com/tgbotapi-test/" + bot.Token) _, err := bot.Request(wh) if err != nil { t.Error(err) t.Fail() } info, err := bot.GetWebhookInfo() if err != nil { t.Error(err) } if info.LastErrorDate != 0 { t.Errorf("failed to set webhook: %s", info.LastErrorMessage) } bot.Request(tgbotapi.RemoveWebhookConfig{}) } func TestUpdatesChan(t *testing.T) { bot, _ := getBot(t) var ucfg tgbotapi.UpdateConfig = tgbotapi.NewUpdate(0) ucfg.Timeout = 60 _, err := bot.GetUpdatesChan(ucfg) if err != nil { t.Error(err) t.Fail() } } func ExampleNewBotAPI() { bot, err := tgbotapi.NewBotAPI("MyAwesomeBotToken") if err != nil { log.Panic(err) } bot.Debug = true log.Printf("Authorized on account %s", bot.Self.UserName) u := tgbotapi.NewUpdate(0) u.Timeout = 60 updates, err := bot.GetUpdatesChan(u) // Optional: wait for updates and clear them if you don't want to handle // a large backlog of old messages time.Sleep(time.Millisecond * 500) updates.Clear() for update := range updates { if update.Message == nil { continue } log.Printf("[%s] %s", update.Message.From.UserName, update.Message.Text) msg := tgbotapi.NewMessage(update.Message.Chat.ID, update.Message.Text) msg.ReplyToMessageID = update.Message.MessageID bot.Send(msg) } } func ExampleNewWebhook() { bot, err := tgbotapi.NewBotAPI("MyAwesomeBotToken") if err != nil { log.Fatal(err) } bot.Debug = true log.Printf("Authorized on account %s", bot.Self.UserName) _, err = bot.Request(tgbotapi.NewWebhookWithCert("https://www.google.com:8443/"+bot.Token, "cert.pem")) if err != nil { log.Fatal(err) } info, err := bot.GetWebhookInfo() if err != nil { log.Fatal(err) } if info.LastErrorDate != 0 { log.Printf("failed to set webhook: %s", info.LastErrorMessage) } updates := bot.ListenForWebhook("/" + bot.Token) go http.ListenAndServeTLS("0.0.0.0:8443", "cert.pem", "key.pem", nil) for update := range updates { log.Printf("%+v\n", update) } } func ExampleInlineConfig() { bot, err := tgbotapi.NewBotAPI("MyAwesomeBotToken") // create new bot if err != nil { log.Panic(err) } log.Printf("Authorized on account %s", bot.Self.UserName) u := tgbotapi.NewUpdate(0) u.Timeout = 60 updates, err := bot.GetUpdatesChan(u) for update := range updates { if update.InlineQuery == nil { // if no inline query, ignore it continue } article := tgbotapi.NewInlineQueryResultArticle(update.InlineQuery.ID, "Echo", update.InlineQuery.Query) article.Description = update.InlineQuery.Query inlineConf := tgbotapi.InlineConfig{ InlineQueryID: update.InlineQuery.ID, IsPersonal: true, CacheTime: 0, Results: []interface{}{article}, } if _, err := bot.Request(inlineConf); err != nil { log.Println(err) } } } func TestDeleteMessage(t *testing.T) { bot, _ := getBot(t) msg := tgbotapi.NewMessage(ChatID, "A test message from the test library in telegram-bot-api") msg.ParseMode = "markdown" message, _ := bot.Send(msg) deleteMessageConfig := tgbotapi.DeleteMessageConfig{ ChatID: message.Chat.ID, MessageID: message.MessageID, } _, err := bot.Request(deleteMessageConfig) if err != nil { t.Error(err) t.Fail() } } func TestPinChatMessage(t *testing.T) { bot, _ := getBot(t) msg := tgbotapi.NewMessage(SupergroupChatID, "A test message from the test library in telegram-bot-api") msg.ParseMode = "markdown" message, _ := bot.Send(msg) pinChatMessageConfig := tgbotapi.PinChatMessageConfig{ ChatID: message.Chat.ID, MessageID: message.MessageID, DisableNotification: false, } _, err := bot.Request(pinChatMessageConfig) if err != nil { t.Error(err) t.Fail() } } func TestUnpinChatMessage(t *testing.T) { bot, _ := getBot(t) msg := tgbotapi.NewMessage(SupergroupChatID, "A test message from the test library in telegram-bot-api") msg.ParseMode = "markdown" message, _ := bot.Send(msg) // We need pin message to unpin something pinChatMessageConfig := tgbotapi.PinChatMessageConfig{ ChatID: message.Chat.ID, MessageID: message.MessageID, DisableNotification: false, } if _, err := bot.Request(pinChatMessageConfig); err != nil { t.Error(err) t.Fail() } unpinChatMessageConfig := tgbotapi.UnpinChatMessageConfig{ ChatID: message.Chat.ID, } if _, err := bot.Request(unpinChatMessageConfig); err != nil { t.Error(err) t.Fail() } }