8000 [Notifier] [FakeSms] Allow missing optional dependency · symfony/symfony@88e6c3e · GitHub
[go: up one dir, main page]

Skip to content

Commit 88e6c3e

Browse files
bschoch-schwarzfabpot
authored andcommitted
[Notifier] [FakeSms] Allow missing optional dependency
1 parent f3a9a0e commit 88e6c3e

File tree

3 files changed

+78
-5
lines changed

3 files changed

+78
-5
lines changed

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

+17-3
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
use Psr\Log\LoggerInterface;
1515
use Symfony\Component\Mailer\MailerInterface;
16+
use Symfony\Component\Notifier\Exception\LogicException;
1617
use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
1718
use Symfony\Component\Notifier\Transport\AbstractTransportFactory;
1819
use Symfony\Component\Notifier\Transport\Dsn;
@@ -24,10 +25,10 @@
2425
*/
2526
final class FakeSmsTransportFactory extends AbstractTransportFactory
2627
{
27-
private MailerInterface $mailer;
28-
private LoggerInterface $logger;
28+
private ?MailerInterface $mailer;
29+
private ?LoggerInterface $logger;
2930

30-
public function __construct(MailerInterface $mailer, LoggerInterface $logger)
31+
public function __construct(MailerInterface $mailer = null, LoggerInterface $logger = null)
3132
{
3233
parent::__construct();
3334

@@ -40,6 +41,10 @@ public function create(Dsn $dsn): FakeSmsEmailTransport|FakeSmsLoggerTransport
4041
$scheme = $dsn->getScheme();
4142

4243
if ('fakesms+email' === $scheme) {
44+
if (null === $this->mailer) {
45+
$this->throwMissingDependencyException($scheme, MailerInterface::class, 'symfony/mailer');
46+
}
47+
4348
$mailerTransport = $dsn->getHost();
4449
$to = $dsn->getRequiredOption('to');
4550
$from = $dsn->getRequiredOption('from');
@@ -48,6 +53,10 @@ public function create(Dsn $dsn): FakeSmsEmailTransport|FakeSmsLoggerTransport
4853
}
4954

5055
if ('fakesms+logger' === $scheme) {
56+
if (null === $this->logger) {
57+
$this->throwMissingDependencyException($scheme, LoggerInterface::class, 'psr/log');
58+
}
59+
5160
return new FakeSmsLoggerTransport($this->logger);
5261
}
5362

@@ -58,4 +67,9 @@ protected function getSupportedSchemes(): array
5867
{
5968
return ['fakesms+email', 'fakesms+logger'];
6069
}
70+
71+
private function throwMissingDependencyException(string $scheme, string $missingDependency, string $suggestedPackage): void
72+
{
73+
throw new LogicException(sprintf('Cannot create a transport for scheme "%s" without providing an implementation of "%s". Try running "composer require "%s"".', $scheme, $missingDependency, $suggestedPackage));
74+
}
6175
}

src/Symfony/Component/Notifier/Bridge/FakeSms/Tests/FakeSmsTransportFactoryTest.php

+56
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,35 @@
1414
use Psr\Log\LoggerInterface;
1515
use Symfony\Component\Mailer\MailerInterface;
1616
use Symfony\Component\Notifier\Bridge\FakeSms\FakeSmsTransportFactory;
17+
use Symfony\Component\Notifier\Exception\LogicException;
1718
use Symfony\Component\Notifier\Test\TransportFactoryTestCase;
19+
use Symfony\Component\Notifier\Transport\Dsn;
1820

1921
final class FakeSmsTransportFactoryTest extends TransportFactoryTestCase
2022
{
23+
/**
24+
* @dataProvider missingRequiredDependencyProvider
25+
*/
26+
public function testMissingRequiredDependency(?MailerInterface $mailer, ?LoggerInterface $logger, string $dsn, string $message)
27+
{
28+
$this->expectException(LogicException::class);
29+
$this->expectExceptionMessage($message);
30+
31+
$factory = new FakeSmsTransportFactory($mailer, $logger);
32+
$factory->create(new Dsn($dsn));
33+
}
34+
35+
/**
36+
* @dataProvider missingOptionalDependencyProvider
37+
*/
38+
public function testMissingOptionalDependency(?MailerInterface $mailer, ?LoggerInterface $logger, string $dsn)
39+
{
40+
$factory = new FakeSmsTransportFactory($mailer, $logger);
41+
$transport = $factory->create(new Dsn($dsn));
42+
43+
$this->assertSame($dsn, (string) $transport);
44+
}
45+
2146
public function createFactory(): FakeSmsTransportFactory
2247
{
2348
return new FakeSmsTransportFactory($this->createMock(MailerInterface::class), $this->createMock(LoggerInterface::class));
@@ -63,4 +88,35 @@ public function unsupportedSchemeProvider(): iterable
6388
{
6489
yield ['somethingElse://default?to=recipient@email.net&from=sender@email.net'];
6590
}
91+
92+
public function missingRequiredDependencyProvider(): iterable
93+
{
94+
$exceptionMessage = 'Cannot create a transport for scheme "%s" without providing an implementation of "%s".';
95+
yield 'missing mailer' => [
96+
null,
97+
$this->createMock(LoggerInterface::class),
98+
'fakesms+email://default?to=recipient@email.net&from=sender@email.net',
99+
sprintf($exceptionMessage, 'fakesms+email', MailerInterface::class),
100+
];
101+
yield 'missing logger' => [
102+
$this->createMock(MailerInterface::class),
103+
null,
104+
'fakesms+logger://default',
105+
sprintf($exceptionMessage, 'fakesms+logger', LoggerInterface::class),
106+
];
107+
}
108+
109+
public function missingOptionalDependencyProvider(): iterable
110+
{
111+
yield 'missing logger' => [
112+
$this->createMock(MailerInterface::class),
113+
null,
114+
'fakesms+email://default?to=recipient@email.net&from=sender@email.net',
115+
];
116+
yield 'missing mailer' => [
117+
null,
118+
$this->createMock(LoggerInterface::class),
119+
'fakesms+logger://default',
120+
];
121+
}
66122
}

src/Symfony/Component/Notifier/Bridge/FakeSms/composer.json

+5-2
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,11 @@
2424
"php": ">=8.1",
2525
"symfony/http-client": "^5.4|^6.0",
2626
"symfony/notifier": "^6.2",
27-
"symfony/event-dispatcher-contracts": "^2|^3",
28-
"symfony/mailer": "^5.4|^6.0"
27+
"symfony/event-dispatcher-contracts": "^2|^3"
28+
},
29+
"require-dev": {
30+
"symfony/mailer": "^5.4|^6.0",
31+
"psr/log": "^1|^2|^3"
2932
},
3033
"autoload": {
3134
"psr-4": { "Symfony\\Component\\Notifier\\Bridge\\FakeSms\\": "" },

0 commit comments

Comments
 (0)
0