diff --git a/src/Messages/Channel/BaseMessage.php b/src/Messages/Channel/BaseMessage.php index ca60af2e..ce8a5968 100644 --- a/src/Messages/Channel/BaseMessage.php +++ b/src/Messages/Channel/BaseMessage.php @@ -27,6 +27,7 @@ abstract class BaseMessage implements Message public const MESSAGES_SUBTYPE_TEMPLATE = 'template'; public const MESSAGES_SUBTYPE_STICKER = 'sticker'; public const MESSAGES_SUBTYPE_CUSTOM = 'custom'; + public const MESSAGES_SUBTYPE_CONTENT = 'content'; public function getClientRef(): ?string { diff --git a/src/Messages/Channel/MMS/MMSContent.php b/src/Messages/Channel/MMS/MMSContent.php new file mode 100644 index 00000000..2ba040a6 --- /dev/null +++ b/src/Messages/Channel/MMS/MMSContent.php @@ -0,0 +1,42 @@ +to = $to; + $this->from = $from; + } + + public function validatesE164(): bool + { + return $this->validatesE164; + } + + public function toArray(): array + { + $returnArray = $this->getBaseMessageUniversalOutputArray(); + $returnArray['content'] = $this->content->toArray(); + + if (!is_null($this->ttl)) { + $returnArray['ttl'] = $this->ttl; + } + + return $returnArray; + } +} diff --git a/src/Messages/Channel/MMS/MMSFile.php b/src/Messages/Channel/MMS/MMSFile.php new file mode 100644 index 00000000..90d64629 --- /dev/null +++ b/src/Messages/Channel/MMS/MMSFile.php @@ -0,0 +1,42 @@ +to = $to; + $this->from = $from; + } + + public function validatesE164(): bool + { + return $this->validatesE164; + } + + public function toArray(): array + { + $returnArray = $this->getBaseMessageUniversalOutputArray(); + $returnArray['file'] = $this->file->toArray(); + + if (!is_null($this->ttl)) { + $returnArray['ttl'] = $this->ttl; + } + + return $returnArray; + } +} diff --git a/src/Messages/Channel/MMS/MMSText.php b/src/Messages/Channel/MMS/MMSText.php new file mode 100644 index 00000000..5147a1b8 --- /dev/null +++ b/src/Messages/Channel/MMS/MMSText.php @@ -0,0 +1,43 @@ +to = $to; + $this->from = $from; + $this->text = $text; + } + + public function validatesE164(): bool + { + return $this->validatesE164; + } + + public function toArray(): array + { + $returnArray = $this->getBaseMessageUniversalOutputArray(); + $returnArray['text'] = $this->text; + + if (!is_null($this->ttl)) { + $returnArray['ttl'] = $this->ttl; + } + + return $returnArray; + } +} diff --git a/src/Messages/MessageObjects/ContentObject.php b/src/Messages/MessageObjects/ContentObject.php new file mode 100644 index 00000000..4b95bba0 --- /dev/null +++ b/src/Messages/MessageObjects/ContentObject.php @@ -0,0 +1,66 @@ +url = $data['url']; + $this->type = $data['type']; + + if (isset($data['caption'])) { + $this->caption = $data['caption']; + } + + return $this; + } + + public function toArray(): array + { + $returnArray = [ + 'url' => $this->url, + 'type' => $this->type, + ]; + + if ($this->getCaption()) { + $returnArray['caption'] = $this->getCaption(); + } + + return $returnArray; + } + + public function getUrl(): string + { + return $this->url; + } + + public function getCaption(): string + { + return $this->caption; + } + + public function getType(): string + { + return $this->type; + } +} diff --git a/test/Messages/ClientTest.php b/test/Messages/ClientTest.php index 65803d74..d2da7082 100644 --- a/test/Messages/ClientTest.php +++ b/test/Messages/ClientTest.php @@ -10,12 +10,15 @@ use Vonage\Client; use Vonage\Client\APIResource; use Vonage\Messages\Channel\BaseMessage; +use Vonage\Messages\Channel\MMS\MMSContent; +use Vonage\Messages\Channel\MMS\MMSText; use Vonage\Messages\Channel\Messenger\MessengerAudio; use Vonage\Messages\Channel\Messenger\MessengerFile; use Vonage\Messages\Channel\Messenger\MessengerImage; use Vonage\Messages\Channel\Messenger\MessengerText; use Vonage\Messages\Channel\Messenger\MessengerVideo; use Vonage\Messages\Channel\MMS\MMSAudio; +use Vonage\Messages\Channel\MMS\MMSFile; use Vonage\Messages\Channel\MMS\MMSImage; use Vonage\Messages\Channel\MMS\MMSvCard; use Vonage\Messages\Channel\MMS\MMSVideo; @@ -42,6 +45,7 @@ use Vonage\Messages\Client as MessagesClient; use Vonage\Messages\ExceptionErrorHandler; use Vonage\Messages\MessageObjects\AudioObject; +use Vonage\Messages\MessageObjects\ContentObject; use Vonage\Messages\MessageObjects\FileObject; use Vonage\Messages\MessageObjects\ImageObject; use Vonage\Messages\MessageObjects\TemplateObject; @@ -198,6 +202,93 @@ public function testCanSendSMSWtihFailover(): void $this->assertArrayHasKey('message_uuid', $result); } + public function testCanSendMMSContent(): void + { + $contentUrl = 'https://picsum.photos/200/300'; + $mmsContentObject = new ContentObject($contentUrl, 'Picture of a skateboarder', ContentObject::TYPE_IMAGE); + + $payload = [ + 'to' => '447700900000', + 'from' => '16105551212', + 'content' => $mmsContentObject + ]; + + $message = new MMSContent($payload['to'], $payload['from'], $mmsContentObject); + $message->setTtl(400); + + $this->vonageClient->send(Argument::that(function (Request $request) use ($payload) { + $this->assertRequestJsonBodyContains('to', $payload['to'], $request); + $this->assertRequestJsonBodyContains('from', $payload['from'], $request); + $this->assertRequestJsonBodyContains('content', $payload['content']->toArray(), $request); + $this->assertRequestJsonBodyContains('channel', 'mms', $request); + $this->assertRequestJsonBodyContains('message_type', 'content', $request); + $this->assertRequestJsonBodyContains('ttl', 400, $request); + $this->assertEquals('POST', $request->getMethod()); + + return true; + }))->willReturn($this->getResponse('sms-success', 202)); + $result = $this->messageClient->send($message); + $this->assertIsArray($result); + $this->assertArrayHasKey('message_uuid', $result); + } + + public function testCanSendMMSText(): void + { + $payload = [ + 'to' => '447700900000', + 'from' => '16105551212', + 'text' => 'my cool message' + ]; + + $message = new MMSText($payload['to'], $payload['from'], $payload['text']); + $message->setTtl(400); + + $this->vonageClient->send(Argument::that(function (Request $request) use ($payload) { + $this->assertRequestJsonBodyContains('to', $payload['to'], $request); + $this->assertRequestJsonBodyContains('from', $payload['from'], $request); + $this->assertRequestJsonBodyContains('text', $payload['text'], $request); + $this->assertRequestJsonBodyContains('channel', 'mms', $request); + $this->assertRequestJsonBodyContains('message_type', 'text', $request); + $this->assertRequestJsonBodyContains('ttl', 400, $request); + $this->assertEquals('POST', $request->getMethod()); + + return true; + }))->willReturn($this->getResponse('sms-success', 202)); + $result = $this->messageClient->send($message); + $this->assertIsArray($result); + $this->assertArrayHasKey('message_uuid', $result); + } + + public function testCanSendMMSFile(): void + { + $fileUrl = 'https://picsum.photos/200/300'; + $mmsFileObject = new FileObject($fileUrl, 'Picture of a skateboarder'); + + $payload = [ + 'to' => '447700900000', + 'from' => '16105551212', + 'file' => $mmsFileObject + ]; + + $message = new MMSFile($payload['to'], $payload['from'], $mmsFileObject); + $message->setTtl(400); + + $this->vonageClient->send(Argument::that(function (Request $request) use ($payload) { + $this->assertRequestJsonBodyContains('to', $payload['to'], $request); + $this->assertRequestJsonBodyContains('from', $payload['from'], $request); + $this->assertRequestJsonBodyContains('file', $payload['file']->toArray(), $request); + $this->assertRequestJsonBodyContains('channel', 'mms', $request); + $this->assertRequestJsonBodyContains('message_type', 'file', $request); + $this->assertRequestJsonBodyContains('ttl', 400, $request); + $this->assertEquals('POST', $request->getMethod()); + + return true; + }))->willReturn($this->getResponse('sms-success', 202)); + $result = $this->messageClient->send($message); + $this->assertIsArray($result); + $this->assertArrayHasKey('message_uuid', $result); + } + public function testCanSendMMSImage(): void { $imageUrl = 'https://picsum.photos/200/300';