diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php index 37d8d64b90..7d76a17ee5 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php @@ -2423,6 +2423,16 @@ class FrameworkExtension extends Extension $container->removeDefinition($classToServices[MercureTransportFactory::class]); } + if (ContainerBuilder::willBeAvailable('symfony/fake-chat-notifier', FakeSmsTransportFactory::class, ['symfony/framework-bundle']) && ContainerBuilder::willBeAvailable('symfony/fake-chat-notifier', FakeSmsTransportFactory::class, ['symfony/notifier']) && ContainerBuilder::willBeAvailable('symfony/fake-chat-notifier', FakeSmsTransportFactory::class, ['symfony/mailer'])) { + $container->getDefinition($classToServices[FakeChatTransportFactory::class]) + ->replaceArgument('$mailer', new Reference('mailer')); + } + + if (ContainerBuilder::willBeAvailable('symfony/fake-sms-notifier', FakeSmsTransportFactory::class, ['symfony/framework-bundle']) && ContainerBuilder::willBeAvailable('symfony/fake-sms-notifier', FakeSmsTransportFactory::class, ['symfony/notifier']) && ContainerBuilder::willBeAvailable('symfony/fake-sms-notifier', FakeSmsTransportFactory::class, ['symfony/mailer'])) { + $container->getDefinition($classToServices[FakeSmsTransportFactory::class]) + ->replaceArgument('$mailer', new Reference('mailer')); + } + if (isset($config['admin_recipients'])) { $notifier = $container->getDefinition('notifier'); foreach ($config['admin_recipients'] as $i => $recipient) { diff --git a/src/Symfony/Component/Notifier/Bridge/FakeChat/.gitignore b/src/Symfony/Component/Notifier/Bridge/FakeChat/.gitignore new file mode 100644 index 0000000000..c49a5d8df5 --- /dev/null +++ b/src/Symfony/Component/Notifier/Bridge/FakeChat/.gitignore @@ -0,0 +1,3 @@ +vendor/ +composer.lock +phpunit.xml diff --git a/src/Symfony/Component/Notifier/Bridge/FakeChat/FakeChatEmailTransport.php b/src/Symfony/Component/Notifier/Bridge/FakeChat/FakeChatEmailTransport.php index a44abb023c..2cc769a25d 100644 --- a/src/Symfony/Component/Notifier/Bridge/FakeChat/FakeChatEmailTransport.php +++ b/src/Symfony/Component/Notifier/Bridge/FakeChat/FakeChatEmailTransport.php @@ -27,6 +27,8 @@ use Symfony\Contracts\HttpClient\HttpClientInterface; */ final class FakeChatEmailTransport extends AbstractTransport { + protected const HOST = 'default'; + private $mailer; private $to; private $from; @@ -61,13 +63,22 @@ final class FakeChatEmailTransport extends AbstractTransport throw new UnsupportedMessageTypeException(__CLASS__, ChatMessage::class, $message); } + $subject = 'New Chat message without specified recipient!'; + if (null !== $message->getRecipientId()) { + $subject = sprintf('New Chat message for recipient: %s', $message->getRecipientId()); + } + $email = (new Email()) ->from($this->from) ->to($this->to) - ->subject(sprintf('New Chat message for recipient: %s', $message->getRecipientId())) + ->subject($subject) ->html($message->getSubject()) ->text($message->getSubject()); + if ('default' !== $transportName = $this->getEndpoint()) { + $email->getHeaders()->addTextHeader('X-Transport', $transportName); + } + $this->mailer->send($email); return new SentMessage($message, (string) $this); diff --git a/src/Symfony/Component/Notifier/Bridge/FakeChat/FakeChatTransportFactory.php b/src/Symfony/Component/Notifier/Bridge/FakeChat/FakeChatTransportFactory.php index 9d40cca74a..3bc46bb975 100644 --- a/src/Symfony/Component/Notifier/Bridge/FakeChat/FakeChatTransportFactory.php +++ b/src/Symfony/Component/Notifier/Bridge/FakeChat/FakeChatTransportFactory.php @@ -11,24 +11,24 @@ namespace Symfony\Component\Notifier\Bridge\FakeChat; +use Symfony\Component\Mailer\MailerInterface; use Symfony\Component\Notifier\Exception\UnsupportedSchemeException; use Symfony\Component\Notifier\Transport\AbstractTransportFactory; use Symfony\Component\Notifier\Transport\Dsn; use Symfony\Component\Notifier\Transport\TransportInterface; -use Symfony\Contracts\Service\ServiceProviderInterface; /** * @author Oskar Stark */ final class FakeChatTransportFactory extends AbstractTransportFactory { - protected $serviceProvider; + protected $mailer; - public function __construct(ServiceProviderInterface $serviceProvider) + public function __construct(MailerInterface $mailer) { parent::__construct(); - $this->serviceProvider = $serviceProvider; + $this->mailer = $mailer; } /** @@ -43,11 +43,11 @@ final class FakeChatTransportFactory extends AbstractTransportFactory } if ('fakechat+email' === $scheme) { - $serviceId = $dsn->getHost(); + $mailerTransport = $dsn->getHost(); $to = $dsn->getRequiredOption('to'); $from = $dsn->getRequiredOption('from'); - return (new FakeChatEmailTransport($this->serviceProvider->get($serviceId), $to, $from))->setHost($serviceId); + return (new FakeChatEmailTransport($this->mailer, $to, $from))->setHost($mailerTransport); } } diff --git a/src/Symfony/Component/Notifier/Bridge/FakeChat/README.md b/src/Symfony/Component/Notifier/Bridge/FakeChat/README.md index 45cb71cb94..5c0f0361cc 100644 --- a/src/Symfony/Component/Notifier/Bridge/FakeChat/README.md +++ b/src/Symfony/Component/Notifier/Bridge/FakeChat/README.md @@ -6,14 +6,18 @@ Provides Fake Chat (as email during development) integration for Symfony Notifie #### DSN example ``` -FAKE_CHAT_DSN=fakechat+email://MAILER_SERVICE_ID?to=TO&from=FROM +FAKE_CHAT_DSN=fakechat+email://default?to=TO&from=FROM ``` where: - - `MAILER_SERVICE_ID` is mailer service id (use `mailer` by default) - `TO` is email who receive Chat message during development - `FROM` is email who send Chat message during development +To use a custom mailer transport: +``` +FAKE_CHAT_DSN=fakechat+email://mailchimp?to=TO&from=FROM +``` + Resources --------- diff --git a/src/Symfony/Component/Notifier/Bridge/FakeChat/Tests/FakeChatEmailTransportTest.php b/src/Symfony/Component/Notifier/Bridge/FakeChat/Tests/FakeChatEmailTransportTest.php index 34836d0599..439ce2f6b4 100644 --- a/src/Symfony/Component/Notifier/Bridge/FakeChat/Tests/FakeChatEmailTransportTest.php +++ b/src/Symfony/Component/Notifier/Bridge/FakeChat/Tests/FakeChatEmailTransportTest.php @@ -12,27 +12,34 @@ namespace Symfony\Component\Notifier\Bridge\FakeChat\Tests; use Symfony\Component\Mailer\MailerInterface; +use Symfony\Component\Mime\Email; use Symfony\Component\Notifier\Bridge\FakeChat\FakeChatEmailTransport; 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\Tests\Fixtures\TestOptions; +use Symfony\Component\Notifier\Tests\Mailer\DummyMailer; use Symfony\Component\Notifier\Transport\TransportInterface; use Symfony\Contracts\HttpClient\HttpClientInterface; -/** - * @author Oskar Stark - */ final class FakeChatEmailTransportTest extends TransportTestCase { - public function createTransport(?HttpClientInterface $client = null): TransportInterface + public function createTransport(?HttpClientInterface $client = null, ?string $transportName = null): TransportInterface { - return (new FakeChatEmailTransport($this->createMock(MailerInterface::class), 'recipient@email.net', 'from@email.net'))->setHost('mailer'); + $transport = (new FakeChatEmailTransport($this->createMock(MailerInterface::class), 'recipient@email.net', 'sender@email.net', $client ?? $this->createMock(HttpClientInterface::class))); + + if (null !== $transportName) { + $transport->setHost($transportName); + } + + return $transport; } public function toStringProvider(): iterable { - yield ['fakechat+email://mailer?to=recipient@email.net&from=from@email.net', $this->createTransport()]; + yield ['fakechat+email://default?to=recipient@email.net&from=sender@email.net', $this->createTransport()]; + yield ['fakechat+email://mailchimp?to=recipient@email.net&from=sender@email.net', $this->createTransport(null, 'mailchimp')]; } public function supportedMessagesProvider(): iterable @@ -45,4 +52,98 @@ final class FakeChatEmailTransportTest extends TransportTestCase yield [new SmsMessage('0611223344', 'Hello!')]; yield [$this->createMock(MessageInterface::class)]; } + + public function testSendWithDefaultTransportAndWithRecipient() + { + $transportName = null; + + $message = new ChatMessage($subject = 'Hello!', new TestOptions(['recipient_id' => $recipient = 'Oskar'])); + + $mailer = new DummyMailer(); + + $transport = (new FakeChatEmailTransport($mailer, $to = 'recipient@email.net', $from = 'sender@email.net')); + $transport->setHost($transportName); + + $transport->send($message); + + /** @var Email $sentEmail */ + $sentEmail = $mailer->getSentEmail(); + $this->assertInstanceOf(Email::class, $sentEmail); + $this->assertSame($to, $sentEmail->getTo()[0]->getEncodedAddress()); + $this->assertSame($from, $sentEmail->getFrom()[0]->getEncodedAddress()); + $this->assertSame(sprintf('New Chat message for recipient: %s', $recipient), $sentEmail->getSubject()); + $this->assertSame($subject, $sentEmail->getTextBody()); + $this->assertFalse($sentEmail->getHeaders()->has('X-Transport')); + } + + public function testSendWithDefaultTransportAndWithoutRecipient() + { + $transportName = null; + + $message = new ChatMessage($subject = 'Hello!'); + + $mailer = new DummyMailer(); + + $transport = (new FakeChatEmailTransport($mailer, $to = 'recipient@email.net', $from = 'sender@email.net')); + $transport->setHost($transportName); + + $transport->send($message); + + /** @var Email $sentEmail */ + $sentEmail = $mailer->getSentEmail(); + $this->assertInstanceOf(Email::class, $sentEmail); + $this->assertSame($to, $sentEmail->getTo()[0]->getEncodedAddress()); + $this->assertSame($from, $sentEmail->getFrom()[0]->getEncodedAddress()); + $this->assertSame('New Chat message without specified recipient!', $sentEmail->getSubject()); + $this->assertSame($subject, $sentEmail->getTextBody()); + $this->assertFalse($sentEmail->getHeaders()->has('X-Transport')); + } + + public function testSendWithCustomTransportAndWithRecipient() + { + $transportName = 'mailchimp'; + + $message = new ChatMessage($subject = 'Hello!', new TestOptions(['recipient_id' => $recipient = 'Oskar'])); + + $mailer = new DummyMailer(); + + $transport = (new FakeChatEmailTransport($mailer, $to = 'recipient@email.net', $from = 'sender@email.net')); + $transport->setHost($transportName); + + $transport->send($message); + + /** @var Email $sentEmail */ + $sentEmail = $mailer->getSentEmail(); + $this->assertInstanceOf(Email::class, $sentEmail); + $this->assertSame($to, $sentEmail->getTo()[0]->getEncodedAddress()); + $this->assertSame($from, $sentEmail->getFrom()[0]->getEncodedAddress()); + $this->assertSame(sprintf('New Chat message for recipient: %s', $recipient), $sentEmail->getSubject()); + $this->assertSame($subject, $sentEmail->getTextBody()); + $this->assertTrue($sentEmail->getHeaders()->has('X-Transport')); + $this->assertSame($transportName, $sentEmail->getHeaders()->get('X-Transport')->getBodyAsString()); + } + + public function testSendWithCustomTransportAndWithoutRecipient() + { + $transportName = 'mailchimp'; + + $message = new ChatMessage($subject = 'Hello!'); + + $mailer = new DummyMailer(); + + $transport = (new FakeChatEmailTransport($mailer, $to = 'recipient@email.net', $from = 'sender@email.net')); + $transport->setHost($transportName); + + $transport->send($message); + + /** @var Email $sentEmail */ + $sentEmail = $mailer->getSentEmail(); + $this->assertInstanceOf(Email::class, $sentEmail); + $this->assertSame($to, $sentEmail->getTo()[0]->getEncodedAddress()); + $this->assertSame($from, $sentEmail->getFrom()[0]->getEncodedAddress()); + $this->assertSame('New Chat message without specified recipient!', $sentEmail->getSubject()); + $this->assertSame($subject, $sentEmail->getTextBody()); + $this->assertTrue($sentEmail->getHeaders()->has('X-Transport')); + $this->assertSame($transportName, $sentEmail->getHeaders()->get('X-Transport')->getBodyAsString()); + } } diff --git a/src/Symfony/Component/Notifier/Bridge/FakeChat/Tests/FakeChatTransportFactoryTest.php b/src/Symfony/Component/Notifier/Bridge/FakeChat/Tests/FakeChatTransportFactoryTest.php index f3e928a279..2debe4dd48 100644 --- a/src/Symfony/Component/Notifier/Bridge/FakeChat/Tests/FakeChatTransportFactoryTest.php +++ b/src/Symfony/Component/Notifier/Bridge/FakeChat/Tests/FakeChatTransportFactoryTest.php @@ -15,11 +15,7 @@ use Symfony\Component\Mailer\MailerInterface; use Symfony\Component\Notifier\Bridge\FakeChat\FakeChatTransportFactory; use Symfony\Component\Notifier\Test\TransportFactoryTestCase; use Symfony\Component\Notifier\Transport\TransportFactoryInterface; -use Symfony\Contracts\Service\ServiceProviderInterface; -/** - * @author Oskar Stark - */ final class FakeChatTransportFactoryTest extends TransportFactoryTestCase { /** @@ -27,41 +23,42 @@ final class FakeChatTransportFactoryTest extends TransportFactoryTestCase */ public function createFactory(): TransportFactoryInterface { - $serviceProvider = $this->createMock(ServiceProviderInterface::class); - $serviceProvider->method('has')->willReturn(true); - $serviceProvider->method('get')->willReturn($this->createMock(MailerInterface::class)); - - return new FakeChatTransportFactory($serviceProvider); + return new FakeChatTransportFactory($this->createMock(MailerInterface::class)); } public function createProvider(): iterable { yield [ - 'fakechat+email://mailer?to=recipient@email.net&from=sender@email.net', - 'fakechat+email://mailer?to=recipient@email.net&from=sender@email.net', + 'fakechat+email://default?to=recipient@email.net&from=sender@email.net', + 'fakechat+email://default?to=recipient@email.net&from=sender@email.net', + ]; + + yield [ + 'fakechat+email://mailchimp?to=recipient@email.net&from=sender@email.net', + 'fakechat+email://mailchimp?to=recipient@email.net&from=sender@email.net', ]; } public function missingRequiredOptionProvider(): iterable { - yield 'missing option: from' => ['fakechat+email://mailer?to=recipient@email.net']; - yield 'missing option: to' => ['fakechat+email://mailer?from=sender@email.net']; + yield 'missing option: from' => ['fakechat+email://default?to=recipient@email.net']; + yield 'missing option: to' => ['fakechat+email://default?from=sender@email.net']; } public function supportsProvider(): iterable { - yield [true, 'fakechat+email://mailer?to=recipient@email.net&from=sender@email.net']; - yield [false, 'somethingElse://mailer?to=recipient@email.net&from=sender@email.net']; + yield [true, 'fakechat+email://default?to=recipient@email.net&from=sender@email.net']; + yield [false, 'somethingElse://default?to=recipient@email.net&from=sender@email.net']; } public function incompleteDsnProvider(): iterable { - yield 'missing from' => ['fakechat+email://mailer?to=recipient@email.net']; - yield 'missing to' => ['fakechat+email://mailer?from=recipient@email.net']; + yield 'missing from' => ['fakechat+email://default?to=recipient@email.net']; + yield 'missing to' => ['fakechat+email://default?from=recipient@email.net']; } public function unsupportedSchemeProvider(): iterable { - yield ['somethingElse://mailer?to=recipient@email.net&from=sender@email.net']; + yield ['somethingElse://default?to=recipient@email.net&from=sender@email.net']; } } diff --git a/src/Symfony/Component/Notifier/Bridge/FakeSms/FakeSmsEmailTransport.php b/src/Symfony/Component/Notifier/Bridge/FakeSms/FakeSmsEmailTransport.php index 886b9286fb..d38acdb1e8 100644 --- a/src/Symfony/Component/Notifier/Bridge/FakeSms/FakeSmsEmailTransport.php +++ b/src/Symfony/Component/Notifier/Bridge/FakeSms/FakeSmsEmailTransport.php @@ -24,9 +24,12 @@ use Symfony\Contracts\HttpClient\HttpClientInterface; /** * @author James Hemery + * @author Oskar Stark */ final class FakeSmsEmailTransport extends AbstractTransport { + protected const HOST = 'default'; + private $mailer; private $to; private $from; @@ -68,6 +71,10 @@ final class FakeSmsEmailTransport extends AbstractTransport ->html($message->getSubject()) ->text($message->getSubject()); + if ('default' !== $transportName = $this->getEndpoint()) { + $email->getHeaders()->addTextHeader('X-Transport', $transportName); + } + $this->mailer->send($email); 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 2dbc36b466..eb666536bc 100644 --- a/src/Symfony/Component/Notifier/Bridge/FakeSms/FakeSmsTransportFactory.php +++ b/src/Symfony/Component/Notifier/Bridge/FakeSms/FakeSmsTransportFactory.php @@ -11,24 +11,25 @@ namespace Symfony\Component\Notifier\Bridge\FakeSms; +use Symfony\Component\Mailer\MailerInterface; use Symfony\Component\Notifier\Exception\UnsupportedSchemeException; use Symfony\Component\Notifier\Transport\AbstractTransportFactory; use Symfony\Component\Notifier\Transport\Dsn; use Symfony\Component\Notifier\Transport\TransportInterface; -use Symfony\Contracts\Service\ServiceProviderInterface; /** * @author James Hemery + * @author Oskar Stark */ final class FakeSmsTransportFactory extends AbstractTransportFactory { - protected $serviceProvider; + protected $mailer; - public function __construct(ServiceProviderInterface $serviceProvider) + public function __construct(MailerInterface $mailer) { parent::__construct(); - $this->serviceProvider = $serviceProvider; + $this->mailer = $mailer; } /** @@ -43,11 +44,11 @@ final class FakeSmsTransportFactory extends AbstractTransportFactory } if ('fakesms+email' === $scheme) { - $serviceId = $dsn->getHost(); + $mailerTransport = $dsn->getHost(); $to = $dsn->getRequiredOption('to'); $from = $dsn->getRequiredOption('from'); - return (new FakeSmsEmailTransport($this->serviceProvider->get($serviceId), $to, $from))->setHost($serviceId); + return (new FakeSmsEmailTransport($this->mailer, $to, $from))->setHost($mailerTransport); } } diff --git a/src/Symfony/Component/Notifier/Bridge/FakeSms/README.md b/src/Symfony/Component/Notifier/Bridge/FakeSms/README.md index b216bd8a02..5e7460e57e 100644 --- a/src/Symfony/Component/Notifier/Bridge/FakeSms/README.md +++ b/src/Symfony/Component/Notifier/Bridge/FakeSms/README.md @@ -6,14 +6,18 @@ Provides Fake SMS (as email during development) integration for Symfony Notifier #### DSN example ``` -FAKE_SMS_DSN=fakesms+email://MAILER_SERVICE_ID?to=TO&from=FROM +FAKE_SMS_DSN=fakesms+email://default?to=TO&from=FROM ``` where: - - `MAILER_SERVICE_ID` is mailer service id (use `mailer` by default) - `TO` is email who receive SMS during development - `FROM` is email who send SMS during development +To use a custom mailer transport: +``` +FAKE_SMS_DSN=fakesms+email://mailchimp?to=TO&from=FROM +``` + Resources --------- diff --git a/src/Symfony/Component/Notifier/Bridge/FakeSms/Tests/FakeSmsEmailTransportTest.php b/src/Symfony/Component/Notifier/Bridge/FakeSms/Tests/FakeSmsEmailTransportTest.php index 38d1ccecd1..0d33903c9f 100644 --- a/src/Symfony/Component/Notifier/Bridge/FakeSms/Tests/FakeSmsEmailTransportTest.php +++ b/src/Symfony/Component/Notifier/Bridge/FakeSms/Tests/FakeSmsEmailTransportTest.php @@ -12,27 +12,33 @@ namespace Symfony\Component\Notifier\Bridge\FakeSms\Tests; use Symfony\Component\Mailer\MailerInterface; +use Symfony\Component\Mime\Email; use Symfony\Component\Notifier\Bridge\FakeSms\FakeSmsEmailTransport; 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\Tests\Mailer\DummyMailer; use Symfony\Component\Notifier\Transport\TransportInterface; use Symfony\Contracts\HttpClient\HttpClientInterface; -/** - * @author James Hemery - */ final class FakeSmsEmailTransportTest extends TransportTestCase { - public function createTransport(?HttpClientInterface $client = null): TransportInterface + public function createTransport(?HttpClientInterface $client = null, ?string $transportName = null): TransportInterface { - return (new FakeSmsEmailTransport($this->createMock(MailerInterface::class), 'recipient@email.net', 'from@email.net'))->setHost('mailer'); + $transport = (new FakeSmsEmailTransport($this->createMock(MailerInterface::class), 'recipient@email.net', 'sender@email.net', $client ?? $this->createMock(HttpClientInterface::class))); + + if (null !== $transportName) { + $transport->setHost($transportName); + } + + return $transport; } public function toStringProvider(): iterable { - yield ['fakesms+email://mailer?to=recipient@email.net&from=from@email.net', $this->createTransport()]; + yield ['fakesms+email://default?to=recipient@email.net&from=sender@email.net', $this->createTransport()]; + yield ['fakesms+email://mailchimp?to=recipient@email.net&from=sender@email.net', $this->createTransport(null, 'mailchimp')]; } public function supportedMessagesProvider(): iterable @@ -46,4 +52,51 @@ final class FakeSmsEmailTransportTest extends TransportTestCase yield [new ChatMessage('Hello!')]; yield [$this->createMock(MessageInterface::class)]; } + + public function testSendWithDefaultTransport() + { + $transportName = null; + + $message = new SmsMessage($phone = '0611223344', $subject = 'Hello!'); + + $mailer = new DummyMailer(); + + $transport = (new FakeSmsEmailTransport($mailer, $to = 'recipient@email.net', $from = 'sender@email.net')); + $transport->setHost($transportName); + + $transport->send($message); + + /** @var Email $sentEmail */ + $sentEmail = $mailer->getSentEmail(); + $this->assertInstanceOf(Email::class, $sentEmail); + $this->assertSame($to, $sentEmail->getTo()[0]->getEncodedAddress()); + $this->assertSame($from, $sentEmail->getFrom()[0]->getEncodedAddress()); + $this->assertSame(sprintf('New SMS on phone number: %s', $phone), $sentEmail->getSubject()); + $this->assertSame($subject, $sentEmail->getTextBody()); + $this->assertFalse($sentEmail->getHeaders()->has('X-Transport')); + } + + public function testSendWithCustomTransport() + { + $transportName = 'mailchimp'; + + $message = new SmsMessage($phone = '0611223344', $subject = 'Hello!'); + + $mailer = new DummyMailer(); + + $transport = (new FakeSmsEmailTransport($mailer, $to = 'recipient@email.net', $from = 'sender@email.net')); + $transport->setHost($transportName); + + $transport->send($message); + + /** @var Email $sentEmail */ + $sentEmail = $mailer->getSentEmail(); + $this->assertInstanceOf(Email::class, $sentEmail); + $this->assertSame($to, $sentEmail->getTo()[0]->getEncodedAddress()); + $this->assertSame($from, $sentEmail->getFrom()[0]->getEncodedAddress()); + $this->assertSame(sprintf('New SMS on phone number: %s', $phone), $sentEmail->getSubject()); + $this->assertSame($subject, $sentEmail->getTextBody()); + $this->assertTrue($sentEmail->getHeaders()->has('X-Transport')); + $this->assertSame($transportName, $sentEmail->getHeaders()->get('X-Transport')->getBodyAsString()); + } } diff --git a/src/Symfony/Component/Notifier/Bridge/FakeSms/Tests/FakeSmsTransportFactoryTest.php b/src/Symfony/Component/Notifier/Bridge/FakeSms/Tests/FakeSmsTransportFactoryTest.php index 1557f465de..e767c0b7cb 100644 --- a/src/Symfony/Component/Notifier/Bridge/FakeSms/Tests/FakeSmsTransportFactoryTest.php +++ b/src/Symfony/Component/Notifier/Bridge/FakeSms/Tests/FakeSmsTransportFactoryTest.php @@ -15,11 +15,7 @@ use Symfony\Component\Mailer\MailerInterface; use Symfony\Component\Notifier\Bridge\FakeSms\FakeSmsTransportFactory; use Symfony\Component\Notifier\Test\TransportFactoryTestCase; use Symfony\Component\Notifier\Transport\TransportFactoryInterface; -use Symfony\Contracts\Service\ServiceProviderInterface; -/** - * @author James Hemery - */ final class FakeSmsTransportFactoryTest extends TransportFactoryTestCase { /** @@ -27,41 +23,42 @@ final class FakeSmsTransportFactoryTest extends TransportFactoryTestCase */ public function createFactory(): TransportFactoryInterface { - $serviceProvider = $this->createMock(ServiceProviderInterface::class); - $serviceProvider->method('has')->willReturn(true); - $serviceProvider->method('get')->willReturn($this->createMock(MailerInterface::class)); - - return new FakeSmsTransportFactory($serviceProvider); + return new FakeSmsTransportFactory($this->createMock(MailerInterface::class)); } public function createProvider(): iterable { yield [ - 'fakesms+email://mailer?to=recipient@email.net&from=sender@email.net', - 'fakesms+email://mailer?to=recipient@email.net&from=sender@email.net', + 'fakesms+email://default?to=recipient@email.net&from=sender@email.net', + 'fakesms+email://default?to=recipient@email.net&from=sender@email.net', + ]; + + yield [ + 'fakesms+email://mailchimp?to=recipient@email.net&from=sender@email.net', + 'fakesms+email://mailchimp?to=recipient@email.net&from=sender@email.net', ]; } public function missingRequiredOptionProvider(): iterable { - yield 'missing option: from' => ['fakesms+email://mailer?to=recipient@email.net']; - yield 'missing option: to' => ['fakesms+email://mailer?from=sender@email.net']; + yield 'missing option: from' => ['fakesms+email://default?to=recipient@email.net']; + yield 'missing option: to' => ['fakesms+email://default?from=sender@email.net']; } public function supportsProvider(): iterable { - yield [true, 'fakesms+email://mailer?to=recipient@email.net&from=sender@email.net']; - yield [false, 'somethingElse://mailer?to=recipient@email.net&from=sender@email.net']; + yield [true, 'fakesms+email://default?to=recipient@email.net&from=sender@email.net']; + yield [false, 'somethingElse://default?to=recipient@email.net&from=sender@email.net']; } public function incompleteDsnProvider(): iterable { - yield 'missing from' => ['fakesms+email://mailer?to=recipient@email.net']; - yield 'missing to' => ['fakesms+email://mailer?from=recipient@email.net']; + yield 'missing from' => ['fakesms+email://default?to=recipient@email.net']; + yield 'missing to' => ['fakesms+email://default?from=recipient@email.net']; } public function unsupportedSchemeProvider(): iterable { - yield ['somethingElse://mailer?to=recipient@email.net&from=sender@email.net']; + yield ['somethingElse://default?to=recipient@email.net&from=sender@email.net']; } } diff --git a/src/Symfony/Component/Notifier/Tests/Fixtures/TestOptions.php b/src/Symfony/Component/Notifier/Tests/Fixtures/TestOptions.php new file mode 100644 index 0000000000..1f129767fd --- /dev/null +++ b/src/Symfony/Component/Notifier/Tests/Fixtures/TestOptions.php @@ -0,0 +1,35 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Notifier\Tests\Fixtures; + +use Symfony\Component\Notifier\Message\MessageInterface; +use Symfony\Component\Notifier\Message\MessageOptionsInterface; + +final class TestOptions implements MessageOptionsInterface +{ + private $options; + + public function __construct(array $options = []) + { + $this->options = $options; + } + + public function getRecipientId(): ?string + { + return $this->options['recipient_id']; + } + + public function toArray(): array + { + return $this->options; + } +} diff --git a/src/Symfony/Component/Notifier/Tests/Mailer/DummyMailer.php b/src/Symfony/Component/Notifier/Tests/Mailer/DummyMailer.php new file mode 100644 index 0000000000..3d4ddf6296 --- /dev/null +++ b/src/Symfony/Component/Notifier/Tests/Mailer/DummyMailer.php @@ -0,0 +1,34 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Notifier\Tests\Mailer; + +use Symfony\Component\Mailer\Envelope; +use Symfony\Component\Mailer\MailerInterface; +use Symfony\Component\Mime\RawMessage; + +/** + * @author Oskar Stark + */ +class DummyMailer implements MailerInterface +{ + private $sentMessage = null; + + public function send(RawMessage $message, Envelope $envelope = null): void + { + $this->sentMessage = $message; + } + + public function getSentEmail(): RawMessage + { + return $this->sentMessage; + } +}