8000 [Notifier] Add FakeSMS Logger transport by noniagriconomie · Pull Request #42123 · symfony/symfony · GitHub
[go: up one dir, main page]

Skip to content

[Notifier] Add FakeSMS Logger transport #42123

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jul 31, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2502,7 +2502,8 @@ private function registerNotifierConfiguration(array $config, ContainerBuilder $

if (ContainerBuilder::willBeAvailable('symfony/fake-sms-notifier', FakeSmsTransportFactory::class, ['symfony/framework-bundle', 'symfony/notifier', 'symfony/mailer'])) {
$container->getDefinition($classToServices[FakeSmsTransportFactory::class])
->replaceArgument('$mailer', new Reference('mailer'));
->replaceArgument('$mailer', new Reference('mailer'))
->replaceArgument('$logger', new Reference('logger'));
}

if (isset($config['admin_recipients'])) {
Expand Down
5 changes: 5 additions & 0 deletions src/Symfony/Component/Notifier/Bridge/FakeSms/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
CHANGELOG
=========

5.4
---

* Add the ``FakeSmsLoggerTransport``

5.3
---

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
<?php

/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace Symfony\Component\Notifier\Bridge\FakeSms;

use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\Notifier\Exception\UnsupportedMessageTypeException;
use Symfony\Component\Notifier\Message\MessageInterface;
use Symfony\Component\Notifier\Message\SentMessage;
use Symfony\Component\Notifier\Message\SmsMessage;
use Symfony\Component\Notifier\Transport\AbstractTransport;
use Symfony\Contracts\HttpClient\HttpClientInterface;

/**
* @author Antoine Makdessi <amakdessi@me.com>
*/
final class FakeSmsLoggerTransport extends AbstractTransport
{
protected const HOST = 'default';

private $logger;

public function __construct(LoggerInterface $logger, HttpClientInterface $client = null, EventDispatcherInterface $dispatcher = null)
{
$this->logger = $logger;

parent::__construct($client, $dispatcher);
}

public function __toString(): string
{
return sprintf('fakesms+logger://%s', $this->getEndpoint());
}

public function supports(MessageInterface $message): bool
{
return $message instanceof SmsMessage;
}

/**
* @param MessageInterface|SmsMessage $message
*/
protected function doSend(MessageInterface $message): SentMessage
{
if (!$this->supports($message)) {
throw new UnsupportedMessageTypeException(__CLASS__, SmsMessage::class, $message);
}

$this->logger->info(sprintf('New SMS on phone number: %s', $message->getPhone()));

return new SentMessage($message, (string) $this);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

namespace Symfony\Component\Notifier\Bridge\FakeSms;

use Psr\Log\LoggerInterface;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
use Symfony\Component\Notifier\Transport\AbstractTransportFactory;
Expand All @@ -20,38 +21,44 @@
/**
* @author James Hemery <james@yieldstudio.fr>
* @author Oskar Stark <oskarstark@googlemail.com>
* @author Antoine Makdessi <amakdessi@me.com>
*/
final class FakeSmsTransportFactory extends AbstractTransportFactory
{
protected $mailer;
protected $logger;

public function __construct(MailerInterface $mailer)
public function __construct(MailerInterface $mailer, LoggerInterface $logger)
{
parent::__construct();

$this->mailer = $mailer;
$this->logger = $logger;
}

/**
* @return FakeSmsEmailTransport
* @return FakeSmsEmailTransport|FakeSmsLoggerTransport
*/
public function create(Dsn $dsn): TransportInterface
{
$scheme = $dsn->getScheme();

if ('fakesms+email' !== $scheme) {
throw new UnsupportedSchemeException($dsn, 'fakesms', $this->getSupportedSchemes());
}
switch ($scheme) {
case 'fakesms+email':
$mailerTransport = $dsn->getHost();
$to = $dsn->getRequiredOption('to');
$from = $dsn->getRequiredOption('from');

$mailerTransport = $dsn->getHost();
$to = $dsn->getRequiredOption('to');
$from = $dsn->getRequiredOption('from');
return (new FakeSmsEmailTransport($this->mailer, $to, $from))->setHost($mailerTransport);
case 'fakesms+logger':
return new FakeSmsLoggerTransport($this->logger);
}

return (new FakeSmsEmailTransport($this->mailer, $to, $from))->setHost($mailerTransport);
throw new UnsupportedSchemeException($dsn, 'fakesms', $this->getSupportedSchemes());
}

protected function getSupportedSchemes(): array
{
return ['fakesms+email'];
return ['fakesms+email', 'fakesms+logger'];
}
}
11 changes: 9 additions & 2 deletions src/Symfony/Component/Notifier/Bridge/FakeSms/README.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
Fake SMS Notifier
=================

Provides Fake SMS (as email during development) integration for Symfony Notifier.
Provides Fake SMS (as email or log during development) integration for Symfony Notifier.

#### DSN example
#### DSN example for email

```
FAKE_SMS_DSN=fakesms+email://default?to=TO&from=FROM
Expand All @@ -14,10 +14,17 @@ where:
- `FROM` is email who send SMS during development

To use a custom mailer transport:

```
FAKE_SMS_DSN=fakesms+email://mailchimp?to=TO&from=FROM
```

#### DSN example for logger

```
FAKE_SMS_DSN=fakesms+logger://default
```

Resources
---------

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
<?php

/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace Symfony\Component\Notifier\Bridge\FakeSms\Tests;

use Psr\Log\LoggerInterface;
use Symfony\Component\Notifier\Bridge\FakeSms\FakeSmsLoggerTransport;
use Symfony\Component\Notifier\Message\ChatMessage;
use Symfony\Component\Notifier\Message\MessageInterface;
use Symfony\Component\Notifier\Message\SmsMessage;
use Symfony\Component\Notifier\Test\TransportTestCase;
use Symfony\Component\Notifier\Transport\TransportInterface;
use Symfony\Contracts\HttpClient\HttpClientInterface;

final class FakeSmsLoggerTransportTest extends TransportTestCase
{
public function createTransport(HttpClientInterface $client = null, LoggerInterface $logger = null): TransportInterface
{
$transport = (new FakeSmsLoggerTransport($logger ?? $this->createMock(LoggerInterface::class), $client ?? $this->createMock(HttpClientInterface::class)));

return $transport;
}

public function toStringProvider(): iterable
{
yield ['fakesms+logger://default', $this->createTransport()];
}

public function supportedMessagesProvider(): iterable
{
yield [new SmsMessage('0611223344', 'Hello!')];
yield [new SmsMessage('+33611223344', 'Hello!')];
}

public function unsupportedMessagesProvider(): iterable
{
yield [new ChatMessage('Hello!')];
yield [$this->createMock(MessageInterface::class)];
}

public function testSendWithDefaultTransport()
{
$message = new SmsMessage($phone = '0611223344', 'Hello!');

$logger = new TestLogger();

$transport = $this->createTransport(null, $logger);

$transport->send($message);

$logs = $logger->logs;
$this->assertNotEmpty($logs);

$log = $logs[0];
$this->assertSame(sprintf('New SMS on phone number: %s', $phone), $log['message']);
$this->assertSame('info', $log['level']);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

namespace Symfony\Component\Notifier\Bridge\FakeSms\Tests;

use Psr\Log\LoggerInterface;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Notifier\Bridge\FakeSms\FakeSmsTransportFactory;
use Symfony\Component\Notifier\Test\TransportFactoryTestCase;
Expand All @@ -23,7 +24,7 @@ final class FakeSmsTransportFactoryTest extends TransportFactoryTestCase
*/
public function createFactory(): TransportFactoryInterface
{
return new FakeSmsTransportFactory($this->createMock(MailerInterface::class));
return new FakeSmsTransportFactory($this->createMock(MailerInterface::class), $this->createMock(LoggerInterface::class));
}

public function createProvider(): iterable
Expand All @@ -37,6 +38,11 @@ public function createProvider(): iterable
'fakesms+email://mailchimp?to=recipient@email.net&from=sender@email.net',
'fakesms+email://mailchimp?to=recipient@email.net&from=sender@email.net',
];

yield [
'fakesms+logger://default',
'fakesms+logger://default',
];
}

public function missingRequiredOptionProvider(): iterable
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?php

/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace Symfony\Component\Notifier\Bridge\FakeSms\Tests;

use Psr\Log\AbstractLogger;

final class TestLogger extends AbstractLogger
{
public $logs = [];

public function log($level, $message, array $context = []): void
{
$this->logs[] = [
'level' => $level,
'message' => $message,
'context' => $context,
];
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "symfony/fake-sms-notifier",
"type": "symfony-bridge",
"description": "Fake SMS (as email during development) Notifier Bridge.",
"description": "Fake SMS (as email or log during development) Notifier Bridge.",
"keywords": ["sms", "development", "email", "notifier", "symfony"],
"homepage": "https://symfony.com",
"license": "MIT",
Expand All @@ -10,6 +10,11 @@
"name": "James Hemery",
"homepage": "https://github.com/JamesHemery"
},
{
"name": "Antoine Makdessi",
"email": "amakdessi@me.com",
"homepage": "http://antoine.makdessi.free.fr"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
Expand Down
0