mirror of
https://github.com/BushlanovDev/max-bot-api-client-php.git
synced 2026-10-08 04:47:44 +00:00
Added AudioAttachmentRequest & ContactAttachmentRequest & FileAttachmentRequest & LocationAttachmentRequest & ShareAttachmentRequest & StickerAttachmentRequest & VideoAttachmentRequest
This commit is contained in:
@@ -10,6 +10,7 @@ use BushlanovDev\MaxMessengerBot\Models\AbstractModel;
|
||||
use PHPUnit\Framework\Attributes\CoversClass;
|
||||
use PHPUnit\Framework\Attributes\Test;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
use stdClass;
|
||||
|
||||
#[CoversClass(AbstractModel::class)]
|
||||
#[CoversClass(ArrayOf::class)]
|
||||
@@ -76,6 +77,139 @@ final class AbstractModelMappingTest extends TestCase
|
||||
|
||||
$this->assertNull($result->childModels);
|
||||
}
|
||||
|
||||
#[Test]
|
||||
public function itCorrectlyCastsInteger(): void
|
||||
{
|
||||
$result = DummyModelForMapping::fromArray(['untyped_int' => 123]);
|
||||
|
||||
$this->assertIsInt($result->untypedInt);
|
||||
$this->assertSame(123, $result->untypedInt);
|
||||
}
|
||||
|
||||
#[Test]
|
||||
public function itCorrectlyCastsFloat(): void
|
||||
{
|
||||
$result = DummyModelForMapping::fromArray(['untyped_float' => 1.23]);
|
||||
|
||||
$this->assertIsFloat($result->untypedFloat);
|
||||
$this->assertSame(1.23, $result->untypedFloat);
|
||||
}
|
||||
|
||||
#[Test]
|
||||
public function itCorrectlyCastsBoolean(): void
|
||||
{
|
||||
$result = DummyModelForMapping::fromArray(['untyped_bool' => true]);
|
||||
|
||||
$this->assertIsBool($result->untypedBool);
|
||||
$this->assertTrue($result->untypedBool);
|
||||
}
|
||||
|
||||
#[Test]
|
||||
public function itReturnsValueAsIsForUnmanagedObjectType(): void
|
||||
{
|
||||
$externalObject = new stdClass();
|
||||
$externalObject->data = 'some value';
|
||||
|
||||
$rawData = [
|
||||
'name' => 'Test With External Object',
|
||||
'external_object' => $externalObject,
|
||||
];
|
||||
|
||||
$result = ModelWithExternalObject::fromArray($rawData);
|
||||
|
||||
$this->assertInstanceOf(ModelWithExternalObject::class, $result);
|
||||
$this->assertSame($externalObject, $result->externalObject);
|
||||
$this->assertSame('some value', $result->externalObject->data);
|
||||
}
|
||||
|
||||
#[Test]
|
||||
public function castArrayHandlesNonArrayValueForArrayProperty(): void
|
||||
{
|
||||
$rawData = [
|
||||
'name' => 'Test with scalar instead of array',
|
||||
'tags' => 'single_tag_value',
|
||||
];
|
||||
|
||||
$result = DummyModelForArrayCast::fromArray($rawData);
|
||||
|
||||
$this->assertInstanceOf(DummyModelForArrayCast::class, $result);
|
||||
$this->assertIsArray($result->tags);
|
||||
$this->assertSame(['single_tag_value'], $result->tags);
|
||||
}
|
||||
|
||||
#[Test]
|
||||
public function castArrayReturnsArrayAsIsForUnmanagedObjectTypesInArrayOf(): void
|
||||
{
|
||||
$items = [
|
||||
(object)['id' => 1, 'name' => 'Item A'],
|
||||
(object)['id' => 2, 'name' => 'Item B'],
|
||||
];
|
||||
$rawData = [
|
||||
'name' => 'Test with unmanaged objects',
|
||||
'items' => $items,
|
||||
];
|
||||
|
||||
$result = ModelWithUnmanagedArray::fromArray($rawData);
|
||||
|
||||
$this->assertInstanceOf(ModelWithUnmanagedArray::class, $result);
|
||||
$this->assertIsArray($result->items);
|
||||
$this->assertSame($items, $result->items);
|
||||
$this->assertSame('Item A', $result->items[0]->name);
|
||||
}
|
||||
|
||||
#[Test]
|
||||
public function toArraySkipsUninitializedProperties(): void
|
||||
{
|
||||
$reflection = new \ReflectionClass(DummyModelForUninitializedProperty::class);
|
||||
$instance = $reflection->newInstanceWithoutConstructor();
|
||||
|
||||
$initializedProp = $reflection->getProperty('initializedProp');
|
||||
$initializedProp->setValue($instance, 'I have a value');
|
||||
|
||||
$resultArray = $instance->toArray();
|
||||
|
||||
$expectedArray = [
|
||||
'initialized_prop' => 'I have a value',
|
||||
];
|
||||
|
||||
$this->assertEquals($expectedArray, $resultArray);
|
||||
$this->assertArrayNotHasKey('uninitialized_prop', $resultArray);
|
||||
}
|
||||
}
|
||||
|
||||
final readonly class DummyModelForUninitializedProperty extends AbstractModel
|
||||
{
|
||||
public string $initializedProp;
|
||||
public int $uninitializedProp;
|
||||
}
|
||||
|
||||
final readonly class DummyModelForArrayCast extends AbstractModel
|
||||
{
|
||||
public function __construct(
|
||||
public ?string $name,
|
||||
public ?array $tags,
|
||||
) {
|
||||
}
|
||||
}
|
||||
|
||||
final readonly class ModelWithUnmanagedArray extends AbstractModel
|
||||
{
|
||||
public function __construct(
|
||||
public ?string $name,
|
||||
#[ArrayOf(stdClass::class)]
|
||||
public ?array $items,
|
||||
) {
|
||||
}
|
||||
}
|
||||
|
||||
final readonly class ModelWithExternalObject extends AbstractModel
|
||||
{
|
||||
public function __construct(
|
||||
public ?string $name,
|
||||
public ?stdClass $externalObject,
|
||||
) {
|
||||
}
|
||||
}
|
||||
|
||||
final readonly class DummyModelForMapping extends AbstractModel
|
||||
@@ -87,8 +221,10 @@ final readonly class DummyModelForMapping extends AbstractModel
|
||||
#[ArrayOf(DummyChildModel::class)]
|
||||
public ?array $childModels,
|
||||
public ?array $untypedArray,
|
||||
)
|
||||
{
|
||||
public ?int $untypedInt,
|
||||
public ?float $untypedFloat,
|
||||
public ?bool $untypedBool,
|
||||
) {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,83 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace BushlanovDev\MaxMessengerBot\Tests\Models\Attachments\Payloads;
|
||||
|
||||
use BushlanovDev\MaxMessengerBot\Models\Attachments\Payloads\ContactAttachmentRequestPayload;
|
||||
use PHPUnit\Framework\Attributes\CoversClass;
|
||||
use PHPUnit\Framework\Attributes\Test;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
#[CoversClass(ContactAttachmentRequestPayload::class)]
|
||||
final class ContactAttachmentRequestPayloadTest extends TestCase
|
||||
{
|
||||
#[Test]
|
||||
public function itConstructsWithAllPropertiesAndSerializesCorrectly(): void
|
||||
{
|
||||
$name = 'John Doe';
|
||||
$contactId = 123456;
|
||||
$vcfInfo = 'BEGIN:VCARD...END:VCARD';
|
||||
$vcfPhone = 'TEL:+79991234567';
|
||||
|
||||
$payload = new ContactAttachmentRequestPayload($name, $contactId, $vcfInfo, $vcfPhone);
|
||||
|
||||
$this->assertInstanceOf(ContactAttachmentRequestPayload::class, $payload);
|
||||
$this->assertSame($name, $payload->name);
|
||||
$this->assertSame($contactId, $payload->contactId);
|
||||
$this->assertSame($vcfInfo, $payload->vcfInfo);
|
||||
$this->assertSame($vcfPhone, $payload->vcfPhone);
|
||||
|
||||
$expectedArray = [
|
||||
'name' => $name,
|
||||
'contact_id' => $contactId,
|
||||
'vcf_info' => $vcfInfo,
|
||||
'vcf_phone' => $vcfPhone,
|
||||
];
|
||||
$this->assertEquals($expectedArray, $payload->toArray());
|
||||
}
|
||||
|
||||
#[Test]
|
||||
public function itConstructsWithNullablePropertiesAndSerializesCorrectly(): void
|
||||
{
|
||||
$name = 'Jane Doe';
|
||||
$vcfPhone = 'TEL:+79876543210';
|
||||
|
||||
$payload = new ContactAttachmentRequestPayload(
|
||||
name: $name,
|
||||
vcfPhone: $vcfPhone,
|
||||
);
|
||||
|
||||
$this->assertSame($name, $payload->name);
|
||||
$this->assertNull($payload->contactId);
|
||||
$this->assertNull($payload->vcfInfo);
|
||||
$this->assertSame($vcfPhone, $payload->vcfPhone);
|
||||
|
||||
$expectedArray = [
|
||||
'name' => $name,
|
||||
'contact_id' => null,
|
||||
'vcf_info' => null,
|
||||
'vcf_phone' => $vcfPhone,
|
||||
];
|
||||
$this->assertEquals($expectedArray, $payload->toArray());
|
||||
}
|
||||
|
||||
#[Test]
|
||||
public function itConstructsWithAllNullsAndSerializesCorrectly(): void
|
||||
{
|
||||
$payload = new ContactAttachmentRequestPayload();
|
||||
|
||||
$this->assertNull($payload->name);
|
||||
$this->assertNull($payload->contactId);
|
||||
$this->assertNull($payload->vcfInfo);
|
||||
$this->assertNull($payload->vcfPhone);
|
||||
|
||||
$expectedArray = [
|
||||
'name' => null,
|
||||
'contact_id' => null,
|
||||
'vcf_info' => null,
|
||||
'vcf_phone' => null,
|
||||
];
|
||||
$this->assertEquals($expectedArray, $payload->toArray());
|
||||
}
|
||||
}
|
||||
@@ -8,13 +8,13 @@ use BushlanovDev\MaxMessengerBot\Enums\ButtonType;
|
||||
use BushlanovDev\MaxMessengerBot\Enums\Intent;
|
||||
use BushlanovDev\MaxMessengerBot\Models\Attachments\Buttons\CallbackButton;
|
||||
use BushlanovDev\MaxMessengerBot\Models\Attachments\Buttons\LinkButton;
|
||||
use BushlanovDev\MaxMessengerBot\Models\Attachments\Payloads\InlineKeyboardPayload;
|
||||
use BushlanovDev\MaxMessengerBot\Models\Attachments\Payloads\InlineKeyboardAttachmentRequestPayload;
|
||||
use PHPUnit\Framework\Attributes\CoversClass;
|
||||
use PHPUnit\Framework\Attributes\Test;
|
||||
use PHPUnit\Framework\Attributes\UsesClass;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
#[CoversClass(InlineKeyboardPayload::class)]
|
||||
#[CoversClass(InlineKeyboardAttachmentRequestPayload::class)]
|
||||
#[UsesClass(CallbackButton::class)]
|
||||
#[UsesClass(LinkButton::class)]
|
||||
final class InlineKeyboardPayloadTest extends TestCase
|
||||
@@ -25,9 +25,9 @@ final class InlineKeyboardPayloadTest extends TestCase
|
||||
$buttons = [
|
||||
[new CallbackButton('Test', 'payload')],
|
||||
];
|
||||
$payload = new InlineKeyboardPayload($buttons);
|
||||
$payload = new InlineKeyboardAttachmentRequestPayload($buttons);
|
||||
|
||||
$this->assertInstanceOf(InlineKeyboardPayload::class, $payload);
|
||||
$this->assertInstanceOf(InlineKeyboardAttachmentRequestPayload::class, $payload);
|
||||
$this->assertSame($buttons, $payload->buttons);
|
||||
}
|
||||
|
||||
@@ -41,7 +41,7 @@ final class InlineKeyboardPayloadTest extends TestCase
|
||||
new LinkButton('Help', 'https://example.com/help'),
|
||||
],
|
||||
];
|
||||
$payload = new InlineKeyboardPayload($buttons);
|
||||
$payload = new InlineKeyboardAttachmentRequestPayload($buttons);
|
||||
|
||||
$resultArray = $payload->toArray();
|
||||
|
||||
@@ -77,7 +77,7 @@ final class InlineKeyboardPayloadTest extends TestCase
|
||||
#[Test]
|
||||
public function toArrayHandlesEmptyButtonsArray(): void
|
||||
{
|
||||
$payload = new InlineKeyboardPayload([]);
|
||||
$payload = new InlineKeyboardAttachmentRequestPayload([]);
|
||||
$resultArray = $payload->toArray();
|
||||
|
||||
$expectedArray = [
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace BushlanovDev\MaxMessengerBot\Tests\Models\Attachments\Payloads;
|
||||
|
||||
use BushlanovDev\MaxMessengerBot\Models\Attachments\Payloads\LocationAttachmentRequestPayload;
|
||||
use PHPUnit\Framework\Attributes\CoversClass;
|
||||
use PHPUnit\Framework\Attributes\Test;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
#[CoversClass(LocationAttachmentRequestPayload::class)]
|
||||
final class LocationAttachmentRequestPayloadTest extends TestCase
|
||||
{
|
||||
#[Test]
|
||||
public function itConstructsAndSerializesCorrectly(): void
|
||||
{
|
||||
$latitude = 55.7558;
|
||||
$longitude = 37.6173;
|
||||
|
||||
$payload = new LocationAttachmentRequestPayload($latitude, $longitude);
|
||||
|
||||
$this->assertInstanceOf(LocationAttachmentRequestPayload::class, $payload);
|
||||
$this->assertSame($latitude, $payload->latitude);
|
||||
$this->assertSame($longitude, $payload->longitude);
|
||||
|
||||
$expectedArray = [
|
||||
'latitude' => $latitude,
|
||||
'longitude' => $longitude,
|
||||
];
|
||||
$this->assertEquals($expectedArray, $payload->toArray());
|
||||
}
|
||||
|
||||
#[Test]
|
||||
public function itHandlesNegativeCoordinates(): void
|
||||
{
|
||||
$latitude = -34.6037;
|
||||
$longitude = -58.3816;
|
||||
|
||||
$payload = new LocationAttachmentRequestPayload($latitude, $longitude);
|
||||
|
||||
$this->assertSame($latitude, $payload->latitude);
|
||||
$this->assertSame($longitude, $payload->longitude);
|
||||
}
|
||||
}
|
||||
@@ -5,7 +5,7 @@ declare(strict_types=1);
|
||||
namespace BushlanovDev\MaxMessengerBot\Tests\Models\Attachments\Payloads;
|
||||
|
||||
use BushlanovDev\MaxMessengerBot\Attributes\ArrayOf;
|
||||
use BushlanovDev\MaxMessengerBot\Models\Attachments\Payloads\PhotoAttachmentPayload;
|
||||
use BushlanovDev\MaxMessengerBot\Models\Attachments\Payloads\PhotoAttachmentRequestPayload;
|
||||
use BushlanovDev\MaxMessengerBot\Models\Attachments\Payloads\PhotoToken;
|
||||
use InvalidArgumentException;
|
||||
use PHPUnit\Framework\Attributes\CoversClass;
|
||||
@@ -14,7 +14,7 @@ use PHPUnit\Framework\Attributes\Test;
|
||||
use PHPUnit\Framework\Attributes\UsesClass;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
#[CoversClass(PhotoAttachmentPayload::class)]
|
||||
#[CoversClass(PhotoAttachmentRequestPayload::class)]
|
||||
#[UsesClass(PhotoToken::class)]
|
||||
#[UsesClass(ArrayOf::class)]
|
||||
final class PhotoAttachmentPayloadTest extends TestCase
|
||||
@@ -22,7 +22,7 @@ final class PhotoAttachmentPayloadTest extends TestCase
|
||||
#[Test]
|
||||
public function canBeCreatedWithUrlOnly(): void
|
||||
{
|
||||
$payload = new PhotoAttachmentPayload(url: 'https://example.com/photo.jpg');
|
||||
$payload = new PhotoAttachmentRequestPayload(url: 'https://example.com/photo.jpg');
|
||||
|
||||
$this->assertSame('https://example.com/photo.jpg', $payload->url);
|
||||
$this->assertNull($payload->token);
|
||||
@@ -39,7 +39,7 @@ final class PhotoAttachmentPayloadTest extends TestCase
|
||||
#[Test]
|
||||
public function canBeCreatedWithTokenOnly(): void
|
||||
{
|
||||
$payload = new PhotoAttachmentPayload(token: 'uploaded_token_abc');
|
||||
$payload = new PhotoAttachmentRequestPayload(token: 'uploaded_token_abc');
|
||||
|
||||
$this->assertSame('uploaded_token_abc', $payload->token);
|
||||
$this->assertNull($payload->url);
|
||||
@@ -60,7 +60,7 @@ final class PhotoAttachmentPayloadTest extends TestCase
|
||||
new PhotoToken('token_1'),
|
||||
new PhotoToken('token_2'),
|
||||
];
|
||||
$payload = new PhotoAttachmentPayload(photos: $photos);
|
||||
$payload = new PhotoAttachmentRequestPayload(photos: $photos);
|
||||
|
||||
$this->assertSame($photos, $payload->photos);
|
||||
$this->assertNull($payload->url);
|
||||
@@ -101,8 +101,8 @@ final class PhotoAttachmentPayloadTest extends TestCase
|
||||
?array $photos
|
||||
): void {
|
||||
$this->expectException(InvalidArgumentException::class);
|
||||
$this->expectExceptionMessage('Provide exactly one of "url", "token", or "photos" for PhotoAttachmentPayload.');
|
||||
$this->expectExceptionMessage('Provide exactly one of "url", "token", or "photos" for PhotoAttachmentRequestPayload.');
|
||||
|
||||
new PhotoAttachmentPayload($url, $token, $photos);
|
||||
new PhotoAttachmentRequestPayload($url, $token, $photos);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,61 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace BushlanovDev\MaxMessengerBot\Tests\Models\Attachments\Payloads;
|
||||
|
||||
use BushlanovDev\MaxMessengerBot\Models\Attachments\Payloads\ShareAttachmentRequestPayload;
|
||||
use InvalidArgumentException;
|
||||
use PHPUnit\Framework\Attributes\CoversClass;
|
||||
use PHPUnit\Framework\Attributes\DataProvider;
|
||||
use PHPUnit\Framework\Attributes\Test;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
#[CoversClass(ShareAttachmentRequestPayload::class)]
|
||||
final class ShareAttachmentRequestPayloadTest extends TestCase
|
||||
{
|
||||
#[Test]
|
||||
public function canBeCreatedWithUrlOnly(): void
|
||||
{
|
||||
$payload = new ShareAttachmentRequestPayload(url: 'https://example.com');
|
||||
|
||||
$this->assertSame('https://example.com', $payload->url);
|
||||
$this->assertNull($payload->token);
|
||||
|
||||
$expectedArray = ['url' => 'https://example.com', 'token' => null];
|
||||
$this->assertEquals($expectedArray, $payload->toArray());
|
||||
}
|
||||
|
||||
#[Test]
|
||||
public function canBeCreatedWithTokenOnly(): void
|
||||
{
|
||||
$payload = new ShareAttachmentRequestPayload(token: 'share_token_abc');
|
||||
|
||||
$this->assertSame('share_token_abc', $payload->token);
|
||||
$this->assertNull($payload->url);
|
||||
|
||||
$expectedArray = ['url' => null, 'token' => 'share_token_abc'];
|
||||
$this->assertEquals($expectedArray, $payload->toArray());
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array<string, array{0: ?string, 1: ?string}>
|
||||
*/
|
||||
public static function invalidPayloadProvider(): array
|
||||
{
|
||||
return [
|
||||
'both null' => [null, null],
|
||||
'both set' => ['https://a.com', 'token123'],
|
||||
];
|
||||
}
|
||||
|
||||
#[Test]
|
||||
#[DataProvider('invalidPayloadProvider')]
|
||||
public function constructorThrowsExceptionForInvalidArguments(?string $url, ?string $token): void
|
||||
{
|
||||
$this->expectException(InvalidArgumentException::class);
|
||||
$this->expectExceptionMessage('Provide exactly one of "url" or "token" for ShareAttachmentRequestPayload.');
|
||||
|
||||
new ShareAttachmentRequestPayload($url, $token);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace BushlanovDev\MaxMessengerBot\Tests\Models\Attachments\Payloads;
|
||||
|
||||
use BushlanovDev\MaxMessengerBot\Models\Attachments\Payloads\StickerAttachmentRequestPayload;
|
||||
use PHPUnit\Framework\Attributes\CoversClass;
|
||||
use PHPUnit\Framework\Attributes\Test;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
#[CoversClass(StickerAttachmentRequestPayload::class)]
|
||||
final class StickerAttachmentRequestPayloadTest extends TestCase
|
||||
{
|
||||
#[Test]
|
||||
public function itCorrectlyHandlesCreationSerializationAndState(): void
|
||||
{
|
||||
$codeValue = 'some_code_string_123';
|
||||
$rawData = ['code' => $codeValue];
|
||||
|
||||
$stickerPayload = StickerAttachmentRequestPayload::fromArray($rawData);
|
||||
|
||||
$this->assertInstanceOf(StickerAttachmentRequestPayload::class, $stickerPayload);
|
||||
$this->assertSame($codeValue, $stickerPayload->code);
|
||||
|
||||
$serializedData = $stickerPayload->toArray();
|
||||
$this->assertEquals($rawData, $serializedData);
|
||||
|
||||
$directInstance = new StickerAttachmentRequestPayload($codeValue);
|
||||
$this->assertSame($codeValue, $directInstance->code);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace BushlanovDev\MaxMessengerBot\Tests\Models\Attachments\Payloads;
|
||||
|
||||
use BushlanovDev\MaxMessengerBot\Models\Attachments\Payloads\UploadedInfoAttachmentRequestPayload;
|
||||
use PHPUnit\Framework\Attributes\CoversClass;
|
||||
use PHPUnit\Framework\Attributes\Test;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
#[CoversClass(UploadedInfoAttachmentRequestPayload::class)]
|
||||
final class UploadedInfoPayloadTest extends TestCase
|
||||
{
|
||||
#[Test]
|
||||
public function itCorrectlyHandlesCreationSerializationAndState(): void
|
||||
{
|
||||
$tokenValue = 'some_unique_token_string_123';
|
||||
$rawData = ['token' => $tokenValue];
|
||||
|
||||
$uploadedInfoPayload = UploadedInfoAttachmentRequestPayload::fromArray($rawData);
|
||||
|
||||
$this->assertInstanceOf(UploadedInfoAttachmentRequestPayload::class, $uploadedInfoPayload);
|
||||
$this->assertSame($tokenValue, $uploadedInfoPayload->token);
|
||||
|
||||
$serializedData = $uploadedInfoPayload->toArray();
|
||||
$this->assertEquals($rawData, $serializedData);
|
||||
|
||||
$directInstance = new UploadedInfoAttachmentRequestPayload($tokenValue);
|
||||
$this->assertSame($tokenValue, $directInstance->token);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace BushlanovDev\MaxMessengerBot\Tests\Models\Attachments\Requests;
|
||||
|
||||
use BushlanovDev\MaxMessengerBot\Enums\AttachmentType;
|
||||
use BushlanovDev\MaxMessengerBot\Models\Attachments\Payloads\UploadedInfoAttachmentRequestPayload;
|
||||
use BushlanovDev\MaxMessengerBot\Models\Attachments\Requests\AudioAttachmentRequest;
|
||||
use PHPUnit\Framework\Attributes\CoversClass;
|
||||
use PHPUnit\Framework\Attributes\Test;
|
||||
use PHPUnit\Framework\Attributes\UsesClass;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
#[CoversClass(AudioAttachmentRequest::class)]
|
||||
#[UsesClass(UploadedInfoAttachmentRequestPayload::class)]
|
||||
final class AudioAttachmentRequestTest extends TestCase
|
||||
{
|
||||
#[Test]
|
||||
public function itCreatesCorrectRequestAndSerializesToArray(): void
|
||||
{
|
||||
$token = 'some_unique_audio_upload_token_98765';
|
||||
$request = new AudioAttachmentRequest($token);
|
||||
|
||||
$this->assertInstanceOf(AudioAttachmentRequest::class, $request);
|
||||
$this->assertSame(AttachmentType::Audio, $request->type);
|
||||
$this->assertInstanceOf(UploadedInfoAttachmentRequestPayload::class, $request->payload);
|
||||
$this->assertSame($token, $request->payload->token);
|
||||
|
||||
$expectedArray = [
|
||||
'type' => 'audio',
|
||||
'payload' => [
|
||||
'token' => $token,
|
||||
],
|
||||
];
|
||||
|
||||
$this->assertEquals($expectedArray, $request->toArray());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace BushlanovDev\MaxMessengerBot\Tests\Models\Attachments\Requests;
|
||||
|
||||
use BushlanovDev\MaxMessengerBot\Enums\AttachmentType;
|
||||
use BushlanovDev\MaxMessengerBot\Models\Attachments\Payloads\ContactAttachmentRequestPayload;
|
||||
use BushlanovDev\MaxMessengerBot\Models\Attachments\Requests\ContactAttachmentRequest;
|
||||
use PHPUnit\Framework\Attributes\CoversClass;
|
||||
use PHPUnit\Framework\Attributes\Test;
|
||||
use PHPUnit\Framework\Attributes\UsesClass;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
#[CoversClass(ContactAttachmentRequest::class)]
|
||||
#[UsesClass(ContactAttachmentRequestPayload::class)]
|
||||
final class ContactAttachmentRequestTest extends TestCase
|
||||
{
|
||||
#[Test]
|
||||
public function itCreatesRequestWithAllFieldsAndSerializes(): void
|
||||
{
|
||||
$request = new ContactAttachmentRequest(
|
||||
name: 'John Doe',
|
||||
contactId: 12345,
|
||||
vcfInfo: 'BEGIN:VCARD...',
|
||||
vcfPhone: 'TEL:+1234567890',
|
||||
);
|
||||
|
||||
$this->assertInstanceOf(ContactAttachmentRequest::class, $request);
|
||||
$this->assertSame(AttachmentType::Contact, $request->type);
|
||||
$this->assertInstanceOf(ContactAttachmentRequestPayload::class, $request->payload);
|
||||
$this->assertSame('John Doe', $request->payload->name);
|
||||
$this->assertSame(12345, $request->payload->contactId);
|
||||
|
||||
$expectedArray = [
|
||||
'type' => 'contact',
|
||||
'payload' => [
|
||||
'name' => 'John Doe',
|
||||
'contact_id' => 12345,
|
||||
'vcf_info' => 'BEGIN:VCARD...',
|
||||
'vcf_phone' => 'TEL:+1234567890',
|
||||
],
|
||||
];
|
||||
$this->assertEquals($expectedArray, $request->toArray());
|
||||
}
|
||||
|
||||
#[Test]
|
||||
public function itCreatesRequestWithOnlySomeFields(): void
|
||||
{
|
||||
$request = new ContactAttachmentRequest(name: 'Jane Doe', vcfPhone: 'TEL:+9876543210');
|
||||
|
||||
$expectedArray = [
|
||||
'type' => 'contact',
|
||||
'payload' => [
|
||||
'name' => 'Jane Doe',
|
||||
'contact_id' => null,
|
||||
'vcf_info' => null,
|
||||
'vcf_phone' => 'TEL:+9876543210',
|
||||
],
|
||||
];
|
||||
$this->assertEquals($expectedArray, $request->toArray());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace BushlanovDev\MaxMessengerBot\Tests\Models\Attachments\Requests;
|
||||
|
||||
use BushlanovDev\MaxMessengerBot\Enums\AttachmentType;
|
||||
use BushlanovDev\MaxMessengerBot\Models\Attachments\Payloads\UploadedInfoAttachmentRequestPayload;
|
||||
use BushlanovDev\MaxMessengerBot\Models\Attachments\Requests\FileAttachmentRequest;
|
||||
use PHPUnit\Framework\Attributes\CoversClass;
|
||||
use PHPUnit\Framework\Attributes\Test;
|
||||
use PHPUnit\Framework\Attributes\UsesClass;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
#[CoversClass(FileAttachmentRequest::class)]
|
||||
#[UsesClass(UploadedInfoAttachmentRequestPayload::class)]
|
||||
final class FileAttachmentRequestTest extends TestCase
|
||||
{
|
||||
#[Test]
|
||||
public function itCreatesCorrectRequestAndSerializesToArray(): void
|
||||
{
|
||||
$token = 'some_generic_file_upload_token_112233';
|
||||
$request = new FileAttachmentRequest($token);
|
||||
|
||||
$this->assertInstanceOf(FileAttachmentRequest::class, $request);
|
||||
$this->assertSame(AttachmentType::File, $request->type);
|
||||
$this->assertInstanceOf(UploadedInfoAttachmentRequestPayload::class, $request->payload);
|
||||
$this->assertSame($token, $request->payload->token);
|
||||
|
||||
$expectedArray = [
|
||||
'type' => 'file',
|
||||
'payload' => [
|
||||
'token' => $token,
|
||||
],
|
||||
];
|
||||
|
||||
$this->assertEquals($expectedArray, $request->toArray());
|
||||
}
|
||||
}
|
||||
@@ -10,7 +10,7 @@ use BushlanovDev\MaxMessengerBot\Enums\Intent;
|
||||
use BushlanovDev\MaxMessengerBot\Models\Attachments\Buttons\AbstractButton;
|
||||
use BushlanovDev\MaxMessengerBot\Models\Attachments\Buttons\CallbackButton;
|
||||
use BushlanovDev\MaxMessengerBot\Models\Attachments\Buttons\LinkButton;
|
||||
use BushlanovDev\MaxMessengerBot\Models\Attachments\Payloads\InlineKeyboardPayload;
|
||||
use BushlanovDev\MaxMessengerBot\Models\Attachments\Payloads\InlineKeyboardAttachmentRequestPayload;
|
||||
use BushlanovDev\MaxMessengerBot\Models\Attachments\Requests\InlineKeyboardAttachmentRequest;
|
||||
use PHPUnit\Framework\Attributes\CoversClass;
|
||||
use PHPUnit\Framework\Attributes\Test;
|
||||
@@ -18,7 +18,7 @@ use PHPUnit\Framework\Attributes\UsesClass;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
#[CoversClass(InlineKeyboardAttachmentRequest::class)]
|
||||
#[UsesClass(InlineKeyboardPayload::class)]
|
||||
#[UsesClass(InlineKeyboardAttachmentRequestPayload::class)]
|
||||
#[UsesClass(AbstractButton::class)]
|
||||
#[UsesClass(CallbackButton::class)]
|
||||
#[UsesClass(LinkButton::class)]
|
||||
@@ -35,7 +35,7 @@ final class InlineKeyboardAttachmentRequestTest extends TestCase
|
||||
|
||||
$this->assertInstanceOf(InlineKeyboardAttachmentRequest::class, $request);
|
||||
$this->assertSame(AttachmentType::InlineKeyboard, $request->type);
|
||||
$this->assertInstanceOf(InlineKeyboardPayload::class, $request->payload);
|
||||
$this->assertInstanceOf(InlineKeyboardAttachmentRequestPayload::class, $request->payload);
|
||||
$this->assertSame($buttons, $request->payload->buttons);
|
||||
|
||||
$expectedArray = [
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace BushlanovDev\MaxMessengerBot\Tests\Models\Attachments\Requests;
|
||||
|
||||
use BushlanovDev\MaxMessengerBot\Enums\AttachmentType;
|
||||
use BushlanovDev\MaxMessengerBot\Models\Attachments\Payloads\LocationAttachmentRequestPayload;
|
||||
use BushlanovDev\MaxMessengerBot\Models\Attachments\Requests\LocationAttachmentRequest;
|
||||
use PHPUnit\Framework\Attributes\CoversClass;
|
||||
use PHPUnit\Framework\Attributes\Test;
|
||||
use PHPUnit\Framework\Attributes\UsesClass;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
#[CoversClass(LocationAttachmentRequest::class)]
|
||||
#[UsesClass(LocationAttachmentRequestPayload::class)]
|
||||
final class LocationAttachmentRequestTest extends TestCase
|
||||
{
|
||||
#[Test]
|
||||
public function itCreatesRequestWithCoordinatesAndSerializes(): void
|
||||
{
|
||||
$latitude = 55.7558;
|
||||
$longitude = 37.6173;
|
||||
|
||||
$request = new LocationAttachmentRequest($latitude, $longitude);
|
||||
|
||||
$this->assertInstanceOf(LocationAttachmentRequest::class, $request);
|
||||
$this->assertSame(AttachmentType::Location, $request->type);
|
||||
$this->assertInstanceOf(LocationAttachmentRequestPayload::class, $request->payload);
|
||||
$this->assertSame($latitude, $request->payload->latitude);
|
||||
$this->assertSame($longitude, $request->payload->longitude);
|
||||
|
||||
$expectedArray = [
|
||||
'type' => 'location',
|
||||
'payload' => [
|
||||
'latitude' => $latitude,
|
||||
'longitude' => $longitude,
|
||||
],
|
||||
];
|
||||
$this->assertEquals($expectedArray, $request->toArray());
|
||||
}
|
||||
}
|
||||
@@ -5,7 +5,7 @@ declare(strict_types=1);
|
||||
namespace BushlanovDev\MaxMessengerBot\Tests\Models\Attachments\Requests;
|
||||
|
||||
use BushlanovDev\MaxMessengerBot\Enums\AttachmentType;
|
||||
use BushlanovDev\MaxMessengerBot\Models\Attachments\Payloads\PhotoAttachmentPayload;
|
||||
use BushlanovDev\MaxMessengerBot\Models\Attachments\Payloads\PhotoAttachmentRequestPayload;
|
||||
use BushlanovDev\MaxMessengerBot\Models\Attachments\Payloads\PhotoToken;
|
||||
use BushlanovDev\MaxMessengerBot\Models\Attachments\Requests\PhotoAttachmentRequest;
|
||||
use InvalidArgumentException;
|
||||
@@ -16,7 +16,7 @@ use PHPUnit\Framework\Attributes\UsesClass;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
#[CoversClass(PhotoAttachmentRequest::class)]
|
||||
#[UsesClass(PhotoAttachmentPayload::class)]
|
||||
#[UsesClass(PhotoAttachmentRequestPayload::class)]
|
||||
#[UsesClass(PhotoToken::class)]
|
||||
final class PhotoAttachmentRequestTest extends TestCase
|
||||
{
|
||||
@@ -28,7 +28,7 @@ final class PhotoAttachmentRequestTest extends TestCase
|
||||
|
||||
$this->assertInstanceOf(PhotoAttachmentRequest::class, $request);
|
||||
$this->assertSame(AttachmentType::Image, $request->type);
|
||||
$this->assertInstanceOf(PhotoAttachmentPayload::class, $request->payload);
|
||||
$this->assertInstanceOf(PhotoAttachmentRequestPayload::class, $request->payload);
|
||||
$this->assertSame($url, $request->payload->url);
|
||||
$this->assertNull($request->payload->token);
|
||||
$this->assertNull($request->payload->photos);
|
||||
@@ -52,7 +52,7 @@ final class PhotoAttachmentRequestTest extends TestCase
|
||||
|
||||
$this->assertInstanceOf(PhotoAttachmentRequest::class, $request);
|
||||
$this->assertSame(AttachmentType::Image, $request->type);
|
||||
$this->assertInstanceOf(PhotoAttachmentPayload::class, $request->payload);
|
||||
$this->assertInstanceOf(PhotoAttachmentRequestPayload::class, $request->payload);
|
||||
$this->assertSame($token, $request->payload->token);
|
||||
$this->assertNull($request->payload->url);
|
||||
$this->assertNull($request->payload->photos);
|
||||
@@ -79,7 +79,7 @@ final class PhotoAttachmentRequestTest extends TestCase
|
||||
|
||||
$this->assertInstanceOf(PhotoAttachmentRequest::class, $request);
|
||||
$this->assertSame(AttachmentType::Image, $request->type);
|
||||
$this->assertInstanceOf(PhotoAttachmentPayload::class, $request->payload);
|
||||
$this->assertInstanceOf(PhotoAttachmentRequestPayload::class, $request->payload);
|
||||
$this->assertSame($photos, $request->payload->photos);
|
||||
$this->assertNull($request->payload->url);
|
||||
$this->assertNull($request->payload->token);
|
||||
@@ -119,8 +119,8 @@ final class PhotoAttachmentRequestTest extends TestCase
|
||||
?array $photos
|
||||
): void {
|
||||
$this->expectException(InvalidArgumentException::class);
|
||||
$this->expectExceptionMessage('Provide exactly one of "url", "token", or "photos" for PhotoAttachmentPayload.');
|
||||
$this->expectExceptionMessage('Provide exactly one of "url", "token", or "photos" for PhotoAttachmentRequestPayload.');
|
||||
|
||||
new PhotoAttachmentPayload($url, $token, $photos);
|
||||
new PhotoAttachmentRequestPayload($url, $token, $photos);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace BushlanovDev\MaxMessengerBot\Tests\Models\Attachments\Requests;
|
||||
|
||||
use BushlanovDev\MaxMessengerBot\Enums\AttachmentType;
|
||||
use BushlanovDev\MaxMessengerBot\Models\Attachments\Payloads\ShareAttachmentRequestPayload;
|
||||
use BushlanovDev\MaxMessengerBot\Models\Attachments\Requests\ShareAttachmentRequest;
|
||||
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(ShareAttachmentRequest::class)]
|
||||
#[UsesClass(ShareAttachmentRequestPayload::class)]
|
||||
final class ShareAttachmentRequestTest extends TestCase
|
||||
{
|
||||
#[Test]
|
||||
public function fromUrlCreatesCorrectRequestAndSerializes(): void
|
||||
{
|
||||
$request = ShareAttachmentRequest::fromUrl('https://dev.max.ru');
|
||||
$this->assertSame(AttachmentType::Share, $request->type);
|
||||
$this->assertSame('https://dev.max.ru', $request->payload->url);
|
||||
$this->assertNull($request->payload->token);
|
||||
|
||||
$expected = ['type' => 'share', 'payload' => ['url' => 'https://dev.max.ru', 'token' => null]];
|
||||
$this->assertEquals($expected, $request->toArray());
|
||||
}
|
||||
|
||||
#[Test]
|
||||
public function fromTokenCreatesCorrectRequestAndSerializes(): void
|
||||
{
|
||||
$request = ShareAttachmentRequest::fromToken('share_token_123');
|
||||
$this->assertSame(AttachmentType::Share, $request->type);
|
||||
$this->assertSame('share_token_123', $request->payload->token);
|
||||
$this->assertNull($request->payload->url);
|
||||
|
||||
$expected = ['type' => 'share', 'payload' => ['token' => 'share_token_123', 'url' => null]];
|
||||
$this->assertEquals($expected, $request->toArray());
|
||||
}
|
||||
|
||||
/** @return array<string, array{0: ?string, 1: ?string}> */
|
||||
public static function invalidPayloadProvider(): array
|
||||
{
|
||||
return [
|
||||
'both null' => [null, null],
|
||||
'both set' => ['https://a.com', 'token123'],
|
||||
];
|
||||
}
|
||||
|
||||
#[Test]
|
||||
#[DataProvider('invalidPayloadProvider')]
|
||||
public function payloadThrowsExceptionForInvalidArguments(?string $url, ?string $token): void
|
||||
{
|
||||
$this->expectException(InvalidArgumentException::class);
|
||||
$this->expectExceptionMessage('Provide exactly one of "url" or "token" for ShareAttachmentRequestPayload.');
|
||||
new ShareAttachmentRequestPayload($url, $token);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace BushlanovDev\MaxMessengerBot\Tests\Models\Attachments\Requests;
|
||||
|
||||
use BushlanovDev\MaxMessengerBot\Enums\AttachmentType;
|
||||
use BushlanovDev\MaxMessengerBot\Models\Attachments\Payloads\StickerAttachmentRequestPayload;
|
||||
use BushlanovDev\MaxMessengerBot\Models\Attachments\Requests\StickerAttachmentRequest;
|
||||
use PHPUnit\Framework\Attributes\CoversClass;
|
||||
use PHPUnit\Framework\Attributes\Test;
|
||||
use PHPUnit\Framework\Attributes\UsesClass;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
#[CoversClass(StickerAttachmentRequest::class)]
|
||||
#[UsesClass(StickerAttachmentRequestPayload::class)]
|
||||
final class StickerAttachmentRequestTest extends TestCase
|
||||
{
|
||||
#[Test]
|
||||
public function itCreatesCorrectRequestAndSerializesToArray(): void
|
||||
{
|
||||
$stickerCode = 'my_awesome_sticker_code';
|
||||
$request = new StickerAttachmentRequest($stickerCode);
|
||||
|
||||
$this->assertInstanceOf(StickerAttachmentRequest::class, $request);
|
||||
$this->assertSame(AttachmentType::Sticker, $request->type);
|
||||
$this->assertInstanceOf(StickerAttachmentRequestPayload::class, $request->payload);
|
||||
$this->assertSame($stickerCode, $request->payload->code);
|
||||
|
||||
$expectedArray = [
|
||||
'type' => 'sticker',
|
||||
'payload' => [
|
||||
'code' => $stickerCode,
|
||||
],
|
||||
];
|
||||
|
||||
$this->assertEquals($expectedArray, $request->toArray());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace BushlanovDev\MaxMessengerBot\Tests\Models\Attachments\Requests;
|
||||
|
||||
use BushlanovDev\MaxMessengerBot\Enums\AttachmentType;
|
||||
use BushlanovDev\MaxMessengerBot\Models\Attachments\Payloads\UploadedInfoAttachmentRequestPayload;
|
||||
use BushlanovDev\MaxMessengerBot\Models\Attachments\Requests\VideoAttachmentRequest;
|
||||
use PHPUnit\Framework\Attributes\CoversClass;
|
||||
use PHPUnit\Framework\Attributes\Test;
|
||||
use PHPUnit\Framework\Attributes\UsesClass;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
#[CoversClass(VideoAttachmentRequest::class)]
|
||||
#[UsesClass(UploadedInfoAttachmentRequestPayload::class)]
|
||||
final class VideoAttachmentRequestTest extends TestCase
|
||||
{
|
||||
#[Test]
|
||||
public function itCreatesCorrectRequestAndSerializesToArray(): void
|
||||
{
|
||||
$token = 'some_unique_video_upload_token_54321';
|
||||
|
||||
$request = new VideoAttachmentRequest($token);
|
||||
|
||||
$this->assertInstanceOf(VideoAttachmentRequest::class, $request);
|
||||
$this->assertSame(AttachmentType::Video, $request->type);
|
||||
$this->assertInstanceOf(UploadedInfoAttachmentRequestPayload::class, $request->payload);
|
||||
$this->assertSame($token, $request->payload->token);
|
||||
|
||||
$expectedArray = [
|
||||
'type' => 'video',
|
||||
'payload' => [
|
||||
'token' => $token,
|
||||
],
|
||||
];
|
||||
|
||||
$this->assertEquals($expectedArray, $request->toArray());
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user