diff --git a/build.gradle b/build.gradle index a257119d..399fa767 100644 --- a/build.gradle +++ b/build.gradle @@ -69,7 +69,7 @@ test { useJUnitPlatform() testLogging { - events('passed', 'failed', 'skipped') + events('started', 'passed', 'failed', 'skipped') } } diff --git a/src/main/java/com/github/stickerifier/stickerify/bot/Stickerify.java b/src/main/java/com/github/stickerifier/stickerify/bot/Stickerify.java index b841f289..7bb441aa 100644 --- a/src/main/java/com/github/stickerifier/stickerify/bot/Stickerify.java +++ b/src/main/java/com/github/stickerifier/stickerify/bot/Stickerify.java @@ -8,7 +8,7 @@ import static com.github.stickerifier.stickerify.telegram.Answer.FILE_ALREADY_VALID; import static com.github.stickerifier.stickerify.telegram.Answer.FILE_READY; import static com.github.stickerifier.stickerify.telegram.Answer.FILE_TOO_LARGE; -import static com.pengrad.telegrambot.model.request.ParseMode.MarkdownV2; +import static com.github.stickerifier.stickerify.telegram.Answer.PROCESSING; import static java.util.HashSet.newHashSet; import static java.util.concurrent.Executors.newThreadPerTaskExecutor; @@ -23,14 +23,15 @@ import com.pengrad.telegrambot.TelegramBot; import com.pengrad.telegrambot.TelegramException; import com.pengrad.telegrambot.UpdatesListener; -import com.pengrad.telegrambot.model.LinkPreviewOptions; import com.pengrad.telegrambot.model.Update; import com.pengrad.telegrambot.model.request.ReplyParameters; +import com.pengrad.telegrambot.model.request.richmessages.InputRichMessage; import com.pengrad.telegrambot.request.BaseRequest; import com.pengrad.telegrambot.request.GetFile; import com.pengrad.telegrambot.request.GetUpdates; import com.pengrad.telegrambot.request.SendDocument; -import com.pengrad.telegrambot.request.SendMessage; +import com.pengrad.telegrambot.request.richmessages.SendRichMessage; +import com.pengrad.telegrambot.request.richmessages.SendRichMessageDraft; import com.pengrad.telegrambot.response.BaseResponse; import org.slf4j.event.Level; @@ -54,6 +55,7 @@ public record Stickerify(TelegramBot bot, Executor executor) implements UpdatesL private static final StructuredLogger LOGGER = new StructuredLogger(Stickerify.class); private static final String BOT_TOKEN = System.getenv("STICKERIFY_TOKEN"); private static final ThreadFactory VIRTUAL_THREAD_FACTORY = Thread.ofVirtual().name("Virtual-", 0).factory(); + private static final InputRichMessage PROCESSING_MESSAGE = new InputRichMessage().html(PROCESSING.getText()); /** * Instantiate the bot processing requests with virtual threads. @@ -127,8 +129,11 @@ private void answerFile(TelegramRequest request, TelegramFile file) { private void answerFile(TelegramRequest request, String fileId) { Set pathsToDelete = newHashSet(2); + var processingMessage = new SendRichMessageDraft(request.getChatId(), 1, PROCESSING_MESSAGE); try { + execute(processingMessage); + var originalFile = retrieveFile(fileId); pathsToDelete.add(originalFile.toPath()); @@ -141,11 +146,10 @@ private void answerFile(TelegramRequest request, String fileId) { var answerWithFile = new SendDocument(request.getChatId(), outputFile) .replyParameters(new ReplyParameters(request.getMessageId())) - .disableContentTypeDetection(true) - .caption(FILE_READY.getText()) - .parseMode(MarkdownV2); + .disableContentTypeDetection(true); execute(answerWithFile); + answerText(FILE_READY, request); } } catch (InterruptedException e) { Thread.currentThread().interrupt(); @@ -209,12 +213,8 @@ private void answerText(TelegramRequest request) { } private void answerText(Answer answer, TelegramRequest request) { - var previewOptions = new LinkPreviewOptions().isDisabled(answer.isDisableLinkPreview()); - - var answerWithText = new SendMessage(request.getChatId(), answer.getText()) - .replyParameters(new ReplyParameters(request.getMessageId())) - .parseMode(MarkdownV2) - .linkPreviewOptions(previewOptions); + var message = new InputRichMessage().markdown(answer.getText()); + var answerWithText = new SendRichMessage(request.getChatId(), message).disableNotification(true); try { execute(answerWithText); diff --git a/src/main/java/com/github/stickerifier/stickerify/telegram/Answer.java b/src/main/java/com/github/stickerifier/stickerify/telegram/Answer.java index a58ce5c2..1d50894d 100644 --- a/src/main/java/com/github/stickerifier/stickerify/telegram/Answer.java +++ b/src/main/java/com/github/stickerifier/stickerify/telegram/Answer.java @@ -6,60 +6,65 @@ public enum Answer { HELP(""" - Send me the media you want to convert and I will take care of the rest\\. + Send me the media you want to convert and I will take care of the rest. Based on what you send, I will answer the following: - \\- the converted media, if you sent a supported file \\(images, gifs, standard and video stickers are supported\\) - \\- no file, if you sent a media already suiting Telegram's requirements - \\- an error message, if you sent either an unsupported or a corrupted file - \\- an informative message for any message without a file + - the converted media, if you sent a supported file (use the **/supported** command to read the full list) + - no file, if you sent a media already suiting Telegram's requirements + - an error message, if you sent either an unsupported or a corrupted file + - an informative message for any message without a file - Once the file is ready, head to [Stickers](https://t.me/Stickers) to create a new sticker\\. + Once the file is ready, head to [Stickers bot](https://t.me/Stickers) to create a new sticker. """), FILE_READY(""" - Your sticker file is ready\\! - Head to [Stickers](https://t.me/Stickers) to create a new sticker\\. + Your sticker file is ready! + + Head to [Stickers bot](https://t.me/Stickers) to create a new sticker. """), FILE_ALREADY_VALID(""" - The media you sent was already suitable to be a Telegram sticker\\. - Send it to [Stickers](https://t.me/Stickers) to add it as a new sticker\\. + The media you sent was already suitable to be a Telegram sticker. + Send it to [Stickers bot](https://t.me/Stickers) to add it as a new sticker. """), FILE_TOO_LARGE(""" - The file can't be converted because Telegram bots can't handle files larger than 20 MB at the moment: please send a smaller one\\. + The file can't be converted because Telegram bots can't handle files larger than 20 MB at the moment: please send a smaller one. """), ABOUT(""" - This bot is open source, check it out on [Github](https://github.com/Stickerifier/Stickerify)\\. + This bot is open source, check it out on [GitHub](https://github.com/Stickerifier/Stickerify). - Looking for sticker packs? Try [MeminiCustom](https://t.me/addstickers/MeminiCustom) and [VideoMemini](https://t.me/addstickers/VideoMemini)\\! + Looking for sticker packs? Try [MeminiCustom](https://t.me/addstickers/MeminiCustom) and [VideoMemini](https://t.me/addstickers/VideoMemini)! """), ERROR(""" - The file conversion was unsuccessful: only images, gifs, standard and video stickers are supported\\. + The file conversion was unsuccessful: use the **/supported** command to read the full list of supported files. - If you think it should have worked, please report the issue on [Github](https://github.com/Stickerifier/Stickerify/issues/new/choose)\\. - """, true), + If you think it should have worked, please report the issue on [GitHub](https://github.com/Stickerifier/Stickerify/issues/new/choose). + """), PRIVACY_POLICY(""" - You can view our privacy policy by visiting [this link](https://stickerifier.github.io/Stickerify/PRIVACY_POLICY.html)\\. + You can view our privacy policy by visiting [this link](https://stickerifier.github.io/Stickerify/PRIVACY_POLICY.html). + + If you have any questions or concerns, feel free to reach out to us at [stickerifier@gmail.com](mailto:stickerifier@gmail.com). + """), + PROCESSING(""" + Processing file... + """), + SUPPORTED_FORMATS(""" + | Type | Supported formats | + |:---------|:------------------------------------------------| + | images | png, jpg, static webp, tiff, ico, svg, psd | + | videos | gif, mov, avi, mp4, webm, m4v, mkv, live photos | + | stickers | static, video, animated | - If you have any questions or concerns, feel free to reach out to us\\. + --- + + If you want to see a format added, please let us know by creating an issue on [GitHub](https://github.com/Stickerifier/Stickerify/issues/new). """); private final String text; - private final boolean disableLinkPreview; Answer(String text) { - this(text, false); - } - - Answer(String text, boolean disableLinkPreview) { this.text = text; - this.disableLinkPreview = disableLinkPreview; } public String getText() { return text; } - - public boolean isDisableLinkPreview() { - return disableLinkPreview; - } } diff --git a/src/main/java/com/github/stickerifier/stickerify/telegram/model/TelegramRequest.java b/src/main/java/com/github/stickerifier/stickerify/telegram/model/TelegramRequest.java index 432607c4..30615abf 100644 --- a/src/main/java/com/github/stickerifier/stickerify/telegram/model/TelegramRequest.java +++ b/src/main/java/com/github/stickerifier/stickerify/telegram/model/TelegramRequest.java @@ -3,6 +3,7 @@ import static com.github.stickerifier.stickerify.telegram.Answer.ABOUT; import static com.github.stickerifier.stickerify.telegram.Answer.HELP; import static com.github.stickerifier.stickerify.telegram.Answer.PRIVACY_POLICY; +import static com.github.stickerifier.stickerify.telegram.Answer.SUPPORTED_FORMATS; import static java.util.Comparator.comparing; import com.fasterxml.jackson.annotation.JsonProperty; @@ -31,6 +32,7 @@ public record TelegramRequest(Message message) { private static final String START_COMMAND = "/start"; private static final String HELP_COMMAND = "/help"; private static final String PRIVACY_COMMAND = "/privacy"; + private static final String SUPPORTED_COMMAND = "/supported"; public @Nullable TelegramFile getFile() { return getMessageMedia() @@ -82,6 +84,7 @@ public Answer getAnswerMessage() { return switch (message.text()) { case HELP_COMMAND, START_COMMAND -> HELP; case PRIVACY_COMMAND -> PRIVACY_POLICY; + case SUPPORTED_COMMAND -> SUPPORTED_FORMATS; case null, default -> ABOUT; }; } diff --git a/src/test/java/com/github/stickerifier/stickerify/bot/MockResponses.java b/src/test/java/com/github/stickerifier/stickerify/bot/MockResponses.java index bd6ab1b9..2b3cc8a0 100644 --- a/src/test/java/com/github/stickerifier/stickerify/bot/MockResponses.java +++ b/src/test/java/com/github/stickerifier/stickerify/bot/MockResponses.java @@ -7,7 +7,7 @@ public final class MockResponses { - static final MockResponse EMPTY_UPDATES = new MockResponse.Builder().body(""" + static final MockResponse SUCCESS_RESPONSE = new MockResponse.Builder().body(""" { ok: true } @@ -76,6 +76,27 @@ public final class MockResponses { } """).build(); + static final MockResponse SUPPORTED_MESSAGE = new MockResponse.Builder().body(""" + { + ok: true, + result: [ + { + update_id: 1, + message: { + message_id: 1, + from: { + id: 123456 + }, + chat: { + id: 1 + }, + text: "/supported" + } + } + ] + } + """).build(); + static final MockResponse FILE_NOT_SUPPORTED = new MockResponse.Builder().body(""" { ok: true, diff --git a/src/test/java/com/github/stickerifier/stickerify/bot/StickerifyTest.java b/src/test/java/com/github/stickerifier/stickerify/bot/StickerifyTest.java index 83471ff9..00a7483f 100644 --- a/src/test/java/com/github/stickerifier/stickerify/bot/StickerifyTest.java +++ b/src/test/java/com/github/stickerifier/stickerify/bot/StickerifyTest.java @@ -9,6 +9,7 @@ import com.github.stickerifier.stickerify.junit.ClearTempFiles; import com.github.stickerifier.stickerify.junit.Tags; import com.github.stickerifier.stickerify.telegram.Answer; +import com.google.gson.JsonParser; import com.pengrad.telegrambot.TelegramBot; import mockwebserver3.MockWebServer; import mockwebserver3.QueueDispatcher; @@ -18,7 +19,7 @@ import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; -import java.net.URLEncoder; +import java.net.URLDecoder; @Tag(Tags.TELEGRAM_API) @ClearTempFiles @@ -29,7 +30,7 @@ class StickerifyTest { @BeforeEach void setup() { - ((QueueDispatcher) server.getDispatcher()).setFailFast(MockResponses.EMPTY_UPDATES); + ((QueueDispatcher) server.getDispatcher()).setFailFast(MockResponses.SUCCESS_RESPONSE); } @Test @@ -40,9 +41,9 @@ void startMessage() throws Exception { var getUpdates = server.takeRequest(); assertEquals("/api/token/getUpdates", getUpdates.getTarget()); - var sendMessage = server.takeRequest(); - assertEquals("/api/token/sendMessage", sendMessage.getTarget()); - assertResponseContainsMessage(sendMessage, Answer.HELP); + var sendRichMessage = server.takeRequest(); + assertEquals("/api/token/sendRichMessage", sendRichMessage.getTarget()); + assertResponseContainsMarkdownMessage(sendRichMessage, Answer.HELP); } } @@ -56,10 +57,32 @@ private Stickerify runBot() { return new Stickerify(bot, Runnable::run); } - private static void assertResponseContainsMessage(RecordedRequest request, Answer answer) { - var message = URLEncoder.encode(answer.getText(), UTF_8); + private static void assertResponseContainsMarkdownMessage(RecordedRequest request, Answer answer) { + assertResponseContainsMessage(request, answer, "markdown"); + } + + private static void assertResponseContainsHtmlMessage(RecordedRequest request) { + assertResponseContainsMessage(request, Answer.PROCESSING, "html"); + } + + private static void assertResponseContainsMessage(RecordedRequest request, Answer answer, String messageFormat) { assertNotNull(request.getBody()); - assertThat(request.getBody().utf8(), containsString(message)); + var decodedBody = URLDecoder.decode(request.getBody().utf8(), UTF_8); + + var richMessageStart = decodedBody.indexOf("rich_message="); + if (richMessageStart == -1) { + throw new AssertionError("No rich message found in request body"); + } + + var richMessageEnd = decodedBody.indexOf("&", richMessageStart); + richMessageEnd = richMessageEnd == -1 ? decodedBody.length() : richMessageEnd; + var richMessageJson = decodedBody.substring(richMessageStart + "rich_message=".length(), richMessageEnd); + + var richMessage = JsonParser.parseString(richMessageJson).getAsJsonObject(); + var actualMessage = richMessage.get(messageFormat).getAsString(); + + var expectedMessage = answer.getText(); + assertThat(actualMessage, containsString(expectedMessage)); } @Test @@ -70,9 +93,9 @@ void helpMessage() throws Exception { var getUpdates = server.takeRequest(); assertEquals("/api/token/getUpdates", getUpdates.getTarget()); - var sendMessage = server.takeRequest(); - assertEquals("/api/token/sendMessage", sendMessage.getTarget()); - assertResponseContainsMessage(sendMessage, Answer.HELP); + var sendRichMessage = server.takeRequest(); + assertEquals("/api/token/sendRichMessage", sendRichMessage.getTarget()); + assertResponseContainsMarkdownMessage(sendRichMessage, Answer.HELP); } } @@ -84,9 +107,23 @@ void privacyMessage() throws Exception { var getUpdates = server.takeRequest(); assertEquals("/api/token/getUpdates", getUpdates.getTarget()); - var sendMessage = server.takeRequest(); - assertEquals("/api/token/sendMessage", sendMessage.getTarget()); - assertResponseContainsMessage(sendMessage, Answer.PRIVACY_POLICY); + var sendRichMessage = server.takeRequest(); + assertEquals("/api/token/sendRichMessage", sendRichMessage.getTarget()); + assertResponseContainsMarkdownMessage(sendRichMessage, Answer.PRIVACY_POLICY); + } + } + + @Test + void supportedMessage() throws Exception { + server.enqueue(MockResponses.SUPPORTED_MESSAGE); + + try (var _ = runBot()) { + var getUpdates = server.takeRequest(); + assertEquals("/api/token/getUpdates", getUpdates.getTarget()); + + var sendRichMessage = server.takeRequest(); + assertEquals("/api/token/sendRichMessage", sendRichMessage.getTarget()); + assertResponseContainsMarkdownMessage(sendRichMessage, Answer.SUPPORTED_FORMATS); } } @@ -98,9 +135,9 @@ void fileNotSupported() throws Exception { var getUpdates = server.takeRequest(); assertEquals("/api/token/getUpdates", getUpdates.getTarget()); - var sendMessage = server.takeRequest(); - assertEquals("/api/token/sendMessage", sendMessage.getTarget()); - assertResponseContainsMessage(sendMessage, Answer.ERROR); + var sendRichMessage = server.takeRequest(); + assertEquals("/api/token/sendRichMessage", sendRichMessage.getTarget()); + assertResponseContainsMarkdownMessage(sendRichMessage, Answer.ERROR); } } @@ -112,15 +149,16 @@ void fileTooBig() throws Exception { var getUpdates = server.takeRequest(); assertEquals("/api/token/getUpdates", getUpdates.getTarget()); - var sendMessage = server.takeRequest(); - assertEquals("/api/token/sendMessage", sendMessage.getTarget()); - assertResponseContainsMessage(sendMessage, Answer.FILE_TOO_LARGE); + var sendRichMessage = server.takeRequest(); + assertEquals("/api/token/sendRichMessage", sendRichMessage.getTarget()); + assertResponseContainsMarkdownMessage(sendRichMessage, Answer.FILE_TOO_LARGE); } } @Test void fileAlreadyValid() throws Exception { server.enqueue(MockResponses.ANIMATED_STICKER); + server.enqueue(MockResponses.SUCCESS_RESPONSE); server.enqueue(MockResponses.fileInfo("animated_sticker.tgs")); server.enqueue(MockResponses.fileDownload("animated_sticker.tgs")); @@ -128,6 +166,10 @@ void fileAlreadyValid() throws Exception { var getUpdates = server.takeRequest(); assertEquals("/api/token/getUpdates", getUpdates.getTarget()); + var sendRichMessageDraft = server.takeRequest(); + assertEquals("/api/token/sendRichMessageDraft", sendRichMessageDraft.getTarget()); + assertResponseContainsHtmlMessage(sendRichMessageDraft); + var getFile = server.takeRequest(); assertEquals("/api/token/getFile", getFile.getTarget()); assertNotNull(getFile.getBody()); @@ -136,15 +178,16 @@ void fileAlreadyValid() throws Exception { var download = server.takeRequest(); assertEquals("/files/token/animated_sticker.tgs", download.getTarget()); - var sendMessage = server.takeRequest(); - assertEquals("/api/token/sendMessage", sendMessage.getTarget()); - assertResponseContainsMessage(sendMessage, Answer.FILE_ALREADY_VALID); + var sendRichMessage = server.takeRequest(); + assertEquals("/api/token/sendRichMessage", sendRichMessage.getTarget()); + assertResponseContainsMarkdownMessage(sendRichMessage, Answer.FILE_ALREADY_VALID); } } @Test void convertedPng() throws Exception { server.enqueue(MockResponses.PNG_FILE); + server.enqueue(MockResponses.SUCCESS_RESPONSE); server.enqueue(MockResponses.fileInfo("big.png")); server.enqueue(MockResponses.fileDownload("big.png")); @@ -152,6 +195,10 @@ void convertedPng() throws Exception { var getUpdates = server.takeRequest(); assertEquals("/api/token/getUpdates", getUpdates.getTarget()); + var sendRichMessageDraft = server.takeRequest(); + assertEquals("/api/token/sendRichMessageDraft", sendRichMessageDraft.getTarget()); + assertResponseContainsHtmlMessage(sendRichMessageDraft); + var getFile = server.takeRequest(); assertEquals("/api/token/getFile", getFile.getTarget()); assertNotNull(getFile.getBody()); @@ -162,14 +209,17 @@ void convertedPng() throws Exception { var sendDocument = server.takeRequest(); assertEquals("/api/token/sendDocument", sendDocument.getTarget()); - assertNotNull(sendDocument.getBody()); - assertThat(sendDocument.getBody().utf8(), containsString(Answer.FILE_READY.getText())); + + var sendRichMessage = server.takeRequest(); + assertEquals("/api/token/sendRichMessage", sendRichMessage.getTarget()); + assertResponseContainsMarkdownMessage(sendRichMessage, Answer.FILE_READY); } } @Test void convertedWebp() throws Exception { server.enqueue(MockResponses.WEBP_FILE); + server.enqueue(MockResponses.SUCCESS_RESPONSE); server.enqueue(MockResponses.fileInfo("static.webp")); server.enqueue(MockResponses.fileDownload("static.webp")); @@ -177,6 +227,10 @@ void convertedWebp() throws Exception { var getUpdates = server.takeRequest(); assertEquals("/api/token/getUpdates", getUpdates.getTarget()); + var sendRichMessageDraft = server.takeRequest(); + assertEquals("/api/token/sendRichMessageDraft", sendRichMessageDraft.getTarget()); + assertResponseContainsHtmlMessage(sendRichMessageDraft); + var getFile = server.takeRequest(); assertEquals("/api/token/getFile", getFile.getTarget()); assertNotNull(getFile.getBody()); @@ -187,14 +241,17 @@ void convertedWebp() throws Exception { var sendDocument = server.takeRequest(); assertEquals("/api/token/sendDocument", sendDocument.getTarget()); - assertNotNull(sendDocument.getBody()); - assertThat(sendDocument.getBody().utf8(), containsString(Answer.FILE_READY.getText())); + + var sendRichMessage = server.takeRequest(); + assertEquals("/api/token/sendRichMessage", sendRichMessage.getTarget()); + assertResponseContainsMarkdownMessage(sendRichMessage, Answer.FILE_READY); } } @Test void convertedMov() throws Exception { server.enqueue(MockResponses.MOV_FILE); + server.enqueue(MockResponses.SUCCESS_RESPONSE); server.enqueue(MockResponses.fileInfo("long.mov")); server.enqueue(MockResponses.fileDownload("long.mov")); @@ -202,6 +259,10 @@ void convertedMov() throws Exception { var getUpdates = server.takeRequest(); assertEquals("/api/token/getUpdates", getUpdates.getTarget()); + var sendRichMessageDraft = server.takeRequest(); + assertEquals("/api/token/sendRichMessageDraft", sendRichMessageDraft.getTarget()); + assertResponseContainsHtmlMessage(sendRichMessageDraft); + var getFile = server.takeRequest(); assertEquals("/api/token/getFile", getFile.getTarget()); assertNotNull(getFile.getBody()); @@ -212,14 +273,17 @@ void convertedMov() throws Exception { var sendDocument = server.takeRequest(); assertEquals("/api/token/sendDocument", sendDocument.getTarget()); - assertNotNull(sendDocument.getBody()); - assertThat(sendDocument.getBody().utf8(), containsString(Answer.FILE_READY.getText())); + + var sendRichMessage = server.takeRequest(); + assertEquals("/api/token/sendRichMessage", sendRichMessage.getTarget()); + assertResponseContainsMarkdownMessage(sendRichMessage, Answer.FILE_READY); } } @Test void convertedWebm() throws Exception { server.enqueue(MockResponses.WEBM_FILE); + server.enqueue(MockResponses.SUCCESS_RESPONSE); server.enqueue(MockResponses.fileInfo("short_low_fps.webm")); server.enqueue(MockResponses.fileDownload("short_low_fps.webm")); @@ -227,6 +291,10 @@ void convertedWebm() throws Exception { var getUpdates = server.takeRequest(); assertEquals("/api/token/getUpdates", getUpdates.getTarget()); + var sendRichMessageDraft = server.takeRequest(); + assertEquals("/api/token/sendRichMessageDraft", sendRichMessageDraft.getTarget()); + assertResponseContainsHtmlMessage(sendRichMessageDraft); + var getFile = server.takeRequest(); assertEquals("/api/token/getFile", getFile.getTarget()); assertNotNull(getFile.getBody()); @@ -237,14 +305,17 @@ void convertedWebm() throws Exception { var sendDocument = server.takeRequest(); assertEquals("/api/token/sendDocument", sendDocument.getTarget()); - assertNotNull(sendDocument.getBody()); - assertThat(sendDocument.getBody().utf8(), containsString(Answer.FILE_READY.getText())); + + var sendRichMessage = server.takeRequest(); + assertEquals("/api/token/sendRichMessage", sendRichMessage.getTarget()); + assertResponseContainsMarkdownMessage(sendRichMessage, Answer.FILE_READY); } } @Test void convertedGif() throws Exception { server.enqueue(MockResponses.GIF_FILE); + server.enqueue(MockResponses.SUCCESS_RESPONSE); server.enqueue(MockResponses.fileInfo("valid.gif")); server.enqueue(MockResponses.fileDownload("valid.gif")); @@ -252,6 +323,10 @@ void convertedGif() throws Exception { var getUpdates = server.takeRequest(); assertEquals("/api/token/getUpdates", getUpdates.getTarget()); + var sendRichMessageDraft = server.takeRequest(); + assertEquals("/api/token/sendRichMessageDraft", sendRichMessageDraft.getTarget()); + assertResponseContainsHtmlMessage(sendRichMessageDraft); + var getFile = server.takeRequest(); assertEquals("/api/token/getFile", getFile.getTarget()); assertNotNull(getFile.getBody()); @@ -262,14 +337,17 @@ void convertedGif() throws Exception { var sendDocument = server.takeRequest(); assertEquals("/api/token/sendDocument", sendDocument.getTarget()); - assertNotNull(sendDocument.getBody()); - assertThat(sendDocument.getBody().utf8(), containsString(Answer.FILE_READY.getText())); + + var sendRichMessage = server.takeRequest(); + assertEquals("/api/token/sendRichMessage", sendRichMessage.getTarget()); + assertResponseContainsMarkdownMessage(sendRichMessage, Answer.FILE_READY); } } @Test void convertedLivePhoto() throws Exception { server.enqueue(MockResponses.LIVE_PHOTO_FILE); + server.enqueue(MockResponses.SUCCESS_RESPONSE); server.enqueue(MockResponses.fileInfo("valid_live_photo")); server.enqueue(MockResponses.fileDownload("valid_live_photo")); @@ -277,6 +355,10 @@ void convertedLivePhoto() throws Exception { var getUpdates = server.takeRequest(); assertEquals("/api/token/getUpdates", getUpdates.getTarget()); + var sendRichMessageDraft = server.takeRequest(); + assertEquals("/api/token/sendRichMessageDraft", sendRichMessageDraft.getTarget()); + assertResponseContainsHtmlMessage(sendRichMessageDraft); + var getFile = server.takeRequest(); assertEquals("/api/token/getFile", getFile.getTarget()); assertNotNull(getFile.getBody()); @@ -287,14 +369,17 @@ void convertedLivePhoto() throws Exception { var sendDocument = server.takeRequest(); assertEquals("/api/token/sendDocument", sendDocument.getTarget()); - assertNotNull(sendDocument.getBody()); - assertThat(sendDocument.getBody().utf8(), containsString(Answer.FILE_READY.getText())); + + var sendRichMessage = server.takeRequest(); + assertEquals("/api/token/sendRichMessage", sendRichMessage.getTarget()); + assertResponseContainsMarkdownMessage(sendRichMessage, Answer.FILE_READY); } } @Test void documentNotSupported() throws Exception { server.enqueue(MockResponses.DOCUMENT); + server.enqueue(MockResponses.SUCCESS_RESPONSE); server.enqueue(MockResponses.fileInfo("document.txt")); server.enqueue(MockResponses.fileDownload("document.txt")); @@ -302,6 +387,10 @@ void documentNotSupported() throws Exception { var getUpdates = server.takeRequest(); assertEquals("/api/token/getUpdates", getUpdates.getTarget()); + var sendRichMessageDraft = server.takeRequest(); + assertEquals("/api/token/sendRichMessageDraft", sendRichMessageDraft.getTarget()); + assertResponseContainsHtmlMessage(sendRichMessageDraft); + var getFile = server.takeRequest(); assertEquals("/api/token/getFile", getFile.getTarget()); assertNotNull(getFile.getBody()); @@ -310,9 +399,9 @@ void documentNotSupported() throws Exception { var download = server.takeRequest(); assertEquals("/files/token/document.txt", download.getTarget()); - var sendMessage = server.takeRequest(); - assertEquals("/api/token/sendMessage", sendMessage.getTarget()); - assertResponseContainsMessage(sendMessage, Answer.ERROR); + var sendRichMessage = server.takeRequest(); + assertEquals("/api/token/sendRichMessage", sendRichMessage.getTarget()); + assertResponseContainsMarkdownMessage(sendRichMessage, Answer.ERROR); } } }