Repository: defstudio/telegraph (php)

Issue:
Implement `forwardMessage` method
implement https://core.telegram.org/bots/api#forwardmessage

to allow:

```php
Telegraph::forwardMessage($originalChatId, $messageId)->protected()->silent()
```

Pull request:
[feat] forwardMessage method #184
Implements methods for forward a message.

`Telegraph::forwardMessage($fromChatId, $messageId)->send();`

Closes #184

Patch:
diff --git a/docs/content/en/features/telegram-api-calls.md b/docs/content/en/features/telegram-api-calls.md
index 53403335..52bbcdb5 100644
--- a/docs/content/en/features/telegram-api-calls.md
+++ b/docs/content/en/features/telegram-api-calls.md
@@ -74,6 +74,14 @@ deletes a message
 Telegraph::deleteMessage($messageId)->send();
 ```
 
+## forwardMessage
+
+forwards a message from another chat
+
+```php
+Telegraph::forwardMessage($fromChat, $messageId)->send();
+```
+
 ## pinMessage
 
 pins a message
diff --git a/docs/content/en/models/telegraph-chat.md b/docs/content/en/models/telegraph-chat.md
index 41f7dc99..8930441e 100644
--- a/docs/content/en/models/telegraph-chat.md
+++ b/docs/content/en/models/telegraph-chat.md
@@ -149,6 +149,16 @@ Starts a `Telegraph` call to delete a message
 $telegraphChat->deleteMessage($messageId)->send();
 ```
 
+### `forwardMessage()`
+
+forwards a message from another chat
+
+```php
+/** @var \DefStudio\Telegraph\Models\TelegraphChat $telegraphChat */
+
+$telegraphChat->forwardMessage($fromChat, $messageId)->send();
+```
+
 ### `pinMessage()`
 
 Starts a `Telegraph` call to pin a message
diff --git a/docs/content/en/webhooks/dto.md b/docs/content/en/webhooks/dto.md
index 94c15d82..c5f9034f 100644
--- a/docs/content/en/webhooks/dto.md
+++ b/docs/content/en/webhooks/dto.md
@@ -143,7 +143,3 @@ This is a DTO for outgoing data, wraps info about the Contact result returned to
 ## `DefStudio\Telegraph\DTO\InlineQueryResultArticle`
 
 This is a DTO for outgoing data, wraps info about the Article result returned to the user
