From 1bfeb17a157ec8e6dea46ff1b00284d8c1aa906e Mon Sep 17 00:00:00 2001 From: Timofey <57951811+smotim@users.noreply.github.com> Date: Mon, 28 Sep 2026 00:14:24 +0500 Subject: [PATCH] Add fields and markup added in schema 0.0.33 - Recipient::$postId: the commented post, set for comments - ContactAttachmentPayload::$hash: hash of the VCF info - ChatPatch: document the description field (up to 16000 chars, empty string removes it) - QuoteMarkup and MarkupType::Quote. createMarkupElement() threw "Unknown or unsupported markup type" on a quote block, so a message with a quote could not be parsed at all New constructor parameters are optional and last, so existing positional calls keep working; toArray() of these models now also carries the new keys. --- src/Enums/MarkupType.php | 1 + src/ModelFactory.php | 2 ++ .../Payloads/ContactAttachmentPayload.php | 2 ++ src/Models/ChatPatch.php | 1 + src/Models/Markup/QuoteMarkup.php | 24 +++++++++++++++++++ src/Models/Recipient.php | 2 ++ .../Attachments/ContactAttachmentTest.php | 12 ++++++++++ .../Payloads/ContactAttachmentPayloadTest.php | 2 +- tests/Models/Markup/MarkupTest.php | 15 ++++++++++++ tests/Models/MessageTest.php | 1 + tests/Models/RecipientTest.php | 15 +++++++++++- 11 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 src/Models/Markup/QuoteMarkup.php diff --git a/src/Enums/MarkupType.php b/src/Enums/MarkupType.php index 828a262..0f71472 100644 --- a/src/Enums/MarkupType.php +++ b/src/Enums/MarkupType.php @@ -15,4 +15,5 @@ enum MarkupType: string case UserMention = 'user_mention'; case Heading = 'heading'; case Highlighted = 'highlighted'; + case Quote = 'quote'; } diff --git a/src/ModelFactory.php b/src/ModelFactory.php index 412a4c1..9408e12 100644 --- a/src/ModelFactory.php +++ b/src/ModelFactory.php @@ -44,6 +44,7 @@ use BushlanovDev\MaxMessengerBot\Models\Markup\HeadingMarkup; use BushlanovDev\MaxMessengerBot\Models\Markup\HighlightedMarkup; use BushlanovDev\MaxMessengerBot\Models\Markup\LinkMarkup; use BushlanovDev\MaxMessengerBot\Models\Markup\MonospacedMarkup; +use BushlanovDev\MaxMessengerBot\Models\Markup\QuoteMarkup; use BushlanovDev\MaxMessengerBot\Models\Markup\StrikethroughMarkup; use BushlanovDev\MaxMessengerBot\Models\Markup\StrongMarkup; use BushlanovDev\MaxMessengerBot\Models\Markup\UnderlineMarkup; @@ -506,6 +507,7 @@ readonly class ModelFactory MarkupType::Underline => UnderlineMarkup::fromArray($data), MarkupType::Heading => HeadingMarkup::fromArray($data), MarkupType::Highlighted => HighlightedMarkup::fromArray($data), + MarkupType::Quote => QuoteMarkup::fromArray($data), MarkupType::Link => LinkMarkup::fromArray($data), MarkupType::UserMention => UserMentionMarkup::fromArray($data), default => throw new LogicException( diff --git a/src/Models/Attachments/Payloads/ContactAttachmentPayload.php b/src/Models/Attachments/Payloads/ContactAttachmentPayload.php index cd7a9a3..c7f6781 100644 --- a/src/Models/Attachments/Payloads/ContactAttachmentPayload.php +++ b/src/Models/Attachments/Payloads/ContactAttachmentPayload.php @@ -15,10 +15,12 @@ final readonly class ContactAttachmentPayload extends AbstractModel /** * @param string|null $vcfInfo User info in VCF format. * @param UserWithPhoto|null $maxInfo User info if the contact is a Max user. + * @param string|null $hash Hash of the user info in VCF format. */ public function __construct( public ?string $vcfInfo, public ?UserWithPhoto $maxInfo, + public ?string $hash = null, ) { } } diff --git a/src/Models/ChatPatch.php b/src/Models/ChatPatch.php index 638c841..0559560 100644 --- a/src/Models/ChatPatch.php +++ b/src/Models/ChatPatch.php @@ -13,6 +13,7 @@ use BushlanovDev\MaxMessengerBot\Models\Attachments\Payloads\PhotoAttachmentRequ * * @property-read PhotoAttachmentRequestPayload|null $icon * @property-read string|null $title + * @property-read string|null $description Up to 16000 characters; an empty string removes the description. * @property-read string|null $pin Message ID to be pinned. * @property-read bool|null $notify */ diff --git a/src/Models/Markup/QuoteMarkup.php b/src/Models/Markup/QuoteMarkup.php new file mode 100644 index 0000000..1a650b1 --- /dev/null +++ b/src/Models/Markup/QuoteMarkup.php @@ -0,0 +1,24 @@ +assertInstanceOf(ContactAttachment::class, $attachment); $this->assertSame('vcf', $attachment->payload->vcfInfo); + $this->assertNull($attachment->payload->hash); + } + + #[Test] + public function payloadCarriesTheVcfHash(): void + { + $attachment = ContactAttachment::fromArray([ + 'type' => 'contact', + 'payload' => ['vcf_info' => 'vcf', 'max_info' => null, 'hash' => 'abc123'], + ]); + + $this->assertSame('abc123', $attachment->payload->hash); } } diff --git a/tests/Models/Attachments/Payloads/ContactAttachmentPayloadTest.php b/tests/Models/Attachments/Payloads/ContactAttachmentPayloadTest.php index 6275f55..b7aaf6b 100644 --- a/tests/Models/Attachments/Payloads/ContactAttachmentPayloadTest.php +++ b/tests/Models/Attachments/Payloads/ContactAttachmentPayloadTest.php @@ -24,6 +24,6 @@ final class ContactAttachmentPayloadTest extends TestCase $payload = new ContactAttachmentPayload('vcf_info_string', $user); $this->assertSame('vcf_info_string', $payload->vcfInfo); $this->assertSame($user, $payload->maxInfo); - $this->assertEquals(['vcf_info' => 'vcf_info_string', 'max_info' => $user->toArray()], $payload->toArray()); + $this->assertEquals(['vcf_info' => 'vcf_info_string', 'max_info' => $user->toArray(), 'hash' => null], $payload->toArray()); } } diff --git a/tests/Models/Markup/MarkupTest.php b/tests/Models/Markup/MarkupTest.php index 1716957..6a11724 100644 --- a/tests/Models/Markup/MarkupTest.php +++ b/tests/Models/Markup/MarkupTest.php @@ -10,6 +10,7 @@ use BushlanovDev\MaxMessengerBot\Models\Markup\HeadingMarkup; use BushlanovDev\MaxMessengerBot\Models\Markup\HighlightedMarkup; use BushlanovDev\MaxMessengerBot\Models\Markup\LinkMarkup; use BushlanovDev\MaxMessengerBot\Models\Markup\MonospacedMarkup; +use BushlanovDev\MaxMessengerBot\Models\Markup\QuoteMarkup; use BushlanovDev\MaxMessengerBot\Models\Markup\StrikethroughMarkup; use BushlanovDev\MaxMessengerBot\Models\Markup\StrongMarkup; use BushlanovDev\MaxMessengerBot\Models\Markup\UnderlineMarkup; @@ -27,6 +28,7 @@ use PHPUnit\Framework\TestCase; #[CoversClass(EmphasizedMarkup::class)] #[CoversClass(HeadingMarkup::class)] #[CoversClass(HighlightedMarkup::class)] +#[CoversClass(QuoteMarkup::class)] final class MarkupTest extends TestCase { #[Test] @@ -140,4 +142,17 @@ final class MarkupTest extends TestCase $this->assertSame(4, $markup->length); $this->assertEquals($data, $markup->toArray()); } + + #[Test] + public function quoteMarkupIsCreatedCorrectly(): void + { + $data = ['type' => 'quote', 'from' => 0, 'length' => 12]; + $markup = QuoteMarkup::fromArray($data); + + $this->assertInstanceOf(QuoteMarkup::class, $markup); + $this->assertSame(MarkupType::Quote, $markup->type); + $this->assertSame(0, $markup->from); + $this->assertSame(12, $markup->length); + $this->assertEquals($data, $markup->toArray()); + } } diff --git a/tests/Models/MessageTest.php b/tests/Models/MessageTest.php index a5bf3e0..8c6c901 100644 --- a/tests/Models/MessageTest.php +++ b/tests/Models/MessageTest.php @@ -32,6 +32,7 @@ final class MessageTest extends TestCase 'chat_type' => 'dialog', 'user_id' => 123, 'chat_id' => null, + 'post_id' => null, ], 'body' => [ 'mid' => 'mid.456.xyz', diff --git a/tests/Models/RecipientTest.php b/tests/Models/RecipientTest.php index 904a0f2..9252575 100644 --- a/tests/Models/RecipientTest.php +++ b/tests/Models/RecipientTest.php @@ -29,7 +29,20 @@ final class RecipientTest extends TestCase $array = $receipt->toArray(); $this->assertIsArray($array); - unset($array['user_id']); + unset($array['user_id'], $array['post_id']); $this->assertSame($data, $array); } + + #[Test] + public function commentRecipientCarriesThePostId(): void + { + $recipient = Recipient::fromArray([ + 'chat_type' => 'channel', + 'chat_id' => -100, + 'post_id' => 'mid.post', + ]); + + $this->assertSame('mid.post', $recipient->postId); + $this->assertNull(Recipient::fromArray(['chat_type' => 'dialog', 'user_id' => 1])->postId); + } }