From 8e566ef84dabe1e7c513b00641d361f2a0c98006 Mon Sep 17 00:00:00 2001 From: Oskar Stark Date: Wed, 9 Dec 2020 13:58:17 +0100 Subject: [PATCH] [Notifier] [Nexmo] Add tests --- .../Bridge/Nexmo/NexmoTransportFactory.php | 17 ++-- .../Nexmo/Tests/NexmoTransportFactoryTest.php | 83 +++++++++++++++++++ .../Bridge/Nexmo/Tests/NexmoTransportTest.php | 51 ++++++++++++ .../Notifier/Bridge/Nexmo/composer.json | 2 +- .../Notifier/Bridge/Nexmo/phpunit.xml.dist | 31 +++++++ 5 files changed, 178 insertions(+), 6 deletions(-) create mode 100644 src/Symfony/Component/Notifier/Bridge/Nexmo/Tests/NexmoTransportFactoryTest.php create mode 100644 src/Symfony/Component/Notifier/Bridge/Nexmo/Tests/NexmoTransportTest.php create mode 100644 src/Symfony/Component/Notifier/Bridge/Nexmo/phpunit.xml.dist diff --git a/src/Symfony/Component/Notifier/Bridge/Nexmo/NexmoTransportFactory.php b/src/Symfony/Component/Notifier/Bridge/Nexmo/NexmoTransportFactory.php index 487e73343c..b6fadbd57d 100644 --- a/src/Symfony/Component/Notifier/Bridge/Nexmo/NexmoTransportFactory.php +++ b/src/Symfony/Component/Notifier/Bridge/Nexmo/NexmoTransportFactory.php @@ -11,6 +11,7 @@ namespace Symfony\Component\Notifier\Bridge\Nexmo; +use Symfony\Component\Notifier\Exception\IncompleteDsnException; use Symfony\Component\Notifier\Exception\UnsupportedSchemeException; use Symfony\Component\Notifier\Transport\AbstractTransportFactory; use Symfony\Component\Notifier\Transport\Dsn; @@ -29,17 +30,23 @@ final class NexmoTransportFactory extends AbstractTransportFactory public function create(Dsn $dsn): TransportInterface { $scheme = $dsn->getScheme(); + + if ('nexmo' !== $scheme) { + throw new UnsupportedSchemeException($dsn, 'nexmo', $this->getSupportedSchemes()); + } + $apiKey = $this->getUser($dsn); $apiSecret = $this->getPassword($dsn); $from = $dsn->getOption('from'); + + if (!$from) { + throw new IncompleteDsnException('Missing from.', $dsn->getOriginalDsn()); + } + $host = 'default' === $dsn->getHost() ? null : $dsn->getHost(); $port = $dsn->getPort(); - if ('nexmo' === $scheme) { - return (new NexmoTransport($apiKey, $apiSecret, $from, $this->client, $this->dispatcher))->setHost($host)->setPort($port); - } - - throw new UnsupportedSchemeException($dsn, 'nexmo', $this->getSupportedSchemes()); + return (new NexmoTransport($apiKey, $apiSecret, $from, $this->client, $this->dispatcher))->setHost($host)->setPort($port); } protected function getSupportedSchemes(): array diff --git a/src/Symfony/Component/Notifier/Bridge/Nexmo/Tests/NexmoTransportFactoryTest.php b/src/Symfony/Component/Notifier/Bridge/Nexmo/Tests/NexmoTransportFactoryTest.php new file mode 100644 index 0000000000..ab94043055 --- /dev/null +++ b/src/Symfony/Component/Notifier/Bridge/Nexmo/Tests/NexmoTransportFactoryTest.php @@ -0,0 +1,83 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Notifier\Bridge\Nexmo\Tests; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\Notifier\Bridge\Nexmo\NexmoTransportFactory; +use Symfony\Component\Notifier\Exception\IncompleteDsnException; +use Symfony\Component\Notifier\Exception\UnsupportedSchemeException; +use Symfony\Component\Notifier\Transport\Dsn; + +final class NexmoTransportFactoryTest extends TestCase +{ + public function testCreateWithDsn() + { + $factory = $this->createFactory(); + + $dsn = 'nexmo://apiKey:apiSecret@default?from=0611223344'; + $transport = $factory->create(Dsn::fromString($dsn)); + $transport->setHost('host.test'); + + $this->assertSame('nexmo://host.test?from=0611223344', (string) $transport); + } + + public function testCreateWithMissingOptionFromThrowsIncompleteDsnException() + { + $factory = $this->createFactory(); + + $this->expectException(IncompleteDsnException::class); + + $dsnIncomplete = 'nexmo://apiKey:apiSecret@default'; + $factory->create(Dsn::fromString($dsnIncomplete)); + } + + public function testSupportsReturnsTrueWithSupportedScheme() + { + $factory = $this->createFactory(); + + $dsn = 'nexmo://apiKey:apiSecret@default?from=0611223344'; + $this->assertTrue($factory->supports(Dsn::fromString($dsn))); + } + + public function testSupportsReturnsFalseWithUnsupportedScheme() + { + $factory = $this->createFactory(); + + $dsnUnsupported = 'nexmoo://apiKey:apiSecret@default?from=0611223344'; + $this->assertFalse($factory->supports(Dsn::fromString($dsnUnsupported))); + } + + public function testUnsupportedSchemeThrowsUnsupportedSchemeException() + { + $factory = $this->createFactory(); + + $this->expectException(UnsupportedSchemeException::class); + + $dsnUnsupported = 'nexmoo://apiKey:apiSecret@default?from=0611223344'; + $factory->create(Dsn::fromString($dsnUnsupported)); + } + + public function testUnsupportedSchemeThrowsUnsupportedSchemeExceptionEvenIfRequiredOptionIsMissing() + { + $factory = $this->createFactory(); + + $this->expectException(UnsupportedSchemeException::class); + + // unsupported scheme and missing "from" option + $factory->create(Dsn::fromString('nexmoo://apiKey:apiSecret@default')); + } + + private function createFactory(): NexmoTransportFactory + { + return new NexmoTransportFactory(); + } +} diff --git a/src/Symfony/Component/Notifier/Bridge/Nexmo/Tests/NexmoTransportTest.php b/src/Symfony/Component/Notifier/Bridge/Nexmo/Tests/NexmoTransportTest.php new file mode 100644 index 0000000000..6e4c21a28d --- /dev/null +++ b/src/Symfony/Component/Notifier/Bridge/Nexmo/Tests/NexmoTransportTest.php @@ -0,0 +1,51 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Notifier\Bridge\Nexmo\Tests; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\Notifier\Bridge\Nexmo\NexmoTransport; +use Symfony\Component\Notifier\Exception\LogicException; +use Symfony\Component\Notifier\Message\MessageInterface; +use Symfony\Component\Notifier\Message\SmsMessage; +use Symfony\Contracts\HttpClient\HttpClientInterface; + +final class NexmoTransportTest extends TestCase +{ + public function testToStringContainsProperties() + { + $transport = $this->createTransport(); + + $this->assertSame('nexmo://host.test?from=sender', (string) $transport); + } + + public function testSupportsMessageInterface() + { + $transport = $this->createTransport(); + + $this->assertTrue($transport->supports(new SmsMessage('0611223344', 'Hello!'))); + $this->assertFalse($transport->supports($this->createMock(MessageInterface::class))); + } + + public function testSendNonSmsMessageThrowsException() + { + $transport = $this->createTransport(); + + $this->expectException(LogicException::class); + + $transport->send($this->createMock(MessageInterface::class)); + } + + private function createTransport(): NexmoTransport + { + return (new NexmoTransport('apiKey', 'apiSecret', 'sender', $this->createMock(HttpClientInterface::class)))->setHost('host.test'); + } +} diff --git a/src/Symfony/Component/Notifier/Bridge/Nexmo/composer.json b/src/Symfony/Component/Notifier/Bridge/Nexmo/composer.json index 72b030f197..a924a1fdd7 100644 --- a/src/Symfony/Component/Notifier/Bridge/Nexmo/composer.json +++ b/src/Symfony/Component/Notifier/Bridge/Nexmo/composer.json @@ -18,7 +18,7 @@ "require": { "php": ">=7.2.5", "symfony/http-client": "^4.3|^5.0", - "symfony/notifier": "^5.0,<5.2" + "symfony/notifier": "~5.1.0" }, "autoload": { "psr-4": { "Symfony\\Component\\Notifier\\Bridge\\Nexmo\\": "" }, diff --git a/src/Symfony/Component/Notifier/Bridge/Nexmo/phpunit.xml.dist b/src/Symfony/Component/Notifier/Bridge/Nexmo/phpunit.xml.dist new file mode 100644 index 0000000000..83cdbf8e8c --- /dev/null +++ b/src/Symfony/Component/Notifier/Bridge/Nexmo/phpunit.xml.dist @@ -0,0 +1,31 @@ + + + + + + + + + + ./Tests/ + + + + + + ./ + + ./Resources + ./Tests + ./vendor + + + +