diff --git a/src/Models/Message.php b/src/Models/Message.php index 28eac3e..54a8a5c 100644 --- a/src/Models/Message.php +++ b/src/Models/Message.php @@ -11,8 +11,8 @@ 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 MessageBody|null $body Body of created message. Text + attachments. * @param User|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. * @param LinkedMessage|null $link Forwarded or replied message. @@ -20,8 +20,8 @@ final readonly class Message extends AbstractModel */ public function __construct( public int $timestamp, - public MessageBody $body, public Recipient $recipient, + public ?MessageBody $body, public ?User $sender, public ?string $url, public ?LinkedMessage $link, diff --git a/tests/Models/Attachments/Payloads/PhotoAttachmentRequestPayloadTest.php b/tests/Models/Attachments/Payloads/PhotoAttachmentRequestPayloadTest.php new file mode 100644 index 0000000..fcb802b --- /dev/null +++ b/tests/Models/Attachments/Payloads/PhotoAttachmentRequestPayloadTest.php @@ -0,0 +1,108 @@ +assertSame('https://example.com/photo.jpg', $payload->url); + $this->assertNull($payload->token); + $this->assertNull($payload->photos); + + $expectedArray = [ + 'url' => 'https://example.com/photo.jpg', + 'token' => null, + 'photos' => null, + ]; + $this->assertEquals($expectedArray, $payload->toArray()); + } + + #[Test] + public function canBeCreatedWithTokenOnly(): void + { + $payload = new PhotoAttachmentRequestPayload(token: 'uploaded_token_abc'); + + $this->assertSame('uploaded_token_abc', $payload->token); + $this->assertNull($payload->url); + $this->assertNull($payload->photos); + + $expectedArray = [ + 'token' => 'uploaded_token_abc', + 'url' => null, + 'photos' => null, + ]; + $this->assertEquals($expectedArray, $payload->toArray()); + } + + #[Test] + public function canBeCreatedWithPhotosOnly(): void + { + $photos = [ + new PhotoToken('token_1'), + new PhotoToken('token_2'), + ]; + $payload = new PhotoAttachmentRequestPayload(photos: $photos); + + $this->assertSame($photos, $payload->photos); + $this->assertNull($payload->url); + $this->assertNull($payload->token); + + $expectedArray = [ + 'photos' => [ + ['token' => 'token_1'], + ['token' => 'token_2'], + ], + 'url' => null, + 'token' => null, + ]; + $this->assertEquals($expectedArray, $payload->toArray()); + } + + /** + * Data provider for invalid constructor arguments. + * + * @return array + */ + public static function invalidPayloadProvider(): array + { + return [ + 'all null (no arguments)' => [null, null, null], + 'url and token provided' => ['https://a.com', 'token123', null], + 'url and photos provided' => ['https://a.com', null, [new PhotoToken('t')]], + 'token and photos provided' => [null, 'token123', [new PhotoToken('t')]], + 'all three arguments provided' => ['https://a.com', 'token123', [new PhotoToken('t')]], + ]; + } + + #[Test] + #[DataProvider('invalidPayloadProvider')] + public function constructorThrowsExceptionForInvalidArguments( + ?string $url, + ?string $token, + ?array $photos + ): void { + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionMessage('Provide exactly one of "url", "token", or "photos" for PhotoAttachmentRequestPayload.'); + + new PhotoAttachmentRequestPayload($url, $token, $photos); + } +} diff --git a/tests/Models/MessageTest.php b/tests/Models/MessageTest.php index 2c60154..2227e96 100644 --- a/tests/Models/MessageTest.php +++ b/tests/Models/MessageTest.php @@ -28,6 +28,11 @@ final class MessageTest extends TestCase { $data = [ 'timestamp' => time(), + 'recipient' => [ + 'chat_type' => 'dialog', + 'user_id' => 123, + 'chat_id' => null, + ], 'body' => [ 'mid' => 'mid.456.xyz', 'seq' => 101, @@ -35,11 +40,6 @@ final class MessageTest extends TestCase 'attachments' => null, 'markup' => null, ], - 'recipient' => [ - 'chat_type' => 'dialog', - 'user_id' => 123, - 'chat_id' => null, - ], 'sender' =>[ 'user_id' => 123, 'first_name' => 'John', diff --git a/tests/WebhookHandlerTest.php b/tests/WebhookHandlerTest.php index cc601ee..01ec307 100644 --- a/tests/WebhookHandlerTest.php +++ b/tests/WebhookHandlerTest.php @@ -79,8 +79,8 @@ final class WebhookHandlerTest extends TestCase ); $message = new Message( $data['message']['timestamp'], - $messageBody, $recipient, + $messageBody, null, null, null,