diff --git a/telegrambots-extensions/src/main/java/org/telegram/telegrambots/extensions/bots/commandbot/CommandBot.java b/telegrambots-extensions/src/main/java/org/telegram/telegrambots/extensions/bots/commandbot/CommandBot.java
new file mode 100644
index 00000000..1164aac2
--- /dev/null
+++ b/telegrambots-extensions/src/main/java/org/telegram/telegrambots/extensions/bots/commandbot/CommandBot.java
@@ -0,0 +1,47 @@
+package org.telegram.telegrambots.extensions.bots.commandbot;
+
+import org.telegram.telegrambots.meta.api.objects.Message;
+import org.telegram.telegrambots.meta.api.objects.Update;
+
+/**
+ * This interface represents common functions for command bots
+ *
+ * @author Andrey Korsakov (loolzaaa)
+ */
+public interface CommandBot {
+ /**
+ * Process all updates, that are not commands.
+ *
+ * @param update the update
+ * @warning Commands that have valid syntax but are not registered on this bot,
+ * won't be forwarded to this method if a default action is present.
+ */
+ void processNonCommandUpdate(Update update);
+
+ /**
+ * This method is called when user sends a not registered command. By default it will just call processNonCommandUpdate(),
+ * override it in your implementation if you want your bot to do other things, such as sending an error message
+ *
+ * @param update Received update from Telegram
+ */
+ default void processInvalidCommandUpdate(Update update) {
+ processNonCommandUpdate(update);
+ }
+
+ /**
+ * Override this function in your bot implementation to filter messages with commands
+ *
+ * For example, if you want to prevent commands execution incoming from group chat:
+ * #
+ * # return !message.getChat().isGroupChat();
+ * #
+ *
+ * @param message Received message
+ * @return true if the message must be ignored by the command bot and treated as a non command message,
+ * false otherwise
+ * @note Default implementation doesn't filter anything
+ */
+ default boolean filter(Message message) {
+ return false;
+ }
+}
diff --git a/telegrambots-extensions/src/main/java/org/telegram/telegrambots/extensions/bots/commandbot/TelegramLongPollingCommandBot.java b/telegrambots-extensions/src/main/java/org/telegram/telegrambots/extensions/bots/commandbot/TelegramLongPollingCommandBot.java
index 117a7d4e..d55a4fe4 100644
--- a/telegrambots-extensions/src/main/java/org/telegram/telegrambots/extensions/bots/commandbot/TelegramLongPollingCommandBot.java
+++ b/telegrambots-extensions/src/main/java/org/telegram/telegrambots/extensions/bots/commandbot/TelegramLongPollingCommandBot.java
@@ -19,7 +19,7 @@ import java.util.function.BiConsumer;
*
* @author Timo Schulz (Mit0x2)
*/
-public abstract class TelegramLongPollingCommandBot extends TelegramLongPollingBot implements ICommandRegistry {
+public abstract class TelegramLongPollingCommandBot extends TelegramLongPollingBot implements CommandBot, ICommandRegistry {
private final CommandRegistry commandRegistry;
/**
@@ -70,34 +70,6 @@ public abstract class TelegramLongPollingCommandBot extends TelegramLongPollingB
processNonCommandUpdate(update);
}
- /**
- * This method is called when user sends a not registered command. By default it will just call processNonCommandUpdate(),
- * override it in your implementation if you want your bot to do other things, such as sending an error message
- *
- * @param update Received update from Telegram
- */
- protected void processInvalidCommandUpdate(Update update) {
- processNonCommandUpdate(update);
- }
-
-
- /**
- * Override this function in your bot implementation to filter messages with commands
- *
- * For example, if you want to prevent commands execution incoming from group chat:
- * #
- * # return !message.getChat().isGroupChat();
- * #
- *
- * @param message Received message
- * @return true if the message must be ignored by the command bot and treated as a non command message,
- * false otherwise
- * @note Default implementation doesn't filter anything
- */
- protected boolean filter(Message message) {
- return false;
- }
-
@Override
public final boolean register(IBotCommand botCommand) {
return commandRegistry.register(botCommand);
@@ -138,13 +110,4 @@ public abstract class TelegramLongPollingCommandBot extends TelegramLongPollingB
*/
@Override
public abstract String getBotUsername();
-
- /**
- * Process all updates, that are not commands.
- *
- * @param update the update
- * @warning Commands that have valid syntax but are not registered on this bot,
- * won't be forwarded to this method if a default action is present.
- */
- public abstract void processNonCommandUpdate(Update update);
}
diff --git a/telegrambots-extensions/src/main/java/org/telegram/telegrambots/extensions/bots/commandbot/TelegramWebhookCommandBot.java b/telegrambots-extensions/src/main/java/org/telegram/telegrambots/extensions/bots/commandbot/TelegramWebhookCommandBot.java
new file mode 100644
index 00000000..dcc37380
--- /dev/null
+++ b/telegrambots-extensions/src/main/java/org/telegram/telegrambots/extensions/bots/commandbot/TelegramWebhookCommandBot.java
@@ -0,0 +1,109 @@
+package org.telegram.telegrambots.extensions.bots.commandbot;
+
+
+import org.telegram.telegrambots.bots.DefaultBotOptions;
+import org.telegram.telegrambots.bots.TelegramWebhookBot;
+import org.telegram.telegrambots.extensions.bots.commandbot.commands.CommandRegistry;
+import org.telegram.telegrambots.extensions.bots.commandbot.commands.IBotCommand;
+import org.telegram.telegrambots.extensions.bots.commandbot.commands.ICommandRegistry;
+import org.telegram.telegrambots.meta.api.methods.BotApiMethod;
+import org.telegram.telegrambots.meta.api.objects.Message;
+import org.telegram.telegrambots.meta.api.objects.Update;
+import org.telegram.telegrambots.meta.bots.AbsSender;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.function.BiConsumer;
+
+/**
+ * This class adds command functionality to the TelegramWebhookBot
+ *
+ * @author Andrey Korsakov (loolzaaa)
+ */
+public abstract class TelegramWebhookCommandBot extends TelegramWebhookBot implements CommandBot, ICommandRegistry {
+ private final CommandRegistry commandRegistry;
+
+ /**
+ * Creates a TelegramWebhookCommandBot using default options
+ * Use ICommandRegistry's methods on this bot to register commands
+ *
+ */
+ public TelegramWebhookCommandBot() {
+ this(new DefaultBotOptions());
+ }
+
+ /**
+ * Creates a TelegramWebhookCommandBot with custom options and allowing commands with
+ * usernames
+ * Use ICommandRegistry's methods on this bot to register commands
+ *
+ * @param options Bot options
+ */
+ public TelegramWebhookCommandBot(DefaultBotOptions options) {
+ this(options, true);
+ }
+
+ /**
+ * Creates a TelegramWebhookCommandBot
+ * Use ICommandRegistry's methods on this bot to register commands
+ *
+ * @param options Bot options
+ * @param allowCommandsWithUsername true to allow commands with parameters (default),
+ * false otherwise
+ */
+ public TelegramWebhookCommandBot(DefaultBotOptions options, boolean allowCommandsWithUsername) {
+ super(options);
+ this.commandRegistry = new CommandRegistry(allowCommandsWithUsername, this::getBotUsername);
+ }
+
+ @Override
+ public BotApiMethod> onWebhookUpdateReceived(Update update) {
+ if (update.hasMessage()) {
+ Message message = update.getMessage();
+ if (message.isCommand() && !filter(message)) {
+ if (!commandRegistry.executeCommand(this, message)) {
+ //we have received a not registered command, handle it as invalid
+ processInvalidCommandUpdate(update);
+ }
+ return null;
+ }
+ }
+ processNonCommandUpdate(update);
+ return null;
+ }
+
+ @Override
+ public final boolean register(IBotCommand botCommand) {
+ return commandRegistry.register(botCommand);
+ }
+
+ @Override
+ public final Map registerAll(IBotCommand... botCommands) {
+ return commandRegistry.registerAll(botCommands);
+ }
+
+ @Override
+ public final boolean deregister(IBotCommand botCommand) {
+ return commandRegistry.deregister(botCommand);
+ }
+
+ @Override
+ public final Map deregisterAll(IBotCommand... botCommands) {
+ return commandRegistry.deregisterAll(botCommands);
+ }
+
+ @Override
+ public final Collection getRegisteredCommands() {
+ return commandRegistry.getRegisteredCommands();
+ }
+
+ @Override
+ public void registerDefaultAction(BiConsumer defaultConsumer) {
+ commandRegistry.registerDefaultAction(defaultConsumer);
+ }
+
+ @Override
+ public final IBotCommand getRegisteredCommand(String commandIdentifier) {
+ return commandRegistry.getRegisteredCommand(commandIdentifier);
+ }
+}
diff --git a/telegrambots/src/main/java/org/telegram/telegrambots/updatesreceivers/ServerlessWebhook.java b/telegrambots/src/main/java/org/telegram/telegrambots/updatesreceivers/ServerlessWebhook.java
new file mode 100644
index 00000000..20d7e873
--- /dev/null
+++ b/telegrambots/src/main/java/org/telegram/telegrambots/updatesreceivers/ServerlessWebhook.java
@@ -0,0 +1,55 @@
+package org.telegram.telegrambots.updatesreceivers;
+
+import lombok.extern.slf4j.Slf4j;
+import org.telegram.telegrambots.meta.api.methods.BotApiMethod;
+import org.telegram.telegrambots.meta.api.objects.Update;
+import org.telegram.telegrambots.meta.exceptions.TelegramApiException;
+import org.telegram.telegrambots.meta.exceptions.TelegramApiValidationException;
+import org.telegram.telegrambots.meta.generics.Webhook;
+import org.telegram.telegrambots.meta.generics.WebhookBot;
+
+import java.util.NoSuchElementException;
+import java.util.concurrent.ConcurrentHashMap;
+
+@Slf4j
+public class ServerlessWebhook implements Webhook {
+
+ private final ConcurrentHashMap callbacks = new ConcurrentHashMap<>();
+
+ public BotApiMethod> updateReceived(String botPath, Update update) throws TelegramApiValidationException {
+ if (callbacks.containsKey(botPath)) {
+ try {
+ BotApiMethod> response = callbacks.get(botPath).onWebhookUpdateReceived(update);
+ if (response != null) {
+ response.validate();
+ }
+ return response;
+ } catch (TelegramApiValidationException e) {
+ log.error(e.getLocalizedMessage(), e);
+ throw e;
+ }
+ } else {
+ throw new NoSuchElementException(String.format("Callback '%s' not exist", botPath));
+ }
+ }
+
+ @Override
+ public void startServer() throws TelegramApiException {
+ // Do nothing, because there is no abstraction for webhook without server
+ }
+
+ @Override
+ public void registerWebhook(WebhookBot callback) {
+ callbacks.putIfAbsent(callback.getBotPath(), callback);
+ }
+
+ @Override
+ public void setInternalUrl(String internalUrl) {
+ throw new UnsupportedOperationException("Not implemented for Serverless Webhook");
+ }
+
+ @Override
+ public void setKeyStore(String keyStore, String keyStorePassword) throws TelegramApiException {
+ throw new UnsupportedOperationException("Not implemented for Serverless Webhook");
+ }
+}
diff --git a/telegrambots/src/test/java/org/telegram/telegrambots/test/ServerlessWebhookTest.java b/telegrambots/src/test/java/org/telegram/telegrambots/test/ServerlessWebhookTest.java
new file mode 100644
index 00000000..41571f07
--- /dev/null
+++ b/telegrambots/src/test/java/org/telegram/telegrambots/test/ServerlessWebhookTest.java
@@ -0,0 +1,298 @@
+package org.telegram.telegrambots.test;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.telegram.telegrambots.meta.api.methods.BotApiMethod;
+import org.telegram.telegrambots.meta.api.objects.Update;
+import org.telegram.telegrambots.test.Fakes.FakeWebhook;
+import org.telegram.telegrambots.updatesreceivers.ServerlessWebhook;
+
+import java.io.IOException;
+import java.io.Serializable;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.fail;
+
+/**
+ * @author Andrey Korsakov
+ * @version 1.0
+ */
+public class ServerlessWebhookTest {
+
+ final FakeWebhook webhookBot = new FakeWebhook();
+ ServerlessWebhook serverlessWebhook;
+
+ @BeforeEach
+ void setUp() {
+ serverlessWebhook = new ServerlessWebhook();
+ serverlessWebhook.registerWebhook(webhookBot);
+ }
+
+ @Test
+ public void TestSendMessage() throws Exception {
+ webhookBot.setReturnValue(BotApiMethodHelperFactory.getSendMessage());
+
+ BotApiMethod> result = serverlessWebhook.updateReceived(webhookBot.getBotPath(), getUpdate());
+
+ assertEquals("{\"chat_id\":\"@test\",\"text\":\"Hithere\",\"parse_mode\":\"html\",\"reply_to_message_id\":12,\"reply_markup\":{\"force_reply\":true},\"method\":\"sendmessage\"}", map(result));
+ }
+
+ @Test
+ public void TestAnswerCallbackQuery() throws Exception {
+ webhookBot.setReturnValue(BotApiMethodHelperFactory.getAnswerCallbackQuery());
+
+ BotApiMethod> result = serverlessWebhook.updateReceived(webhookBot.getBotPath(), getUpdate());
+
+ assertEquals("{\"callback_query_id\":\"id\",\"text\":\"text\",\"show_alert\":true,\"method\":\"answercallbackquery\"}", map(result));
+ }
+
+ @Test
+ public void TestAnswerInlineQuery() throws Exception {
+ webhookBot.setReturnValue(BotApiMethodHelperFactory.getAnswerInlineQuery());
+
+ BotApiMethod> result = serverlessWebhook.updateReceived(webhookBot.getBotPath(), getUpdate());
+
+ assertEquals("{\"inline_query_id\":\"id\",\"results\":[{\"type\":\"article\",\"id\":\"0\",\"title\":\"Title\",\"input_message_content\":{\"message_text\":\"Text\",\"parse_mode\":\"Markdown\"},\"reply_markup\":{\"inline_keyboard\":[[{\"text\":\"Button1\",\"callback_data\":\"Callback\"}]]},\"url\":\"Url\",\"hide_url\":false,\"description\":\"Description\",\"thumb_url\":\"ThumbUrl\",\"thumb_width\":10,\"thumb_height\":20},{\"type\":\"photo\",\"id\":\"1\",\"photo_url\":\"PhotoUrl\",\"mime_type\":\"image/jpg\",\"photo_width\":10,\"photo_height\":20,\"thumb_url\":\"ThumbUrl\",\"title\":\"Title\",\"description\":\"Description\",\"caption\":\"Caption\",\"input_message_content\":{\"message_text\":\"Text\",\"parse_mode\":\"Markdown\"},\"reply_markup\":{\"inline_keyboard\":[[{\"text\":\"Button1\",\"callback_data\":\"Callback\"}]]},\"caption_entities\":[]}],\"cache_time\":100,\"is_personal\":true,\"next_offset\":\"3\",\"switch_pm_text\":\"pmText\",\"switch_pm_parameter\":\"PmParameter\",\"method\":\"answerInlineQuery\"}",
+ map(result));
+ }
+
+ @Test
+ public void TestEditMessageCaption() throws Exception {
+ webhookBot.setReturnValue(BotApiMethodHelperFactory.getEditMessageCaption());
+
+ BotApiMethod> result = serverlessWebhook.updateReceived(webhookBot.getBotPath(), getUpdate());
+
+ assertEquals("{\"chat_id\":\"ChatId\",\"message_id\":1,\"caption\":\"Caption\"," +
+ "\"reply_markup\":{\"inline_keyboard\":[[{\"text\":\"Button1\",\"callback_data\":\"Callback\"}]]}," +
+ "\"caption_entities\":[],\"method\":\"editmessagecaption\"}", map(result));
+ }
+
+ @Test
+ public void TestEditMessageReplyMarkup() throws Exception {
+ webhookBot.setReturnValue(BotApiMethodHelperFactory.getEditMessageReplyMarkup());
+
+ BotApiMethod> result = serverlessWebhook.updateReceived(webhookBot.getBotPath(), getUpdate());
+
+ assertEquals("{\"inline_message_id\":\"12345\",\"reply_markup\":{" +
+ "\"inline_keyboard\":[[{\"text\":\"Button1\"," +
+ "\"callback_data\":\"Callback\"}]]},\"method\":\"editmessagereplymarkup\"}",
+ map(result));
+ }
+
+ @Test
+ public void TestEditMessageText() throws Exception {
+ webhookBot.setReturnValue(BotApiMethodHelperFactory.getEditMessageText());
+
+ BotApiMethod> result = serverlessWebhook.updateReceived(webhookBot.getBotPath(), getUpdate());
+
+ assertEquals("{\"chat_id\":\"ChatId\",\"message_id\":1,\"text\":\"Text\"," +
+ "\"parse_mode\":\"Markdown\",\"reply_markup\":{\"" +
+ "inline_keyboard\":[[{\"text\":\"Button1\",\"callback_data\"" +
+ ":\"Callback\"}]]},\"method\":\"editmessagetext\"}", map(result));
+ }
+
+ @Test
+ public void TestForwardMessage() throws Exception {
+ webhookBot.setReturnValue(BotApiMethodHelperFactory.getForwardMessage());
+
+ BotApiMethod> result = serverlessWebhook.updateReceived(webhookBot.getBotPath(), getUpdate());
+
+ assertEquals("{\"chat_id\":\"To\",\"from_chat_id\":\"From\",\"message_id\":15," +
+ "\"disable_notification\":true,\"method\":\"forwardmessage\"}", map(result));
+ }
+
+ @Test
+ public void TestGetChat() throws Exception {
+ webhookBot.setReturnValue(BotApiMethodHelperFactory.getGetChat());
+
+ BotApiMethod> result = serverlessWebhook.updateReceived(webhookBot.getBotPath(), getUpdate());
+
+ assertEquals("{\"chat_id\":\"12345\",\"method\":\"getChat\"}", map(result));
+ }
+
+ @Test
+ public void TestGetChatAdministrators() throws Exception {
+ webhookBot.setReturnValue(BotApiMethodHelperFactory.getChatAdministrators());
+
+ BotApiMethod> result = serverlessWebhook.updateReceived(webhookBot.getBotPath(), getUpdate());
+
+ assertEquals("{\"chat_id\":\"12345\",\"method\":\"getChatAdministrators\"}", map(result));
+ }
+
+ @Test
+ public void TestGetChatMember() throws Exception {
+ webhookBot.setReturnValue(BotApiMethodHelperFactory.getChatMember());
+
+ BotApiMethod> result = serverlessWebhook.updateReceived(webhookBot.getBotPath(), getUpdate());
+
+ assertEquals("{\"chat_id\":\"12345\",\"user_id\":98765,\"method\":\"getChatMember\"}", map(result));
+ }
+
+ @Test
+ public void TestGetChatMembersCount() throws Exception {
+ webhookBot.setReturnValue(BotApiMethodHelperFactory.getChatMemberCount());
+
+ BotApiMethod> result = serverlessWebhook.updateReceived(webhookBot.getBotPath(), getUpdate());
+
+ assertEquals("{\"chat_id\":\"12345\",\"method\":\"getChatMemberCount\"}", map(result));
+ }
+
+ @Test
+ public void TestGetFile() throws Exception {
+ webhookBot.setReturnValue(BotApiMethodHelperFactory.getGetFile());
+
+ BotApiMethod> result = serverlessWebhook.updateReceived(webhookBot.getBotPath(), getUpdate());
+
+ assertEquals("{\"file_id\":\"FileId\",\"method\":\"getFile\"}", map(result));
+ }
+
+ @Test
+ public void TestGetGameHighScores() throws Exception {
+ webhookBot.setReturnValue(BotApiMethodHelperFactory.getGetGameHighScores());
+
+ BotApiMethod> result = serverlessWebhook.updateReceived(webhookBot.getBotPath(), getUpdate());
+
+ assertEquals("{\"chat_id\":\"12345\",\"message_id\":67890,\"user_id\":98765,\"method\":\"getGameHighScores\"}", map(result));
+ }
+
+ @Test
+ public void TestGetMe() throws Exception {
+ webhookBot.setReturnValue(BotApiMethodHelperFactory.getGetMe());
+
+ BotApiMethod> result = serverlessWebhook.updateReceived(webhookBot.getBotPath(), getUpdate());
+
+ assertEquals("{\"method\":\"getme\"}", map(result));
+ }
+
+ @Test
+ public void TestGetUserProfilePhotos() throws Exception {
+ webhookBot.setReturnValue(BotApiMethodHelperFactory.getGetUserProfilePhotos());
+
+ BotApiMethod> result = serverlessWebhook.updateReceived(webhookBot.getBotPath(), getUpdate());
+
+ assertEquals("{\"user_id\":98765,\"offset\":3,\"limit\":10,\"method\":\"getuserprofilephotos\"}", map(result));
+ }
+
+ @Test
+ public void TestGetWebhookInfo() throws Exception {
+ webhookBot.setReturnValue(BotApiMethodHelperFactory.getGetWebhookInfo());
+
+ BotApiMethod> result = serverlessWebhook.updateReceived(webhookBot.getBotPath(), getUpdate());
+
+ assertEquals("{\"method\":\"getwebhookinfo\"}", map(result));
+ }
+
+ @Test
+ public void TestKickChatMember() throws Exception {
+ webhookBot.setReturnValue(BotApiMethodHelperFactory.getBanChatMember());
+
+ BotApiMethod> result = serverlessWebhook.updateReceived(webhookBot.getBotPath(), getUpdate());
+
+ assertEquals("{\"chat_id\":\"12345\",\"user_id\":98765,\"method\":\"banChatMember\"}", map(result));
+ }
+
+ @Test
+ public void TestLeaveChat() throws Exception {
+ webhookBot.setReturnValue(BotApiMethodHelperFactory.getLeaveChat());
+
+ BotApiMethod> result = serverlessWebhook.updateReceived(webhookBot.getBotPath(), getUpdate());
+
+ assertEquals("{\"chat_id\":\"12345\",\"method\":\"leaveChat\"}", map(result));
+ }
+
+ @Test
+ public void TestSendChatAction() throws Exception {
+ webhookBot.setReturnValue(BotApiMethodHelperFactory.getSendChatAction());
+
+ BotApiMethod> result = serverlessWebhook.updateReceived(webhookBot.getBotPath(), getUpdate());
+
+ assertEquals("{\"chat_id\":\"12345\",\"action\":\"record_video\",\"method\":\"sendChatAction\"}", map(result));
+ }
+
+ @Test
+ public void TestSendContact() throws Exception {
+ webhookBot.setReturnValue(BotApiMethodHelperFactory.getSendContact());
+
+ BotApiMethod> result = serverlessWebhook.updateReceived(webhookBot.getBotPath(), getUpdate());
+
+ assertEquals("{\"chat_id\":\"12345\",\"phone_number\":\"123456789\",\"first_name\":\"First Name\",\"last_name\":\"Last Name\",\"reply_to_message_id\":54,\"reply_markup\":{\"keyboard\":[[{\"text\":\"Button1\",\"request_contact\":true}]],\"resize_keyboard\":true,\"one_time_keyboard\":true,\"selective\":true},\"method\":\"sendContact\"}", map(result));
+ }
+
+ @Test
+ public void TestSendGame() throws Exception {
+ webhookBot.setReturnValue(BotApiMethodHelperFactory.getSendGame());
+
+ BotApiMethod> result = serverlessWebhook.updateReceived(webhookBot.getBotPath(), getUpdate());
+
+ assertEquals("{\"chat_id\":\"12345\",\"game_short_name\":\"MyGame\",\"method\":\"sendGame\"}", map(result));
+ }
+
+ @Test
+ public void TestSendLocation() throws Exception {
+ webhookBot.setReturnValue(BotApiMethodHelperFactory.getSendLocation());
+
+ BotApiMethod> result = serverlessWebhook.updateReceived(webhookBot.getBotPath(), getUpdate());
+
+ assertEquals("{\"chat_id\":\"12345\",\"latitude\":12.5,\"longitude\":21.5,\"reply_to_message_id\":53,\"method\":\"sendlocation\"}", map(result));
+ }
+
+ @Test
+ public void TestSendVenue() throws Exception {
+ webhookBot.setReturnValue(BotApiMethodHelperFactory.getSendVenue());
+
+ BotApiMethod> result = serverlessWebhook.updateReceived(webhookBot.getBotPath(), getUpdate());
+
+ assertEquals("{\"chat_id\":\"12345\",\"latitude\":12.5,\"longitude\":21.5,\"title\":\"Venue Title\",\"address\":\"Address\",\"foursquare_id\":\"FourId\",\"reply_to_message_id\":53,\"method\":\"sendVenue\"}", map(result));
+ }
+
+ @Test
+ public void TestSetGameScore() throws Exception {
+ webhookBot.setReturnValue(BotApiMethodHelperFactory.getSetGameScore());
+
+ BotApiMethod> result = serverlessWebhook.updateReceived(webhookBot.getBotPath(), getUpdate());
+
+ assertEquals("{\"inline_message_id\":\"12345\",\"disable_edit_message\":true,\"user_id\":98765,\"score\":12,\"method\":\"setGameScore\"}", map(result));
+ }
+
+ @Test
+ public void TestUnbanChatMember() throws Exception {
+ webhookBot.setReturnValue(BotApiMethodHelperFactory.getUnbanChatMember());
+
+ BotApiMethod> result = serverlessWebhook.updateReceived(webhookBot.getBotPath(), getUpdate());
+
+ assertEquals("{\"chat_id\":\"12345\",\"user_id\":98765,\"method\":\"unbanchatmember\"}", map(result));
+ }
+
+ @Test
+ public void TestSendInvoice() throws Exception {
+ webhookBot.setReturnValue(BotApiMethodHelperFactory.getSendInvoice());
+
+ BotApiMethod> result = serverlessWebhook.updateReceived(webhookBot.getBotPath(), getUpdate());
+
+ assertEquals("{\"chat_id\":\"12345\",\"title\":\"Random title\",\"description\":\"Random description\"," +
+ "\"payload\":\"Random Payload\",\"provider_token\":\"Random provider token\",\"start_parameter\":\"STARTPARAM\"," +
+ "\"currency\":\"EUR\",\"prices\":[{\"label\":\"LABEL\",\"amount\":1000}],\"max_tip_amount\":100," +
+ "\"suggested_tip_amounts\":[10,50,75],\"method\":\"sendinvoice\"}", map(result));
+ }
+
+ private Update getUpdate() {
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ return mapper.readValue("{\"update_id\": 10}", Update.class);
+ } catch (IOException e) {
+ return null;
+ }
+ }
+
+ private String map(BotApiMethod method) {
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ return mapper.writeValueAsString(method);
+ } catch (JsonProcessingException e) {
+ fail("Failed to serialize");
+ return null;
+ }
+ }
+}
diff --git a/telegrambots/src/test/java/org/telegram/telegrambots/test/TestRestApi.java b/telegrambots/src/test/java/org/telegram/telegrambots/test/TestRestApi.java
index 4559ffdc..6fd94a1a 100644
--- a/telegrambots/src/test/java/org/telegram/telegrambots/test/TestRestApi.java
+++ b/telegrambots/src/test/java/org/telegram/telegrambots/test/TestRestApi.java
@@ -227,7 +227,7 @@ public class TestRestApi extends JerseyTest {
.request(MediaType.APPLICATION_JSON)
.post(entity, GetChatMemberCount.class);
- assertEquals("{\"chat_id\":\"12345\",\"method\":\"getChatMembersCount\"}", map(result));
+ assertEquals("{\"chat_id\":\"12345\",\"method\":\"getChatMemberCount\"}", map(result));
}
@Test
@@ -305,7 +305,7 @@ public class TestRestApi extends JerseyTest {
.request(MediaType.APPLICATION_JSON)
.post(entity, BanChatMember.class);
- assertEquals("{\"chat_id\":\"12345\",\"user_id\":98765,\"method\":\"kickchatmember\"}", map(result));
+ assertEquals("{\"chat_id\":\"12345\",\"user_id\":98765,\"method\":\"banChatMember\"}", map(result));
}
@Test