-
-## `DefStudio\Telegraph\DTO\InlineQueryResultMpeg4Gif`
-
-This is a DTO for outgoing data, wraps info about the Mpeg4Gif result returned to the user
diff --git a/docs/content/en/webhooks/webhook-request-types.md b/docs/content/en/webhooks/webhook-request-types.md
index e92b31a8..ee74189c 100644
--- a/docs/content/en/webhooks/webhook-request-types.md
+++ b/docs/content/en/webhooks/webhook-request-types.md
@@ -161,7 +161,7 @@ Different kind of result can be sent through the handler:
 - Document (coming soon)
 - Gif ([`DefStudio\Telegraph\DTO\InlineQueryResultGif`](webhooks/dto#defstudio-telegraph-dto-inline-query-result-gif))
 - Location (coming soon)
-- Mpeg4Gif ([`DefStudio\Telegraph\DTO\InlineQueryResultMpeg4Gif`](webhooks/dto#defstudio-telegraph-dto-inline-query-result-Mpeg4Gif))
+- Mpeg4Gif (coming soon)
 - Photo([`DefStudio\Telegraph\DTO\InlineQueryResultPhoto`](webhooks/dto#defstudio-telegraph-dto-inline-query-result-photo))
 - Venue (coming soon)
 - Video (coming soon)
diff --git a/src/Concerns/ComposesMessages.php b/src/Concerns/ComposesMessages.php
index 14c77cc5..9a050c3b 100644
--- a/src/Concerns/ComposesMessages.php
+++ b/src/Concerns/ComposesMessages.php
@@ -4,6 +4,7 @@
 
 namespace DefStudio\Telegraph\Concerns;
 
+use DefStudio\Telegraph\Models\TelegraphChat;
 use DefStudio\Telegraph\Telegraph;
 
 trait ComposesMessages
@@ -148,4 +149,20 @@ trait ComposesMessages
 
         return $telegraph;
     }
+
+    public function forwardMessage(TelegraphChat|int $fromChat, int $messageId): Telegraph
+    {
+        $fromChatId = is_int($fromChat) ? $fromChat : $fromChat->chat_id;
+
+        $telegraph = clone $this;
+
+        $telegraph->endpoint = self::ENDPOINT_FORWARD_MESSAGE;
+        $telegraph->data = [
+            'chat_id' => $telegraph->getChat()->chat_id,
+            'message_id' => $messageId,
+            'from_chat_id' => $fromChatId,
+        ];
+
+        return $telegraph;
+    }
 }
diff --git a/src/DTO/InlineQueryResultMpeg4Gif.php b/src/DTO/InlineQueryResultMpeg4Gif.php
deleted file mode 100644
index e5f16bc8..00000000
--- a/src/DTO/InlineQueryResultMpeg4Gif.php
+++ /dev/null
@@ -1,88 +0,0 @@
-<?php
-
-/** @noinspection PhpUnused */
-
-namespace DefStudio\Telegraph\DTO;
-
-class InlineQueryResultMpeg4Gif extends InlineQueryResult
-{
-    protected string $type = 'mpeg4_gif';
-    protected string $id;
-    protected string $mpeg4Url;
-    protected string $thumbUrl;
-    protected int|null $mpeg4Width = null;
-    protected int|null $mpeg4Height = null;
-    protected int|null $mpeg4Duration = null;
-    protected string|null $thumbMimeType = null;
-    protected string|null $title = null;
-    protected string|null $caption = null;
-
-    public static function make(string $id, string $mpeg4Url, string $thumbUrl): InlineQueryResultMpeg4Gif
-    {
-        $result = new InlineQueryResultMpeg4Gif();
-        $result->id = $id;
-        $result->mpeg4Url = $mpeg4Url;
-        $result->thumbUrl = $thumbUrl;
-
-        return $result;
-    }
-
-    public function mpeg4Width(int|null $mpeg4Width): InlineQueryResultMpeg4Gif
-    {
-        $this->mpeg4Width = $mpeg4Width;
-
-        return $this;
-    }
-
-    public function mpeg4Height(int|null $mpeg4Height): InlineQueryResultMpeg4Gif
-    {
-        $this->mpeg4Height = $mpeg4Height;
-
-        return $this;
-    }
-
-    public function mpeg4Duration(int|null $mpeg4Duration): InlineQueryResultMpeg4Gif
-    {
-        $this->mpeg4Duration = $mpeg4Duration;
-
-        return $this;
-    }
-
-    public function thumbMimeType(string|null $thumbMimeType): InlineQueryResultMpeg4Gif
-    {
-        $this->thumbMimeType = $thumbMimeType;
-
-        return $this;
-    }
-
-    public function title(string|null $title): InlineQueryResultMpeg4Gif
-    {
-        $this->title = $title;
-
-        return $this;
-    }
-
-    public function caption(string|null $caption): InlineQueryResultMpeg4Gif
-    {
-        $this->caption = $caption;
-
-        return $this;
-    }
-
-    /**
-     * @inheritDoc
-     */
-    public function data(): array
-    {
-        return [
-            'mpeg4_url' => $this->mpeg4Url,
-            'mpeg4_width' => $this->mpeg4Width,
-            'mpeg4_height' => $this->mpeg4Height,
-            'mpeg4_duration' => $this->mpeg4Duration,
-            'thumb_url' => $this->thumbUrl,
-            'thumb_mime_type' => $this->thumbMimeType,
-            'title' => $this->title,
-            'caption' => $this->caption,
-        ];
-    }
-}
diff --git a/src/Facades/Telegraph.php b/src/Facades/Telegraph.php
index 0466188a..ab320860 100644
--- a/src/Facades/Telegraph.php
+++ b/src/Facades/Telegraph.php
@@ -29,6 +29,7 @@ use Illuminate\Support\Facades\Facade;
  * @method static \DefStudio\Telegraph\Telegraph  replaceKeyboard(string $messageId, Keyboard|callable $newKeyboard)
  * @method static \DefStudio\Telegraph\Telegraph  deleteKeyboard(string $messageId)
  * @method static \DefStudio\Telegraph\Telegraph  deleteMessage(string $messageId)
+ * @method static \DefStudio\Telegraph\Telegraph  forwardMessage($fromChat, $messageId)
  * @method static \DefStudio\Telegraph\Telegraph  pinMessage(string $messageId)
  * @method static \DefStudio\Telegraph\Telegraph  unpinMessage(string $messageId)
  * @method static \DefStudio\Telegraph\Telegraph  unpinAllMessages()
diff --git a/src/Models/TelegraphChat.php b/src/Models/TelegraphChat.php
index cbcea04a..64662e4d 100644
--- a/src/Models/TelegraphChat.php
+++ b/src/Models/TelegraphChat.php
@@ -271,4 +271,9 @@ class TelegraphChat extends Model
     {
         return TelegraphFacade::chat($this)->quiz($question);
     }
+
+    public function forwardMessage(TelegraphChat|int $fromChat, int $messageId): Telegraph
+    {
+        return TelegraphFacade::chat($this)->forwardMessage($fromChat, $messageId);
+    }
 }
diff --git a/src/Telegraph.php b/src/Telegraph.php
index 7471f0d2..de4c7f1f 100755
--- a/src/Telegraph.php
+++ b/src/Telegraph.php
@@ -91,6 +91,7 @@ class Telegraph
     public const ENDPOINT_RESTRICT_CHAT_MEMBER = 'restrictChatMember';
     public const ENDPOINT_PROMOTE_CHAT_MEMBER = 'promoteChatMember';
     public const ENDPOINT_SEND_POLL = 'sendPoll';
+    public const ENDPOINT_FORWARD_MESSAGE = 'forwardMessage';
 
 
     /** @var array<string, mixed> */


Test patch:
diff --git a/tests/Unit/Concerns/AnswersInlineQueriesTest.php b/tests/Unit/Concerns/AnswersInlineQueriesTest.php
index aa759257..e24fbbb1 100644
--- a/tests/Unit/Concerns/AnswersInlineQueriesTest.php
+++ b/tests/Unit/Concerns/AnswersInlineQueriesTest.php
@@ -5,7 +5,6 @@
 use DefStudio\Telegraph\DTO\InlineQueryResultArticle;
 use DefStudio\Telegraph\DTO\InlineQueryResultContact;
 use DefStudio\Telegraph\DTO\InlineQueryResultGif;
-use DefStudio\Telegraph\DTO\InlineQueryResultMpeg4Gif;
 use DefStudio\Telegraph\DTO\InlineQueryResultPhoto;
 use DefStudio\Telegraph\Exceptions\InlineQueryException;
 use DefStudio\Telegraph\Telegraph;
@@ -16,7 +15,6 @@ it('can answer an inline query', function () {
         InlineQueryResultPhoto::make(42, 'https://photo.dev', 'https://photo-thumb.dev'),
         InlineQueryResultContact::make(42, '399999999', 'testFirstName'),
         InlineQueryResultArticle::make(42, 'testTitle', 'testMessage'),
-        InlineQueryResultMpeg4Gif::make(42, 'testMpeg4Url', 'testThumbUrl'),
     ]))->toMatchTelegramSnapshot();
 });
 
