2
0
mirror of https://github.com/yagop/node-telegram-bot-api synced 2025-08-29 21:37:58 +00:00

Telegram Bot API 5.0 Support (#835)

* Add new method sendPoll

* getMyCommands

* setMyCommands

* Update doc/api

* 1# Fix Test sendPhoto

The sendPhoto method does not support .gif files, use sendAnimation.

This fix remplace .gif file by .png

* CustomTitle and ChatPermissions support

setChatAdministratorCustomTitle
setChatPermissions

* Update Readme

Update Badge Telegram API Version

* Minor Fix and Fix setChatPhoto

The Telegram Bots api has a bug that they are fixing and gives problems with the previous image. While they don't fix it, the image replacement is the fastest solution

* Minor Fix and Add Test

Fixed setChatPermissions

Test:
- sendDice
- getMyCommands
- setMyCommands
- setChatAdministratorCustomTitle
- setChatPermissions

* Update Changelog and Package.json version

* Fix typos in Changelog

* Add support for poll_answer

From: https://github.com/yagop/node-telegram-bot-api/pull/777

* Add JieJiSS contribution in Changelog

* Add sendPoll Test

* Add unpinAllChatMessages Support

* Add copyMessage support

* Add close and logOut Support

* Add Test + Minor fixes

* Update CHANGELOG

Update version 0.50.1

* Update Readme Bot API Badge

* Update Version to 0.51.0
This commit is contained in:
Daniel Pérez Fernández 2020-12-10 11:47:22 +01:00 committed by GitHub
parent fc24d0dc4d
commit 5d30b6a134
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 230 additions and 60 deletions

View File

@ -3,6 +3,25 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
This project adheres to [Semantic Versioning](http://semver.org/). This project adheres to [Semantic Versioning](http://semver.org/).
## [0.51.0][0.51.0] - 2020-11-04
Added:
1. Support Bot API v5.0: (by @danielperez9430)
* Add method *copyMessage()*
* Add method *unpinAllChatMessages()*
* Add method *close()*
* Add method *logOut()*
Changed: (by @danielperez9430)
* Remove trailing-spaces
* Fix Bugs in Test
New Test: (by @danielperez9430)
* copyMessage
* unpinAllChatMessages
## [0.50.0][0.50.0] - 2020-05-2020 ## [0.50.0][0.50.0] - 2020-05-2020
Added: Added:

View File

@ -4,7 +4,7 @@
Node.js module to interact with the official [Telegram Bot API](https://core.telegram.org/bots/api). Node.js module to interact with the official [Telegram Bot API](https://core.telegram.org/bots/api).
[![Bot API](https://img.shields.io/badge/Bot%20API-v.4.8.0-00aced.svg?style=flat-square&logo=telegram)](https://core.telegram.org/bots/api) [![Bot API](https://img.shields.io/badge/Bot%20API-v.5.0-00aced.svg?style=flat-square&logo=telegram)](https://core.telegram.org/bots/api)
[![npm package](https://img.shields.io/npm/v/node-telegram-bot-api?logo=npm&style=flat-square)](https://www.npmjs.org/package/node-telegram-bot-api) [![npm package](https://img.shields.io/npm/v/node-telegram-bot-api?logo=npm&style=flat-square)](https://www.npmjs.org/package/node-telegram-bot-api)
[![Build Status](https://img.shields.io/travis/yagop/node-telegram-bot-api/master?style=flat-square&logo=travis)](https://travis-ci.org/yagop/node-telegram-bot-api) [![Build Status](https://img.shields.io/travis/yagop/node-telegram-bot-api/master?style=flat-square&logo=travis)](https://travis-ci.org/yagop/node-telegram-bot-api)
[![Coverage Status](https://img.shields.io/codecov/c/github/yagop/node-telegram-bot-api?style=flat-square&logo=codecov)](https://codecov.io/gh/yagop/node-telegram-bot-api) [![Coverage Status](https://img.shields.io/codecov/c/github/yagop/node-telegram-bot-api?style=flat-square&logo=codecov)](https://codecov.io/gh/yagop/node-telegram-bot-api)

View File

@ -22,6 +22,8 @@ TelegramBot
* [.closeWebHook()](#TelegramBot+closeWebHook) ⇒ <code>Promise</code> * [.closeWebHook()](#TelegramBot+closeWebHook) ⇒ <code>Promise</code>
* [.hasOpenWebHook()](#TelegramBot+hasOpenWebHook) ⇒ <code>Boolean</code> * [.hasOpenWebHook()](#TelegramBot+hasOpenWebHook) ⇒ <code>Boolean</code>
* [.getMe([options])](#TelegramBot+getMe) ⇒ <code>Promise</code> * [.getMe([options])](#TelegramBot+getMe) ⇒ <code>Promise</code>
* [.logOut([options])](#TelegramBot+logOut) ⇒ <code>Promise</code>
* [.close([options])](#TelegramBot+close) ⇒ <code>Promise</code>
* [.setWebHook(url, [options], [fileOptions])](#TelegramBot+setWebHook) ⇒ <code>Promise</code> * [.setWebHook(url, [options], [fileOptions])](#TelegramBot+setWebHook) ⇒ <code>Promise</code>
* [.deleteWebHook([options])](#TelegramBot+deleteWebHook) ⇒ <code>Promise</code> * [.deleteWebHook([options])](#TelegramBot+deleteWebHook) ⇒ <code>Promise</code>
* [.getWebHookInfo([options])](#TelegramBot+getWebHookInfo) ⇒ <code>Promise</code> * [.getWebHookInfo([options])](#TelegramBot+getWebHookInfo) ⇒ <code>Promise</code>
@ -30,6 +32,7 @@ TelegramBot
* [.sendMessage(chatId, text, [options])](#TelegramBot+sendMessage) ⇒ <code>Promise</code> * [.sendMessage(chatId, text, [options])](#TelegramBot+sendMessage) ⇒ <code>Promise</code>
* [.answerInlineQuery(inlineQueryId, results, [options])](#TelegramBot+answerInlineQuery) ⇒ <code>Promise</code> * [.answerInlineQuery(inlineQueryId, results, [options])](#TelegramBot+answerInlineQuery) ⇒ <code>Promise</code>
* [.forwardMessage(chatId, fromChatId, messageId, [options])](#TelegramBot+forwardMessage) ⇒ <code>Promise</code> * [.forwardMessage(chatId, fromChatId, messageId, [options])](#TelegramBot+forwardMessage) ⇒ <code>Promise</code>
* [.copyMessage(chatId, fromChatId, messageId, [options])](#TelegramBot+copyMessage) ⇒ <code>Promise</code>
* [.sendPhoto(chatId, photo, [options], [fileOptions])](#TelegramBot+sendPhoto) ⇒ <code>Promise</code> * [.sendPhoto(chatId, photo, [options], [fileOptions])](#TelegramBot+sendPhoto) ⇒ <code>Promise</code>
* [.sendAudio(chatId, audio, [options], [fileOptions])](#TelegramBot+sendAudio) ⇒ <code>Promise</code> * [.sendAudio(chatId, audio, [options], [fileOptions])](#TelegramBot+sendAudio) ⇒ <code>Promise</code>
* [.sendDocument(chatId, doc, [options], [fileOptions])](#TelegramBot+sendDocument) ⇒ <code>Promise</code> * [.sendDocument(chatId, doc, [options], [fileOptions])](#TelegramBot+sendDocument) ⇒ <code>Promise</code>
@ -52,6 +55,7 @@ TelegramBot
* [.setChatDescription(chatId, description, [options])](#TelegramBot+setChatDescription) ⇒ <code>Promise</code> * [.setChatDescription(chatId, description, [options])](#TelegramBot+setChatDescription) ⇒ <code>Promise</code>
* [.pinChatMessage(chatId, messageId, [options])](#TelegramBot+pinChatMessage) ⇒ <code>Promise</code> * [.pinChatMessage(chatId, messageId, [options])](#TelegramBot+pinChatMessage) ⇒ <code>Promise</code>
* [.unpinChatMessage(chatId, [options])](#TelegramBot+unpinChatMessage) ⇒ <code>Promise</code> * [.unpinChatMessage(chatId, [options])](#TelegramBot+unpinChatMessage) ⇒ <code>Promise</code>
* [.unpinAllChatMessages(chatId, [options])](#TelegramBot+unpinAllChatMessages) ⇒ <code>Promise</code>
* [.answerCallbackQuery(callbackQueryId, [options])](#TelegramBot+answerCallbackQuery) ⇒ <code>Promise</code> * [.answerCallbackQuery(callbackQueryId, [options])](#TelegramBot+answerCallbackQuery) ⇒ <code>Promise</code>
* [.setMyCommands(commands, [options])](#TelegramBot+setMyCommands) ⇒ <code>Promise</code> * [.setMyCommands(commands, [options])](#TelegramBot+setMyCommands) ⇒ <code>Promise</code>
* [.getMyCommands([options])](#TelegramBot+getMyCommands) ⇒ <code>Promise</code> * [.getMyCommands([options])](#TelegramBot+getMyCommands) ⇒ <code>Promise</code>
@ -235,6 +239,35 @@ Returns basic information about the bot in form of a `User` object.
| --- | --- | --- | | --- | --- | --- |
| [options] | <code>Object</code> | Additional Telegram query options | | [options] | <code>Object</code> | Additional Telegram query options |
<a name="TelegramBot+logOut"></a>
### telegramBot.logOut([options]) ⇒ <code>Promise</code>
This method log out your bot from the cloud Bot API server before launching the bot locally.
You must log out the bot before running it locally, otherwise there is no guarantee that the bot will receive updates.
After a successful call, you will not be able to log in again using the same token for 10 minutes.
Returns True on success.
**Kind**: instance method of [<code>TelegramBot</code>](#TelegramBot)
**See**: https://core.telegram.org/bots/api#logout
| Param | Type | Description |
| --- | --- | --- |
| [options] | <code>Object</code> | Additional Telegram query options |
<a name="TelegramBot+close"></a>
### telegramBot.close([options]) ⇒ <code>Promise</code>
This method close the bot instance before moving it from one local server to another.
This method will return error 429 in the first 10 minutes after the bot is launched.
Returns True on success.
**Kind**: instance method of [<code>TelegramBot</code>](#TelegramBot)
**See**: https://core.telegram.org/bots/api#close
| Param | Type | Description |
| --- | --- | --- |
| [options] | <code>Object</code> | Additional Telegram query options |
<a name="TelegramBot+setWebHook"></a> <a name="TelegramBot+setWebHook"></a>
### telegramBot.setWebHook(url, [options], [fileOptions]) ⇒ <code>Promise</code> ### telegramBot.setWebHook(url, [options], [fileOptions]) ⇒ <code>Promise</code>
@ -354,6 +387,20 @@ Forward messages of any kind.
| messageId | <code>Number</code> \| <code>String</code> | Unique message identifier | | messageId | <code>Number</code> \| <code>String</code> | Unique message identifier |
| [options] | <code>Object</code> | Additional Telegram query options | | [options] | <code>Object</code> | Additional Telegram query options |
<a name="TelegramBot+copyMessage"></a>
### telegramBot.copyMessage(chatId, fromChatId, messageId, [options]) ⇒ <code>Promise</code>
Copy messages of any kind.
**Kind**: instance method of [<code>TelegramBot</code>](#TelegramBot)
| Param | Type | Description |
| --- | --- | --- |
| chatId | <code>Number</code> \| <code>String</code> | Unique identifier for the message recipient |
| fromChatId | <code>Number</code> \| <code>String</code> | Unique identifier for the chat where the original message was sent |
| messageId | <code>Number</code> \| <code>String</code> | Unique message identifier |
| [options] | <code>Object</code> | Additional Telegram query options |
<a name="TelegramBot+sendPhoto"></a> <a name="TelegramBot+sendPhoto"></a>
### telegramBot.sendPhoto(chatId, photo, [options], [fileOptions]) ⇒ <code>Promise</code> ### telegramBot.sendPhoto(chatId, photo, [options], [fileOptions]) ⇒ <code>Promise</code>
@ -720,7 +767,7 @@ Returns True on success.
<a name="TelegramBot+unpinChatMessage"></a> <a name="TelegramBot+unpinChatMessage"></a>
### telegramBot.unpinChatMessage(chatId, [options]) ⇒ <code>Promise</code> ### telegramBot.unpinChatMessage(chatId, [options]) ⇒ <code>Promise</code>
Use this method to unpin a message in a supergroup chat. Use this method to unpin a message from the list of pinned messages in a chat.
The bot must be an administrator in the chat for this to work and must have the appropriate admin rights. The bot must be an administrator in the chat for this to work and must have the appropriate admin rights.
Returns True on success. Returns True on success.
@ -732,6 +779,21 @@ Returns True on success.
| chatId | <code>Number</code> \| <code>String</code> | Unique identifier for the message recipient | | chatId | <code>Number</code> \| <code>String</code> | Unique identifier for the message recipient |
| [options] | <code>Object</code> | Additional Telegram query options | | [options] | <code>Object</code> | Additional Telegram query options |
<a name="TelegramBot+unpinAllChatMessages"></a>
### telegramBot.unpinAllChatMessages(chatId, [options]) ⇒ <code>Promise</code>
Use this method to clear the list of pinned messages in a chat
The bot must be an administrator in the chat for this to work and must have the appropriate admin rights.
Returns True on success.
**Kind**: instance method of [<code>TelegramBot</code>](#TelegramBot)
**See**: https://core.telegram.org/bots/api#unpinallchatmessages
| Param | Type | Description |
| --- | --- | --- |
| chatId | <code>Number</code> \| <code>String</code> | Unique identifier for the message recipient |
| [options] | <code>Object</code> | Additional Telegram query options |
<a name="TelegramBot+answerCallbackQuery"></a> <a name="TelegramBot+answerCallbackQuery"></a>
### telegramBot.answerCallbackQuery(callbackQueryId, [options]) ⇒ <code>Promise</code> ### telegramBot.answerCallbackQuery(callbackQueryId, [options]) ⇒ <code>Promise</code>

View File

@ -1,6 +1,6 @@
{ {
"name": "node-telegram-bot-api", "name": "node-telegram-bot-api",
"version": "0.50.0", "version": "0.51.0",
"description": "Telegram Bot API", "description": "Telegram Bot API",
"main": "./index.js", "main": "./index.js",
"directories": { "directories": {

View File

@ -473,6 +473,31 @@ class TelegramBot extends EventEmitter {
return this._request('getMe', { form }); return this._request('getMe', { form });
} }
/**
* This method log out your bot from the cloud Bot API server before launching the bot locally.
* You must log out the bot before running it locally, otherwise there is no guarantee that the bot will receive updates.
* After a successful call, you will not be able to log in again using the same token for 10 minutes.
* Returns True on success.
* @param {Object} [options] Additional Telegram query options
* @return {Promise}
* @see https://core.telegram.org/bots/api#logout
*/
logOut(form = {}) {
return this._request('logOut', { form });
}
/**
* This method close the bot instance before moving it from one local server to another.
* This method will return error 429 in the first 10 minutes after the bot is launched.
* Returns True on success.
* @param {Object} [options] Additional Telegram query options
* @return {Promise}
* @see https://core.telegram.org/bots/api#close
*/
close(form = {}) {
return this._request('close', { form });
}
/** /**
* Specify an url to receive incoming updates via an outgoing webHook. * Specify an url to receive incoming updates via an outgoing webHook.
* This method has an [older, compatible signature][setWebHook-v0.25.0] * This method has an [older, compatible signature][setWebHook-v0.25.0]
@ -712,6 +737,7 @@ class TelegramBot extends EventEmitter {
* @param {Number|String} messageId Unique message identifier * @param {Number|String} messageId Unique message identifier
* @param {Object} [options] Additional Telegram query options * @param {Object} [options] Additional Telegram query options
* @return {Promise} * @return {Promise}
* @see https://core.telegram.org/bots/api#forwardmessage
*/ */
forwardMessage(chatId, fromChatId, messageId, form = {}) { forwardMessage(chatId, fromChatId, messageId, form = {}) {
form.chat_id = chatId; form.chat_id = chatId;
@ -720,6 +746,26 @@ class TelegramBot extends EventEmitter {
return this._request('forwardMessage', { form }); return this._request('forwardMessage', { form });
} }
/**
* Copy messages of any kind.
* The method is analogous to the method forwardMessages, but the copied message doesn't
* have a link to the original message.
* Returns the MessageId of the sent message on success.
* @param {Number|String} chatId Unique identifier for the message recipient
* @param {Number|String} fromChatId Unique identifier for the chat where the
* original message was sent
* @param {Number|String} messageId Unique message identifier
* @param {Object} [options] Additional Telegram query options
* @return {Promise}
* @see https://core.telegram.org/bots/api#copymessage
*/
copyMessage(chatId, fromChatId, messageId, form = {}) {
form.chat_id = chatId;
form.from_chat_id = fromChatId;
form.message_id = messageId;
return this._request('copyMessage', { form });
}
/** /**
* Send photo * Send photo
* @param {Number|String} chatId Unique identifier for the message recipient * @param {Number|String} chatId Unique identifier for the message recipient
@ -1202,6 +1248,21 @@ class TelegramBot extends EventEmitter {
return this._request('unpinChatMessage', { form }); return this._request('unpinChatMessage', { form });
} }
/**
* Use this method to clear the list of pinned messages in a chat
* The bot must be an administrator in the chat for this to work and must have the appropriate admin rights.
* Returns True on success.
*
* @param {Number|String} chatId Unique identifier for the message recipient
* @param {Object} [options] Additional Telegram query options
* @return {Promise}
* @see https://core.telegram.org/bots/api#unpinallchatmessages
*/
unpinAllChatMessages(chatId, form = {}) {
form.chat_id = chatId;
return this._request('unpinAllChatMessages', { form });
}
/** /**
* Use this method to send answers to callback queries sent from * Use this method to send answers to callback queries sent from
* inline keyboards. The answer will be displayed to the user as * inline keyboards. The answer will be displayed to the user as

View File

@ -63,11 +63,11 @@ describe('module.exports', function moduleExportsSuite() {
const nodeVersion = parseInt(process.versions.node.split('.')[0], 10); const nodeVersion = parseInt(process.versions.node.split('.')[0], 10);
it('is loaded from src/ on Node.js v6+ and above', function test() { it('is loaded from src/ on Node.js v6+ and above', function test() {
if (nodeVersion <= 5) this.skip(); // skip on Node.js v5 and below if (nodeVersion <= 5) this.skip(); // skip on Node.js v5 and below
assert.equal(TelegramBot, require('../src/telegram')); assert.strictEqual(TelegramBot, require('../src/telegram'));
}); });
it('is loaded from lib/ on Node.js v5 and below', function test() { it('is loaded from lib/ on Node.js v5 and below', function test() {
if (nodeVersion > 5) this.skip(); // skip on newer versions if (nodeVersion > 5) this.skip(); // skip on newer versions
assert.equal(TelegramBot, require('../lib/telegram')); assert.strictEqual(TelegramBot, require('../lib/telegram'));
}); });
}); });
@ -125,22 +125,22 @@ describe('TelegramBot', function telegramSuite() {
}); });
it('automatically starts polling', function test() { it('automatically starts polling', function test() {
assert.equal(botPolling.isPolling(), true); assert.strictEqual(botPolling.isPolling(), true);
return utils.isPollingMockServer(pollingPort2); return utils.isPollingMockServer(pollingPort2);
}); });
it('automatically opens webhook', function test() { it('automatically opens webhook', function test() {
assert.equal(botWebHook.hasOpenWebHook(), true); assert.strictEqual(botWebHook.hasOpenWebHook(), true);
return utils.hasOpenWebHook(webHookPort2); return utils.hasOpenWebHook(webHookPort2);
}); });
it('does not automatically poll if "autoStart" is false', function test() { it('does not automatically poll if "autoStart" is false', function test() {
assert.equal(testbot.isPolling(), false); assert.strictEqual(testbot.isPolling(), false);
return utils.isPollingMockServer(pollingPort, true); return utils.isPollingMockServer(pollingPort, true);
}); });
it('does not automatically open webhook if "autoOpen" is false', function test() { it('does not automatically open webhook if "autoOpen" is false', function test() {
assert.equal(testbot.hasOpenWebHook(), false); assert.strictEqual(testbot.hasOpenWebHook(), false);
return utils.hasOpenWebHook(webHookPort, true); return utils.hasOpenWebHook(webHookPort, true);
}); });
@ -169,7 +169,7 @@ describe('TelegramBot', function telegramSuite() {
const myBot = new TelegramBot(12345, { polling: true }); const myBot = new TelegramBot(12345, { polling: true });
myBot.once('polling_error', (error) => { myBot.once('polling_error', (error) => {
assert.ok(error); assert.ok(error);
assert.equal(error.code, 'ETELEGRAM'); assert.strictEqual(error.code, 'ETELEGRAM');
return myBot.stopPolling().then(() => { done(); }).catch(done); return myBot.stopPolling().then(() => { done(); }).catch(done);
}); });
}); });
@ -182,7 +182,7 @@ describe('TelegramBot', function telegramSuite() {
it('(webhook) emits "webhook_error" if could not parse webhook request body', function test(done) { it('(webhook) emits "webhook_error" if could not parse webhook request body', function test(done) {
botWebHook.once('webhook_error', (error) => { botWebHook.once('webhook_error', (error) => {
assert.ok(error); assert.ok(error);
assert.equal(error.code, 'EPARSE'); assert.strictEqual(error.code, 'EPARSE');
return done(); return done();
}); });
utils.sendWebHookMessage(webHookPort2, TOKEN, { update: 'unparseable!', json: false }); utils.sendWebHookMessage(webHookPort2, TOKEN, { update: 'unparseable!', json: false });
@ -192,13 +192,13 @@ describe('TelegramBot', function telegramSuite() {
describe('WebHook', function webHookSuite() { describe('WebHook', function webHookSuite() {
it('returns 200 OK for health endpoint', function test(done) { it('returns 200 OK for health endpoint', function test(done) {
utils.sendWebHookRequest(webHookPort2, '/healthz').then(resp => { utils.sendWebHookRequest(webHookPort2, '/healthz').then(resp => {
assert.equal(resp, 'OK'); assert.strictEqual(resp, 'OK');
return done(); return done();
}); });
}); });
it('returns 401 error if token is wrong', function test(done) { it('returns 401 error if token is wrong', function test(done) {
utils.sendWebHookMessage(webHookPort2, 'wrong-token').catch(resp => { utils.sendWebHookMessage(webHookPort2, 'wrong-token').catch(resp => {
assert.equal(resp.statusCode, 401); assert.strictEqual(resp.statusCode, 401);
return done(); return done();
}); });
}); });
@ -250,7 +250,7 @@ describe('TelegramBot', function telegramSuite() {
const myBot = new TelegramBot(null); const myBot = new TelegramBot(null);
return myBot.sendMessage(USERID, 'text').catch(error => { return myBot.sendMessage(USERID, 'text').catch(error => {
// FIX: assert.ok(error instanceof TelegramBot.errors.FatalError); // FIX: assert.ok(error instanceof TelegramBot.errors.FatalError);
assert.equal(error.code, 'EFATAL'); assert.strictEqual(error.code, 'EFATAL');
assert.ok(error.message.indexOf('not provided') > -1); assert.ok(error.message.indexOf('not provided') > -1);
}); });
}); });
@ -263,7 +263,7 @@ describe('TelegramBot', function telegramSuite() {
} }
return bot.sendPhoto(USERID, buffer).catch(error => { return bot.sendPhoto(USERID, buffer).catch(error => {
// FIX: assert.ok(error instanceof TelegramBot.errors.FatalError); // FIX: assert.ok(error instanceof TelegramBot.errors.FatalError);
assert.equal(error.code, 'EFATAL'); assert.strictEqual(error.code, 'EFATAL');
assert.ok(error.message.indexOf('Unsupported') > -1); assert.ok(error.message.indexOf('Unsupported') > -1);
}); });
}); });
@ -273,13 +273,13 @@ describe('TelegramBot', function telegramSuite() {
}); });
return myBot.getMe().catch(error => { return myBot.getMe().catch(error => {
// FIX: assert.ok(error instanceof TelegramBot.errors.FatalError); // FIX: assert.ok(error instanceof TelegramBot.errors.FatalError);
assert.equal(error.code, 'EFATAL'); assert.strictEqual(error.code, 'EFATAL');
}); });
}); });
it('ParseError is thrown if response body could not be parsed', function test() { it('ParseError is thrown if response body could not be parsed', function test() {
botParse.sendMessage(USERID, 'text').catch(error => { botParse.sendMessage(USERID, 'text').catch(error => {
// FIX: assert.ok(error instanceof TelegramBot.errors.ParseError); // FIX: assert.ok(error instanceof TelegramBot.errors.ParseError);
assert.equal(error.code, 'EPARSE'); assert.strictEqual(error.code, 'EPARSE');
assert.ok(typeof error.response === 'object'); assert.ok(typeof error.response === 'object');
assert.ok(typeof error.response.body === 'string'); assert.ok(typeof error.response.body === 'string');
}); });
@ -287,7 +287,7 @@ describe('TelegramBot', function telegramSuite() {
it('TelegramError is thrown if error is from Telegram', function test() { it('TelegramError is thrown if error is from Telegram', function test() {
return bot.sendMessage('404', 'text').catch(error => { return bot.sendMessage('404', 'text').catch(error => {
// FIX: assert.ok(error instanceof TelegramBot.errors.TelegramError); // FIX: assert.ok(error instanceof TelegramBot.errors.TelegramError);
assert.equal(error.code, 'ETELEGRAM'); assert.strictEqual(error.code, 'ETELEGRAM');
assert.ok(typeof error.response === 'object'); assert.ok(typeof error.response === 'object');
assert.ok(typeof error.response.body === 'object'); assert.ok(typeof error.response.body === 'object');
}); });
@ -304,7 +304,7 @@ describe('TelegramBot', function telegramSuite() {
return botWebHook.startPolling().catch((err) => { return botWebHook.startPolling().catch((err) => {
// TODO: check for error in a better way // TODO: check for error in a better way
// FIX: assert.ok(err instanceof TelegramBot.errors.FatalError); // FIX: assert.ok(err instanceof TelegramBot.errors.FatalError);
assert.equal(err.code, 'EFATAL'); assert.strictEqual(err.code, 'EFATAL');
assert.ok(err.message.indexOf('mutually exclusive') !== -1); assert.ok(err.message.indexOf('mutually exclusive') !== -1);
}); });
}); });
@ -312,12 +312,12 @@ describe('TelegramBot', function telegramSuite() {
describe('#isPolling', function isPollingSuite() { describe('#isPolling', function isPollingSuite() {
it('returns true if bot is polling', function test() { it('returns true if bot is polling', function test() {
assert.equal(testbot.isPolling(), true); assert.strictEqual(testbot.isPolling(), true);
return utils.isPollingMockServer(pollingPort); return utils.isPollingMockServer(pollingPort);
}); });
it('returns false if bot is not polling', function test() { it('returns false if bot is not polling', function test() {
return testbot.stopPolling().then(() => { return testbot.stopPolling().then(() => {
assert.equal(testbot.isPolling(), false); assert.strictEqual(testbot.isPolling(), false);
utils.clearPollingCheck(pollingPort); utils.clearPollingCheck(pollingPort);
return utils.isPollingMockServer(pollingPort, true); return utils.isPollingMockServer(pollingPort, true);
}); });
@ -346,7 +346,7 @@ describe('TelegramBot', function telegramSuite() {
return botPolling.openWebHook().catch((err) => { return botPolling.openWebHook().catch((err) => {
// TODO: check for error in a better way // TODO: check for error in a better way
// FIX: assert.ok(err instanceof TelegramBot.errors.FatalError); // FIX: assert.ok(err instanceof TelegramBot.errors.FatalError);
assert.equal(err.code, 'EFATAL'); assert.strictEqual(err.code, 'EFATAL');
assert.ok(err.message.indexOf('mutually exclusive') !== -1); assert.ok(err.message.indexOf('mutually exclusive') !== -1);
}); });
}); });
@ -354,12 +354,12 @@ describe('TelegramBot', function telegramSuite() {
describe('#hasOpenWebHook', function hasOpenWebHookSuite() { describe('#hasOpenWebHook', function hasOpenWebHookSuite() {
it('returns true if webhook is opened', function test() { it('returns true if webhook is opened', function test() {
assert.equal(testbot.hasOpenWebHook(), true); assert.strictEqual(testbot.hasOpenWebHook(), true);
return utils.hasOpenWebHook(webHookPort); return utils.hasOpenWebHook(webHookPort);
}); });
it('returns false if webhook is closed', function test() { it('returns false if webhook is closed', function test() {
testbot.closeWebHook().then(() => { testbot.closeWebHook().then(() => {
assert.equal(testbot.hasOpenWebHook(), false); assert.strictEqual(testbot.hasOpenWebHook(), false);
return utils.hasOpenWebHook(webHookPort, true); return utils.hasOpenWebHook(webHookPort, true);
}); });
}); });
@ -397,28 +397,28 @@ describe('TelegramBot', function telegramSuite() {
return bot return bot
.setWebHook(ip) .setWebHook(ip)
.then(resp => { .then(resp => {
assert.equal(resp, true); assert.strictEqual(resp, true);
}); });
}); });
it('should set a webHook with certificate', function test() { it('should set a webHook with certificate', function test() {
return bot return bot
.setWebHook(ip, { certificate: cert }) .setWebHook(ip, { certificate: cert })
.then(resp => { .then(resp => {
assert.equal(resp, true); assert.strictEqual(resp, true);
}); });
}); });
it('(v0.25.0 and lower) should set a webHook with certificate', function test() { it('(v0.25.0 and lower) should set a webHook with certificate', function test() {
return bot return bot
.setWebHook(ip, cert) .setWebHook(ip, cert)
.then(resp => { .then(resp => {
assert.equal(resp, true); assert.strictEqual(resp, true);
}); });
}); });
it('should delete the webHook', function test() { it('should delete the webHook', function test() {
return bot return bot
.setWebHook('') .setWebHook('')
.then(resp => { .then(resp => {
assert.equal(resp, true); assert.strictEqual(resp, true);
}); });
}); });
}); });
@ -429,7 +429,7 @@ describe('TelegramBot', function telegramSuite() {
}); });
it('should delete webhook', function test() { it('should delete webhook', function test() {
return bot.deleteWebHook().then(resp => { return bot.deleteWebHook().then(resp => {
assert.equal(resp, true); assert.strictEqual(resp, true);
}); });
}); });
}); });
@ -459,12 +459,12 @@ describe('TelegramBot', function telegramSuite() {
}); });
it('should return an Array', function test() { it('should return an Array', function test() {
return bot.getUpdates(opts).then(resp => { return bot.getUpdates(opts).then(resp => {
assert.equal(Array.isArray(resp), true); assert.strictEqual(Array.isArray(resp), true);
}); });
}); });
it('(v0.25.0 and lower) should return an Array', function test() { it('(v0.25.0 and lower) should return an Array', function test() {
return bot.getUpdates(opts.timeout, opts.limit).then(resp => { return bot.getUpdates(opts.timeout, opts.limit).then(resp => {
assert.equal(Array.isArray(resp), true); assert.strictEqual(Array.isArray(resp), true);
}); });
}); });
}); });
@ -500,6 +500,23 @@ describe('TelegramBot', function telegramSuite() {
}); });
}); });
describe('#copyMessage', function copyMessageSuite() {
before(function before() {
utils.handleRatelimit(bot, 'sendMessage', this);
utils.handleRatelimit(bot, 'copyMessage', this);
});
it('should send copy of a message', function test() {
return bot.sendMessage(USERID, 'test').then(resp => {
const messageId = resp.message_id;
return bot.copyMessage(USERID, USERID, messageId)
.then(copy => {
assert.ok(is.object(copy));
assert.ok(is.number(copy.message_id));
});
});
});
});
describe('#sendPhoto', function sendPhotoSuite() { describe('#sendPhoto', function sendPhotoSuite() {
let photoId; let photoId;
this.timeout(timeout); this.timeout(timeout);
@ -812,7 +829,7 @@ describe('TelegramBot', function telegramSuite() {
it('should send a chat action', function test() { it('should send a chat action', function test() {
const action = 'typing'; const action = 'typing';
return bot.sendChatAction(USERID, action).then(resp => { return bot.sendChatAction(USERID, action).then(resp => {
assert.equal(resp, true); assert.strictEqual(resp, true);
}); });
}); });
}); });
@ -892,25 +909,25 @@ describe('TelegramBot', function telegramSuite() {
it('should set a chat photo from file', function test() { it('should set a chat photo from file', function test() {
const photo = `${__dirname}/data/chat_photo.png`; const photo = `${__dirname}/data/chat_photo.png`;
return bot.setChatPhoto(GROUPID, photo).then(resp => { return bot.setChatPhoto(GROUPID, photo).then(resp => {
assert.equal(resp, true); assert.strictEqual(resp, true);
}); });
}); });
it('should set a chat photo from fs.readStream', function test() { it('should set a chat photo from fs.readStream', function test() {
const photo = fs.createReadStream(`${__dirname}/data/chat_photo.png`); const photo = fs.createReadStream(`${__dirname}/data/chat_photo.png`);
return bot.setChatPhoto(GROUPID, photo).then(resp => { return bot.setChatPhoto(GROUPID, photo).then(resp => {
assert.equal(resp, true); assert.strictEqual(resp, true);
}); });
}); });
it('should set a chat photo from request Stream', function test() { it('should set a chat photo from request Stream', function test() {
const photo = request(`${staticUrl}/chat_photo.png`); const photo = request(`${staticUrl}/chat_photo.png`);
return bot.setChatPhoto(GROUPID, photo).then(resp => { return bot.setChatPhoto(GROUPID, photo).then(resp => {
assert.equal(resp, true); assert.strictEqual(resp, true);
}); });
}); });
it('should set a chat photo from a Buffer', function test() { it('should set a chat photo from a Buffer', function test() {
const photo = fs.readFileSync(`${__dirname}/data/chat_photo.png`); const photo = fs.readFileSync(`${__dirname}/data/chat_photo.png`);
return bot.setChatPhoto(GROUPID, photo).then(resp => { return bot.setChatPhoto(GROUPID, photo).then(resp => {
assert.equal(resp, true); assert.strictEqual(resp, true);
}); });
}); });
}); });
@ -921,7 +938,7 @@ describe('TelegramBot', function telegramSuite() {
}); });
it('should delete the chat photo', function test() { it('should delete the chat photo', function test() {
return bot.deleteChatPhoto(GROUPID).then(resp => { return bot.deleteChatPhoto(GROUPID).then(resp => {
assert.equal(resp, true); assert.strictEqual(resp, true);
}); });
}); });
}); });
@ -933,7 +950,7 @@ describe('TelegramBot', function telegramSuite() {
it('should set the chat title', function test() { it('should set the chat title', function test() {
const random = Math.floor(Math.random() * 1000); const random = Math.floor(Math.random() * 1000);
return bot.setChatTitle(GROUPID, `ntba test group (random: ${random})`).then(resp => { return bot.setChatTitle(GROUPID, `ntba test group (random: ${random})`).then(resp => {
assert.equal(resp, true); assert.strictEqual(resp, true);
}); });
}); });
}); });
@ -946,7 +963,7 @@ describe('TelegramBot', function telegramSuite() {
const random = Math.floor(Math.random() * 1000); const random = Math.floor(Math.random() * 1000);
const description = `node-telegram-bot-api test group (random: ${random})`; const description = `node-telegram-bot-api test group (random: ${random})`;
return bot.setChatDescription(GROUPID, description).then(resp => { return bot.setChatDescription(GROUPID, description).then(resp => {
assert.equal(resp, true); assert.strictEqual(resp, true);
}); });
}); });
}); });
@ -961,7 +978,7 @@ describe('TelegramBot', function telegramSuite() {
}); });
it('should pin chat message', function test() { it('should pin chat message', function test() {
return bot.pinChatMessage(GROUPID, messageId).then(resp => { return bot.pinChatMessage(GROUPID, messageId).then(resp => {
assert.equal(resp, true); assert.strictEqual(resp, true);
}); });
}); });
}); });
@ -972,7 +989,18 @@ describe('TelegramBot', function telegramSuite() {
}); });
it('should unpin chat message', function test() { it('should unpin chat message', function test() {
return bot.unpinChatMessage(GROUPID).then(resp => { return bot.unpinChatMessage(GROUPID).then(resp => {
assert.equal(resp, true); assert.strictEqual(resp, true);
});
});
});
describe('#unpinAllChatMessages', function unpinAllChatMessagesSuite() {
before(function before() {
utils.handleRatelimit(bot, 'unpinAllChatMessages', this);
});
it('should unpin all chats messages', function test() {
return bot.unpinAllChatMessages(GROUPID).then(resp => {
assert.ok(is.boolean(resp));
}); });
}); });
}); });
@ -984,13 +1012,13 @@ describe('TelegramBot', function telegramSuite() {
}); });
it('should edit a message sent by the bot', function test() { it('should edit a message sent by the bot', function test() {
return bot.sendMessage(USERID, 'test').then(resp => { return bot.sendMessage(USERID, 'test').then(resp => {
assert.equal(resp.text, 'test'); assert.strictEqual(resp.text, 'test');
const opts = { const opts = {
chat_id: USERID, chat_id: USERID,
message_id: resp.message_id message_id: resp.message_id
}; };
return bot.editMessageText('edit test', opts).then(msg => { return bot.editMessageText('edit test', opts).then(msg => {
assert.equal(msg.text, 'edit test'); assert.strictEqual(msg.text, 'edit test');
}); });
}); });
}); });
@ -1006,13 +1034,13 @@ describe('TelegramBot', function telegramSuite() {
const photo = `${__dirname}/data/photo.png`; const photo = `${__dirname}/data/photo.png`;
const options = { caption: 'test caption' }; const options = { caption: 'test caption' };
return bot.sendPhoto(USERID, photo, options).then(resp => { return bot.sendPhoto(USERID, photo, options).then(resp => {
assert.equal(resp.caption, 'test caption'); assert.strictEqual(resp.caption, 'test caption');
const opts = { const opts = {
chat_id: USERID, chat_id: USERID,
message_id: resp.message_id message_id: resp.message_id
}; };
return bot.editMessageCaption('new test caption', opts).then(msg => { return bot.editMessageCaption('new test caption', opts).then(msg => {
assert.equal(msg.caption, 'new test caption'); assert.strictEqual(msg.caption, 'new test caption');
}); });
}); });
}); });
@ -1053,7 +1081,7 @@ describe('TelegramBot', function telegramSuite() {
}); });
it('should delete message', function test() { it('should delete message', function test() {
return bot.deleteMessage(USERID, messageId).then(resp => { return bot.deleteMessage(USERID, messageId).then(resp => {
assert.equal(resp, true); assert.strictEqual(resp, true);
}); });
}); });
}); });
@ -1248,7 +1276,7 @@ describe('TelegramBot', function telegramSuite() {
it('should get a file stream', function test(done) { it('should get a file stream', function test(done) {
const fileStream = bot.getFileStream(FILE_ID); const fileStream = bot.getFileStream(FILE_ID);
assert.ok(fileStream instanceof stream.Readable); assert.ok(fileStream instanceof stream.Readable);
assert.equal(fileStream.path, FILE_ID); assert.strictEqual(fileStream.path, FILE_ID);
fileStream.on('info', (info) => { fileStream.on('info', (info) => {
assert.ok(info); assert.ok(info);
assert.ok(utils.isTelegramFileURI(info.uri), `${info.uri} is not a file URI`); assert.ok(utils.isTelegramFileURI(info.uri), `${info.uri} is not a file URI`);
@ -1270,7 +1298,7 @@ describe('TelegramBot', function telegramSuite() {
return bot.downloadFile(FILE_ID, downloadPath) return bot.downloadFile(FILE_ID, downloadPath)
.then(filePath => { .then(filePath => {
assert.ok(is.string(filePath)); assert.ok(is.string(filePath));
assert.equal(path.dirname(filePath), downloadPath); assert.strictEqual(path.dirname(filePath), downloadPath);
assert.ok(fs.existsSync(filePath)); assert.ok(fs.existsSync(filePath));
fs.unlinkSync(filePath); // Delete file after test fs.unlinkSync(filePath); // Delete file after test
}); });
@ -1281,7 +1309,7 @@ describe('TelegramBot', function telegramSuite() {
it('should call `onText` callback on match', function test(done) { it('should call `onText` callback on match', function test(done) {
const regexp = /\/onText (.+)/; const regexp = /\/onText (.+)/;
botWebHook.onText(regexp, (msg, match) => { botWebHook.onText(regexp, (msg, match) => {
assert.equal(match[1], 'ECHO ALOHA'); assert.strictEqual(match[1], 'ECHO ALOHA');
assert.ok(botWebHook.removeTextListener(regexp)); assert.ok(botWebHook.removeTextListener(regexp));
return done(); return done();
}); });
@ -1292,7 +1320,7 @@ describe('TelegramBot', function telegramSuite() {
it('should reset the global regex state with each message', function test(done) { it('should reset the global regex state with each message', function test(done) {
const regexp = /\/onText (.+)/g; const regexp = /\/onText (.+)/g;
botWebHook.onText(regexp, () => { botWebHook.onText(regexp, () => {
assert.equal(regexp.lastIndex, 0); assert.strictEqual(regexp.lastIndex, 0);
assert.ok(botWebHook.removeTextListener(regexp)); assert.ok(botWebHook.removeTextListener(regexp));
return done(); return done();
}); });
@ -1314,10 +1342,10 @@ describe('TelegramBot', function telegramSuite() {
bot.onText(regexp, callback); bot.onText(regexp, callback);
bot.onText(regexp2, callback); bot.onText(regexp2, callback);
const textListener = bot.removeTextListener(regexp); const textListener = bot.removeTextListener(regexp);
assert.equal(regexp, textListener.regexp); assert.strictEqual(regexp, textListener.regexp);
}); });
it('returns `null` if missing', function test() { it('returns `null` if missing', function test() {
assert.equal(null, bot.removeTextListener(/404/)); assert.strictEqual(null, bot.removeTextListener(/404/));
}); });
}); });
@ -1330,14 +1358,14 @@ describe('TelegramBot', function telegramSuite() {
it('returns the right reply-listener', function test() { it('returns the right reply-listener', function test() {
const id = bot.onReplyToMessage(chatId, messageId, callback); const id = bot.onReplyToMessage(chatId, messageId, callback);
const replyListener = bot.removeReplyListener(id); const replyListener = bot.removeReplyListener(id);
assert.equal(id, replyListener.id); assert.strictEqual(id, replyListener.id);
assert.equal(chatId, replyListener.chatId); assert.strictEqual(chatId, replyListener.chatId);
assert.equal(messageId, replyListener.messageId); assert.strictEqual(messageId, replyListener.messageId);
assert.equal(callback, replyListener.callback); assert.strictEqual(callback, replyListener.callback);
}); });
it('returns `null` if missing', function test() { it('returns `null` if missing', function test() {
// NOTE: '0' is never a valid reply listener ID :) // NOTE: '0' is never a valid reply listener ID :)
assert.equal(null, bot.removeReplyListener(0)); assert.strictEqual(null, bot.removeReplyListener(0));
}); });
}); });
@ -1467,7 +1495,7 @@ describe('TelegramBot', function telegramSuite() {
it('should get the sticker set given the name of the set', function test() { it('should get the sticker set given the name of the set', function test() {
return bot.getStickerSet(STICKER_SET_NAME).then(resp => { return bot.getStickerSet(STICKER_SET_NAME).then(resp => {
assert.ok(is.object(resp)); assert.ok(is.object(resp));
assert.equal(resp.name.toLowerCase(), STICKER_SET_NAME); assert.strictEqual(resp.name.toLowerCase(), STICKER_SET_NAME);
assert.ok(is.string(resp.title)); assert.ok(is.string(resp.title));
assert.ok(is.boolean(resp.contains_masks)); assert.ok(is.boolean(resp.contains_masks));
assert.ok(is.array(resp.stickers)); assert.ok(is.array(resp.stickers));
@ -1511,7 +1539,7 @@ describe('TelegramBot', function telegramSuite() {
disable_notification: true, disable_notification: true,
}).then(resp => { }).then(resp => {
assert.ok(is.array(resp)); assert.ok(is.array(resp));
assert.equal(resp.length, 3); assert.strictEqual(resp.length, 3);
}); });
}); });
}); });