diff --git a/Tests/Transport/MailgunApiTransportTest.php b/Tests/Transport/MailgunApiTransportTest.php index f30fa02..b4d2356 100644 --- a/Tests/Transport/MailgunApiTransportTest.php +++ b/Tests/Transport/MailgunApiTransportTest.php @@ -12,10 +12,14 @@ namespace Symfony\Component\Mailer\Bridge\Mailgun\Tests\Transport; use PHPUnit\Framework\TestCase; +use Symfony\Component\HttpClient\MockHttpClient; +use Symfony\Component\HttpClient\Response\MockResponse; use Symfony\Component\Mailer\Bridge\Mailgun\Transport\MailgunApiTransport; use Symfony\Component\Mailer\Envelope; +use Symfony\Component\Mailer\Exception\HttpTransportException; use Symfony\Component\Mime\Address; use Symfony\Component\Mime\Email; +use Symfony\Contracts\HttpClient\ResponseInterface; class MailgunApiTransportTest extends TestCase { @@ -64,4 +68,67 @@ public function testCustomHeader() $this->assertArrayHasKey('h:x-mailgun-variables', $payload); $this->assertEquals($json, $payload['h:x-mailgun-variables']); } + + public function testSend() + { + $client = new MockHttpClient(function (string $method, string $url, array $options): ResponseInterface { + $this->assertSame('POST', $method); + $this->assertSame('https://api.us-east-1.mailgun.net:8984/v3/symfony/messages', $url); + $this->assertStringContainsString('Basic YXBpOkFDQ0VTU19LRVk=', $options['headers'][2] ?? $options['request_headers'][1]); + + $content = ''; + while ($chunk = $options['body']()) { + $content .= $chunk; + } + + $this->assertStringContainsString('Hello!', $content); + $this->assertStringContainsString('Saif Eddin ', $content); + $this->assertStringContainsString('Fabien ', $content); + $this->assertStringContainsString('Hello There!', $content); + + return new MockResponse(json_encode(['id' => 'foobar']), [ + 'http_code' => 200, + ]); + }); + $transport = new MailgunApiTransport('ACCESS_KEY', 'symfony', 'us-east-1', $client); + $transport->setPort(8984); + + $mail = new Email(); + $mail->subject('Hello!') + ->to(new Address('saif.gmati@symfony.com', 'Saif Eddin')) + ->from(new Address('fabpot@symfony.com', 'Fabien')) + ->text('Hello There!'); + + $message = $transport->send($mail); + + $this->assertSame('foobar', $message->getMessageId()); + } + + public function testSendThrowsForErrorResponse() + { + $client = new MockHttpClient(function (string $method, string $url, array $options): ResponseInterface { + $this->assertSame('POST', $method); + $this->assertSame('https://api.mailgun.net:8984/v3/symfony/messages', $url); + $this->assertStringContainsStringIgnoringCase('Authorization: Basic YXBpOkFDQ0VTU19LRVk=', $options['headers'][2] ?? $options['request_headers'][1]); + + return new MockResponse(json_encode(['message' => 'i\'m a teapot']), [ + 'http_code' => 418, + 'response_headers' => [ + 'content-type' => 'application/json', + ], + ]); + }); + $transport = new MailgunApiTransport('ACCESS_KEY', 'symfony', 'us', $client); + $transport->setPort(8984); + + $mail = new Email(); + $mail->subject('Hello!') + ->to(new Address('saif.gmati@symfony.com', 'Saif Eddin')) + ->from(new Address('fabpot@symfony.com', 'Fabien')) + ->text('Hello There!'); + + $this->expectException(HttpTransportException::class); + $this->expectExceptionMessage('Unable to send an email: i\'m a teapot (code 418).'); + $transport->send($mail); + } } diff --git a/Tests/Transport/MailgunHttpTransportTest.php b/Tests/Transport/MailgunHttpTransportTest.php index 9b57b2b..a50f1ff 100644 --- a/Tests/Transport/MailgunHttpTransportTest.php +++ b/Tests/Transport/MailgunHttpTransportTest.php @@ -12,7 +12,13 @@ namespace Symfony\Component\Mailer\Bridge\Mailgun\Tests\Transport; use PHPUnit\Framework\TestCase; +use Symfony\Component\HttpClient\MockHttpClient; +use Symfony\Component\HttpClient\Response\MockResponse; use Symfony\Component\Mailer\Bridge\Mailgun\Transport\MailgunHttpTransport; +use Symfony\Component\Mailer\Exception\HttpTransportException; +use Symfony\Component\Mime\Address; +use Symfony\Component\Mime\Email; +use Symfony\Contracts\HttpClient\ResponseInterface; class MailgunHttpTransportTest extends TestCase { @@ -45,4 +51,67 @@ public function getTransportData() ], ]; } + + public function testSend() + { + $client = new MockHttpClient(function (string $method, string $url, array $options): ResponseInterface { + $this->assertSame('POST', $method); + $this->assertSame('https://api.us-east-1.mailgun.net:8984/v3/symfony/messages.mime', $url); + $this->assertStringContainsString('Basic YXBpOkFDQ0VTU19LRVk=', $options['headers'][2] ?? $options['request_headers'][1]); + + $content = ''; + while ($chunk = $options['body']()) { + $content .= $chunk; + } + + $this->assertStringContainsString('Subject: Hello!', $content); + $this->assertStringContainsString('To: Saif Eddin ', $content); + $this->assertStringContainsString('From: Fabien ', $content); + $this->assertStringContainsString('Hello There!', $content); + + return new MockResponse(json_encode(['id' => 'foobar']), [ + 'http_code' => 200, + ]); + }); + $transport = new MailgunHttpTransport('ACCESS_KEY', 'symfony', 'us-east-1', $client); + $transport->setPort(8984); + + $mail = new Email(); + $mail->subject('Hello!') + ->to(new Address('saif.gmati@symfony.com', 'Saif Eddin')) + ->from(new Address('fabpot@symfony.com', 'Fabien')) + ->text('Hello There!'); + + $message = $transport->send($mail); + + $this->assertSame('foobar', $message->getMessageId()); + } + + public function testSendThrowsForErrorResponse() + { + $client = new MockHttpClient(function (string $method, string $url, array $options): ResponseInterface { + $this->assertSame('POST', $method); + $this->assertSame('https://api.mailgun.net:8984/v3/symfony/messages.mime', $url); + $this->assertStringContainsString('Basic YXBpOkFDQ0VTU19LRVk=', $options['headers'][2] ?? $options['request_headers'][1]); + + return new MockResponse(json_encode(['message' => 'i\'m a teapot']), [ + 'http_code' => 418, + 'response_headers' => [ + 'content-type' => 'application/json', + ], + ]); + }); + $transport = new MailgunHttpTransport('ACCESS_KEY', 'symfony', 'us', $client); + $transport->setPort(8984); + + $mail = new Email(); + $mail->subject('Hello!') + ->to(new Address('saif.gmati@symfony.com', 'Saif Eddin')) + ->from(new Address('fabpot@symfony.com', 'Fabien')) + ->text('Hello There!'); + + $this->expectException(HttpTransportException::class); + $this->expectExceptionMessage('Unable to send an email: i\'m a teapot (code 418).'); + $transport->send($mail); + } }