From 95091a1ed2aacb96c01deca559c15916ea21dcea Mon Sep 17 00:00:00 2001 From: Camille Baronnet Date: Mon, 24 Apr 2023 13:05:43 +0200 Subject: [PATCH] [Notifier] [SpotHit] Support `smslong` and `smslongnbr` API parameters --- .../Notifier/Bridge/SpotHit/CHANGELOG.md | 5 ++ .../Notifier/Bridge/SpotHit/README.md | 4 +- .../Bridge/SpotHit/SpotHitTransport.php | 26 ++++++- .../SpotHit/SpotHitTransportFactory.php | 4 +- .../Tests/SpotHitTransportFactoryTest.php | 6 ++ .../SpotHit/Tests/SpotHitTransportTest.php | 72 +++++++++++++++++++ 6 files changed, 114 insertions(+), 3 deletions(-) diff --git a/src/Symfony/Component/Notifier/Bridge/SpotHit/CHANGELOG.md b/src/Symfony/Component/Notifier/Bridge/SpotHit/CHANGELOG.md index 5092c668a1f20..190646b71aca6 100644 --- a/src/Symfony/Component/Notifier/Bridge/SpotHit/CHANGELOG.md +++ b/src/Symfony/Component/Notifier/Bridge/SpotHit/CHANGELOG.md @@ -1,6 +1,11 @@ CHANGELOG ========= +6.4 +--- + + * Support `SMSLong` and `SMSLongNBr` API parameters + 6.2 --- diff --git a/src/Symfony/Component/Notifier/Bridge/SpotHit/README.md b/src/Symfony/Component/Notifier/Bridge/SpotHit/README.md index ae45ce40f1570..6d54ebdb3f2c7 100644 --- a/src/Symfony/Component/Notifier/Bridge/SpotHit/README.md +++ b/src/Symfony/Component/Notifier/Bridge/SpotHit/README.md @@ -6,12 +6,14 @@ Provides [Spot-Hit](https://www.spot-hit.fr/) integration for Symfony Notifier. #### DSN example ``` -SPOTHIT_DSN=spothit://TOKEN@default?from=FROM +SPOTHIT_DSN=spothit://TOKEN@default?from=FROM&smslong=SMSLONG&smslongnbr=SMSLONGNBR ``` where: - `TOKEN` is your Spot-Hit API key - `FROM` is the custom sender (3-11 letters, default is a 5 digits phone number) + - `SMSLONG` (optional) 0 or 1 : allows SMS messages longer than 160 characters + - `SMSLONGNBR` (optional) integer : allows to check the size of the long SMS sent. You must send the number of concatenated SMS as a value. If our counter indicates a different number, your message will be rejected. Resources --------- diff --git a/src/Symfony/Component/Notifier/Bridge/SpotHit/SpotHitTransport.php b/src/Symfony/Component/Notifier/Bridge/SpotHit/SpotHitTransport.php index 1f3434974cb43..7b10b60720322 100644 --- a/src/Symfony/Component/Notifier/Bridge/SpotHit/SpotHitTransport.php +++ b/src/Symfony/Component/Notifier/Bridge/SpotHit/SpotHitTransport.php @@ -35,6 +35,8 @@ final class SpotHitTransport extends AbstractTransport private string $token; private ?string $from; + private ?bool $smsLong = null; + private ?int $smsLongNBr = null; public function __construct(#[\SensitiveParameter] string $token, string $from = null, HttpClientInterface $client = null, EventDispatcherInterface $dispatcher = null) { @@ -46,7 +48,27 @@ public function __construct(#[\SensitiveParameter] string $token, string $from = public function __toString(): string { - return sprintf('spothit://%s%s', $this->getEndpoint(), null !== $this->from ? '?from='.$this->from : ''); + $query = http_build_query([ + 'from' => $this->from, + 'smslong' => $this->smsLong, + 'smslongnbr' => $this->smsLongNBr, + ]); + + return sprintf('spothit://%s', $this->getEndpoint()).('' !== $query ? '?'.$query : ''); + } + + public function setSmsLong(?bool $smsLong): self + { + $this->smsLong = $smsLong; + + return $this; + } + + public function setLongNBr(?int $smsLongNBr): self + { + $this->smsLongNBr = $smsLongNBr; + + return $this; } public function supports(MessageInterface $message): bool @@ -76,6 +98,8 @@ protected function doSend(MessageInterface $message): SentMessage 'type' => 'premium', 'message' => $message->getSubject(), 'expediteur' => $message->getFrom() ?: $this->from, + 'smslong' => $this->smsLong, + 'smslongnbr' => $this->smsLongNBr, ], ]); diff --git a/src/Symfony/Component/Notifier/Bridge/SpotHit/SpotHitTransportFactory.php b/src/Symfony/Component/Notifier/Bridge/SpotHit/SpotHitTransportFactory.php index 699e5c3eb63e5..550a5675059a2 100644 --- a/src/Symfony/Component/Notifier/Bridge/SpotHit/SpotHitTransportFactory.php +++ b/src/Symfony/Component/Notifier/Bridge/SpotHit/SpotHitTransportFactory.php @@ -30,10 +30,12 @@ public function create(Dsn $dsn): SpotHitTransport $token = $this->getUser($dsn); $from = $dsn->getOption('from'); + $smsLong = $dsn->getOption('smslong'); + $smsLongNBr = $dsn->getOption('smslongnbr'); $host = 'default' === $dsn->getHost() ? null : $dsn->getHost(); $port = $dsn->getPort(); - return (new SpotHitTransport($token, $from, $this->client, $this->dispatcher))->setHost($host)->setPort($port); + return (new SpotHitTransport($token, $from, $this->client, $this->dispatcher))->setHost($host)->setPort($port)->setSmsLong($smsLong)->setLongNBr($smsLongNBr); } protected function getSupportedSchemes(): array diff --git a/src/Symfony/Component/Notifier/Bridge/SpotHit/Tests/SpotHitTransportFactoryTest.php b/src/Symfony/Component/Notifier/Bridge/SpotHit/Tests/SpotHitTransportFactoryTest.php index 444ea14cc920c..c39fef4d9600c 100644 --- a/src/Symfony/Component/Notifier/Bridge/SpotHit/Tests/SpotHitTransportFactoryTest.php +++ b/src/Symfony/Component/Notifier/Bridge/SpotHit/Tests/SpotHitTransportFactoryTest.php @@ -31,11 +31,17 @@ public static function createProvider(): iterable 'spothit://spot-hit.fr?from=MyCompany', 'spothit://api_token@default?from=MyCompany', ]; + yield [ + 'spothit://spot-hit.fr?from=MyCompany&smslong=1', + 'spothit://api_token@default?from=MyCompany&smslong=1', + ]; } public static function supportsProvider(): iterable { yield [true, 'spothit://api_token@default?from=MyCompany']; + yield [true, 'spothit://api_token@default?from=MyCompany&smslong=1']; + yield [true, 'spothit://api_token@default?from=MyCompany&smslongnbr=1']; yield [false, 'somethingElse://api_token@default?from=MyCompany']; } diff --git a/src/Symfony/Component/Notifier/Bridge/SpotHit/Tests/SpotHitTransportTest.php b/src/Symfony/Component/Notifier/Bridge/SpotHit/Tests/SpotHitTransportTest.php index 17e6179785a56..f0aaea2f6e63b 100644 --- a/src/Symfony/Component/Notifier/Bridge/SpotHit/Tests/SpotHitTransportTest.php +++ b/src/Symfony/Component/Notifier/Bridge/SpotHit/Tests/SpotHitTransportTest.php @@ -12,6 +12,7 @@ namespace Symfony\Component\Notifier\Bridge\SpotHit\Tests; use Symfony\Component\HttpClient\MockHttpClient; +use Symfony\Component\HttpClient\Response\MockResponse; use Symfony\Component\Notifier\Bridge\SpotHit\SpotHitTransport; use Symfony\Component\Notifier\Message\ChatMessage; use Symfony\Component\Notifier\Message\SmsMessage; @@ -29,6 +30,9 @@ public static function createTransport(HttpClientInterface $client = null): Spot public static function toStringProvider(): iterable { yield ['spothit://host.test?from=MyCompany', self::createTransport()]; + yield ['spothit://host.test?from=MyCompany&smslong=1', self::createTransport()->setSmsLong(true)]; + yield ['spothit://host.test?from=MyCompany&smslongnbr=3', self::createTransport()->setLongNBr(3)]; + yield ['spothit://host.test?from=MyCompany&smslong=1&smslongnbr=3', self::createTransport()->setSmsLong(true)->setLongNBr(3)]; } public static function supportedMessagesProvider(): iterable @@ -42,4 +46,72 @@ public static function unsupportedMessagesProvider(): iterable yield [new ChatMessage('Hello!')]; yield [new DummyMessage()]; } + + public function testShouldSendAMessageUsingTheSpotHitAPI() + { + $expectedRequest = [ + function ($method, $url, $options) { + $this->assertSame('POST', $method); + $this->assertSame('https://www.spot-hit.fr/api/envoyer/sms', $url); + $this->assertSame('key=&destinataires=0611223344&type=premium&message=Hello%21&expediteur=', $options['body']); + + return new MockResponse(json_encode([ + 'resultat' => ['success' => 'true'], + 'id' => '???', + ], \JSON_THROW_ON_ERROR)); + }, + ]; + + $client = new MockHttpClient($expectedRequest); + $transport = new SpotHitTransport('', '', $client, null); + $transport->send(new SmsMessage('0611223344', 'Hello!')); + } + + public function argumentsProvider(): \Generator + { + yield [ + function (SpotHitTransport $transport) { $transport->setSmsLong(true); }, + function (array $bodyArguments) { $this->assertSame('1', $bodyArguments['smslong']); }, + ]; + + yield [ + function (SpotHitTransport $transport) { $transport->setLongNBr(3); }, + function (array $bodyArguments) { $this->assertSame('3', $bodyArguments['smslongnbr']); }, + ]; + + yield [ + function (SpotHitTransport $transport) { + $transport->setSmsLong(true); + $transport->setLongNBr(3); + }, + function (array $bodyArguments) { + $this->assertSame('1', $bodyArguments['smslong']); + $this->assertSame('3', $bodyArguments['smslongnbr']); + }, + ]; + } + + /** + * @dataProvider argumentsProvider + */ + public function testShouldForwardArgumentToRequest($setupTransport, $assertions) + { + $expectedRequest = [ + function ($method, $url, $options) use ($assertions) { + $bodyFields = []; + parse_str($options['body'], $bodyFields); + $assertions($bodyFields); + + return new MockResponse(json_encode([ + 'resultat' => ['success' => 'true'], + 'id' => '???', + ], \JSON_THROW_ON_ERROR)); + }, + ]; + + $client = new MockHttpClient($expectedRequest); + $transport = new SpotHitTransport('', '', $client, null); + $setupTransport($transport); + $transport->send(new SmsMessage('0611223344', 'Hello!')); + } }