@@ -27,7 +25,6 @@ it('can set cache duration', function () {
             InlineQueryResultPhoto::make(42, 'https://photo.dev', 'https://photo-thumb.dev'),
             InlineQueryResultContact::make(42, '399999999', 'testFirstName'),
             InlineQueryResultArticle::make(42, 'testTitle', 'testMessage'),
-            InlineQueryResultMpeg4Gif::make(42, 'testMpeg4Url', 'testThumbUrl'),
         ])->cache(600)
     )->toMatchTelegramSnapshot();
 });
@@ -39,7 +36,6 @@ it('can set next offset', function () {
             InlineQueryResultPhoto::make(42, 'https://photo.dev', 'https://photo-thumb.dev'),
             InlineQueryResultContact::make(42, '399999999', 'testFirstName'),
             InlineQueryResultArticle::make(42, 'testTitle', 'testMessage'),
-            InlineQueryResultMpeg4Gif::make(42, 'testMpeg4Url', 'testThumbUrl'),
         ])->nextOffset('2')
     )->toMatchTelegramSnapshot();
 });
@@ -51,7 +47,6 @@ it('can set results as personal', function () {
             InlineQueryResultPhoto::make(42, 'https://photo.dev', 'https://photo-thumb.dev'),
             InlineQueryResultContact::make(42, '399999999', 'testFirstName'),
             InlineQueryResultArticle::make(42, 'testTitle', 'testMessage'),
-            InlineQueryResultMpeg4Gif::make(42, 'testMpeg4Url', 'testThumbUrl'),
         ])->personal()
     )->toMatchTelegramSnapshot();
 });
