8000 feature #50136 [Notifier] [SpotHit] Support `smslong` and `smslongnbr… · symfony/symfony@888054b · GitHub
[go: up one dir, main page]

Skip to content

Commit 888054b

Browse files
committed
feature #50136 [Notifier] [SpotHit] Support smslong and smslongnbr API parameters (camillebaronnet)
This PR was squashed before being merged into the 6.4 branch. Discussion ---------- [Notifier] [SpotHit] Support `smslong` and `smslongnbr` API parameters | Q | A | ------------- | --- | Branch? | 6.4 | Bug fix? | no | New feature? | yes <!-- please update src/**/CHANGELOG.md files --> | Deprecations? |no <!-- please update UPGRADE-*.md and src/**/CHANGELOG.md files --> | License | MIT | Doc PR | mandatory for components ? By default, SMS via Spot Hit are strictly limited to 160 characters maximum. This PR allows to forward the corresponding arguments from the DSN to the API request to unlock this capability Commits ------- 95091a1 [Notifier] [SpotHit] Support `smslong` and `smslongnbr` API parameters
2 parents f404704 + 95091a1 commit 888054b

File tree

6 files changed

+114
-3
lines changed
  • Tests
  • 6 files changed

    +114
    -3
    lines changed

    src/Symfony/Component/Notifier/Bridge/SpotHit/CHANGELOG.md

    Lines changed: 5 additions & 0 deletions
    Original file line numberDiff line numberDiff line change
    @@ -1,6 +1,11 @@
    11
    CHANGELOG
    22
    =========
    33

    4+
    6.4
    5+
    ---
    6+
    7+
    * Support `SMSLong` and `SMSLongNBr` API parameters
    8+
    49
    6.2
    510
    ---
    611

    src/Symfony/Component/Notifier/Bridge/SpotHit/README.md

    Lines changed: 3 additions & 1 deletion
    Original file line numberDiff line numberDiff line change
    @@ -6,12 +6,14 @@ Provides [Spot-Hit](https://www.spot-hit.fr/) integration for Symfony Notifier.
    66
    #### DSN example
    77

    88
    ```
    9-
    SPOTHIT_DSN=spothit://TOKEN@default?from=FROM
    9+
    SPOTHIT_DSN=spothit://TOKEN@default?from=FROM&smslong=SMSLONG&smslongnbr=SMSLONGNBR
    1010
    ```
    1111

    1212
    where:
    1313
    - `TOKEN` is your Spot-Hit API key
    1414
    - `FROM` is the custom sender (3-11 letters, default is a 5 digits phone number)
    15+
    - `SMSLONG` (optional) 0 or 1 : allows SMS messages longer than 160 characters
    16+
    - `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.
    1517

    1618
    Resources
    1719
    ---------

    src/Symfony/Component/Notifier/Bridge/SpotHit/SpotHitTransport.php

    Lines changed: 25 additions & 1 deletion
    Original file line numberDiff line numberDiff line change
    @@ -35,6 +35,8 @@ final class SpotHitTransport extends AbstractTransport
    3535

    3636
    private string $token;
    3737
    private ?string $from;
    38+
    private ?bool $smsLong = null;
    39+
    private ?int $smsLongNBr = null;
    3840

    3941
    public function __construct(#[\SensitiveParameter] string $token, string $from = null, HttpClientInterface $client = null, EventDispatcherInterface $dispatcher = null)
    4042
    {
    @@ -46,7 +48,27 @@ public function __construct(#[\SensitiveParameter] string $token, string $from =
    4648

    4749
    public function __toString(): string
    4850
    {
    49-
    return sprintf('spothit://%s%s', $this->getEndpoint(), null !== $this->from ? '?from='.$this->from : '');
    51+
    $query = http_build_query([
    52+
    'from' => $this->from,
    53+
    'smslong' => $this->smsLong,
    54+
    'smslongnbr' => $this->smsLongNBr,
    55+
    ]);
    56+
    57+
    return sprintf('spothit://%s', $this->getEndpoint()).('' !== $query ? '?'.$query : '');
    58+
    }
    59+
    60+
    public function setSmsLong(?bool $smsLong): self
    61+
    {
    62+
    $this->smsLong = $smsLong;
    63+
    64+
    return $this;
    65+
    }
    66+
    67+
    public function setLongNBr(?int $smsLongNBr): self
    68+
    {
    69+
    $this->smsLongNBr = $smsLongNBr;
    70+
    71+
    return $this;
    5072
    }
    5173

    5274
    public function supports(MessageInterface $message): bool
    @@ -76,6 +98,8 @@ protected function doSend(MessageInterface $message): SentMessage
    7698
    'type' => 'premium',
    7799
    'message' => $message->getSubject(),
    78100
    'expediteur' => $message->getFrom() ?: $this->from,
    101+
    'smslong' => $this->smsLong,
    102+
    'smslongnbr' => $this->smsLongNBr,
    79103
    ],
    80104
    ]);
    81105

    src/Symfony/Component/Notifier/Bridge/SpotHit/SpotHitTransportFactory.php

    Lines changed: 3 additions & 1 deletion
    Original file line numberDiff line numberDiff line change
    @@ -30,10 +30,12 @@ public function create(Dsn $dsn): SpotHitTransport
    3030

    3131
    $token = $this->getUser($dsn);
    3232
    $from = $dsn->getOption('from');
    33+
    $smsLong = $dsn->getOption('smslong');
    34+
    $smsLongNBr = $dsn->getOption('smslongnbr');
    3335
    $host = 'default' === $dsn->getHost() ? null : $dsn->getHost();
    3436
    $port = $dsn->getPort();
    3537

    36-
    return (new SpotHitTransport($token, $from, $this->client, $this->dispatcher))->setHost($host)->setPort($port);
    38+
    return (new SpotHitTransport($token, $from, $this->client, $this->dispatcher))->setHost($host)->setPort($port)->setSmsLong($smsLong)->setLongNBr($smsLongNBr);
    3739
    }
    3840

    3941
    protected function getSupportedSchemes(): array

    src/Symfony/Component/Notifier/Bridge/SpotHit/Tests/SpotHitTransportFactoryTest.php

    Lines changed: 6 additions & 0 deletions
    Original file line numberDiff line numberDiff line change
    @@ -31,11 +31,17 @@ public static function createProvider(): iterable
    3131
    'spothit://spot-hit.fr?from=MyCompany',
    3232
    'spothit://api_token@default?from=MyCompany',
    3333
    ];
    34+
    yield [
    35+
    'spothit://spot-hit.fr?from=MyCompany&smslong=1',
    36+
    'spothit://api_token@default?from=MyCompany&smslong=1',
    37+
    ];
    3438
    }
    3539

    3640
    public static function supportsProvider(): iterable
    3741
    {
    3842
    yield [true, 'spothit://api_token@default?from=MyCompany'];
    43+
    yield [true, 'spothit://api_token@default?from=MyCompany&smslong=1'];
    44+
    yield [true, 'spothit://api_token@default?from=MyCompany&smslongnbr=1'];
    3945
    yield [false, 'somethingElse://api_token@default?from=MyCompany'];
    4046
    }
    4147

    src/Symfony/Component/Notifier/Bridge/SpotHit/Tests/SpotHitTransportTest.php

    Lines changed: 72 additions & 0 deletions
    Original file line numberDiff line numberDiff line change
    @@ -12,6 +12,7 @@
    1212
    namespace Symfony\Component\Notifier\Bridge\SpotHit\Tests;
    1313

    1414
    use Symfony\Component\HttpClient\MockHttpClient;
    15+
    use Symfony\Component\HttpClient\Response\MockResponse;
    1516
    use Symfony\Component\Notifier\Bridge\SpotHit\SpotHitTransport;
    1617
    use Symfony\Component\Notifier\Message\ChatMessage;
    1718
    use Symfony\Component\Notifier\Message\SmsMessage;
    @@ -29,6 +30,9 @@ public static function createTransport(HttpClientInterface $client = null): Spot
    2930
    public static function toStringProvider(): iterable
    3031
    {
    3132
    yield ['spothit://host.test?from=MyCompany', self::createTransport()];
    33+
    yield ['spothit://host.test?from=MyCompany&smslong=1', self::createTransport()->setSmsLong(true)];
    34+
    yield ['spothit://host.test?from=MyCompany&smslongnbr=3', self::createTransport()->setLongNBr(3)];
    35+
    yield ['spothit://host.test?from=MyCompany&smslong=1&smslongnbr=3', self::createTransport()->setSmsLong(true)->setLongNBr(3)];
    3236
    }
    3337

    3438
    public static function supportedMessagesProvider(): iterable
    @@ -42,4 +46,72 @@ public static function unsupportedMessagesProvider(): iterable
    4246
    yield [new ChatMessage('Hello!')];
    4347
    yield [new DummyMessage()];
    4448
    }
    49+
    50+
    public function testShouldSendAMessageUsingTheSpotHitAPI()
    51+
    {
    52+
    $expectedRequest = [
    53+
    function ($method, $url, $options) {
    54+
    $this->assertSame('POST', $method);
    55+
    $this->assertSame('https://www.spot-hit.fr/api/envoyer/sms', $url);
    56+
    $this->assertSame('key=&destinataires=0611223344&type=premium&message=Hello%21&expediteur=', $options['body']);
    57+
    58+
    return new MockResponse(json_encode([
    59+
    'resultat' => ['success' => 'true'],
    60+
    'id' => '???',
    61+
    ], \JSON_THROW_ON_ERROR));
    62+
    },
    63+
    ];
    64+
    65+
    $client = new MockHttpClient($expectedRequest);
    66+
    $transport = new SpotHitTransport('', '', $client, null);
    67+
    $transport->send(new SmsMessage('0611223344', 'Hello!'));
    68+
    }
    69+
    70+
    public function argumentsProvider(): \Generator
    71+
    {
    72+
    yield [
    73+
    function (SpotHitTransport $transport) { $transport->setSmsLong(true); },
    74+
    function (array $bodyArguments) { $this->assertSame('1', $bodyArguments['smslong']); },
    75+
    ];
    76+
    77+
    yield [
    78+
    function (SpotHitTransport $transport) { $transport->setLongNBr(3); },
    79+
    function (array $bodyArguments) { $this->assertSame('3', $bodyArguments['smslongnbr']); },
    80+
    ];
    81+
    82+
    yield [
    83+
    function (SpotHitTransport $transport) {
    84+
    $transport->setSmsLong(true);
    85+
    $transport->setLongNBr(3);
    86+
    },
    87+
    function (array $bodyArguments) {
    88+
    $this->assertSame('1', $bodyArguments['smslong']);
    89+
    $this->assertSame('3', $bodyArguments['smslongnbr']);
    90+
    },
    91+
    ];
    92+
    }
    93+
    94+
    /**
    95+
    * @dataProvider argumentsProvider
    96+
    */
    97+
    public function testShouldForwardArgumentToRequest($setupTransport, $assertions)
    98+
    {
    99+
    $expectedRequest = [
    100+
    function ($method, $url, $options) use ($assertions) {
    101+
    $bodyFields = [];
    102+
    parse_str($options['body'], $bodyFields);
    103+
    $assertions($bodyFields);
    104+
    105+
    return new MockResponse(json_encode([
    106+
    'resultat' => ['success' => 'true'],
    107+
    'id' => '???',
    108+
    ], \JSON_THROW_ON_ERROR));
    109+
    },
    110+
    ];
    111+
    112+
    $client = new MockHttpClient($expectedRequest);
    113+
    $transport = new SpotHitTransport('', '', $client, null);
    114+
    $setupTransport($transport);
    115+
    $transport->send(new SmsMessage('0611223344', 'Hello!'));
    116+
    }
    45117
    }

    0 commit comments

    Comments
     (0)
    0