From e5e2cd4b9f401994af6b80f75879197fd21a1426 Mon Sep 17 00:00:00 2001 From: Oskar Stark Date: Fri, 22 Jan 2021 08:29:46 +0100 Subject: [PATCH] [Notifier] [Mobyt] Change ctor signature and validate message types --- .../Notifier/Bridge/Mobyt/CHANGELOG.md | 1 + .../Notifier/Bridge/Mobyt/MobytOptions.php | 16 ++++++++ .../Notifier/Bridge/Mobyt/MobytTransport.php | 14 +++++-- .../Bridge/Mobyt/MobytTransportFactory.php | 2 +- .../Component/Notifier/Bridge/Mobyt/README.md | 2 +- .../Bridge/Mobyt/Tests/MobytOptionsTest.php | 39 +++++++++++++++++-- 6 files changed, 65 insertions(+), 9 deletions(-) diff --git a/src/Symfony/Component/Notifier/Bridge/Mobyt/CHANGELOG.md b/src/Symfony/Component/Notifier/Bridge/Mobyt/CHANGELOG.md index 91b7e5fb62ef8..e63a4859e5433 100644 --- a/src/Symfony/Component/Notifier/Bridge/Mobyt/CHANGELOG.md +++ b/src/Symfony/Component/Notifier/Bridge/Mobyt/CHANGELOG.md @@ -5,6 +5,7 @@ CHANGELOG --- * The bridge is not marked as `@experimental` anymore + * Validate message types 5.2.0 ----- diff --git a/src/Symfony/Component/Notifier/Bridge/Mobyt/MobytOptions.php b/src/Symfony/Component/Notifier/Bridge/Mobyt/MobytOptions.php index 695e50fe871fe..426990dff5fa0 100644 --- a/src/Symfony/Component/Notifier/Bridge/Mobyt/MobytOptions.php +++ b/src/Symfony/Component/Notifier/Bridge/Mobyt/MobytOptions.php @@ -11,6 +11,7 @@ namespace Symfony\Component\Notifier\Bridge\Mobyt; +use Symfony\Component\Notifier\Exception\InvalidArgumentException; use Symfony\Component\Notifier\Message\MessageOptionsInterface; use Symfony\Component\Notifier\Notification\Notification; @@ -27,6 +28,10 @@ final class MobytOptions implements MessageOptionsInterface public function __construct(array $options = []) { + if (isset($options['message_type'])) { + self::validateMessageType($options['message_type']); + } + $this->options = $options; } @@ -66,6 +71,17 @@ public function getRecipientId(): ?string public function messageType(string $type) { + self::validateMessageType($type); + $this->options['message_type'] = $type; } + + public static function validateMessageType($type): string + { + if (!\in_array($type, $supported = [self::MESSAGE_TYPE_QUALITY_HIGH, self::MESSAGE_TYPE_QUALITY_MEDIUM, self::MESSAGE_TYPE_QUALITY_LOW], true)) { + throw new InvalidArgumentException(sprintf('The message type "%s" is not supported; supported message types are: "%s"', $type, implode('", "', $supported))); + } + + return $type; + } } diff --git a/src/Symfony/Component/Notifier/Bridge/Mobyt/MobytTransport.php b/src/Symfony/Component/Notifier/Bridge/Mobyt/MobytTransport.php index 4e2ec1d94390d..ee0d4efa4a902 100644 --- a/src/Symfony/Component/Notifier/Bridge/Mobyt/MobytTransport.php +++ b/src/Symfony/Component/Notifier/Bridge/Mobyt/MobytTransport.php @@ -33,11 +33,15 @@ final class MobytTransport extends AbstractTransport private $from; private $typeQuality; - public function __construct(string $accountSid, string $authToken, string $from, string $typeQuality, HttpClientInterface $client = null, EventDispatcherInterface $dispatcher = null) + public function __construct(string $accountSid, string $authToken, string $from, string $typeQuality = null, HttpClientInterface $client = null, EventDispatcherInterface $dispatcher = null) { $this->accountSid = $accountSid; $this->authToken = $authToken; $this->from = $from; + + $typeQuality = $typeQuality ?? MobytOptions::MESSAGE_TYPE_QUALITY_LOW; + MobytOptions::validateMessageType($typeQuality); + $this->typeQuality = $typeQuality; parent::__construct($client, $dispatcher); @@ -77,14 +81,16 @@ protected function doSend(MessageInterface $message): SentMessage 'user_key: '.$this->accountSid, 'Access_token: '.$this->authToken, ], - 'body' => json_encode(array_filter($options)), + 'json' => array_filter($options), ]); - if (401 === $response->getStatusCode() || 404 === $response->getStatusCode()) { + $statusCode = $response->getStatusCode(); + + if (401 === $statusCode || 404 === $statusCode) { throw new TransportException(sprintf('Unable to send the SMS: "%s". Check your credentials.', $message->getSubject()), $response); } - if (201 !== $response->getStatusCode()) { + if (201 !== $statusCode) { $error = $response->toArray(false); throw new TransportException(sprintf('Unable to send the SMS: "%s".', $error['result']), $response); diff --git a/src/Symfony/Component/Notifier/Bridge/Mobyt/MobytTransportFactory.php b/src/Symfony/Component/Notifier/Bridge/Mobyt/MobytTransportFactory.php index 6bbc4ccb81537..9f352f8f44873 100644 --- a/src/Symfony/Component/Notifier/Bridge/Mobyt/MobytTransportFactory.php +++ b/src/Symfony/Component/Notifier/Bridge/Mobyt/MobytTransportFactory.php @@ -35,7 +35,7 @@ public function create(Dsn $dsn): TransportInterface $accountSid = $this->getUser($dsn); $authToken = $this->getPassword($dsn); $from = $dsn->getRequiredOption('from'); - $typeQuality = $dsn->getOption('type_quality', MobytOptions::MESSAGE_TYPE_QUALITY_LOW); + $typeQuality = $dsn->getOption('type_quality'); $host = 'default' === $dsn->getHost() ? null : $dsn->getHost(); $port = $dsn->getPort(); diff --git a/src/Symfony/Component/Notifier/Bridge/Mobyt/README.md b/src/Symfony/Component/Notifier/Bridge/Mobyt/README.md index 0e556c1047103..60f696b23ad48 100644 --- a/src/Symfony/Component/Notifier/Bridge/Mobyt/README.md +++ b/src/Symfony/Component/Notifier/Bridge/Mobyt/README.md @@ -14,7 +14,7 @@ where: - `USER_KEY` is your Mobyt user key - `ACCESS_TOKEN` is your Mobyt access token - `FROM` is the sender - - `TYPE_QUALITY` is the quality : `N` for high, `L` for medium, `LL` for low (default: `L`) + - `TYPE_QUALITY` is the quality of your message: `N` for high, `L` for medium, `LL` for low (default: `L`) Resources --------- diff --git a/src/Symfony/Component/Notifier/Bridge/Mobyt/Tests/MobytOptionsTest.php b/src/Symfony/Component/Notifier/Bridge/Mobyt/Tests/MobytOptionsTest.php index a56f587324e0f..9d193ebf7100f 100644 --- a/src/Symfony/Component/Notifier/Bridge/Mobyt/Tests/MobytOptionsTest.php +++ b/src/Symfony/Component/Notifier/Bridge/Mobyt/Tests/MobytOptionsTest.php @@ -4,6 +4,7 @@ use PHPUnit\Framework\TestCase; use Symfony\Component\Notifier\Bridge\Mobyt\MobytOptions; +use Symfony\Component\Notifier\Exception\InvalidArgumentException; use Symfony\Component\Notifier\Notification\Notification; final class MobytOptionsTest extends TestCase @@ -64,11 +65,43 @@ public function testToArray() $this->assertEmpty($mobytOptions->toArray()); } - public function testMessageType() + /** + * @dataProvider validMessageTypes + */ + public function testMessageType(string $type) + { + $mobytOptions = new MobytOptions(); + $mobytOptions->messageType($type); + + $this->assertSame(['message_type' => $type], $mobytOptions->toArray()); + } + + public function validMessageTypes(): iterable + { + yield [MobytOptions::MESSAGE_TYPE_QUALITY_HIGH]; + yield [MobytOptions::MESSAGE_TYPE_QUALITY_MEDIUM]; + yield [MobytOptions::MESSAGE_TYPE_QUALITY_LOW]; + } + + public function testCallingMessageTypeMethodWithUnknownTypeThrowsInvalidArgumentException() { $mobytOptions = new MobytOptions(); - $mobytOptions->messageType('foo'); - $this->assertSame(['message_type' => 'foo'], $mobytOptions->toArray()); + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionMessage('The message type "foo-bar" is not supported; supported message types are: "N", "L", "LL"'); + + $mobytOptions->messageType('foo-bar'); + } + + public function testSettingMessageTypeViaConstructorWithUnknownTypeThrowsInvalidArgumentException() + { + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionMessage( + 'The message type "foo-bar" is not supported; supported message types are: "N", "L", "LL"' + ); + + new MobytOptions([ + 'message_type' => 'foo-bar', + ]); } }