From 2596a724e4456a5e410c951b1bdfb47c1e3f0cfc Mon Sep 17 00:00:00 2001 From: noniagriconomie Date: Thu, 15 Jul 2021 09:43:36 +0200 Subject: [PATCH] Add FakeSMS Logger transport --- .../FrameworkExtension.php | 3 +- .../Notifier/Bridge/FakeSms/CHANGELOG.md | 5 ++ .../Bridge/FakeSms/FakeSmsLoggerTransport.php | 62 +++++++++++++++++ .../FakeSms/FakeSmsTransportFactory.php | 27 +++++--- .../Notifier/Bridge/FakeSms/README.md | 11 +++- .../Tests/FakeSmsLoggerTransportTest.php | 66 +++++++++++++++++++ .../Tests/FakeSmsTransportFactoryTest.php | 8 ++- .../Bridge/FakeSms/Tests/TestLogger.php | 28 ++++++++ .../Notifier/Bridge/FakeSms/composer.json | 7 +- 9 files changed, 202 insertions(+), 15 deletions(-) create mode 100644 src/Symfony/Component/Notifier/Bridge/FakeSms/FakeSmsLoggerTransport.php create mode 100644 src/Symfony/Component/Notifier/Bridge/FakeSms/Tests/FakeSmsLoggerTransportTest.php create mode 100644 src/Symfony/Component/Notifier/Bridge/FakeSms/Tests/TestLogger.php diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php index 3a5aa40ea7b09..688f2e3743b35 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php @@ -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'])) { diff --git a/src/Symfony/Component/Notifier/Bridge/FakeSms/CHANGELOG.md b/src/Symfony/Component/Notifier/Bridge/FakeSms/CHANGELOG.md index 1f2b652ac20ea..3d0c644e338bf 100644 --- a/src/Symfony/Component/Notifier/Bridge/FakeSms/CHANGELOG.md +++ b/src/Symfony/Component/Notifier/Bridge/FakeSms/CHANGELOG.md @@ -1,6 +1,11 @@ CHANGELOG ========= +5.4 +--- + + * Add the ``FakeSmsLoggerTransport`` + 5.3 --- diff --git a/src/Symfony/Component/Notifier/Bridge/FakeSms/FakeSmsLoggerTransport.php b/src/Symfony/Component/Notifier/Bridge/FakeSms/FakeSmsLoggerTransport.php new file mode 100644 index 0000000000000..e63510b384ef7 --- /dev/null +++ b/src/Symfony/Component/Notifier/Bridge/FakeSms/FakeSmsLoggerTransport.php @@ -0,0 +1,62 @@ + + * + * 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 + */ +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); + } +} diff --git a/src/Symfony/Component/Notifier/Bridge/FakeSms/FakeSmsTransportFactory.php b/src/Symfony/Component/Notifier/Bridge/FakeSms/FakeSmsTransportFactory.php index ab6ee804fb5d5..1360e6b408c15 100644 --- a/src/Symfony/Component/Notifier/Bridge/FakeSms/FakeSmsTransportFactory.php +++ b/src/Symfony/Component/Notifier/Bridge/FakeSms/FakeSmsTransportFactory.php @@ -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; @@ -20,38 +21,44 @@ /** * @author James Hemery * @author Oskar Stark + * @author Antoine Makdessi */ 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']; } } diff --git a/src/Symfony/Component/Notifier/Bridge/FakeSms/README.md b/src/Symfony/Component/Notifier/Bridge/FakeSms/README.md index 9bb1c15ab0d5d..4fba506e54789 100644 --- a/src/Symfony/Component/Notifier/Bridge/FakeSms/README.md +++ b/src/Symfony/Component/Notifier/Bridge/FakeSms/README.md @@ -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 @@ -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 --------- diff --git a/src/Symfony/Component/Notifier/Bridge/FakeSms/Tests/FakeSmsLoggerTransportTest.php b/src/Symfony/Component/Notifier/Bridge/FakeSms/Tests/FakeSmsLoggerTransportTest.php new file mode 100644 index 0000000000000..443f9cb4ee047 --- /dev/null +++ b/src/Symfony/Component/Notifier/Bridge/FakeSms/Tests/FakeSmsLoggerTransportTest.php @@ -0,0 +1,66 @@ + + * + * 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']); + } +} diff --git a/src/Symfony/Component/Notifier/Bridge/FakeSms/Tests/FakeSmsTransportFactoryTest.php b/src/Symfony/Component/Notifier/Bridge/FakeSms/Tests/FakeSmsTransportFactoryTest.php index e767c0b7cb333..603da742f2f5c 100644 --- a/src/Symfony/Component/Notifier/Bridge/FakeSms/Tests/FakeSmsTransportFactoryTest.php +++ b/src/Symfony/Component/Notifier/Bridge/FakeSms/Tests/FakeSmsTransportFactoryTest.php @@ -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; @@ -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 @@ -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 diff --git a/src/Symfony/Component/Notifier/Bridge/FakeSms/Tests/TestLogger.php b/src/Symfony/Component/Notifier/Bridge/FakeSms/Tests/TestLogger.php new file mode 100644 index 0000000000000..91cfd756a5c38 --- /dev/null +++ b/src/Symfony/Component/Notifier/Bridge/FakeSms/Tests/TestLogger.php @@ -0,0 +1,28 @@ + + * + * 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, + ]; + } +} diff --git a/src/Symfony/Component/Notifier/Bridge/FakeSms/composer.json b/src/Symfony/Component/Notifier/Bridge/FakeSms/composer.json index 60c19c0961173..5f4cd64858ab0 100644 --- a/src/Symfony/Component/Notifier/Bridge/FakeSms/composer.json +++ b/src/Symfony/Component/Notifier/Bridge/FakeSms/composer.json @@ -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", @@ -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"