From 7a8a096b85e6c13e94cdd790d7a71ba9ce5fd372 Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 14 Jul 2025 19:01:42 +0300 Subject: [PATCH] SendMessage method add sender --- src/Models/Message.php | 4 ++ src/Models/Sender.php | 29 ++++++++++++++ tests/ApiTest.php | 11 ++++++ tests/ModelFactoryTest.php | 12 ++++++ tests/Models/MessageTest.php | 13 +++++++ tests/Models/RecipientTest.php | 2 +- tests/Models/ResultTest.php | 4 +- tests/Models/SenderTest.php | 70 ++++++++++++++++++++++++++++++++++ 8 files changed, 142 insertions(+), 3 deletions(-) create mode 100644 src/Models/Sender.php create mode 100644 tests/Models/SenderTest.php diff --git a/src/Models/Message.php b/src/Models/Message.php index 72096ae..08214ee 100644 --- a/src/Models/Message.php +++ b/src/Models/Message.php @@ -13,11 +13,15 @@ final readonly class Message extends AbstractModel * @param int $timestamp Unix-time when message was created. * @param MessageBody $body Body of created message. Text + attachments. * @param Recipient $recipient Message recipient. Could be user or chat. + * @param Sender|null $sender User who sent this message. Can be null if message has been posted on behalf of a channel. + * @param string|null $url Message public URL. Can be null for dialogs or non-public chats/channels. */ public function __construct( public int $timestamp, public MessageBody $body, public Recipient $recipient, + public ?Sender $sender, + public ?string $url, ) { } } diff --git a/src/Models/Sender.php b/src/Models/Sender.php new file mode 100644 index 0000000..3dc0df1 --- /dev/null +++ b/src/Models/Sender.php @@ -0,0 +1,29 @@ + time(), 'body' => ['mid' => 'mid.456.xyz', 'seq' => 101, 'text' => $text], 'recipient' => ['chat_type' => 'dialog', 'user_id' => 123, 'chat_id' => null], + 'sender' => [ + 'user_id' => 123, + 'first_name' => 'John', + 'last_name' => 'Doe', + 'username' => 'johndoe', + 'is_bot' => false, + 'last_activity_time' => 1678886400000, + ], + 'url' => 'https://max.ru/message/123', ], ]; diff --git a/tests/ModelFactoryTest.php b/tests/ModelFactoryTest.php index 38488ba..ee05724 100644 --- a/tests/ModelFactoryTest.php +++ b/tests/ModelFactoryTest.php @@ -13,6 +13,7 @@ use BushlanovDev\MaxMessengerBot\Models\Message; use BushlanovDev\MaxMessengerBot\Models\MessageBody; use BushlanovDev\MaxMessengerBot\Models\Recipient; use BushlanovDev\MaxMessengerBot\Models\Result; +use BushlanovDev\MaxMessengerBot\Models\Sender; use BushlanovDev\MaxMessengerBot\Models\Subscription; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\Test; @@ -28,6 +29,7 @@ use PHPUnit\Framework\TestCase; #[UsesClass(Message::class)] #[UsesClass(MessageBody::class)] #[UsesClass(Recipient::class)] +#[UsesClass(Sender::class)] final class ModelFactoryTest extends TestCase { private ModelFactory $factory; @@ -156,6 +158,15 @@ final class ModelFactoryTest extends TestCase 'user_id' => 123, 'chat_id' => null, ], + 'sender' =>[ + 'user_id' => 123, + 'first_name' => 'John', + 'last_name' => 'Doe', + 'username' => 'johndoe', + 'is_bot' => false, + 'last_activity_time' => 1678886400000, + ], + 'url' => 'https://max.ru/message/123', ]; $message = $this->factory->createMessage($rawData); @@ -163,5 +174,6 @@ final class ModelFactoryTest extends TestCase $this->assertInstanceOf(Message::class, $message); $this->assertInstanceOf(MessageBody::class, $message->body); $this->assertInstanceOf(Recipient::class, $message->recipient); + $this->assertInstanceOf(Sender::class, $message->sender); } } diff --git a/tests/Models/MessageTest.php b/tests/Models/MessageTest.php index 5b65f57..61bfaa6 100644 --- a/tests/Models/MessageTest.php +++ b/tests/Models/MessageTest.php @@ -7,6 +7,7 @@ namespace BushlanovDev\MaxMessengerBot\Tests\Models; use BushlanovDev\MaxMessengerBot\Models\Message; use BushlanovDev\MaxMessengerBot\Models\MessageBody; use BushlanovDev\MaxMessengerBot\Models\Recipient; +use BushlanovDev\MaxMessengerBot\Models\Sender; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\Test; use PHPUnit\Framework\Attributes\UsesClass; @@ -15,6 +16,7 @@ use PHPUnit\Framework\TestCase; #[CoversClass(Message::class)] #[UsesClass(MessageBody::class)] #[UsesClass(Recipient::class)] +#[UsesClass(Sender::class)] final class MessageTest extends TestCase { #[Test] @@ -32,6 +34,15 @@ final class MessageTest extends TestCase 'user_id' => 123, 'chat_id' => null, ], + 'sender' =>[ + 'user_id' => 123, + 'first_name' => 'John', + 'last_name' => 'Doe', + 'username' => 'johndoe', + 'is_bot' => false, + 'last_activity_time' => 1678886400000, + ], + 'url' => 'https://max.ru/message/123', ]; $message = Message::fromArray($data); @@ -40,6 +51,8 @@ final class MessageTest extends TestCase $this->assertSame($data['timestamp'], $message->timestamp); $this->assertInstanceOf(MessageBody::class, $message->body); $this->assertInstanceOf(Recipient::class, $message->recipient); + $this->assertInstanceOf(Sender::class, $message->sender); + $this->assertSame($data['url'], $message->url); $array = $message->toArray(); diff --git a/tests/Models/RecipientTest.php b/tests/Models/RecipientTest.php index ec3689f..904a0f2 100644 --- a/tests/Models/RecipientTest.php +++ b/tests/Models/RecipientTest.php @@ -10,7 +10,7 @@ use PHPUnit\Framework\Attributes\Test; use PHPUnit\Framework\TestCase; #[CoversClass(Recipient::class)] -class RecipientTest extends TestCase +final class RecipientTest extends TestCase { #[Test] public function canBeCreatedFromArray(): void diff --git a/tests/Models/ResultTest.php b/tests/Models/ResultTest.php index 9141dea..0682bc3 100644 --- a/tests/Models/ResultTest.php +++ b/tests/Models/ResultTest.php @@ -13,7 +13,7 @@ use PHPUnit\Framework\TestCase; final class ResultTest extends TestCase { #[Test] - public function canBeCreatedFromArray(): void + public function canBeCreatedFromArrayWithNullMessage(): void { $data = [ 'success' => true, @@ -32,7 +32,7 @@ final class ResultTest extends TestCase } #[Test] - public function canBeCreatedFromArrayWithNullMessage(): void + public function canBeCreatedFromArray(): void { $data = [ 'success' => false, diff --git a/tests/Models/SenderTest.php b/tests/Models/SenderTest.php new file mode 100644 index 0000000..352aae4 --- /dev/null +++ b/tests/Models/SenderTest.php @@ -0,0 +1,70 @@ + 123, + 'first_name' => 'John', + 'last_name' => 'Doe', + 'username' => 'johndoe', + 'is_bot' => false, + 'last_activity_time' => 1678886400000, + ]; + + $sender = Sender::fromArray($data); + + $this->assertInstanceOf(Sender::class, $sender); + $this->assertSame($data['user_id'], $sender->userId); + $this->assertSame($data['first_name'], $sender->firstName); + $this->assertSame($data['last_name'], $sender->lastName); + $this->assertSame($data['username'], $sender->username); + $this->assertSame($data['is_bot'], $sender->isBot); + $this->assertSame($data['last_activity_time'], $sender->lastActivityTime); + + $array = $sender->toArray(); + + $this->assertIsArray($array); + $this->assertSame($data, $array); + } + + #[Test] + public function canBeCreatedFromArrayWithOptionalDataNull(): void + { + $data = [ + 'user_id' => 123, + 'first_name' => 'John', + 'is_bot' => false, + 'last_activity_time' => 1678886400000, + ]; + + $sender = Sender::fromArray($data); + + $this->assertInstanceOf(Sender::class, $sender); + $this->assertSame($data['user_id'], $sender->userId); + $this->assertSame($data['first_name'], $sender->firstName); + $this->assertNull($sender->lastName); + $this->assertNull($sender->username); + $this->assertSame($data['is_bot'], $sender->isBot); + $this->assertSame($data['last_activity_time'], $sender->lastActivityTime); + + $array = $sender->toArray(); + + $this->assertIsArray($array); + unset($array['last_name']); + unset($array['username']); + $this->assertSame($data, $array); + } +}