Skip to content

Commit 035a59e

Browse files
committed
[Notifier] Fix service locator for fake-chat/sms
1 parent ddb48bb commit 035a59e

File tree

13 files changed

+322
-64
lines changed

13 files changed

+322
-64
lines changed

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2417,6 +2417,16 @@ private function registerNotifierConfiguration(array $config, ContainerBuilder $
24172417
$container->removeDefinition($classToServices[MercureTransportFactory::class]);
24182418
}
24192419

2420+
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'])) {
2421+
$container->getDefinition($classToServices[FakeChatTransportFactory::class])
2422+
->setArgument(0, new Reference('mailer'));
2423+
}
2424+
2425+
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'])) {
2426+
$container->getDefinition($classToServices[FakeSmsTransportFactory::class])
2427+
->setArgument(0, new Reference('mailer'));
2428+
}
2429+
24202430
if (isset($config['admin_recipients'])) {
24212431
$notifier = $container->getDefinition('notifier');
24222432
foreach ($config['admin_recipients'] as $i => $recipient) {

src/Symfony/Component/Notifier/Bridge/FakeChat/FakeChatEmailTransport.php

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
*/
2828
final class FakeChatEmailTransport extends AbstractTransport
2929
{
30+
protected const HOST = 'default';
31+
3032
private $mailer;
3133
private $to;
3234
private $from;
@@ -61,13 +63,22 @@ protected function doSend(MessageInterface $message): SentMessage
6163
throw new UnsupportedMessageTypeException(__CLASS__, ChatMessage::class, $message);
6264
}
6365

66+
$subject = 'New Chat message without specified recipient!';
67+
if (null !== $message->getRecipientId()) {
68+
$subject = sprintf('New Chat message for recipient: %s', $message->getRecipientId());
69+
}
70+
6471
$email = (new Email())
6572
->from($this->from)
6673
->to($this->to)
67-
->subject(sprintf('New Chat message for recipient: %s', $message->getRecipientId()))
74+
->subject($subject)
6875
->html($message->getSubject())
6976
->text($message->getSubject());
7077

78+
if ('default' !== $transportName = $this->getEndpoint()) {
79+
$email->getHeaders()->addTextHeader('X-Transport', $transportName);
80+
}
81+
7182
$this->mailer->send($email);
7283

7384
return new SentMessage($message, (string) $this);

src/Symfony/Component/Notifier/Bridge/FakeChat/FakeChatTransportFactory.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,24 +11,24 @@
1111

1212
namespace Symfony\Component\Notifier\Bridge\FakeChat;
1313

14+
use Symfony\Component\Mailer\MailerInterface;
1415
use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
1516
use Symfony\Component\Notifier\Transport\AbstractTransportFactory;
1617
use Symfony\Component\Notifier\Transport\Dsn;
1718
use Symfony\Component\Notifier\Transport\TransportInterface;
18-
use Symfony\Contracts\Service\ServiceProviderInterface;
1919

2020
/**
2121
* @author Oskar Stark <oskarstark@googlemail.com>
2222
*/
2323
final class FakeChatTransportFactory extends AbstractTransportFactory
2424
{
25-
protected $serviceProvider;
25+
protected $mailer;
2626

27-
public function __construct(ServiceProviderInterface $serviceProvider)
27+
public function __construct(MailerInterface $mailer)
2828
{
2929
parent::__construct();
3030

31-
$this->serviceProvider = $serviceProvider;
31+
$this->mailer = $mailer;
3232
}
3333

3434
/**
@@ -43,11 +43,11 @@ public function create(Dsn $dsn): TransportInterface
4343
}
4444

4545
if ('fakechat+email' === $scheme) {
46-
$serviceId = $dsn->getHost();
46+
$mailerTransport = $dsn->getHost();
4747
$to = $dsn->getRequiredOption('to');
4848
$from = $dsn->getRequiredOption('from');
4949

50-
return (new FakeChatEmailTransport($this->serviceProvider->get($serviceId), $to, $from))->setHost($serviceId);
50+
return (new FakeChatEmailTransport($this->mailer, $to, $from))->setHost($mailerTransport);
5151
}
5252
}
5353

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,18 @@ Provides Fake Chat (as email during development) integration for Symfony Notifie
66
#### DSN example
77

88
```
9-
FAKE_CHAT_DSN=fakechat+email://MAILER_SERVICE_ID?to=TO&from=FROM
9+
FAKE_CHAT_DSN=fakechat+email://default?to=TO&from=FROM
1010
```
1111

1212
where:
13-
- `MAILER_SERVICE_ID` is mailer service id (use `mailer` by default)
1413
- `TO` is email who receive Chat message during development
1514
- `FROM` is email who send Chat message during development
1615

16+
To use a custom mailer transport:
17+
```
18+
FAKE_CHAT_DSN=fakechat+email://mailchimp?to=TO&from=FROM
19+
```
20+
1721
Resources
1822
---------
1923

src/Symfony/Component/Notifier/Bridge/FakeChat/Tests/FakeChatEmailTransportTest.php

Lines changed: 107 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,27 +12,34 @@
1212
namespace Symfony\Component\Notifier\Bridge\FakeChat\Tests;
1313

1414
use Symfony\Component\Mailer\MailerInterface;
15+
use Symfony\Component\Mime\Email;
1516
use Symfony\Component\Notifier\Bridge\FakeChat\FakeChatEmailTransport;
1617
use Symfony\Component\Notifier\Message\ChatMessage;
1718
use Symfony\Component\Notifier\Message\MessageInterface;
1819
use Symfony\Component\Notifier\Message\SmsMessage;
1920
use Symfony\Component\Notifier\Test\TransportTestCase;
21+
use Symfony\Component\Notifier\Tests\Fixtures\TestOptions;
22+
use Symfony\Component\Notifier\Tests\Mailer\DummyMailer;
2023
use Symfony\Component\Notifier\Transport\TransportInterface;
2124
use Symfony\Contracts\HttpClient\HttpClientInterface;
2225

23-
/**
24-
* @author Oskar Stark <oskarstark@googlemail.com>
25-
*/
2626
final class FakeChatEmailTransportTest extends TransportTestCase
2727
{
28-
public function createTransport(?HttpClientInterface $client = null): TransportInterface
28+
public function createTransport(?HttpClientInterface $client = null, ?string $transportName = null): TransportInterface
2929
{
30-
return (new FakeChatEmailTransport($this->createMock(MailerInterface::class), 'recipient@email.net', 'from@email.net'))->setHost('mailer');
30+
$transport = (new FakeChatEmailTransport($this->createMock(MailerInterface::class), 'recipient@email.net', 'sender@email.net', $client ?? $this->createMock(HttpClientInterface::class)));
31+
32+
if (null !== $transportName) {
33+
$transport->setHost($transportName);
34+
}
35+
36+
return $transport;
3137
}
3238

3339
public function toStringProvider(): iterable
3440
{
35-
yield ['fakechat+email://mailer?to=recipient@email.net&from=from@email.net', $this->createTransport()];
41+
yield ['fakechat+email://default?to=recipient@email.net&from=sender@email.net', $this->createTransport()];
42+
yield ['fakechat+email://mailchimp?to=recipient@email.net&from=sender@email.net', $this->createTransport(null, 'mailchimp')];
3643
}
3744

3845
public function supportedMessagesProvider(): iterable
@@ -45,4 +52,98 @@ public function unsupportedMessagesProvider(): iterable
4552
yield [new SmsMessage('0611223344', 'Hello!')];
4653
yield [$this->createMock(MessageInterface::class)];
4754
}
55+
56+
public function testSendWithDefaultTransportAndWithRecipient()
57+
{
58+
$transportName = null;
59+
60+
$message = new ChatMessage($subject = 'Hello!', new TestOptions(['recipient_id' => $recipient = 'Oskar']));
61+
62+
$mailer = new DummyMailer();
63+
64+
$transport = (new FakeChatEmailTransport($mailer, $to = 'recipient@email.net', $from = 'sender@email.net'));
65+
$transport->setHost($transportName);
66+
67+
$transport->send($message);
68+
69+
/** @var Email $sentEmail */
70+
$sentEmail = $mailer->getSentEmail();
71+
$this->assertInstanceOf(Email::class, $sentEmail);
72+
$this->assertSame($to, $sentEmail->getTo()[0]->getEncodedAddress());
73+
$this->assertSame($from, $sentEmail->getFrom()[0]->getEncodedAddress());
74+
$this->assertSame(sprintf('New Chat message for recipient: %s', $recipient), $sentEmail->getSubject());
75+
$this->assertSame($subject, $sentEmail->getTextBody());
76+
$this->assertFalse($sentEmail->getHeaders()->has('X-Transport'));
77+
}
78+
79+
public function testSendWithDefaultTransportAndWithoutRecipient()
80+
{
81+
$transportName = null;
82+
83+
$message = new ChatMessage($subject = 'Hello!');
84+
85+
$mailer = new DummyMailer();
86+
87+
$transport = (new FakeChatEmailTransport($mailer, $to = 'recipient@email.net', $from = 'sender@email.net'));
88+
$transport->setHost($transportName);
89+
90+
$transport->send($message);
91+
92+
/** @var Email $sentEmail */
93+
$sentEmail = $mailer->getSentEmail();
94+
$this->assertInstanceOf(Email::class, $sentEmail);
95+
$this->assertSame($to, $sentEmail->getTo()[0]->getEncodedAddress());
96+
$this->assertSame($from, $sentEmail->getFrom()[0]->getEncodedAddress());
97+
$this->assertSame('New Chat message without specified recipient!', $sentEmail->getSubject());
98+
$this->assertSame($subject, $sentEmail->getTextBody());
99+
$this->assertFalse($sentEmail->getHeaders()->has('X-Transport'));
100+
}
101+
102+
public function testSendWithCustomTransportAndWithRecipient()
103+
{
104+
$transportName = 'mailchimp';
105+
106+
$message = new ChatMessage($subject = 'Hello!', new TestOptions(['recipient_id' => $recipient = 'Oskar']));
107+
108+
$mailer = new DummyMailer();
109+
110+
$transport = (new FakeChatEmailTransport($mailer, $to = 'recipient@email.net', $from = 'sender@email.net'));
111+
$transport->setHost($transportName);
112+
113+
$transport->send($message);
114+
115+
/** @var Email $sentEmail */
116+
$sentEmail = $mailer->getSentEmail();
117+
$this->assertInstanceOf(Email::class, $sentEmail);
118+
$this->assertSame($to, $sentEmail->getTo()[0]->getEncodedAddress());
119+
$this->assertSame($from, $sentEmail->getFrom()[0]->getEncodedAddress());
120+
$this->assertSame(sprintf('New Chat message for recipient: %s', $recipient), $sentEmail->getSubject());
121+
$this->assertSame($subject, $sentEmail->getTextBody());
122+
$this->assertTrue($sentEmail->getHeaders()->has('X-Transport'));
123+
$this->assertSame($transportName, $sentEmail->getHeaders()->get('X-Transport')->getBodyAsString());
124+
}
125+
126+
public function testSendWithCustomTransportAndWithoutRecipient()
127+
{
128+
$transportName = 'mailchimp';
129+
130+
$message = new ChatMessage($subject = 'Hello!');
131+
132+
$mailer = new DummyMailer();
133+
134+
$transport = (new FakeChatEmailTransport($mailer, $to = 'recipient@email.net', $from = 'sender@email.net'));
135+
$transport->setHost($transportName);
136+
137+
$transport->send($message);
138+
139+
/** @var Email $sentEmail */
140+
$sentEmail = $mailer->getSentEmail();
141+
$this->assertInstanceOf(Email::class, $sentEmail);
142+
$this->assertSame($to, $sentEmail->getTo()[0]->getEncodedAddress());
143+
$this->assertSame($from, $sentEmail->getFrom()[0]->getEncodedAddress());
144+
$this->assertSame('New Chat message without specified recipient!', $sentEmail->getSubject());
145+
$this->assertSame($subject, $sentEmail->getTextBody());
146+
$this->assertTrue($sentEmail->getHeaders()->has('X-Transport'));
147+
$this->assertSame($transportName, $sentEmail->getHeaders()->get('X-Transport')->getBodyAsString());
148+
}
48149
}

src/Symfony/Component/Notifier/Bridge/FakeChat/Tests/FakeChatTransportFactoryTest.php

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -15,53 +15,50 @@
1515
use Symfony\Component\Notifier\Bridge\FakeChat\FakeChatTransportFactory;
1616
use Symfony\Component\Notifier\Test\TransportFactoryTestCase;
1717
use Symfony\Component\Notifier\Transport\TransportFactoryInterface;
18-
use Symfony\Contracts\Service\ServiceProviderInterface;
1918

20-
/**
21-
* @author Oskar Stark <oskarstark@googlemail.com>
22-
*/
2319
final class FakeChatTransportFactoryTest extends TransportFactoryTestCase
2420
{
2521
/**
2622
* @return FakeChatTransportFactory
2723
*/
2824
public function createFactory(): TransportFactoryInterface
2925
{
30-
$serviceProvider = $this->createMock(ServiceProviderInterface::class);
31-
$serviceProvider->method('has')->willReturn(true);
32-
$serviceProvider->method('get')->willReturn($this->createMock(MailerInterface::class));
33-
34-
return new FakeChatTransportFactory($serviceProvider);
26+
return new FakeChatTransportFactory($this->createMock(MailerInterface::class));
3527
}
3628

3729
public function createProvider(): iterable
3830
{
3931
yield [
40-
'fakechat+email://mailer?to=recipient@email.net&from=sender@email.net',
41-
'fakechat+email://mailer?to=recipient@email.net&from=sender@email.net',
32+
'fakechat+email://default?to=recipient@email.net&from=sender@email.net',
33+
'fakechat+email://default?to=recipient@email.net&from=sender@email.net',
34+
];
35+
36+
yield [
37+
'fakechat+email://mailchimp?to=recipient@email.net&from=sender@email.net',
38+
'fakechat+email://mailchimp?to=recipient@email.net&from=sender@email.net',
4239
];
4340
}
4441

4542
public function missingRequiredOptionProvider(): iterable
4643
{
47-
yield 'missing option: from' => ['fakechat+email://mailer?to=recipient@email.net'];
48-
yield 'missing option: to' => ['fakechat+email://mailer?from=sender@email.net'];
44+
yield 'missing option: from' => ['fakechat+email://default?to=recipient@email.net'];
45+
yield 'missing option: to' => ['fakechat+email://default?from=sender@email.net'];
4946
}
5047

5148
public function supportsProvider(): iterable
5249
{
53-
yield [true, 'fakechat+email://mailer?to=recipient@email.net&from=sender@email.net'];
54-
yield [false, 'somethingElse://mailer?to=recipient@email.net&from=sender@email.net'];
50+
yield [true, 'fakechat+email://default?to=recipient@email.net&from=sender@email.net'];
51+
yield [false, 'somethingElse://default?to=recipient@email.net&from=sender@email.net'];
5552
}
5653

5754
public function incompleteDsnProvider(): iterable
5855
{
59-
yield 'missing from' => ['fakechat+email://mailer?to=recipient@email.net'];
60-
yield 'missing to' => ['fakechat+email://mailer?from=recipient@email.net'];
56+
yield 'missing from' => ['fakechat+email://default?to=recipient@email.net'];
57+
yield 'missing to' => ['fakechat+email://default?from=recipient@email.net'];
6158
}
6259

6360
public function unsupportedSchemeProvider(): iterable
6461
{
65-
yield ['somethingElse://mailer?to=recipient@email.net&from=sender@email.net'];
62+
yield ['somethingElse://default?to=recipient@email.net&from=sender@email.net'];
6663
}
6764
}

src/Symfony/Component/Notifier/Bridge/FakeSms/FakeSmsEmailTransport.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,12 @@
2424

2525
/**
2626
* @author James Hemery <james@yieldstudio.fr>
27+
* @author Oskar Stark <oskarstark@googlemail.com>
2728
*/
2829
final class FakeSmsEmailTransport extends AbstractTransport
2930
{
31+
protected const HOST = 'default';
32+
3033
private $mailer;
3134
private $to;
3235
private $from;
@@ -68,6 +71,10 @@ protected function doSend(MessageInterface $message): SentMessage
6871
->html($message->getSubject())
6972
->text($message->getSubject());
7073

74+
if ('default' !== $transportName = $this->getEndpoint()) {
75+
$email->getHeaders()->addTextHeader('X-Transport', $transportName);
76+
}
77+
7178
$this->mailer->send($email);
7279

7380
return new SentMessage($message, (string) $this);

src/Symfony/Component/Notifier/Bridge/FakeSms/FakeSmsTransportFactory.php

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
namespace Symfony\Component\Notifier\Bridge\FakeSms;
1313

14+
use Symfony\Component\Mailer\MailerInterface;
1415
use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
1516
use Symfony\Component\Notifier\Transport\AbstractTransportFactory;
1617
use Symfony\Component\Notifier\Transport\Dsn;
@@ -19,16 +20,20 @@
1920

2021
/**
2122
* @author James Hemery <james@yieldstudio.fr>
23+
* @author Oskar Stark <oskarstark@googlemail.com>
2224
*/
2325
final class FakeSmsTransportFactory extends AbstractTransportFactory
2426
{
25-
protected $serviceProvider;
27+
protected $mailer;
2628

27-
public function __construct(ServiceProviderInterface $serviceProvider)
29+
/**
30+
* @param ServiceProviderInterface $mailer A container that holds {@see MailerInterface} instances
31+
*/
32+
public function __construct(MailerInterface $mailer)
2833
{
2934
parent::__construct();
3035

31-
$this->serviceProvider = $serviceProvider;
36+
$this->mailer = $mailer;
3237
}
3338

3439
/**
@@ -43,11 +48,11 @@ public function create(Dsn $dsn): TransportInterface
4348
}
4449

4550
if ('fakesms+email' === $scheme) {
46-
$serviceId = $dsn->getHost();
51+
$mailerTransport = $dsn->getHost();
4752
$to = $dsn->getRequiredOption('to');
4853
$from = $dsn->getRequiredOption('from');
4954

50-
return (new FakeSmsEmailTransport($this->serviceProvider->get($serviceId), $to, $from))->setHost($serviceId);
55+
return (new FakeSmsEmailTransport($this->mailer, $to, $from))->setHost($mailerTransport);
5156
}
5257
}
5358

0 commit comments

Comments
 (0)