@@ -63,7 +58,6 @@ it('can offer to switch to private message', function () {
             InlineQueryResultPhoto::make(42, 'https://photo.dev', 'https://photo-thumb.dev'),
             InlineQueryResultContact::make(42, '399999999', 'testFirstName'),
             InlineQueryResultArticle::make(42, 'testTitle', 'testMessage'),
-            InlineQueryResultMpeg4Gif::make(42, 'testMpeg4Url', 'testThumbUrl'),
         ])->offertToSwitchToPrivateMessage('configure', '123456')
     )->toMatchTelegramSnapshot();
 });
diff --git a/tests/Unit/Concerns/ComposesMessagesTest.php b/tests/Unit/Concerns/ComposesMessagesTest.php
index e03d97d9..42daceba 100644
--- a/tests/Unit/Concerns/ComposesMessagesTest.php
+++ b/tests/Unit/Concerns/ComposesMessagesTest.php
@@ -58,3 +58,10 @@ it('can edit a message', function (callable $setupClosure) {
     'edit before text' => fn () => fn (Telegraph $telegraph) => $telegraph->edit(123456)->markdown('new text'),
     'edit after text' => fn () => fn (Telegraph $telegraph) => $telegraph->markdown('new text')->edit(123456),
 ]);
+
+it('can forward a message', function () {
+    $chat = make_chat();
+
+    expect(fn (Telegraph $telegraph) => $telegraph->forwardMessage($chat, 123456))
+        ->toMatchTelegramSnapshot();
+});
diff --git a/tests/Unit/DTO/InlineQueryResultMpeg4GifTest.php b/tests/Unit/DTO/InlineQueryResultMpeg4GifTest.php
deleted file mode 100644
index d6b746e6..00000000
--- a/tests/Unit/DTO/InlineQueryResultMpeg4GifTest.php
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-
-use DefStudio\Telegraph\DTO\InlineQueryResultMpeg4Gif;
-
-it('can export to array', function () {
-    expect(
-        InlineQueryResultMpeg4Gif::make('a45', 'testMpeg4Url', 'testThumbUrl')
-            ->mpeg4Width(400)
-            ->mpeg4Height(200)
-            ->mpeg4Duration(10)
-            ->thumbMimeType('testThumbMimeType')
-            ->title('testTitle')
-            ->caption('testCaption')
-            ->toArray()
-    )->toBe([
-        'mpeg4_url' => 'testMpeg4Url',
-        'mpeg4_width' => 400,
-        'mpeg4_height' => 200,
-        'mpeg4_duration' => 10,
-        'thumb_url' => 'testThumbUrl',
-        'thumb_mime_type' => 'testThumbMimeType',
-        'title' => 'testTitle',
-        'caption' => 'testCaption',
-        'id' => "a45",
-        'type' => "mpeg4_gif",
-    ]);
-});
diff --git a/tests/Unit/Models/TelegraphChatTest.php b/tests/Unit/Models/TelegraphChatTest.php
index dea21f9d..4d66c149 100644
--- a/tests/Unit/Models/TelegraphChatTest.php
+++ b/tests/Unit/Models/TelegraphChatTest.php
@@ -470,3 +470,15 @@ it('can create a quiz', function () {
 
     TelegraphQuizFake::assertSentQuiz('foo?', ['bar!', 'baz!'], 1);
 });
+
+it('can forward a message', function () {
+    Telegraph::fake();
+    $chat = make_chat();
+
+    $chat->forwardMessage($chat, 123)->send();
+
+    Telegraph::assertSentData(\DefStudio\Telegraph\Telegraph::ENDPOINT_FORWARD_MESSAGE, [
+        'from_chat_id' => $chat->chat_id,
+        'message_id' => 123,
+    ]);
+});
diff --git a/tests/__snapshots__/AnswersInlineQueriesTest__it_can_answer_an_inline_query__1.yml b/tests/__snapshots__/AnswersInlineQueriesTest__it_can_answer_an_inline_query__1.yml
index 6dcf4071..63c12e9e 100644
--- a/tests/__snapshots__/AnswersInlineQueriesTest__it_can_answer_an_inline_query__1.yml
+++ b/tests/__snapshots__/AnswersInlineQueriesTest__it_can_answer_an_inline_query__1.yml
@@ -1,5 +1,5 @@
 url: 'https://api.telegram.org/bot3f3814e1-5836-3d77-904e-60f64b15df36/answerInlineQuery'
 payload:
     inline_query_id: '99'
