Ported MessageBuilder and BatchMessage (#472)

* Ported MessageBuilder and BatchMessage

* Added test for MessageBuilder

* Added test for BatchMessageTest

* cs

* cs

* Removed PHP7 code
This commit is contained in:
Tobias Nyholm 2018-08-04 21:30:15 +02:00 committed by GitHub
parent 48e5b8956b
commit eb07576e6a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 1308 additions and 3 deletions

View File

@ -13,7 +13,8 @@
"require-dev": { "require-dev": {
"phpunit/phpunit": "~4.8", "phpunit/phpunit": "~4.8",
"php-http/guzzle6-adapter": "^1.0", "php-http/guzzle6-adapter": "^1.0",
"guzzlehttp/psr7": "^1.4" "guzzlehttp/psr7": "^1.4",
"nyholm/nsa": "^1.1"
}, },
"autoload": { "autoload": {
"psr-0": { "psr-0": {

View File

@ -11,6 +11,7 @@ namespace Mailgun\Api;
use Mailgun\Assert; use Mailgun\Assert;
use Mailgun\Exception\InvalidArgumentException; use Mailgun\Exception\InvalidArgumentException;
use Mailgun\Message\BatchMessage;
use Mailgun\Model\Message\SendResponse; use Mailgun\Model\Message\SendResponse;
use Mailgun\Model\Message\ShowResponse; use Mailgun\Model\Message\ShowResponse;
@ -19,6 +20,17 @@ use Mailgun\Model\Message\ShowResponse;
*/ */
class Message extends HttpApi class Message extends HttpApi
{ {
/**
* @param string $domain
* @param bool $autoSend
*
* @return BatchMessage
*/
public function getBatchMessage($domain, $autoSend = true)
{
return new BatchMessage($this, $domain, $autoSend);
}
/** /**
* @param string $domain * @param string $domain
* @param array $params * @param array $params

View File

@ -285,7 +285,7 @@ class Mailgun
/** /**
* @return MessageBuilder * @return MessageBuilder
* *
* @deprecated Will be removed in 3.0 * @deprecated Will be removed in 3.0.
*/ */
public function MessageBuilder() public function MessageBuilder()
{ {
@ -308,7 +308,7 @@ class Mailgun
* *
* @return BatchMessage * @return BatchMessage
* *
* @deprecated Will be removed in 3.0 * @deprecated Will be removed in 3.0. Use Mailgun::messages()::getBatchMessage().
*/ */
public function BatchMessage($workingDomain, $autoSend = true) public function BatchMessage($workingDomain, $autoSend = true)
{ {

View File

@ -0,0 +1,134 @@
<?php
/*
* Copyright (C) 2013 Mailgun
*
* This software may be modified and distributed under the terms
* of the MIT license. See the LICENSE file for details.
*/
namespace Mailgun\Message;
use Mailgun\Api\Message;
use Mailgun\Message\Exceptions\MissingRequiredParameter;
use Mailgun\Message\Exceptions\RuntimeException;
use Mailgun\Message\Exceptions\TooManyRecipients;
/**
* This class is used for batch sending. See the official documentation (link below)
* for usage instructions.
*
* @see https://github.com/mailgun/mailgun-php/blob/master/src/Mailgun/Message/README.md
*/
class BatchMessage extends MessageBuilder
{
/**
* @var array
*/
private $batchRecipientAttributes = [];
/**
* @var bool
*/
private $autoSend = true;
/**
* @var array
*/
private $messageIds = [];
/**
* @var string
*/
private $domain;
/**
* @var Message
*/
private $api;
/**
* @param Message $messageApi
* @param string $domain
* @param bool $autoSend
*/
public function __construct(Message $messageApi, $domain, $autoSend)
{
$this->api = $messageApi;
$this->domain = $domain;
$this->autoSend = $autoSend;
}
/**
* @param string $headerName
* @param string $address
* @param array $variables {
*
* @var string $id
* @var string $full_name
* @var string $first
* @var string $last
* }
*
* @throws MissingRequiredParameter
* @throws TooManyRecipients
*/
protected function addRecipient($headerName, $address, array $variables)
{
if (array_key_exists($headerName, $this->counters['recipients'])) {
if ($this->counters['recipients'][$headerName] === self::RECIPIENT_COUNT_LIMIT) {
if (false === $this->autoSend) {
throw TooManyRecipients::whenAutoSendDisabled();
}
$this->finalize();
}
}
parent::addRecipient($headerName, $address, $variables);
if (array_key_exists($headerName, $this->counters['recipients']) && !array_key_exists('id', $variables)) {
$variables['id'] = $headerName.'_'.$this->counters['recipients'][$headerName];
}
$this->batchRecipientAttributes[(string) $address] = $variables;
}
/**
* @throws MissingRequiredParameter
*/
public function finalize()
{
$message = $this->message;
if (empty($this->domain)) {
throw new RuntimeException('You must call BatchMessage::setDomain before sending messages.');
} elseif (empty($message['from'])) {
throw MissingRequiredParameter::create('from');
} elseif (empty($message['to'])) {
throw MissingRequiredParameter::create('to');
} elseif (empty($message['subject'])) {
throw MissingRequiredParameter::create('subject');
} elseif (empty($message['text']) && empty($message['html'])) {
throw MissingRequiredParameter::create('text" or "html');
} else {
$message['recipient-variables'] = json_encode($this->batchRecipientAttributes);
$response = $this->api->send($this->domain, $message);
$this->batchRecipientAttributes = [];
$this->counters['recipients']['to'] = 0;
$this->counters['recipients']['cc'] = 0;
$this->counters['recipients']['bcc'] = 0;
unset($this->message['to']);
$this->messageIds[] = $response->getId();
}
}
/**
* @return string[]
*/
public function getMessageIds()
{
return $this->messageIds;
}
}

View File

@ -0,0 +1,20 @@
<?php
/*
* Copyright (C) 2013 Mailgun
*
* This software may be modified and distributed under the terms
* of the MIT license. See the LICENSE file for details.
*/
namespace Mailgun\Message\Exceptions;
use Mailgun\Exception;
class LimitExceeded extends \Exception implements Exception
{
public static function create($field, $limit)
{
return new self(sprintf('You\'ve exceeded the maximum (%d) %s for a single message.', $limit, $field));
}
}

View File

@ -0,0 +1,24 @@
<?php
/*
* Copyright (C) 2013 Mailgun
*
* This software may be modified and distributed under the terms
* of the MIT license. See the LICENSE file for details.
*/
namespace Mailgun\Message\Exceptions;
use Mailgun\Exception;
class MissingRequiredParameter extends \Exception implements Exception
{
public static function create($parameter, $message = null)
{
if (null === $message) {
$message = 'The parameters passed to the API were invalid. Please specify "%s".';
}
return new self(sprintf($message, $parameter));
}
}

View File

@ -0,0 +1,18 @@
<?php
declare(strict_types=1);
/*
* Copyright (C) 2013 Mailgun
*
* This software may be modified and distributed under the terms
* of the MIT license. See the LICENSE file for details.
*/
namespace Mailgun\Message\Exceptions;
use Mailgun\Exception;
class RuntimeException extends \RuntimeException implements Exception
{
}

View File

@ -0,0 +1,26 @@
<?php
/*
* Copyright (C) 2013 Mailgun
*
* This software may be modified and distributed under the terms
* of the MIT license. See the LICENSE file for details.
*/
namespace Mailgun\Message\Exceptions;
use Mailgun\Exception;
use Mailgun\Message\MessageBuilder;
class TooManyRecipients extends LimitExceeded implements Exception
{
public static function create($field, $limit = MessageBuilder::RECIPIENT_COUNT_LIMIT)
{
return new self(sprintf('You\'ve exceeded the maximum recipient count (%s) for filed "%s".', $limit, $field));
}
public static function whenAutoSendDisabled($limit = MessageBuilder::RECIPIENT_COUNT_LIMIT)
{
return new self(sprintf('You\'ve exceeded the maximum recipient count (%s) with autosend disabled.', $limit));
}
}

View File

@ -0,0 +1,464 @@
<?php
/*
* Copyright (C) 2013 Mailgun
*
* This software may be modified and distributed under the terms
* of the MIT license. See the LICENSE file for details.
*/
namespace Mailgun\Message;
use Mailgun\Message\Exceptions\LimitExceeded;
use Mailgun\Message\Exceptions\TooManyRecipients;
/**
* This class is used for composing a properly formed
* message object. Dealing with arrays can be cumbersome,
* this class makes the process easier. See the official
* documentation (link below) for usage instructions.
*
* @see https://github.com/mailgun/mailgun-php/blob/master/src/Mailgun/Message/README.md
*/
class MessageBuilder
{
const RECIPIENT_COUNT_LIMIT = 1000;
const CAMPAIGN_ID_LIMIT = 3;
const TAG_LIMIT = 3;
/**
* @var array
*/
protected $message = [];
/**
* @var array
*/
protected $variables = [];
/**
* @var array
*/
protected $counters = [
'recipients' => [
'to' => 0,
'cc' => 0,
'bcc' => 0,
],
'attributes' => [
'attachment' => 0,
'campaign_id' => 0,
'custom_option' => 0,
'tag' => 0,
],
];
/**
* @param array $params
* @param string $key
* @param mixed $default
*
* @return mixed
*/
private function get($params, $key, $default)
{
if (array_key_exists($key, $params)) {
return $params[$key];
}
return $default;
}
/**
* @param array $params {
*
* @var string $full_name
* @var string $first
* @var string $last
* }
*
* @return string
*/
private function getFullName(array $params)
{
if (isset($params['full_name'])) {
return $this->get($params, 'full_name', '');
}
return trim(sprintf('%s %s', $this->get($params, 'first', ''), $this->get($params, 'last', '')));
}
/**
* @param string $address
* @param array $params {
*
* @var string $full_name
* @var string $first
* @var string $last
* }
*
* @return string
*/
protected function parseAddress($address, array $variables)
{
$fullName = $this->getFullName($variables);
if (!empty($fullName)) {
return sprintf('"%s" <%s>', $fullName, $address);
}
return $address;
}
/**
* @param string $headerName
* @param string $address
* @param array $variables {
*
* @var string $full_name
* @var string $first
* @var string $last
* }
*/
protected function addRecipient($headerName, $address, array $variables)
{
$compiledAddress = $this->parseAddress($address, $variables);
if ('h:reply-to' === $headerName) {
$this->message[$headerName] = $compiledAddress;
} elseif (isset($this->message[$headerName])) {
$this->message[$headerName][] = $compiledAddress;
} else {
$this->message[$headerName] = [$compiledAddress];
}
if (array_key_exists($headerName, $this->counters['recipients'])) {
$this->counters['recipients'][$headerName] += 1;
}
}
/**
* @param string $address
* @param array $variables {
*
* @var string $id If used with BatchMessage
* @var string $full_name
* @var string $first
* @var string $last
* }
*
* @throws TooManyRecipients
*/
public function addToRecipient($address, array $variables = [])
{
if ($this->counters['recipients']['to'] > self::RECIPIENT_COUNT_LIMIT) {
throw TooManyRecipients::create('to');
}
$this->addRecipient('to', $address, $variables);
}
/**
* @param string $address
* @param array $variables {
*
* @var string $id If used with BatchMessage
* @var string $full_name
* @var string $first
* @var string $last
* }
*
* @throws TooManyRecipients
*/
public function addCcRecipient($address, array $variables = [])
{
if ($this->counters['recipients']['cc'] > self::RECIPIENT_COUNT_LIMIT) {
throw TooManyRecipients::create('cc');
}
$this->addRecipient('cc', $address, $variables);
}
/**
* @param string $address
* @param array $variables {
*
* @var string $id If used with BatchMessage
* @var string $full_name
* @var string $first
* @var string $last
* }
*
* @throws TooManyRecipients
*/
public function addBccRecipient($address, array $variables)
{
if ($this->counters['recipients']['bcc'] > self::RECIPIENT_COUNT_LIMIT) {
throw TooManyRecipients::create('bcc');
}
$this->addRecipient('bcc', $address, $variables);
}
/**
* @param string $address
* @param array $variables {
*
* @var string $id If used with BatchMessage
* @var string $full_name
* @var string $first
* @var string $last
* }
*/
public function setFromAddress($address, array $variables = [])
{
$this->addRecipient('from', $address, $variables);
}
/**
* @param string $address
* @param array $variables {
*
* @var string $id If used with BatchMessage
* @var string $full_name
* @var string $first
* @var string $last
* }
*/
public function setReplyToAddress($address, array $variables = [])
{
$this->addRecipient('h:reply-to', $address, $variables);
}
/**
* @param string $subject
*/
public function setSubject($subject)
{
$this->message['subject'] = $subject;
}
/**
* @param string $headerName
* @param mixed $headerData
*/
public function addCustomHeader($headerName, $headerData)
{
if (!preg_match('/^h:/i', $headerName)) {
$headerName = 'h:'.$headerName;
}
if (!array_key_exists($headerName, $this->message)) {
$this->message[$headerName] = $headerData;
} else {
if (is_array($this->message[$headerName])) {
$this->message[$headerName][] = $headerData;
} else {
$this->message[$headerName] = [$this->message[$headerName], $headerData];
}
}
}
/**
* @param string $textBody
*/
public function setTextBody($textBody)
{
$this->message['text'] = $textBody;
}
/**
* @param string $htmlBody
*
* @return string
*/
public function setHtmlBody($htmlBody)
{
$this->message['html'] = $htmlBody;
}
/**
* @param string $attachmentPath
* @param string|null $attachmentName
*/
public function addAttachment($attachmentPath, $attachmentName = null)
{
if (!isset($this->message['attachment'])) {
$this->message['attachment'] = [];
}
$this->message['attachment'][] = [
'filePath' => $attachmentPath,
'remoteName' => $attachmentName,
];
}
/**
* @param string $inlineImagePath
* @param string|null $inlineImageName
*/
public function addInlineImage($inlineImagePath, $inlineImageName = null)
{
if (!isset($this->message['inline'])) {
$this->message['inline'] = [];
}
$this->message['inline'][] = [
'filePath' => $inlineImagePath,
'remoteName' => $inlineImageName,
];
}
/**
* @param bool $enabled
*/
public function setTestMode($enabled)
{
$this->message['o:testmode'] = $this->boolToString($enabled);
}
/**
* @param string $campaignId
*
* @throws LimitExceeded
*/
public function addCampaignId($campaignId)
{
if ($this->counters['attributes']['campaign_id'] >= self::CAMPAIGN_ID_LIMIT) {
throw LimitExceeded::create('campaigns', self::CAMPAIGN_ID_LIMIT);
}
if (isset($this->message['o:campaign'])) {
array_push($this->message['o:campaign'], (string) $campaignId);
} else {
$this->message['o:campaign'] = [(string) $campaignId];
}
$this->counters['attributes']['campaign_id'] += 1;
}
/**
* @param string $tag
*
* @throws LimitExceeded
*/
public function addTag($tag)
{
if ($this->counters['attributes']['tag'] >= self::TAG_LIMIT) {
throw LimitExceeded::create('tags', self::TAG_LIMIT);
}
if (isset($this->message['o:tag'])) {
array_push($this->message['o:tag'], $tag);
} else {
$this->message['o:tag'] = [$tag];
}
$this->counters['attributes']['tag'] += 1;
}
/**
* @param bool $enabled
*/
public function setDkim($enabled)
{
$this->message['o:dkim'] = $this->boolToString($enabled);
}
/**
* @param bool $enabled
*
* @return string
*/
public function setOpenTracking($enabled)
{
$this->message['o:tracking-opens'] = $this->boolToString($enabled);
}
/**
* @param bool $enabled
*
* @return string
*/
public function setClickTracking($enabled)
{
$this->message['o:tracking-clicks'] = $this->boolToString($enabled);
}
/**
* @param string $timeDate
* @param string|null $timeZone
*
* @return string
*/
public function setDeliveryTime($timeDate, $timeZone = null)
{
if (null !== $timeZone) {
$timeZoneObj = new \DateTimeZone($timeZone);
} else {
$timeZoneObj = new \DateTimeZone('UTC');
}
$dateTimeObj = new \DateTime($timeDate, $timeZoneObj);
$formattedTimeDate = $dateTimeObj->format(\DateTime::RFC2822);
$this->message['o:deliverytime'] = $formattedTimeDate;
return $this->message['o:deliverytime'];
}
/**
* @param string $customName
* @param mixed $data
*/
public function addCustomData($customName, $data)
{
$this->message['v:'.$customName] = json_encode($data);
}
/**
* @param string $parameterName
* @param mixed $data
*
* @return mixed
*/
public function addCustomParameter($parameterName, $data)
{
if (isset($this->message[$parameterName])) {
$this->message[$parameterName][] = $data;
} else {
$this->message[$parameterName] = [$data];
}
return $this->message[$parameterName];
}
/**
* @param array $message
*/
public function setMessage($message)
{
$this->message = $message;
}
/**
* @return array
*/
public function getMessage()
{
return $this->message;
}
/**
* @param $enabled
*
* @return string
*/
private function boolToString($enabled)
{
if (filter_var($enabled, FILTER_VALIDATE_BOOLEAN)) {
$enabled = 'yes';
} elseif ('html' === $enabled) {
$enabled = 'html';
} else {
$enabled = 'no';
}
return $enabled;
}
}

View File

@ -0,0 +1,84 @@
Mailgun - Messages
==================
This is the Mailgun PHP *Message* utilities.
The below assumes you've already installed the Mailgun PHP SDK in to your
project. If not, go back to the master README for instructions.
There are two utilities included, `MessageBuilder` and `BatchMessage`.
* `MessageBuilder`: Allows you to build a message object by calling methods for
each MIME attribute.
* `BatchMessage`: Extends `MessageBuilder` and allows you to iterate through
recipients from a list. Messages will fire after the 1,000th recipient has been
added.
Usage - Message Builder
-----------------------
Here's how to use Message Builder to build your Message.
```php
# Next, instantiate a Message Builder object from the SDK.
$builder = new MessageBuilder();
# Define the from address.
$builder->setFromAddress("me@example.com", array("first"=>"PHP", "last" => "SDK"));
# Define a to recipient.
$builder->addToRecipient("john.doe@example.com", array("first" => "John", "last" => "Doe"));
# Define a cc recipient.
$builder->addCcRecipient("sally.doe@example.com", array("full_name" => "Sally Doe"));
# Define the subject.
$builder->setSubject("A message from the PHP SDK using Message Builder!");
# Define the body of the message.
$builder->setTextBody("This is the text body of the message!");
# Other Optional Parameters.
$builder->addCampaignId("My-Awesome-Campaign");
$builder->addCustomHeader("Customer-Id", "12345");
$builder->addAttachment("@/tron.jpg");
$builder->setDeliveryTime("tomorrow 8:00AM", "PST");
$builder->setClickTracking(true);
# Finally, send the message.
$mg = Mailgun::create('key-example');
$domain = ;
$mg->messages()->send("example.com", $builder->getMessage());
```
Usage - Batch Message
---------------------
Here's how to use Batch Message to easily handle batch sending jobs.
```php
# First, instantiate the SDK with your API credentials and define your domain.
$mg = new Mailgun("key-example");
# Next, instantiate a Message Builder object from the SDK, pass in your sending domain.
$batchMessage = $mg->messages()->getBatchMessage("example.com");
# Define the from address.
$batchMessage->setFromAddress("me@example.com", array("first"=>"PHP", "last" => "SDK"));
# Define the subject.
$batchMessage->setSubject("A Batch Message from the PHP SDK!");
# Define the body of the message.
$batchMessage->setTextBody("This is the text body of the message!");
# Next, let's add a few recipients to the batch job.
$batchMessage->addToRecipient("john.doe@example.com", array("first" => "John", "last" => "Doe"));
$batchMessage->addToRecipient("sally.doe@example.com", array("first" => "Sally", "last" => "Doe"));
$batchMessage->addToRecipient("mike.jones@example.com", array("first" => "Mike", "last" => "Jones"));
...
// After 1,000 recipients, Batch Message will automatically post your message to the messages endpoint.
// Call finalize() to send any remaining recipients still in the buffer.
$batchMessage->finalize();
$messageIds = $batchMessage->getMessageIds();
```
More Documentation
------------------
See the official [Mailgun Docs](http://documentation.mailgun.com/api-sending.html)
for more information.

View File

@ -18,6 +18,7 @@ use Mailgun\Messages\Exceptions\TooManyParameters;
* This class is used for batch sending. See the official documentation (link below) * This class is used for batch sending. See the official documentation (link below)
* for usage instructions. * for usage instructions.
* *
* @deprecated Will be removed in 3.0. Use Mailgun\Message\BatchMessage
* @see https://github.com/mailgun/mailgun-php/blob/master/src/Mailgun/Messages/README.md * @see https://github.com/mailgun/mailgun-php/blob/master/src/Mailgun/Messages/README.md
*/ */
class BatchMessage extends MessageBuilder class BatchMessage extends MessageBuilder

View File

@ -20,6 +20,7 @@ use Mailgun\Messages\Exceptions\TooManyParameters;
* this class makes the process easier. See the official * this class makes the process easier. See the official
* documentation (link below) for usage instructions. * documentation (link below) for usage instructions.
* *
* @deprecated Will be removed in 3.0. Use Mailgun\Message\MessageBuilder
* @see https://github.com/mailgun/mailgun-php/blob/master/src/Mailgun/Messages/README.md * @see https://github.com/mailgun/mailgun-php/blob/master/src/Mailgun/Messages/README.md
*/ */
class MessageBuilder class MessageBuilder

View File

@ -0,0 +1,179 @@
<?php
/*
* Copyright (C) 2013 Mailgun
*
* This software may be modified and distributed under the terms
* of the MIT license. See the LICENSE file for details.
*/
namespace Mailgun\Tests\Message;
use Mailgun\Api\Message;
use Mailgun\Message\BatchMessage;
use Mailgun\Message\Exceptions\MissingRequiredParameter;
use Mailgun\Model\Message\SendResponse;
use Nyholm\NSA;
class BatchMessageTest extends \PHPUnit_Framework_TestCase
{
/**
* @var BatchMessage
*/
private $batchMessage;
public function setUp()
{
$messageApi = $this->getMockBuilder(Message::class)
->disableOriginalConstructor()
->setMethods(['send', 'sendMime', 'show'])
->getMock();
$messageApi->method('send')
->willReturn(SendResponse::create(['id' => 4711, 'message' => 'Message sent']));
$this->batchMessage = $messageApi->getBatchMessage('example.com');
}
public function testAddRecipient()
{
$this->batchMessage->addToRecipient('test@samples.mailgun.org', ['first' => 'Test', 'last' => 'User']);
$message = NSA::getProperty($this->batchMessage, 'message');
$this->assertEquals(['to' => ['"Test User" <test@samples.mailgun.org>']], $message);
$counter = NSA::getProperty($this->batchMessage, 'counters');
$this->assertEquals(1, $counter['recipients']['to']);
}
public function testAddRecipientWithoutFirstAndLastName()
{
$this->batchMessage->addToRecipient('test@samples.mailgun.org');
$message = NSA::getProperty($this->batchMessage, 'message');
$this->assertEquals(['to' => ['test@samples.mailgun.org']], $message);
$counter = NSA::getProperty($this->batchMessage, 'counters');
$this->assertEquals(1, $counter['recipients']['to']);
}
public function testRecipientVariablesOnTo()
{
$this->batchMessage->addToRecipient('test@samples.mailgun.org', ['first' => 'Test', 'last' => 'User']);
$message = NSA::getProperty($this->batchMessage, 'message');
$this->assertEquals(['to' => ['"Test User" <test@samples.mailgun.org>']], $message);
$attributes = NSA::getProperty($this->batchMessage, 'batchRecipientAttributes');
$this->assertEquals('Test', $attributes['test@samples.mailgun.org']['first']);
$this->assertEquals('User', $attributes['test@samples.mailgun.org']['last']);
}
public function testRecipientVariablesOnCc()
{
$this->batchMessage->addCcRecipient('test@samples.mailgun.org', ['first' => 'Test', 'last' => 'User']);
$message = NSA::getProperty($this->batchMessage, 'message');
$this->assertEquals(['cc' => ['"Test User" <test@samples.mailgun.org>']], $message);
$attributes = NSA::getProperty($this->batchMessage, 'batchRecipientAttributes');
$this->assertEquals('Test', $attributes['test@samples.mailgun.org']['first']);
$this->assertEquals('User', $attributes['test@samples.mailgun.org']['last']);
}
public function testRecipientVariablesOnBcc()
{
$this->batchMessage->addBccRecipient('test@samples.mailgun.org', ['first' => 'Test', 'last' => 'User']);
$message = NSA::getProperty($this->batchMessage, 'message');
$this->assertEquals(['bcc' => ['"Test User" <test@samples.mailgun.org>']], $message);
$attributes = NSA::getProperty($this->batchMessage, 'batchRecipientAttributes');
$this->assertEquals('Test', $attributes['test@samples.mailgun.org']['first']);
$this->assertEquals('User', $attributes['test@samples.mailgun.org']['last']);
}
public function testAddMultipleBatchRecipients()
{
for ($i = 0; $i < 100; ++$i) {
$this->batchMessage->addToRecipient("$i@samples.mailgun.org", ['first' => 'Test', 'last' => "User $i"]);
}
$message = NSA::getProperty($this->batchMessage, 'message');
$this->assertEquals(100, count($message['to']));
}
public function testMaximumBatchSize()
{
$this->batchMessage->setFromAddress('samples@mailgun.org', ['first' => 'Test', 'last' => 'User']);
$this->batchMessage->setSubject('This is the subject of the message!');
$this->batchMessage->setTextBody('This is the text body of the message!');
for ($i = 0; $i < 1001; ++$i) {
$this->batchMessage->addToRecipient("$i@samples.mailgun.org", ['first' => 'Test', 'last' => "User $i"]);
}
$message = NSA::getProperty($this->batchMessage, 'message');
$this->assertEquals(1, count($message['to']));
}
public function testAttributeResetOnEndBatchMessage()
{
$this->batchMessage->addToRecipient('test-user@samples.mailgun.org', ['first' => 'Test', 'last' => 'User']);
$this->batchMessage->setFromAddress('samples@mailgun.org', ['first' => 'Test', 'last' => 'User']);
$this->batchMessage->setSubject('This is the subject of the message!');
$this->batchMessage->setTextBody('This is the text body of the message!');
$this->batchMessage->finalize();
$message = NSA::getProperty($this->batchMessage, 'message');
$this->assertTrue(true, empty($message));
}
public function testDefaultIDInVariables()
{
$this->batchMessage->addToRecipient('test-to@samples.mailgun.org');
$this->batchMessage->addCcRecipient('test-cc@samples.mailgun.org');
$attributes = NSA::getProperty($this->batchMessage, 'batchRecipientAttributes');
$this->assertEquals('to_1', $attributes['test-to@samples.mailgun.org']['id']);
$this->assertEquals('cc_1', $attributes['test-cc@samples.mailgun.org']['id']);
}
public function testGetMessageIds()
{
$this->batchMessage->addToRecipient('test-user@samples.mailgun.org', ['first' => 'Test', 'last' => 'User']);
$this->batchMessage->setFromAddress('samples@mailgun.org', ['first' => 'Test', 'last' => 'User']);
$this->batchMessage->setSubject('This is the subject of the message!');
$this->batchMessage->setTextBody('This is the text body of the message!');
$this->batchMessage->finalize();
$this->assertEquals(['4711'], $this->batchMessage->getMessageIds());
}
public function testInvalidMissingRequiredMIMEParametersExceptionGetsFlungNoFrom()
{
$this->batchMessage->addToRecipient('test-user@samples.mailgun.org', ['first' => 'Test', 'last' => 'User']);
$this->batchMessage->setSubject('This is the subject of the message!');
$this->batchMessage->setTextBody('This is the text body of the message!');
$this->setExpectedException(MissingRequiredParameter::class);
$this->batchMessage->finalize();
}
public function testInvalidMissingRequiredMIMEParametersExceptionGetsFlungNoTo()
{
$this->batchMessage->setFromAddress('samples@mailgun.org', ['first' => 'Test', 'last' => 'User']);
$this->batchMessage->setSubject('This is the subject of the message!');
$this->batchMessage->setTextBody('This is the text body of the message!');
$this->setExpectedException(MissingRequiredParameter::class);
$this->batchMessage->finalize();
}
public function testInvalidMissingRequiredMIMEParametersExceptionGetsFlungNoSubject()
{
$this->batchMessage->addToRecipient('test-user@samples.mailgun.org', ['first' => 'Test', 'last' => 'User']);
$this->batchMessage->setFromAddress('samples@mailgun.org', ['first' => 'Test', 'last' => 'User']);
$this->batchMessage->setTextBody('This is the text body of the message!');
$this->setExpectedException(MissingRequiredParameter::class);
$this->batchMessage->finalize();
}
public function testInvalidMissingRequiredMIMEParametersExceptionGetsFlungNoTextOrHtml()
{
$this->batchMessage->addToRecipient('test-user@samples.mailgun.org', ['first' => 'Test', 'last' => 'User']);
$this->batchMessage->setFromAddress('samples@mailgun.org', ['first' => 'Test', 'last' => 'User']);
$this->batchMessage->setSubject('This is the subject of the message!');
$this->setExpectedException(MissingRequiredParameter::class);
$this->batchMessage->finalize();
}
}

View File

@ -0,0 +1,340 @@
<?php
/*
* Copyright (C) 2013 Mailgun
*
* This software may be modified and distributed under the terms
* of the MIT license. See the LICENSE file for details.
*/
namespace Mailgun\Tests\Message;
use Mailgun\Message\MessageBuilder;
use Nyholm\NSA;
class MessageBuilderTest extends \PHPUnit_Framework_TestCase
{
/**
* @var MessageBuilder
*/
private $messageBuilder;
public function setUp()
{
$this->messageBuilder = new MessageBuilder();
}
public function testBlankInstantiation()
{
$message = $this->messageBuilder->getMessage();
$this->assertTrue(is_array($message));
}
public function testCountersSetToZero()
{
$counters = NSA::getProperty($this->messageBuilder, 'counters');
$this->assertEquals(0, $counters['recipients']['to']);
$this->assertEquals(0, $counters['recipients']['cc']);
$this->assertEquals(0, $counters['recipients']['bcc']);
$this->assertEquals(0, $counters['attributes']['attachment']);
$this->assertEquals(0, $counters['attributes']['campaign_id']);
$this->assertEquals(0, $counters['attributes']['custom_option']);
$this->assertEquals(0, $counters['attributes']['tag']);
}
public function testAddToRecipient()
{
$this->messageBuilder->addToRecipient('test@samples.mailgun.org', ['first' => 'Test', 'last' => 'User']);
$message = $this->messageBuilder->getMessage();
$this->assertEquals(['to' => ['"Test User" <test@samples.mailgun.org>']], $message);
}
public function testAddCcRecipient()
{
$this->messageBuilder->addCcRecipient('test@samples.mailgun.org', ['first' => 'Test', 'last' => 'User']);
$message = $this->messageBuilder->getMessage();
$this->assertEquals(['cc' => ['"Test User" <test@samples.mailgun.org>']], $message);
}
public function testAddBccRecipient()
{
$this->messageBuilder->addBccRecipient('test@samples.mailgun.org', ['first' => 'Test', 'last' => 'User']);
$message = $this->messageBuilder->getMessage();
$this->assertEquals(['bcc' => ['"Test User" <test@samples.mailgun.org>']], $message);
}
public function testToRecipientCount()
{
$this->messageBuilder->addToRecipient('test-user@samples.mailgun.org', ['first' => 'Test', 'last' => 'User']);
$array = NSA::getProperty($this->messageBuilder, 'counters');
$this->assertEquals(1, $array['recipients']['to']);
}
public function testCcRecipientCount()
{
$this->messageBuilder->addCcRecipient('test-user@samples.mailgun.org', ['first' => 'Test', 'last' => 'User']);
$array = NSA::getProperty($this->messageBuilder, 'counters');
$this->assertEquals(1, $array['recipients']['cc']);
}
public function testBccRecipientCount()
{
$this->messageBuilder->addBccRecipient('test-user@samples.mailgun.org', ['first' => 'Test', 'last' => 'User']);
$array = NSA::getProperty($this->messageBuilder, 'counters');
$this->assertEquals(1, $array['recipients']['bcc']);
}
public function testSetFromAddress()
{
$this->messageBuilder->setFromAddress('test@samples.mailgun.org', ['first' => 'Test', 'last' => 'User']);
$message = $this->messageBuilder->getMessage();
$this->assertEquals(['from' => ['"Test User" <test@samples.mailgun.org>']], $message);
}
public function testSetReplyTo()
{
$this->messageBuilder->setReplyToAddress('overwritten@samples.mailgun.org');
$this->messageBuilder->setReplyToAddress('test@samples.mailgun.org', ['first' => 'Test', 'last' => 'User']);
$message = $this->messageBuilder->getMessage();
$this->assertEquals(['h:reply-to' => '"Test User" <test@samples.mailgun.org>'], $message);
}
public function testSetSubject()
{
$this->messageBuilder->setSubject('Test Subject');
$message = $this->messageBuilder->getMessage();
$this->assertEquals(['subject' => 'Test Subject'], $message);
}
public function testAddCustomHeader()
{
$this->messageBuilder->addCustomHeader('My-Header', '123');
$message = $this->messageBuilder->getMessage();
$this->assertEquals(['h:My-Header' => '123'], $message);
}
public function testAddMultipleCustomHeader()
{
$this->messageBuilder->addCustomHeader('My-Header', '123');
$this->messageBuilder->addCustomHeader('My-Header', '456');
$message = $this->messageBuilder->getMessage();
$this->assertEquals(['h:My-Header' => ['123', '456']], $message);
}
public function testSetTextBody()
{
$this->messageBuilder->setTextBody('This is the text body!');
$message = $this->messageBuilder->getMessage();
$this->assertEquals(['text' => 'This is the text body!'], $message);
}
public function testSetHtmlBody()
{
$this->messageBuilder->setHtmlBody('<html><body>This is an awesome email</body></html>');
$message = $this->messageBuilder->getMessage();
$this->assertEquals(['html' => '<html><body>This is an awesome email</body></html>'], $message);
}
public function testAddAttachments()
{
$this->messageBuilder->addAttachment('@../TestAssets/mailgun_icon.png');
$this->messageBuilder->addAttachment('@../TestAssets/rackspace_logo.png');
$message = $this->messageBuilder->getMessage();
$this->assertEquals(
[
[
'filePath' => '@../TestAssets/mailgun_icon.png',
'remoteName' => null,
],
[
'filePath' => '@../TestAssets/rackspace_logo.png',
'remoteName' => null,
],
],
$message['attachment']
);
}
public function testAddInlineImages()
{
$this->messageBuilder->addInlineImage('@../TestAssets/mailgun_icon.png');
$this->messageBuilder->addInlineImage('@../TestAssets/rackspace_logo.png');
$message = $this->messageBuilder->getMessage();
$this->assertEquals(
[
[
'filePath' => '@../TestAssets/mailgun_icon.png',
'remoteName' => null,
],
[
'filePath' => '@../TestAssets/rackspace_logo.png',
'remoteName' => null,
],
],
$message['inline']
);
}
public function testAddAttachmentsPostName()
{
$this->messageBuilder->addAttachment('@../TestAssets/mailgun_icon.png', 'mg_icon.png');
$this->messageBuilder->addAttachment('@../TestAssets/rackspace_logo.png', 'rs_logo.png');
$message = $this->messageBuilder->getMessage();
$this->assertEquals(
[
[
'filePath' => '@../TestAssets/mailgun_icon.png',
'remoteName' => 'mg_icon.png',
],
[
'filePath' => '@../TestAssets/rackspace_logo.png',
'remoteName' => 'rs_logo.png',
],
],
$message['attachment']
);
}
public function testAddInlineImagePostName()
{
$this->messageBuilder->addInlineImage('@../TestAssets/mailgun_icon.png', 'mg_icon.png');
$this->messageBuilder->addInlineImage('@../TestAssets/rackspace_logo.png', 'rs_logo.png');
$message = $this->messageBuilder->getMessage();
$this->assertEquals(
[
[
'filePath' => '@../TestAssets/mailgun_icon.png',
'remoteName' => 'mg_icon.png',
],
[
'filePath' => '@../TestAssets/rackspace_logo.png',
'remoteName' => 'rs_logo.png',
],
],
$message['inline']
);
}
public function testSetTestMode()
{
$this->messageBuilder->setTestMode(true);
$message = $this->messageBuilder->getMessage();
$this->assertEquals(['o:testmode' => 'yes'], $message);
$this->messageBuilder->setTestMode(false);
$message = $this->messageBuilder->getMessage();
$this->assertEquals(['o:testmode' => 'no'], $message);
$this->messageBuilder->setTestMode('yes');
$message = $this->messageBuilder->getMessage();
$this->assertEquals(['o:testmode' => 'yes'], $message);
$this->messageBuilder->setTestMode('no');
$message = $this->messageBuilder->getMessage();
$this->assertEquals(['o:testmode' => 'no'], $message);
}
public function testAddCampaignId()
{
$this->messageBuilder->addCampaignId('ABC123');
$this->messageBuilder->addCampaignId('XYZ987');
$this->messageBuilder->addCampaignId('TUV456');
$message = $this->messageBuilder->getMessage();
$this->assertEquals(['o:campaign' => ['ABC123', 'XYZ987', 'TUV456']], $message);
}
public function testAddCampaignIdInteger()
{
$this->messageBuilder->addCampaignId(1111);
$this->messageBuilder->addCampaignId(2222);
$message = $this->messageBuilder->getMessage();
$this->assertSame(['o:campaign' => ['1111', '2222']], $message);
}
public function testSetDkim()
{
$this->messageBuilder->setDkim(true);
$message = $this->messageBuilder->getMessage();
$this->assertEquals(['o:dkim' => 'yes'], $message);
$this->messageBuilder->setDkim(false);
$message = $this->messageBuilder->getMessage();
$this->assertEquals(['o:dkim' => 'no'], $message);
$this->messageBuilder->setDkim('yes');
$message = $this->messageBuilder->getMessage();
$this->assertEquals(['o:dkim' => 'yes'], $message);
$this->messageBuilder->setDkim('no');
$message = $this->messageBuilder->getMessage();
$this->assertEquals(['o:dkim' => 'no'], $message);
}
public function testSetClickTracking()
{
$this->messageBuilder->setClickTracking(true);
$message = $this->messageBuilder->getMessage();
$this->assertEquals(['o:tracking-clicks' => 'yes'], $message);
$this->messageBuilder->setClickTracking(false);
$message = $this->messageBuilder->getMessage();
$this->assertEquals(['o:tracking-clicks' => 'no'], $message);
$this->messageBuilder->setClickTracking('yes');
$message = $this->messageBuilder->getMessage();
$this->assertEquals(['o:tracking-clicks' => 'yes'], $message);
$this->messageBuilder->setClickTracking('no');
$message = $this->messageBuilder->getMessage();
$this->assertEquals(['o:tracking-clicks' => 'no'], $message);
}
public function testSetOpenTracking()
{
$this->messageBuilder->setOpenTracking(true);
$message = $this->messageBuilder->getMessage();
$this->assertEquals(['o:tracking-opens' => 'yes'], $message);
$this->messageBuilder->setOpenTracking(false);
$message = $this->messageBuilder->getMessage();
$this->assertEquals(['o:tracking-opens' => 'no'], $message);
$this->messageBuilder->setOpenTracking('yes');
$message = $this->messageBuilder->getMessage();
$this->assertEquals(['o:tracking-opens' => 'yes'], $message);
$this->messageBuilder->setOpenTracking('no');
$message = $this->messageBuilder->getMessage();
$this->assertEquals(['o:tracking-opens' => 'no'], $message);
}
public function testSetDeliveryTime()
{
$this->messageBuilder->setDeliveryTime('January 15, 2014 8:00AM', 'CST');
$message = $this->messageBuilder->getMessage();
$this->assertEquals(['o:deliverytime' => 'Wed, 15 Jan 2014 08:00:00 -0600'], $message);
$this->messageBuilder->setDeliveryTime('January 15, 2014 8:00AM', 'UTC');
$message = $this->messageBuilder->getMessage();
$this->assertEquals(['o:deliverytime' => 'Wed, 15 Jan 2014 08:00:00 +0000'], $message);
$this->messageBuilder->setDeliveryTime('January 15, 2014 8:00AM');
$message = $this->messageBuilder->getMessage();
$this->assertEquals(['o:deliverytime' => 'Wed, 15 Jan 2014 08:00:00 +0000'], $message);
$this->messageBuilder->setDeliveryTime('1/15/2014 13:50:01', 'CDT');
$message = $this->messageBuilder->getMessage();
$this->assertEquals(['o:deliverytime' => 'Wed, 15 Jan 2014 13:50:01 -0600'], $message);
}
public function testAddCustomData()
{
$this->messageBuilder->addCustomData('My-Super-Awesome-Data', ['What' => 'Mailgun Rocks!']);
$message = $this->messageBuilder->getMessage();
$this->assertEquals(['v:My-Super-Awesome-Data' => '{"What":"Mailgun Rocks!"}'], $message);
}
public function testAddCustomParameter()
{
$this->messageBuilder->addCustomParameter('my-option', 'yes');
$this->messageBuilder->addCustomParameter('o:my-other-option', 'no');
$message = $this->messageBuilder->getMessage();
$this->assertEquals(['my-option' => ['yes'], 'o:my-other-option' => ['no']], $message);
}
public function testSetMessage()
{
$message = [1, 2, 3, 4, 5];
$this->messageBuilder->setMessage($message);
$this->assertEquals($message, $this->messageBuilder->getMessage());
}
}

View File

@ -9,6 +9,7 @@
namespace Mailgun\Tests\Messages; namespace Mailgun\Tests\Messages;
use Http\Client\HttpClient;
use Mailgun\Connection\RestClient; use Mailgun\Connection\RestClient;
use Mailgun\Tests\Mock\Mailgun; use Mailgun\Tests\Mock\Mailgun;