fix #1 TypeError Api::sendUserMessage после отправки сообщения

Added PhotoAttachmentRequestPayloadTest
This commit is contained in:
Alex
2025-08-04 19:43:37 +03:00
parent 728536f064
commit 32e393e044
4 changed files with 116 additions and 8 deletions
+2 -2
View File
@@ -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,
@@ -0,0 +1,108 @@
<?php
declare(strict_types=1);
namespace BushlanovDev\MaxMessengerBot\Tests\Models\Attachments\Payloads;
use BushlanovDev\MaxMessengerBot\Attributes\ArrayOf;
use BushlanovDev\MaxMessengerBot\Models\Attachments\Payloads\PhotoAttachmentRequestPayload;
use BushlanovDev\MaxMessengerBot\Models\Attachments\Payloads\PhotoToken;
use InvalidArgumentException;
use PHPUnit\Framework\Attributes\CoversClass;
use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\Attributes\Test;
use PHPUnit\Framework\Attributes\UsesClass;
use PHPUnit\Framework\TestCase;
#[CoversClass(PhotoAttachmentRequestPayload::class)]
#[UsesClass(PhotoToken::class)]
#[UsesClass(ArrayOf::class)]
final class PhotoAttachmentRequestPayloadTest extends TestCase
{
#[Test]
public function canBeCreatedWithUrlOnly(): void
{
$payload = new PhotoAttachmentRequestPayload(url: 'https://example.com/photo.jpg');
$this->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<string, array{0: string|null, 1: string|null, 2: array|null}>
*/
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);
}
}
+5 -5
View File
@@ -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',
+1 -1
View File
@@ -79,8 +79,8 @@ final class WebhookHandlerTest extends TestCase
);
$message = new Message(
$data['message']['timestamp'],
$messageBody,
$recipient,
$messageBody,
null,
null,
null,