-    results: [{ gif_url: 'https://gif.dev', thumb_url: 'https://gif-thumb.dev', id: '42', type: gif }, { photo_url: 'https://photo.dev', thumb_url: 'https://photo-thumb.dev', id: '42', type: photo }, { phone_number: '399999999', first_name: testFirstName, id: '42', type: contact }, { title: testTitle, input_message_content: { message: testMessage, parse_mode: html }, id: '42', type: article }, { mpeg4_url: testMpeg4Url, thumb_url: testThumbUrl, id: '42', type: mpeg4_gif }]
+    results: [{ gif_url: 'https://gif.dev', thumb_url: 'https://gif-thumb.dev', id: '42', type: gif }, { photo_url: 'https://photo.dev', thumb_url: 'https://photo-thumb.dev', id: '42', type: photo }, { phone_number: '399999999', first_name: testFirstName, id: '42', type: contact }, { title: testTitle, input_message_content: { message: testMessage, parse_mode: html }, id: '42', type: article }]
 files: {  }
diff --git a/tests/__snapshots__/AnswersInlineQueriesTest__it_can_offer_to_switch_to_private_message__1.yml b/tests/__snapshots__/AnswersInlineQueriesTest__it_can_offer_to_switch_to_private_message__1.yml
index 1414de24..3f92e2fd 100644
--- a/tests/__snapshots__/AnswersInlineQueriesTest__it_can_offer_to_switch_to_private_message__1.yml
+++ b/tests/__snapshots__/AnswersInlineQueriesTest__it_can_offer_to_switch_to_private_message__1.yml
@@ -1,7 +1,7 @@
 url: 'https://api.telegram.org/bot3f3814e1-5836-3d77-904e-60f64b15df36/answerInlineQuery'
 payload:
     inline_query_id: '99'
-    results: [{ gif_url: 'https://gif.dev', thumb_url: 'https://gif-thumb.dev', id: '42', type: gif }, { photo_url: 'https://photo.dev', thumb_url: 'https://photo-thumb.dev', id: '42', type: photo }, { phone_number: '399999999', first_name: testFirstName, id: '42', type: contact }, { title: testTitle, input_message_content: { message: testMessage, parse_mode: html }, id: '42', type: article }, { mpeg4_url: testMpeg4Url, thumb_url: testThumbUrl, id: '42', type: mpeg4_gif }]
+    results: [{ gif_url: 'https://gif.dev', thumb_url: 'https://gif-thumb.dev', id: '42', type: gif }, { photo_url: 'https://photo.dev', thumb_url: 'https://photo-thumb.dev', id: '42', type: photo }, { phone_number: '399999999', first_name: testFirstName, id: '42', type: contact }, { title: testTitle, input_message_content: { message: testMessage, parse_mode: html }, id: '42', type: article }]
     switch_pm_text: configure
     switch_pm_parameter: '123456'
 files: {  }
diff --git a/tests/__snapshots__/AnswersInlineQueriesTest__it_can_set_cache_duration__1.yml b/tests/__snapshots__/AnswersInlineQueriesTest__it_can_set_cache_duration__1.yml
index 9bddd540..8f743a8e 100644
--- a/tests/__snapshots__/AnswersInlineQueriesTest__it_can_set_cache_duration__1.yml
+++ b/tests/__snapshots__/AnswersInlineQueriesTest__it_can_set_cache_duration__1.yml
@@ -1,6 +1,6 @@
 url: 'https://api.telegram.org/bot3f3814e1-5836-3d77-904e-60f64b15df36/answerInlineQuery'
 payload:
     inline_query_id: '99'
-    results: [{ gif_url: 'https://gif.dev', thumb_url: 'https://gif-thumb.dev', id: '42', type: gif }, { photo_url: 'https://photo.dev', thumb_url: 'https://photo-thumb.dev', id: '42', type: photo }, { phone_number: '399999999', first_name: testFirstName, id: '42', type: contact }, { title: testTitle, input_message_content: { message: testMessage, parse_mode: html }, id: '42', type: article }, { mpeg4_url: testMpeg4Url, thumb_url: testThumbUrl, id: '42', type: mpeg4_gif }]
+    results: [{ gif_url: 'https://gif.dev', thumb_url: 'https://gif-thumb.dev', id: '42', type: gif }, { photo_url: 'https://photo.dev', thumb_url: 'https://photo-thumb.dev', id: '42', type: photo }, { phone_number: '399999999', first_name: testFirstName, id: '42', type: contact }, { title: testTitle, input_message_content: { message: testMessage, parse_mode: html }, id: '42', type: article }]
     cache_time: 600
 files: {  }
diff --git a/tests/__snapshots__/AnswersInlineQueriesTest__it_can_set_next_offset__1.yml b/tests/__snapshots__/AnswersInlineQueriesTest__it_can_set_next_offset__1.yml
index 8ed82f60..1e285b8b 100644
--- a/tests/__snapshots__/AnswersInlineQueriesTest__it_can_set_next_offset__1.yml
+++ b/tests/__snapshots__/AnswersInlineQueriesTest__it_can_set_next_offset__1.yml
@@ -1,6 +1,6 @@
 url: 'https://api.telegram.org/bot3f3814e1-5836-3d77-904e-60f64b15df36/answerInlineQuery'
 payload:
     inline_query_id: '99'
-    results: [{ gif_url: 'https://gif.dev', thumb_url: 'https://gif-thumb.dev', id: '42', type: gif }, { photo_url: 'https://photo.dev', thumb_url: 'https://photo-thumb.dev', id: '42', type: photo }, { phone_number: '399999999', first_name: testFirstName, id: '42', type: contact }, { title: testTitle, input_message_content: { message: testMessage, parse_mode: html }, id: '42', type: article }, { mpeg4_url: testMpeg4Url, thumb_url: testThumbUrl, id: '42', type: mpeg4_gif }]
+    results: [{ gif_url: 'https://gif.dev', thumb_url: 'https://gif-thumb.dev', id: '42', type: gif }, { photo_url: 'https://photo.dev', thumb_url: 'https://photo-thumb.dev', id: '42', type: photo }, { phone_number: '399999999', first_name: testFirstName, id: '42', type: contact }, { title: testTitle, input_message_content: { message: testMessage, parse_mode: html }, id: '42', type: article }]
     next_offset: '2'
 files: {  }
diff --git a/tests/__snapshots__/AnswersInlineQueriesTest__it_can_set_results_as_personal__1.yml b/tests/__snapshots__/AnswersInlineQueriesTest__it_can_set_results_as_personal__1.yml
index da00bb83..ab84c5e4 100644
--- a/tests/__snapshots__/AnswersInlineQueriesTest__it_can_set_results_as_personal__1.yml
+++ b/tests/__snapshots__/AnswersInlineQueriesTest__it_can_set_results_as_personal__1.yml
@@ -1,6 +1,6 @@
 url: 'https://api.telegram.org/bot3f3814e1-5836-3d77-904e-60f64b15df36/answerInlineQuery'
 payload:
     inline_query_id: '99'
-    results: [{ gif_url: 'https://gif.dev', thumb_url: 'https://gif-thumb.dev', id: '42', type: gif }, { photo_url: 'https://photo.dev', thumb_url: 'https://photo-thumb.dev', id: '42', type: photo }, { phone_number: '399999999', first_name: testFirstName, id: '42', type: contact }, { title: testTitle, input_message_content: { message: testMessage, parse_mode: html }, id: '42', type: article }, { mpeg4_url: testMpeg4Url, thumb_url: testThumbUrl, id: '42', type: mpeg4_gif }]
+    results: [{ gif_url: 'https://gif.dev', thumb_url: 'https://gif-thumb.dev', id: '42', type: gif }, { photo_url: 'https://photo.dev', thumb_url: 'https://photo-thumb.dev', id: '42', type: photo }, { phone_number: '399999999', first_name: testFirstName, id: '42', type: contact }, { title: testTitle, input_message_content: { message: testMessage, parse_mode: html }, id: '42', type: article }]
     is_personal: true
 files: {  }
diff --git a/tests/__snapshots__/ComposesMessagesTest__it_can_forward_a_message__1.yml b/tests/__snapshots__/ComposesMessagesTest__it_can_forward_a_message__1.yml
new file mode 100644
index 00000000..c33ff520
--- /dev/null
+++ b/tests/__snapshots__/ComposesMessagesTest__it_can_forward_a_message__1.yml
@@ -0,0 +1,6 @@
+url: 'https://api.telegram.org/bot3f3814e1-5836-3d77-904e-60f64b15df36/forwardMessage'
+payload:
+    chat_id: '-123456789'
+    message_id: 123456
+    from_chat_id: '-123456789'
+files: {  }