From 384b0adf38ca8387685e61c83b9d1b60ff563270 Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Wed, 6 Jan 2021 15:07:43 +0100 Subject: [PATCH 1/7] [VarDumper] fix mutating $GLOBALS while cloning it --- .../Component/VarDumper/Cloner/Data.php | 2 +- .../Component/VarDumper/Cloner/VarCloner.php | 14 +++++++++---- .../VarDumper/Tests/Dumper/CliDumperTest.php | 20 ++++++++++--------- 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/src/Symfony/Component/VarDumper/Cloner/Data.php b/src/Symfony/Component/VarDumper/Cloner/Data.php index 52d86edf12..21adb2364a 100644 --- a/src/Symfony/Component/VarDumper/Cloner/Data.php +++ b/src/Symfony/Component/VarDumper/Cloner/Data.php @@ -335,7 +335,7 @@ class Data implements \ArrayAccess, \Countable, \IteratorAggregate } $cursor->hardRefTo = $refs[$r]; $cursor->hardRefHandle = $this->useRefHandles & $item->handle; - $cursor->hardRefCount = $item->refCount; + $cursor->hardRefCount = 0 < $item->handle ? $item->refCount : 0; } $cursor->attr = $item->attr; $type = $item->class ?: \gettype($item->value); diff --git a/src/Symfony/Component/VarDumper/Cloner/VarCloner.php b/src/Symfony/Component/VarDumper/Cloner/VarCloner.php index fad05f67d6..6a9002137b 100644 --- a/src/Symfony/Component/VarDumper/Cloner/VarCloner.php +++ b/src/Symfony/Component/VarDumper/Cloner/VarCloner.php @@ -159,13 +159,19 @@ class VarCloner extends AbstractCloner if (Stub::ARRAY_ASSOC === $stub->class) { // Copies of $GLOBALS have very strange behavior, // let's detect them with some black magic - $a[$gid] = true; - - // Happens with copies of $GLOBALS - if (isset($v[$gid])) { + if (\PHP_VERSION_ID < 80100 && ($a[$gid] = true) && isset($v[$gid])) { unset($v[$gid]); $a = []; foreach ($v as $gk => &$gv) { + if ($v === $gv) { + unset($v); + $v = new Stub(); + $v->value = [$v->cut = \count($gv), Stub::TYPE_ARRAY => 0]; + $v->handle = -1; + $gv = &$hardRefs[spl_object_id($v)]; + $gv = $v; + } + $a[$gk] = &$gv; } unset($gv); diff --git a/src/Symfony/Component/VarDumper/Tests/Dumper/CliDumperTest.php b/src/Symfony/Component/VarDumper/Tests/Dumper/CliDumperTest.php index ed842f276e..ae81eb33f2 100644 --- a/src/Symfony/Component/VarDumper/Tests/Dumper/CliDumperTest.php +++ b/src/Symfony/Component/VarDumper/Tests/Dumper/CliDumperTest.php @@ -439,6 +439,7 @@ EOTXT /** * @runInSeparateProcess * @preserveGlobalState disabled + * @requires PHP < 8.1 */ public function testSpecialVars56() { @@ -453,11 +454,11 @@ array:3 [ ] ] 1 => array:1 [ - "GLOBALS" => &2 array:1 [ - "GLOBALS" => &2 array:1 [&2] - ] + "GLOBALS" => & array:1 [ …1] + ] + 2 => &3 array:1 [ + "GLOBALS" => &3 array:1 [&3] ] - 2 => &2 array:1 [&2] ] EOTXT , @@ -468,6 +469,7 @@ EOTXT /** * @runInSeparateProcess * @preserveGlobalState disabled + * @requires PHP < 8.1 */ public function testGlobals() { @@ -490,11 +492,11 @@ EOTXT <<<'EOTXT' array:2 [ 1 => array:1 [ - "GLOBALS" => &1 array:1 [ - "GLOBALS" => &1 array:1 [&1] - ] + "GLOBALS" => & array:1 [ …1] + ] + 2 => &2 array:1 [ + "GLOBALS" => &2 array:1 [&2] ] - 2 => &1 array:1 [&1] ] EOTXT @@ -584,6 +586,6 @@ EOTXT return $var; }; - return [$var(), $GLOBALS, &$GLOBALS]; + return eval('return [$var(), $GLOBALS, &$GLOBALS];'); } } From 6bfcaa7ede86b9377df885ca6e1368e182b506bd Mon Sep 17 00:00:00 2001 From: Oskar Stark Date: Wed, 6 Jan 2021 20:38:33 +0100 Subject: [PATCH 2/7] [Notifier] Cleanup changelog (5.1) --- src/Symfony/Component/Notifier/CHANGELOG.md | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Symfony/Component/Notifier/CHANGELOG.md b/src/Symfony/Component/Notifier/CHANGELOG.md index 7c415f7142..76fc86eea0 100644 --- a/src/Symfony/Component/Notifier/CHANGELOG.md +++ b/src/Symfony/Component/Notifier/CHANGELOG.md @@ -4,7 +4,6 @@ CHANGELOG 5.1.0 ----- - * Added the Mattermost notifier bridge * [BC BREAK] The `ChatMessage::fromNotification()` method's `$recipient` and `$transport` arguments were removed. * [BC BREAK] The `EmailMessage::fromNotification()` and `SmsMessage::fromNotification()` From be5a54132547858fe5524bdc1a56ded16e84c2b4 Mon Sep 17 00:00:00 2001 From: Oskar Stark Date: Wed, 6 Jan 2021 20:40:35 +0100 Subject: [PATCH 3/7] [Notifier] Cleanup changelog (5.2) --- src/Symfony/Component/Notifier/CHANGELOG.md | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Symfony/Component/Notifier/CHANGELOG.md b/src/Symfony/Component/Notifier/CHANGELOG.md index adb97747a6..e33f6b079a 100644 --- a/src/Symfony/Component/Notifier/CHANGELOG.md +++ b/src/Symfony/Component/Notifier/CHANGELOG.md @@ -5,7 +5,6 @@ CHANGELOG ----- * [BC BREAK] The `TransportInterface::send()` and `AbstractTransport::doSend()` methods changed to return a `?SentMessage` instance instead of `void`. - * Added the Zulip notifier bridge * The `EmailRecipientInterface` and `RecipientInterface` were introduced. * Added `email` and `phone` properties to `Recipient`. * [BC BREAK] Changed the type-hint of the `$recipient` argument in the `as*Message()` method From 185454367a65540c3ccae3b029edaae57f9f3144 Mon Sep 17 00:00:00 2001 From: "Alexander M. Turek" Date: Thu, 7 Jan 2021 02:06:44 +0100 Subject: [PATCH 4/7] [DependencyInjection] Fix InvalidParameterTypeException for function parameters --- .../InvalidParameterTypeException.php | 7 ++- .../InvalidParameterTypeExceptionTest.php | 52 +++++++++++++++++++ 2 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 src/Symfony/Component/DependencyInjection/Tests/Exception/InvalidParameterTypeExceptionTest.php diff --git a/src/Symfony/Component/DependencyInjection/Exception/InvalidParameterTypeException.php b/src/Symfony/Component/DependencyInjection/Exception/InvalidParameterTypeException.php index 461c50cce6..2a11626fe2 100644 --- a/src/Symfony/Component/DependencyInjection/Exception/InvalidParameterTypeException.php +++ b/src/Symfony/Component/DependencyInjection/Exception/InvalidParameterTypeException.php @@ -25,6 +25,11 @@ class InvalidParameterTypeException extends InvalidArgumentException $acceptedType = $acceptedType instanceof \ReflectionNamedType ? $acceptedType->getName() : (string) $acceptedType; $this->code = $type; - parent::__construct(sprintf('Invalid definition for service "%s": argument %d of "%s::%s()" accepts "%s", "%s" passed.', $serviceId, 1 + $parameter->getPosition(), $parameter->getDeclaringClass()->getName(), $parameter->getDeclaringFunction()->getName(), $acceptedType, $type)); + $function = $parameter->getDeclaringFunction(); + $functionName = $function instanceof \ReflectionMethod + ? sprintf('%s::%s', $function->getDeclaringClass()->getName(), $function->getName()) + : $function->getName(); + + parent::__construct(sprintf('Invalid definition for service "%s": argument %d of "%s()" accepts "%s", "%s" passed.', $serviceId, 1 + $parameter->getPosition(), $functionName, $acceptedType, $type)); } } diff --git a/src/Symfony/Component/DependencyInjection/Tests/Exception/InvalidParameterTypeExceptionTest.php b/src/Symfony/Component/DependencyInjection/Tests/Exception/InvalidParameterTypeExceptionTest.php new file mode 100644 index 0000000000..d61388ea2d --- /dev/null +++ b/src/Symfony/Component/DependencyInjection/Tests/Exception/InvalidParameterTypeExceptionTest.php @@ -0,0 +1,52 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\DependencyInjection\Tests\Exception; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\DependencyInjection\Exception\InvalidParameterTypeException; + +final class InvalidParameterTypeExceptionTest extends TestCase +{ + /** + * @dataProvider provideReflectionParameters + */ + public function testExceptionMessage(\ReflectionParameter $parameter, string $expectedMessage) + { + $exception = new InvalidParameterTypeException('my_service', 'int', $parameter); + + self::assertSame($expectedMessage, $exception->getMessage()); + } + + public function provideReflectionParameters(): iterable + { + yield 'static method' => [ + new \ReflectionParameter([MyClass::class, 'doSomething'], 0), + 'Invalid definition for service "my_service": argument 1 of "Symfony\Component\DependencyInjection\Tests\Exception\MyClass::doSomething()" accepts "array", "int" passed.', + ]; + + yield 'function' => [ + new \ReflectionParameter(__NAMESPACE__.'\\myFunction', 0), + 'Invalid definition for service "my_service": argument 1 of "Symfony\Component\DependencyInjection\Tests\Exception\myFunction()" accepts "array", "int" passed.', + ]; + } +} + +class MyClass +{ + public static function doSomething(array $arguments): void + { + } +} + +function myFunction(array $arguments): void +{ +} From f16230be5dd5b0e452f94295b2960d0f0ea60ee9 Mon Sep 17 00:00:00 2001 From: "Alexander M. Turek" Date: Thu, 7 Jan 2021 03:10:33 +0100 Subject: [PATCH 5/7] [DependencyInjection] Support PHP 8 builtin types in CheckTypeDeclarationsPass --- .../Compiler/CheckTypeDeclarationsPass.php | 19 +++-- .../CheckTypeDeclarationsPassTest.php | 69 ++++++++++++++++++- .../UnionConstructor.php | 10 +++ 3 files changed, 92 insertions(+), 6 deletions(-) diff --git a/src/Symfony/Component/DependencyInjection/Compiler/CheckTypeDeclarationsPass.php b/src/Symfony/Component/DependencyInjection/Compiler/CheckTypeDeclarationsPass.php index 752633ce17..41c4db8329 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/CheckTypeDeclarationsPass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/CheckTypeDeclarationsPass.php @@ -280,15 +280,26 @@ final class CheckTypeDeclarationsPass extends AbstractRecursivePass return; } + if ('mixed' === $type) { + return; + } + if (is_a($class, $type, true)) { return; } - $checkFunction = sprintf('is_%s', $type); - - if (!$reflectionType->isBuiltin() || !$checkFunction($value)) { - throw new InvalidParameterTypeException($this->currentId, \is_object($value) ? $class : \gettype($value), $parameter); + if ('false' === $type) { + if (false === $value) { + return; + } + } elseif ($reflectionType->isBuiltin()) { + $checkFunction = sprintf('is_%s', $type); + if ($checkFunction($value)) { + return; + } } + + throw new InvalidParameterTypeException($this->currentId, \is_object($value) ? $class : \gettype($value), $parameter); } private function getExpressionLanguage(): ExpressionLanguage diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/CheckTypeDeclarationsPassTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/CheckTypeDeclarationsPassTest.php index bd69302d43..e5705dce08 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/CheckTypeDeclarationsPassTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/CheckTypeDeclarationsPassTest.php @@ -836,6 +836,22 @@ class CheckTypeDeclarationsPassTest extends TestCase $this->addToAssertionCount(1); } + /** + * @requires PHP 8 + */ + public function testUnionTypePassesWithFalse() + { + $container = new ContainerBuilder(); + + $container->register('union', UnionConstructor::class) + ->setFactory([UnionConstructor::class, 'create']) + ->setArguments([false]); + + (new CheckTypeDeclarationsPass(true))->process($container); + + $this->addToAssertionCount(1); + } + /** * @requires PHP 8 */ @@ -851,8 +867,6 @@ class CheckTypeDeclarationsPassTest extends TestCase $this->expectExceptionMessage('Invalid definition for service "union": argument 1 of "Symfony\\Component\\DependencyInjection\\Tests\\Fixtures\\CheckTypeDeclarationsPass\\UnionConstructor::__construct()" accepts "Symfony\Component\DependencyInjection\Tests\Fixtures\CheckTypeDeclarationsPass\Foo|int", "Symfony\Component\DependencyInjection\Tests\Fixtures\CheckTypeDeclarationsPass\Waldo" passed.'); (new CheckTypeDeclarationsPass(true))->process($container); - - $this->addToAssertionCount(1); } /** @@ -869,6 +883,57 @@ class CheckTypeDeclarationsPassTest extends TestCase $this->expectExceptionMessage('Invalid definition for service "union": argument 1 of "Symfony\\Component\\DependencyInjection\\Tests\\Fixtures\\CheckTypeDeclarationsPass\\UnionConstructor::__construct()" accepts "Symfony\Component\DependencyInjection\Tests\Fixtures\CheckTypeDeclarationsPass\Foo|int", "array" passed.'); (new CheckTypeDeclarationsPass(true))->process($container); + } + + /** + * @requires PHP 8 + */ + public function testUnionTypeWithFalseFailsWithReference() + { + $container = new ContainerBuilder(); + + $container->register('waldo', Waldo::class); + $container->register('union', UnionConstructor::class) + ->setFactory([UnionConstructor::class, 'create']) + ->setArguments([new Reference('waldo')]); + + $this->expectException(\Symfony\Component\DependencyInjection\Exception\InvalidArgumentException::class); + $this->expectExceptionMessage('Invalid definition for service "union": argument 1 of "Symfony\Component\DependencyInjection\Tests\Fixtures\CheckTypeDeclarationsPass\UnionConstructor::create()" accepts "array|false", "Symfony\Component\DependencyInjection\Tests\Fixtures\CheckTypeDeclarationsPass\Waldo" passed.'); + + (new CheckTypeDeclarationsPass(true))->process($container); + } + + /** + * @requires PHP 8 + */ + public function testUnionTypeWithFalseFailsWithTrue() + { + $container = new ContainerBuilder(); + + $container->register('waldo', Waldo::class); + $container->register('union', UnionConstructor::class) + ->setFactory([UnionConstructor::class, 'create']) + ->setArguments([true]); + + $this->expectException(\Symfony\Component\DependencyInjection\Exception\InvalidArgumentException::class); + $this->expectExceptionMessage('Invalid definition for service "union": argument 1 of "Symfony\Component\DependencyInjection\Tests\Fixtures\CheckTypeDeclarationsPass\UnionConstructor::create()" accepts "array|false", "boolean" passed.'); + + (new CheckTypeDeclarationsPass(true))->process($container); + } + + /** + * @requires PHP 8 + */ + public function testReferencePassesMixed() + { + $container = new ContainerBuilder(); + + $container->register('waldo', Waldo::class); + $container->register('union', UnionConstructor::class) + ->setFactory([UnionConstructor::class, 'make']) + ->setArguments([new Reference('waldo')]); + + (new CheckTypeDeclarationsPass(true))->process($container); $this->addToAssertionCount(1); } diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/CheckTypeDeclarationsPass/UnionConstructor.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/CheckTypeDeclarationsPass/UnionConstructor.php index 5ba5972863..144480a978 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/CheckTypeDeclarationsPass/UnionConstructor.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/CheckTypeDeclarationsPass/UnionConstructor.php @@ -7,4 +7,14 @@ class UnionConstructor public function __construct(Foo|int $arg) { } + + public static function create(array|false $arg): static + { + return new static(0); + } + + public static function make(mixed $arg): static + { + return new static(0); + } } From e4598c2b4fea05e6b1cdb738ef14914d26dddbf1 Mon Sep 17 00:00:00 2001 From: Pavol Tuka <30590523+pavol-tk@users.noreply.github.com> Date: Thu, 7 Jan 2021 13:02:01 +0100 Subject: [PATCH 6/7] Rename parameter of @method configureContainer Default application Kernel has `configureContainer` method defined with `$container` as first parameter. PhpStorm inspection said: ``` Parameter's name changed during inheritance Parameter's name changed from 'c' to 'container' ``` --- src/Symfony/Bundle/FrameworkBundle/Kernel/MicroKernelTrait.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Symfony/Bundle/FrameworkBundle/Kernel/MicroKernelTrait.php b/src/Symfony/Bundle/FrameworkBundle/Kernel/MicroKernelTrait.php index 8e5247faea..4df9fde6e4 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Kernel/MicroKernelTrait.php +++ b/src/Symfony/Bundle/FrameworkBundle/Kernel/MicroKernelTrait.php @@ -29,7 +29,7 @@ use Symfony\Component\Routing\RouteCollectionBuilder; * @author Fabien Potencier * * @method void configureRoutes(RoutingConfigurator $routes) - * @method void configureContainer(ContainerConfigurator $c) + * @method void configureContainer(ContainerConfigurator $container) */ trait MicroKernelTrait { From 8f6b08c13138b7aea5ca2564076fa799ba2d58fd Mon Sep 17 00:00:00 2001 From: Oskar Stark Date: Wed, 6 Jan 2021 13:52:21 +0100 Subject: [PATCH 7/7] [Notifier] Use abstract test cases in 5.2 --- .../Tests/DiscordTransportFactoryTest.php | 97 +++++++----------- .../Discord/Tests/DiscordTransportTest.php | 39 ++++---- .../Notifier/Bridge/Discord/composer.json | 2 +- .../Bridge/Esendex/EsendexTransport.php | 2 +- .../Tests/EsendexTransportFactoryTest.php | 98 +++++++----------- .../Esendex/Tests/EsendexTransportTest.php | 45 ++++----- .../Notifier/Bridge/Esendex/composer.json | 2 +- .../Notifier/Bridge/GoogleChat/README.md | 2 +- .../Tests/GoogleChatOptionsTest.php | 2 +- .../Tests/GoogleChatTransportFactoryTest.php | 91 +++++++---------- .../Tests/GoogleChatTransportTest.php | 44 ++++----- .../Notifier/Bridge/GoogleChat/composer.json | 2 +- .../Tests/InfobipTransportFactoryTest.php | 87 ++++++---------- .../Infobip/Tests/InfobipTransportTest.php | 36 +++---- .../Notifier/Bridge/Infobip/composer.json | 2 +- .../Tests/LinkedInTransportFactoryTest.php | 76 ++++++-------- .../LinkedIn/Tests/LinkedInTransportTest.php | 46 +++++---- .../Notifier/Bridge/LinkedIn/composer.json | 2 +- .../Mobyt/Tests/MobytTransportFactoryTest.php | 61 ++++++++++++ .../Bridge/Mobyt/Tests/MobytTransportTest.php | 52 ++++++++++ .../Notifier/Bridge/Mobyt/composer.json | 2 +- .../Tests/SendinblueTransportFactoryTest.php | 99 +++++++------------ .../Tests/SendinblueTransportTest.php | 44 ++++----- .../Notifier/Bridge/Sendinblue/composer.json | 2 +- .../Notifier/Bridge/Slack/SlackTransport.php | 4 + .../Slack/Tests/SlackTransportFactoryTest.php | 68 ++++++------- .../Bridge/Slack/Tests/SlackTransportTest.php | 59 ++++++----- .../Tests/SmsapiTransportFactoryTest.php | 97 +++++++----------- .../Smsapi/Tests/SmsapiTransportTest.php | 35 +++---- .../Notifier/Bridge/Smsapi/composer.json | 2 +- .../Telegram/Tests/TelegramTransportTest.php | 2 +- .../Zulip/Tests/ZulipTransportFactoryTest.php | 97 +++++++----------- .../Bridge/Zulip/Tests/ZulipTransportTest.php | 35 +++---- .../Notifier/Bridge/Zulip/composer.json | 2 +- 34 files changed, 600 insertions(+), 736 deletions(-) create mode 100644 src/Symfony/Component/Notifier/Bridge/Mobyt/Tests/MobytTransportFactoryTest.php create mode 100644 src/Symfony/Component/Notifier/Bridge/Mobyt/Tests/MobytTransportTest.php diff --git a/src/Symfony/Component/Notifier/Bridge/Discord/Tests/DiscordTransportFactoryTest.php b/src/Symfony/Component/Notifier/Bridge/Discord/Tests/DiscordTransportFactoryTest.php index 40c8f4d4aa..48d620d49b 100644 --- a/src/Symfony/Component/Notifier/Bridge/Discord/Tests/DiscordTransportFactoryTest.php +++ b/src/Symfony/Component/Notifier/Bridge/Discord/Tests/DiscordTransportFactoryTest.php @@ -11,74 +11,43 @@ namespace Symfony\Component\Notifier\Bridge\Discord\Tests; -use PHPUnit\Framework\TestCase; use Symfony\Component\Notifier\Bridge\Discord\DiscordTransportFactory; -use Symfony\Component\Notifier\Exception\IncompleteDsnException; -use Symfony\Component\Notifier\Exception\UnsupportedSchemeException; -use Symfony\Component\Notifier\Transport\Dsn; +use Symfony\Component\Notifier\Tests\TransportFactoryTestCase; +use Symfony\Component\Notifier\Transport\TransportFactoryInterface; -final class DiscordTransportFactoryTest extends TestCase +final class DiscordTransportFactoryTest extends TransportFactoryTestCase { - public function testCreateWithDsn() - { - $factory = $this->createFactory(); - - $transport = $factory->create(Dsn::fromString('discord://token@host.test?webhook_id=testWebhookId')); - - $this->assertSame('discord://host.test?webhook_id=testWebhookId', (string) $transport); - } - - public function testCreateWithMissingOptionWebhookIdThrowsIncompleteDsnException() - { - $factory = $this->createFactory(); - - $this->expectException(IncompleteDsnException::class); - - $factory->create(Dsn::fromString('discord://token@host')); - } - - public function testCreateWithNoTokenThrowsIncompleteDsnException() - { - $factory = $this->createFactory(); - - $this->expectException(IncompleteDsnException::class); - $factory->create(Dsn::fromString('discord://host.test?webhook_id=testWebhookId')); - } - - public function testSupportsReturnsTrueWithSupportedScheme() - { - $factory = $this->createFactory(); - - $this->assertTrue($factory->supports(Dsn::fromString('discord://host?webhook_id=testWebhookId'))); - } - - public function testSupportsReturnsFalseWithUnsupportedScheme() - { - $factory = $this->createFactory(); - - $this->assertFalse($factory->supports(Dsn::fromString('somethingElse://host?webhook_id=testWebhookId'))); - } - - public function testUnsupportedSchemeThrowsUnsupportedSchemeException() - { - $factory = $this->createFactory(); - - $this->expectException(UnsupportedSchemeException::class); - $factory->create(Dsn::fromString('somethingElse://token@host?webhook_id=testWebhookId')); - } - - public function testUnsupportedSchemeThrowsUnsupportedSchemeExceptionEvenIfRequiredOptionIsMissing() - { - $factory = $this->createFactory(); - - $this->expectException(UnsupportedSchemeException::class); - - // unsupported scheme and missing "webhook_id" option - $factory->create(Dsn::fromString('somethingElse://token@host')); - } - - private function createFactory(): DiscordTransportFactory + /** + * @return DiscordTransportFactory + */ + public function createFactory(): TransportFactoryInterface { return new DiscordTransportFactory(); } + + public function createProvider(): iterable + { + yield [ + 'discord://host.test?webhook_id=testWebhookId', + 'discord://token@host.test?webhook_id=testWebhookId', + ]; + } + + public function supportsProvider(): iterable + { + yield [true, 'discord://host?webhook_id=testWebhookId']; + yield [false, 'somethingElse://host?webhook_id=testWebhookId']; + } + + public function incompleteDsnProvider(): iterable + { + yield 'missing token' => ['discord://host.test?webhook_id=testWebhookId']; + yield 'missing option: webhook_id' => ['discord://token@host']; + } + + public function unsupportedSchemeProvider(): iterable + { + yield ['somethingElse://token@host?webhook_id=testWebhookId']; + yield ['somethingElse://token@host']; // missing "webhook_id" option + } } diff --git a/src/Symfony/Component/Notifier/Bridge/Discord/Tests/DiscordTransportTest.php b/src/Symfony/Component/Notifier/Bridge/Discord/Tests/DiscordTransportTest.php index 9d4d0ba005..70dd0f46ea 100644 --- a/src/Symfony/Component/Notifier/Bridge/Discord/Tests/DiscordTransportTest.php +++ b/src/Symfony/Component/Notifier/Bridge/Discord/Tests/DiscordTransportTest.php @@ -11,40 +11,42 @@ namespace Symfony\Component\Notifier\Bridge\Discord\Tests; -use PHPUnit\Framework\TestCase; use Symfony\Component\HttpClient\MockHttpClient; use Symfony\Component\Notifier\Bridge\Discord\DiscordTransport; use Symfony\Component\Notifier\Exception\LogicException; use Symfony\Component\Notifier\Exception\TransportException; use Symfony\Component\Notifier\Message\ChatMessage; use Symfony\Component\Notifier\Message\MessageInterface; +use Symfony\Component\Notifier\Message\SmsMessage; +use Symfony\Component\Notifier\Tests\TransportTestCase; +use Symfony\Component\Notifier\Transport\TransportInterface; use Symfony\Contracts\HttpClient\HttpClientInterface; use Symfony\Contracts\HttpClient\ResponseInterface; -final class DiscordTransportTest extends TestCase +final class DiscordTransportTest extends TransportTestCase { - public function testToStringContainsProperties() + /** + * @return DiscordTransport + */ + public function createTransport(?HttpClientInterface $client = null): TransportInterface { - $transport = $this->createTransport(); - - $this->assertSame('discord://host.test?webhook_id=testWebhookId', (string) $transport); + return (new DiscordTransport('testToken', 'testWebhookId', $client ?: $this->createMock(HttpClientInterface::class)))->setHost('host.test'); } - public function testSupportsChatMessage() + public function toStringProvider(): iterable { - $transport = $this->createTransport(); - - $this->assertTrue($transport->supports(new ChatMessage('testChatMessage'))); - $this->assertFalse($transport->supports($this->createMock(MessageInterface::class))); + yield ['discord://host.test?webhook_id=testWebhookId', $this->createTransport()]; } - public function testSendNonChatMessageThrowsLogicException() + public function supportedMessagesProvider(): iterable { - $transport = $this->createTransport(); + yield [new ChatMessage('Hello!')]; + } - $this->expectException(LogicException::class); - - $transport->send($this->createMock(MessageInterface::class)); + public function unsupportedMessagesProvider(): iterable + { + yield [new SmsMessage('0611223344', 'Hello!')]; + yield [$this->createMock(MessageInterface::class)]; } public function testSendChatMessageWithMoreThan2000CharsThrowsLogicException() @@ -78,9 +80,4 @@ final class DiscordTransportTest extends TestCase $transport->send(new ChatMessage('testMessage')); } - - private function createTransport(?HttpClientInterface $client = null): DiscordTransport - { - return (new DiscordTransport('testToken', 'testWebhookId', $client ?? $this->createMock(HttpClientInterface::class)))->setHost('host.test'); - } } diff --git a/src/Symfony/Component/Notifier/Bridge/Discord/composer.json b/src/Symfony/Component/Notifier/Bridge/Discord/composer.json index 4e4a5bd424..67b9c03270 100644 --- a/src/Symfony/Component/Notifier/Bridge/Discord/composer.json +++ b/src/Symfony/Component/Notifier/Bridge/Discord/composer.json @@ -18,7 +18,7 @@ "require": { "php": ">=7.2.5", "symfony/http-client": "^4.3|^5.0", - "symfony/notifier": "~5.2.0", + "symfony/notifier": "~5.2.2", "symfony/polyfill-mbstring": "^1.0" }, "require-dev": { diff --git a/src/Symfony/Component/Notifier/Bridge/Esendex/EsendexTransport.php b/src/Symfony/Component/Notifier/Bridge/Esendex/EsendexTransport.php index 812c58906e..e4a944779e 100644 --- a/src/Symfony/Component/Notifier/Bridge/Esendex/EsendexTransport.php +++ b/src/Symfony/Component/Notifier/Bridge/Esendex/EsendexTransport.php @@ -44,7 +44,7 @@ final class EsendexTransport extends AbstractTransport public function __toString(): string { - return sprintf('esendex://%s', $this->getEndpoint()); + return sprintf('esendex://%s?accountreference=%s&from=%s', $this->getEndpoint(), $this->accountReference, $this->from); } public function supports(MessageInterface $message): bool diff --git a/src/Symfony/Component/Notifier/Bridge/Esendex/Tests/EsendexTransportFactoryTest.php b/src/Symfony/Component/Notifier/Bridge/Esendex/Tests/EsendexTransportFactoryTest.php index 469a23c985..c05f3cfaab 100644 --- a/src/Symfony/Component/Notifier/Bridge/Esendex/Tests/EsendexTransportFactoryTest.php +++ b/src/Symfony/Component/Notifier/Bridge/Esendex/Tests/EsendexTransportFactoryTest.php @@ -11,75 +11,43 @@ namespace Symfony\Component\Notifier\Bridge\Esendex\Tests; -use PHPUnit\Framework\TestCase; use Symfony\Component\Notifier\Bridge\Esendex\EsendexTransportFactory; -use Symfony\Component\Notifier\Exception\IncompleteDsnException; -use Symfony\Component\Notifier\Exception\UnsupportedSchemeException; -use Symfony\Component\Notifier\Transport\Dsn; +use Symfony\Component\Notifier\Tests\TransportFactoryTestCase; +use Symfony\Component\Notifier\Transport\TransportFactoryInterface; -final class EsendexTransportFactoryTest extends TestCase +final class EsendexTransportFactoryTest extends TransportFactoryTestCase { - public function testCreateWithDsn() - { - $factory = $this->createFactory(); - - $transport = $factory->create(Dsn::fromString('esendex://email:password@host.test?accountreference=testAccountreference&from=testFrom')); - - $this->assertSame('esendex://host.test', (string) $transport); - } - - public function testCreateWithMissingOptionAccountreferenceThrowsIncompleteDsnException() - { - $factory = $this->createFactory(); - - $this->expectException(IncompleteDsnException::class); - - $factory->create(Dsn::fromString('esendex://email:password@host?from=FROM')); - } - - public function testCreateWithMissingOptionFromThrowsIncompleteDsnException() - { - $factory = $this->createFactory(); - - $this->expectException(IncompleteDsnException::class); - - $factory->create(Dsn::fromString('esendex://email:password@host?accountreference=ACCOUNTREFERENCE')); - } - - public function testSupportsReturnsTrueWithSupportedScheme() - { - $factory = $this->createFactory(); - - $this->assertTrue($factory->supports(Dsn::fromString('esendex://email:password@host?accountreference=ACCOUNTREFERENCE&from=FROM'))); - } - - public function testSupportsReturnsFalseWithUnsupportedScheme() - { - $factory = $this->createFactory(); - - $this->assertFalse($factory->supports(Dsn::fromString('somethingElse://email:password@host?accountreference=ACCOUNTREFERENCE&from=FROM'))); - } - - public function testUnsupportedSchemeThrowsUnsupportedSchemeException() - { - $factory = $this->createFactory(); - - $this->expectException(UnsupportedSchemeException::class); - $factory->create(Dsn::fromString('somethingElse://email:password@host?accountreference=REFERENCE&from=FROM')); - } - - public function testUnsupportedSchemeThrowsUnsupportedSchemeExceptionEvenIfRequiredOptionIsMissing() - { - $factory = $this->createFactory(); - - $this->expectException(UnsupportedSchemeException::class); - - // unsupported scheme and missing "from" option - $factory->create(Dsn::fromString('somethingElse://email:password@host?accountreference=REFERENCE')); - } - - private function createFactory(): EsendexTransportFactory + /** + * @return EsendexTransportFactory + */ + public function createFactory(): TransportFactoryInterface { return new EsendexTransportFactory(); } + + public function createProvider(): iterable + { + yield [ + 'esendex://host.test?accountreference=ACCOUNTREFERENCE&from=FROM', + 'esendex://email:password@host.test?accountreference=ACCOUNTREFERENCE&from=FROM', + ]; + } + + public function supportsProvider(): iterable + { + yield [true, 'esendex://email:password@host?accountreference=ACCOUNTREFERENCE&from=FROM']; + yield [false, 'somethingElse://email:password@default']; + } + + public function incompleteDsnProvider(): iterable + { + yield 'missing option: from' => ['esendex://email:password@host?accountreference=ACCOUNTREFERENCE']; + yield 'missing option: accountreference' => ['esendex://email:password@host?from=FROM']; + } + + public function unsupportedSchemeProvider(): iterable + { + yield ['somethingElse://email:password@default?accountreference=ACCOUNTREFERENCE&from=FROM']; + yield ['somethingElse://email:password@host?accountreference=ACCOUNTREFERENCE']; // missing "from" option + } } diff --git a/src/Symfony/Component/Notifier/Bridge/Esendex/Tests/EsendexTransportTest.php b/src/Symfony/Component/Notifier/Bridge/Esendex/Tests/EsendexTransportTest.php index 295b5e6102..4076ad4988 100644 --- a/src/Symfony/Component/Notifier/Bridge/Esendex/Tests/EsendexTransportTest.php +++ b/src/Symfony/Component/Notifier/Bridge/Esendex/Tests/EsendexTransportTest.php @@ -11,42 +11,44 @@ namespace Symfony\Component\Notifier\Bridge\Esendex\Tests; -use PHPUnit\Framework\TestCase; use Symfony\Component\HttpClient\MockHttpClient; use Symfony\Component\Notifier\Bridge\Esendex\EsendexTransport; -use Symfony\Component\Notifier\Exception\LogicException; use Symfony\Component\Notifier\Exception\TransportException; +use Symfony\Component\Notifier\Message\ChatMessage; use Symfony\Component\Notifier\Message\MessageInterface; use Symfony\Component\Notifier\Message\SmsMessage; +use Symfony\Component\Notifier\Tests\TransportTestCase; +use Symfony\Component\Notifier\Transport\TransportInterface; use Symfony\Contracts\HttpClient\HttpClientInterface; use Symfony\Contracts\HttpClient\ResponseInterface; -final class EsendexTransportTest extends TestCase +final class EsendexTransportTest extends TransportTestCase { - public function testToString() + /** + * @return EsendexTransport + */ + public function createTransport(?HttpClientInterface $client = null): TransportInterface { - $transport = $this->createTransport(); - - $this->assertSame('esendex://host.test', (string) $transport); + return (new EsendexTransport('testToken', 'testAccountReference', 'testFrom', $client ?: $this->createMock(HttpClientInterface::class)))->setHost('host.test'); } - public function testSupportsSmsMessage() + public function toStringProvider(): iterable { - $transport = $this->createTransport(); - - $this->assertTrue($transport->supports(new SmsMessage('phone', 'testSmsMessage'))); - $this->assertFalse($transport->supports($this->createMock(MessageInterface::class))); + yield ['esendex://host.test?accountreference=testAccountReference&from=testFrom', $this->createTransport()]; } - public function testSendNonSmsMessageThrowsLogicException() + public function supportedMessagesProvider(): iterable { - $transport = $this->createTransport(); - - $this->expectException(LogicException::class); - $transport->send($this->createMock(MessageInterface::class)); + yield [new SmsMessage('0611223344', 'Hello!')]; } - public function testSendWithErrorResponseThrows() + public function unsupportedMessagesProvider(): iterable + { + yield [new ChatMessage('Hello!')]; + yield [$this->createMock(MessageInterface::class)]; + } + + public function testSendWithErrorResponseThrowsTransportException() { $response = $this->createMock(ResponseInterface::class); $response->expects($this->exactly(2)) @@ -65,7 +67,7 @@ final class EsendexTransportTest extends TestCase $transport->send(new SmsMessage('phone', 'testMessage')); } - public function testSendWithErrorResponseContainingDetailsThrows() + public function testSendWithErrorResponseContainingDetailsThrowsTransportException() { $response = $this->createMock(ResponseInterface::class); $response->expects($this->exactly(2)) @@ -86,9 +88,4 @@ final class EsendexTransportTest extends TestCase $transport->send(new SmsMessage('phone', 'testMessage')); } - - private function createTransport(?HttpClientInterface $client = null): EsendexTransport - { - return (new EsendexTransport('testToken', 'testAccountReference', 'testFrom', $client ?: $this->createMock(HttpClientInterface::class)))->setHost('host.test'); - } } diff --git a/src/Symfony/Component/Notifier/Bridge/Esendex/composer.json b/src/Symfony/Component/Notifier/Bridge/Esendex/composer.json index b639a44716..6ce8ca54a2 100644 --- a/src/Symfony/Component/Notifier/Bridge/Esendex/composer.json +++ b/src/Symfony/Component/Notifier/Bridge/Esendex/composer.json @@ -18,7 +18,7 @@ "require": { "php": ">=7.2.5", "symfony/http-client": "^4.4|^5.0", - "symfony/notifier": "~5.2.0" + "symfony/notifier": "~5.2.2" }, "autoload": { "psr-4": { "Symfony\\Component\\Notifier\\Bridge\\Esendex\\": "" }, diff --git a/src/Symfony/Component/Notifier/Bridge/GoogleChat/README.md b/src/Symfony/Component/Notifier/Bridge/GoogleChat/README.md index 8a4b55c7e8..53da1e8060 100644 --- a/src/Symfony/Component/Notifier/Bridge/GoogleChat/README.md +++ b/src/Symfony/Component/Notifier/Bridge/GoogleChat/README.md @@ -14,7 +14,7 @@ where: - `ACCESS_KEY` is your Google Chat access key - `ACCESS_TOKEN` is your Google Chat access token - `SPACE` is the Google Chat space - - `THREAD_KEY` is the the Google Chat message thread to group messages into a single thread (optional) + - `THREAD_KEY` is the Google Chat message thread to group messages into a single thread (optional) Resources --------- diff --git a/src/Symfony/Component/Notifier/Bridge/GoogleChat/Tests/GoogleChatOptionsTest.php b/src/Symfony/Component/Notifier/Bridge/GoogleChat/Tests/GoogleChatOptionsTest.php index aa763bcd0f..691958c46a 100644 --- a/src/Symfony/Component/Notifier/Bridge/GoogleChat/Tests/GoogleChatOptionsTest.php +++ b/src/Symfony/Component/Notifier/Bridge/GoogleChat/Tests/GoogleChatOptionsTest.php @@ -14,7 +14,7 @@ namespace Symfony\Component\Notifier\Bridge\GoogleChat\Tests; use PHPUnit\Framework\TestCase; use Symfony\Component\Notifier\Bridge\GoogleChat\GoogleChatOptions; -class GoogleChatOptionsTest extends TestCase +final class GoogleChatOptionsTest extends TestCase { public function testToArray() { diff --git a/src/Symfony/Component/Notifier/Bridge/GoogleChat/Tests/GoogleChatTransportFactoryTest.php b/src/Symfony/Component/Notifier/Bridge/GoogleChat/Tests/GoogleChatTransportFactoryTest.php index 01a8d263f2..0840a3476a 100644 --- a/src/Symfony/Component/Notifier/Bridge/GoogleChat/Tests/GoogleChatTransportFactoryTest.php +++ b/src/Symfony/Component/Notifier/Bridge/GoogleChat/Tests/GoogleChatTransportFactoryTest.php @@ -11,65 +11,46 @@ namespace Symfony\Component\Notifier\Bridge\GoogleChat\Tests; -use PHPUnit\Framework\TestCase; use Symfony\Component\Notifier\Bridge\GoogleChat\GoogleChatTransportFactory; -use Symfony\Component\Notifier\Exception\IncompleteDsnException; -use Symfony\Component\Notifier\Exception\UnsupportedSchemeException; -use Symfony\Component\Notifier\Transport\Dsn; +use Symfony\Component\Notifier\Tests\TransportFactoryTestCase; +use Symfony\Component\Notifier\Transport\TransportFactoryInterface; -final class GoogleChatTransportFactoryTest extends TestCase +final class GoogleChatTransportFactoryTest extends TransportFactoryTestCase { - public function testCreateWithDsn() - { - $factory = $this->createFactory(); - - $transport = $factory->create(Dsn::fromString('googlechat://abcde-fghij:kl_mnopqrstwxyz%3D@chat.googleapis.com/AAAAA_YYYYY')); - - $this->assertSame('googlechat://chat.googleapis.com/AAAAA_YYYYY', (string) $transport); - } - - public function testCreateWithThreadKeyInDsn() - { - $factory = $this->createFactory(); - - $transport = $factory->create(Dsn::fromString('googlechat://abcde-fghij:kl_mnopqrstwxyz%3D@chat.googleapis.com/AAAAA_YYYYY?threadKey=abcdefg')); - - $this->assertSame('googlechat://chat.googleapis.com/AAAAA_YYYYY?threadKey=abcdefg', (string) $transport); - } - - public function testCreateRequiresCredentials() - { - $factory = $this->createFactory(); - - $this->expectException(IncompleteDsnException::class); - - $factory->create(Dsn::fromString('googlechat://chat.googleapis.com/v1/spaces/AAAAA_YYYYY/messages')); - } - - public function testSupportsReturnsTrueWithSupportedScheme() - { - $factory = $this->createFactory(); - - $this->assertTrue($factory->supports(Dsn::fromString('googlechat://host/path'))); - } - - public function testSupportsReturnsFalseWithUnsupportedScheme() - { - $factory = $this->createFactory(); - - $this->assertFalse($factory->supports(Dsn::fromString('somethingElse://host/path'))); - } - - public function testUnsupportedSchemeThrowsUnsupportedSchemeException() - { - $factory = $this->createFactory(); - - $this->expectException(UnsupportedSchemeException::class); - $factory->create(Dsn::fromString('somethingElse://host/path')); - } - - private function createFactory(): GoogleChatTransportFactory + /** + * @return GoogleChatTransportFactory + */ + public function createFactory(): TransportFactoryInterface { return new GoogleChatTransportFactory(); } + + public function createProvider(): iterable + { + yield [ + 'googlechat://chat.googleapis.com/AAAAA_YYYYY', + 'googlechat://abcde-fghij:kl_mnopqrstwxyz%3D@chat.googleapis.com/AAAAA_YYYYY', + ]; + + yield [ + 'googlechat://chat.googleapis.com/AAAAA_YYYYY?threadKey=abcdefg', + 'googlechat://abcde-fghij:kl_mnopqrstwxyz%3D@chat.googleapis.com/AAAAA_YYYYY?threadKey=abcdefg', + ]; + } + + public function supportsProvider(): iterable + { + yield [true, 'googlechat://host/path']; + yield [false, 'somethingElse://host/path']; + } + + public function incompleteDsnProvider(): iterable + { + yield 'missing credentials' => ['googlechat://chat.googleapis.com/v1/spaces/AAAAA_YYYYY/messages']; + } + + public function unsupportedSchemeProvider(): iterable + { + yield ['somethingElse://host/path']; + } } diff --git a/src/Symfony/Component/Notifier/Bridge/GoogleChat/Tests/GoogleChatTransportTest.php b/src/Symfony/Component/Notifier/Bridge/GoogleChat/Tests/GoogleChatTransportTest.php index f3d63d6506..9fd6a7c7d3 100644 --- a/src/Symfony/Component/Notifier/Bridge/GoogleChat/Tests/GoogleChatTransportTest.php +++ b/src/Symfony/Component/Notifier/Bridge/GoogleChat/Tests/GoogleChatTransportTest.php @@ -20,38 +20,39 @@ use Symfony\Component\Notifier\Exception\TransportException; use Symfony\Component\Notifier\Message\ChatMessage; use Symfony\Component\Notifier\Message\MessageInterface; use Symfony\Component\Notifier\Message\MessageOptionsInterface; +use Symfony\Component\Notifier\Message\SmsMessage; use Symfony\Component\Notifier\Notification\Notification; +use Symfony\Component\Notifier\Transport\TransportInterface; use Symfony\Contracts\HttpClient\HttpClientInterface; use Symfony\Contracts\HttpClient\ResponseInterface; -class GoogleChatTransportTest extends TestCase +final class GoogleChatTransportTest extends TestCase { - public function testToStringContainsProperties() + /** + * @return GoogleChatTransport + */ + public function createTransport(?HttpClientInterface $client = null): TransportInterface { - $transport = $this->createTransport(); - $transport->setHost(null); - - $this->assertSame('googlechat://chat.googleapis.com/My-Space', (string) $transport); + return new GoogleChatTransport('My-Space', 'theAccessKey', 'theAccessToken=', $client ?: $this->createMock(HttpClientInterface::class)); } - public function testSupportsChatMessage() + public function toStringProvider(): iterable { - $transport = $this->createTransport(); - - $this->assertTrue($transport->supports(new ChatMessage('testChatMessage'))); - $this->assertFalse($transport->supports($this->createMock(MessageInterface::class))); + yield ['googlechat://chat.googleapis.com/My-Space', $this->createTransport()]; } - public function testSendNonChatMessageThrowsLogicException() + public function supportedMessagesProvider(): iterable { - $transport = $this->createTransport(); - - $this->expectException(LogicException::class); - - $transport->send($this->createMock(MessageInterface::class)); + yield [new ChatMessage('Hello!')]; } - public function testSendWithEmptyArrayResponseThrows() + public function unsupportedMessagesProvider(): iterable + { + yield [new SmsMessage('0611223344', 'Hello!')]; + yield [$this->createMock(MessageInterface::class)]; + } + + public function testSendWithEmptyArrayResponseThrowsTransportException() { $this->expectException(TransportException::class); $this->expectExceptionMessage('Unable to post the Google Chat message: "[]"'); @@ -76,7 +77,7 @@ class GoogleChatTransportTest extends TestCase $this->assertSame('spaces/My-Space/messages/abcdefg.hijklmno', $sentMessage->getMessageId()); } - public function testSendWithErrorResponseThrows() + public function testSendWithErrorResponseThrowsTransportException() { $this->expectException(TransportException::class); $this->expectExceptionMessage('API key not valid. Please pass a valid API key.'); @@ -208,9 +209,4 @@ class GoogleChatTransportTest extends TestCase $this->assertSame('spaces/My-Space/messages/abcdefg.hijklmno', $sentMessage->getMessageId()); } - - private function createTransport(?HttpClientInterface $client = null): GoogleChatTransport - { - return new GoogleChatTransport('My-Space', 'theAccessKey', 'theAccessToken=', $client ?: $this->createMock(HttpClientInterface::class)); - } } diff --git a/src/Symfony/Component/Notifier/Bridge/GoogleChat/composer.json b/src/Symfony/Component/Notifier/Bridge/GoogleChat/composer.json index e03d63d3ef..befd79b58d 100644 --- a/src/Symfony/Component/Notifier/Bridge/GoogleChat/composer.json +++ b/src/Symfony/Component/Notifier/Bridge/GoogleChat/composer.json @@ -18,7 +18,7 @@ "require": { "php": ">=7.2.5", "symfony/http-client": "^4.3|^5.0", - "symfony/notifier": "~5.2.0" + "symfony/notifier": "~5.2.2" }, "autoload": { "psr-4": { "Symfony\\Component\\Notifier\\Bridge\\GoogleChat\\": "" }, diff --git a/src/Symfony/Component/Notifier/Bridge/Infobip/Tests/InfobipTransportFactoryTest.php b/src/Symfony/Component/Notifier/Bridge/Infobip/Tests/InfobipTransportFactoryTest.php index a10c3214f4..64dab3d0a7 100644 --- a/src/Symfony/Component/Notifier/Bridge/Infobip/Tests/InfobipTransportFactoryTest.php +++ b/src/Symfony/Component/Notifier/Bridge/Infobip/Tests/InfobipTransportFactoryTest.php @@ -11,65 +11,42 @@ namespace Symfony\Component\Notifier\Bridge\Infobip\Tests; -use PHPUnit\Framework\TestCase; use Symfony\Component\Notifier\Bridge\Infobip\InfobipTransportFactory; -use Symfony\Component\Notifier\Exception\IncompleteDsnException; -use Symfony\Component\Notifier\Exception\UnsupportedSchemeException; -use Symfony\Component\Notifier\Transport\Dsn; +use Symfony\Component\Notifier\Tests\TransportFactoryTestCase; +use Symfony\Component\Notifier\Transport\TransportFactoryInterface; -final class InfobipTransportFactoryTest extends TestCase +final class InfobipTransportFactoryTest extends TransportFactoryTestCase { - public function testCreateWithDsn() - { - $factory = $this->createFactory(); - - $transport = $factory->create(Dsn::fromString('infobip://authtoken@host.test?from=0611223344')); - - $this->assertSame('infobip://host.test?from=0611223344', (string) $transport); - } - - public function testCreateWithNoFromThrowsIncompleteDsnException() - { - $factory = $this->createFactory(); - - $this->expectException(IncompleteDsnException::class); - $factory->create(Dsn::fromString('infobip://authtoken@default')); - } - - public function testSupportsReturnsTrueWithSupportedScheme() - { - $factory = $this->createFactory(); - - $this->assertTrue($factory->supports(Dsn::fromString('infobip://authtoken@default?from=0611223344'))); - } - - public function testSupportsReturnsFalseWithUnsupportedScheme() - { - $factory = $this->createFactory(); - - $this->assertFalse($factory->supports(Dsn::fromString('somethingElse://authtoken@default?from=0611223344'))); - } - - public function testUnsupportedSchemeThrowsUnsupportedSchemeException() - { - $factory = $this->createFactory(); - - $this->expectException(UnsupportedSchemeException::class); - $factory->create(Dsn::fromString('somethingElse://authtoken@default?from=FROM')); - } - - public function testUnsupportedSchemeThrowsUnsupportedSchemeExceptionEvenIfRequiredOptionIsMissing() - { - $factory = $this->createFactory(); - - $this->expectException(UnsupportedSchemeException::class); - - // unsupported scheme and missing "from" option - $factory->create(Dsn::fromString('somethingElse://authtoken@default')); - } - - private function createFactory(): InfobipTransportFactory + /** + * @return InfobipTransportFactory + */ + public function createFactory(): TransportFactoryInterface { return new InfobipTransportFactory(); } + + public function createProvider(): iterable + { + yield [ + 'infobip://host.test?from=0611223344', + 'infobip://authtoken@host.test?from=0611223344', + ]; + } + + public function supportsProvider(): iterable + { + yield [true, 'infobip://authtoken@default?from=0611223344']; + yield [false, 'somethingElse://authtoken@default?from=0611223344']; + } + + public function incompleteDsnProvider(): iterable + { + yield 'missing option: from' => ['infobip://authtoken@default']; + } + + public function unsupportedSchemeProvider(): iterable + { + yield ['somethingElse://authtoken@default?from=FROM']; + yield ['somethingElse://authtoken@default']; // missing "from" option + } } diff --git a/src/Symfony/Component/Notifier/Bridge/Infobip/Tests/InfobipTransportTest.php b/src/Symfony/Component/Notifier/Bridge/Infobip/Tests/InfobipTransportTest.php index 7c4a9d2143..98c40c73d9 100644 --- a/src/Symfony/Component/Notifier/Bridge/Infobip/Tests/InfobipTransportTest.php +++ b/src/Symfony/Component/Notifier/Bridge/Infobip/Tests/InfobipTransportTest.php @@ -11,41 +11,37 @@ namespace Symfony\Component\Notifier\Bridge\Infobip\Tests; -use PHPUnit\Framework\TestCase; use Symfony\Component\Notifier\Bridge\Infobip\InfobipTransport; -use Symfony\Component\Notifier\Exception\LogicException; +use Symfony\Component\Notifier\Message\ChatMessage; use Symfony\Component\Notifier\Message\MessageInterface; use Symfony\Component\Notifier\Message\SmsMessage; +use Symfony\Component\Notifier\Tests\TransportTestCase; +use Symfony\Component\Notifier\Transport\TransportInterface; use Symfony\Contracts\HttpClient\HttpClientInterface; -final class InfobipTransportTest extends TestCase +final class InfobipTransportTest extends TransportTestCase { - public function testToStringContainsProperties() + /** + * @return InfobipTransport + */ + public function createTransport(?HttpClientInterface $client = null): TransportInterface { - $transport = $this->createTransport(); - - $this->assertSame('infobip://host.test?from=0611223344', (string) $transport); + return (new InfobipTransport('authtoken', '0611223344', $client ?: $this->createMock(HttpClientInterface::class)))->setHost('host.test'); } - public function testSupportsMessageInterface() + public function toStringProvider(): iterable { - $transport = $this->createTransport(); - - $this->assertTrue($transport->supports(new SmsMessage('0611223344', 'Hello!'))); - $this->assertFalse($transport->supports($this->createMock(MessageInterface::class))); + yield ['infobip://host.test?from=0611223344', $this->createTransport()]; } - public function testSendNonSmsMessageThrowsLogicException() + public function supportedMessagesProvider(): iterable { - $transport = $this->createTransport(); - - $this->expectException(LogicException::class); - - $transport->send($this->createMock(MessageInterface::class)); + yield [new SmsMessage('0611223344', 'Hello!')]; } - private function createTransport(): InfobipTransport + public function unsupportedMessagesProvider(): iterable { - return (new InfobipTransport('authtoken', '0611223344', $this->createMock(HttpClientInterface::class)))->setHost('host.test'); + yield [new ChatMessage('Hello!')]; + yield [$this->createMock(MessageInterface::class)]; } } diff --git a/src/Symfony/Component/Notifier/Bridge/Infobip/composer.json b/src/Symfony/Component/Notifier/Bridge/Infobip/composer.json index 17c2c7ec50..09e2c4443d 100644 --- a/src/Symfony/Component/Notifier/Bridge/Infobip/composer.json +++ b/src/Symfony/Component/Notifier/Bridge/Infobip/composer.json @@ -22,7 +22,7 @@ "require": { "php": ">=7.2.5", "symfony/http-client": "^4.3|^5.0", - "symfony/notifier": "~5.2.0" + "symfony/notifier": "~5.2.2" }, "autoload": { "psr-4": { "Symfony\\Component\\Notifier\\Bridge\\Infobip\\": "" }, diff --git a/src/Symfony/Component/Notifier/Bridge/LinkedIn/Tests/LinkedInTransportFactoryTest.php b/src/Symfony/Component/Notifier/Bridge/LinkedIn/Tests/LinkedInTransportFactoryTest.php index 51dd961963..76ddaeb753 100644 --- a/src/Symfony/Component/Notifier/Bridge/LinkedIn/Tests/LinkedInTransportFactoryTest.php +++ b/src/Symfony/Component/Notifier/Bridge/LinkedIn/Tests/LinkedInTransportFactoryTest.php @@ -2,55 +2,41 @@ namespace Symfony\Component\Notifier\Bridge\LinkedIn\Tests; -use PHPUnit\Framework\TestCase; use Symfony\Component\Notifier\Bridge\LinkedIn\LinkedInTransportFactory; -use Symfony\Component\Notifier\Exception\IncompleteDsnException; -use Symfony\Component\Notifier\Exception\UnsupportedSchemeException; -use Symfony\Component\Notifier\Transport\Dsn; +use Symfony\Component\Notifier\Tests\TransportFactoryTestCase; +use Symfony\Component\Notifier\Transport\TransportFactoryInterface; -final class LinkedInTransportFactoryTest extends TestCase +final class LinkedInTransportFactoryTest extends TransportFactoryTestCase { - public function testCreateWithDsn() - { - $factory = $this->createFactory(); - - $transport = $factory->create(Dsn::fromString('linkedin://accessToken:UserId@host.test')); - - $this->assertSame('linkedin://host.test', (string) $transport); - } - - public function testCreateWithOnlyAccessTokenOrUserIdThrowsIncompleteDsnException() - { - $factory = $this->createFactory(); - - $this->expectException(IncompleteDsnException::class); - $factory->create(Dsn::fromString('linkedin://AccessTokenOrUserId@default')); - } - - public function testSupportsReturnsTrueWithSupportedScheme() - { - $factory = $this->createFactory(); - - $this->assertTrue($factory->supports(Dsn::fromString('linkedin://host/path'))); - } - - public function testSupportsReturnsFalseWithUnsupportedScheme() - { - $factory = $this->createFactory(); - - $this->assertFalse($factory->supports(Dsn::fromString('somethingElse://host/path'))); - } - - public function testUnsupportedSchemeThrowsUnsupportedSchemeException() - { - $factory = $this->createFactory(); - - $this->expectException(UnsupportedSchemeException::class); - $factory->create(Dsn::fromString('somethingElse://accessToken:UserId@default')); - } - - private function createFactory(): LinkedInTransportFactory + /** + * @return LinkedInTransportFactory + */ + public function createFactory(): TransportFactoryInterface { return new LinkedInTransportFactory(); } + + public function createProvider(): iterable + { + yield [ + 'linkedin://host.test', + 'linkedin://accessToken:UserId@host.test', + ]; + } + + public function supportsProvider(): iterable + { + yield [true, 'linkedin://host']; + yield [false, 'somethingElse://host']; + } + + public function incompleteDsnProvider(): iterable + { + yield 'missing account or user_id' => ['linkedin://AccessTokenOrUserId@default']; + } + + public function unsupportedSchemeProvider(): iterable + { + yield ['somethingElse://accessToken:UserId@default']; + } } diff --git a/src/Symfony/Component/Notifier/Bridge/LinkedIn/Tests/LinkedInTransportTest.php b/src/Symfony/Component/Notifier/Bridge/LinkedIn/Tests/LinkedInTransportTest.php index 524bc5d8b7..f3bbcadaa6 100644 --- a/src/Symfony/Component/Notifier/Bridge/LinkedIn/Tests/LinkedInTransportTest.php +++ b/src/Symfony/Component/Notifier/Bridge/LinkedIn/Tests/LinkedInTransportTest.php @@ -2,7 +2,6 @@ namespace Symfony\Component\Notifier\Bridge\LinkedIn\Tests; -use PHPUnit\Framework\TestCase; use Symfony\Component\HttpClient\MockHttpClient; use Symfony\Component\Notifier\Bridge\LinkedIn\LinkedInTransport; use Symfony\Component\Notifier\Exception\LogicException; @@ -10,39 +9,41 @@ use Symfony\Component\Notifier\Exception\TransportException; use Symfony\Component\Notifier\Message\ChatMessage; use Symfony\Component\Notifier\Message\MessageInterface; use Symfony\Component\Notifier\Message\MessageOptionsInterface; +use Symfony\Component\Notifier\Message\SmsMessage; use Symfony\Component\Notifier\Notification\Notification; +use Symfony\Component\Notifier\Tests\TransportTestCase; +use Symfony\Component\Notifier\Transport\TransportInterface; use Symfony\Contracts\HttpClient\HttpClientInterface; use Symfony\Contracts\HttpClient\ResponseInterface; -final class LinkedInTransportTest extends TestCase +final class LinkedInTransportTest extends TransportTestCase { - public function testToStringContainsProperties() + /** + * @return LinkedInTransport + */ + public function createTransport(?HttpClientInterface $client = null): TransportInterface { - $transport = $this->createTransport(); - - $this->assertSame('linkedin://host.test', (string) $transport); + return (new LinkedInTransport('AuthToken', 'AccountId', $client ?: $this->createMock(HttpClientInterface::class)))->setHost('host.test'); } - public function testSupportsChatMessage() + public function toStringProvider(): iterable { - $transport = $this->createTransport(); - - $this->assertTrue($transport->supports(new ChatMessage('testChatMessage'))); - $this->assertFalse($transport->supports($this->createMock(MessageInterface::class))); + yield ['linkedin://host.test', $this->createTransport()]; } - public function testSendNonChatMessageThrows() + public function supportedMessagesProvider(): iterable { - $transport = $this->createTransport(); - - $this->expectException(LogicException::class); - $transport->send($this->createMock(MessageInterface::class)); + yield [new ChatMessage('Hello!')]; } - public function testSendWithEmptyArrayResponseThrows() + public function unsupportedMessagesProvider(): iterable { - $this->expectException(TransportException::class); + yield [new SmsMessage('0611223344', 'Hello!')]; + yield [$this->createMock(MessageInterface::class)]; + } + public function testSendWithEmptyArrayResponseThrowsTransportException() + { $response = $this->createMock(ResponseInterface::class); $response->expects($this->exactly(2)) ->method('getStatusCode') @@ -57,10 +58,12 @@ final class LinkedInTransportTest extends TestCase $transport = $this->createTransport($client); + $this->expectException(TransportException::class); + $transport->send(new ChatMessage('testMessage')); } - public function testSendWithErrorResponseThrows() + public function testSendWithErrorResponseThrowsTransportException() { $this->expectException(TransportException::class); $this->expectExceptionMessage('testErrorCode'); @@ -187,9 +190,4 @@ final class LinkedInTransportTest extends TestCase $transport->send(new ChatMessage('testMessage', $this->createMock(MessageOptionsInterface::class))); } - - private function createTransport(?HttpClientInterface $client = null): LinkedInTransport - { - return (new LinkedInTransport('AuthToken', 'AccountId', $client ?? $this->createMock(HttpClientInterface::class)))->setHost('host.test'); - } } diff --git a/src/Symfony/Component/Notifier/Bridge/LinkedIn/composer.json b/src/Symfony/Component/Notifier/Bridge/LinkedIn/composer.json index ed01347a7a..6ebc829c25 100644 --- a/src/Symfony/Component/Notifier/Bridge/LinkedIn/composer.json +++ b/src/Symfony/Component/Notifier/Bridge/LinkedIn/composer.json @@ -18,7 +18,7 @@ "require": { "php": ">=7.2.5", "symfony/http-client": "^4.3|^5.0", - "symfony/notifier": "~5.2.0" + "symfony/notifier": "~5.2.2" }, "autoload": { "psr-4": { "Symfony\\Component\\Notifier\\Bridge\\LinkedIn\\": "" }, diff --git a/src/Symfony/Component/Notifier/Bridge/Mobyt/Tests/MobytTransportFactoryTest.php b/src/Symfony/Component/Notifier/Bridge/Mobyt/Tests/MobytTransportFactoryTest.php new file mode 100644 index 0000000000..1001dff8d0 --- /dev/null +++ b/src/Symfony/Component/Notifier/Bridge/Mobyt/Tests/MobytTransportFactoryTest.php @@ -0,0 +1,61 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Notifier\Bridge\Mobyt\Tests; + +use Symfony\Component\Notifier\Bridge\Mobyt\MobytTransportFactory; +use Symfony\Component\Notifier\Tests\TransportFactoryTestCase; +use Symfony\Component\Notifier\Transport\TransportFactoryInterface; + +/** + * @author Oskar Stark + */ +final class MobytTransportFactoryTest extends TransportFactoryTestCase +{ + /** + * @return MobytTransportFactory + */ + public function createFactory(): TransportFactoryInterface + { + return new MobytTransportFactory(); + } + + public function createProvider(): iterable + { + yield [ + 'mobyt://host.test?from=FROM&type_quality=LL', + 'mobyt://accountSid:authToken@host.test?from=FROM', + ]; + + yield [ + 'mobyt://host.test?from=FROM&type_quality=N', + 'mobyt://accountSid:authToken@host.test?from=FROM&type_quality=N', + ]; + } + + public function supportsProvider(): iterable + { + yield [true, 'mobyt://accountSid:authToken@host.test?from=FROM']; + yield [false, 'somethingElse://accountSid:authToken@host.test?from=FROM']; + } + + public function incompleteDsnProvider(): iterable + { + yield 'missing token' => ['mobyt://host.test?from=FROM']; + yield 'missing option: from' => ['mobyt://accountSid:authToken@host']; + } + + public function unsupportedSchemeProvider(): iterable + { + yield ['somethingElse://accountSid:authToken@host.test?from=FROM']; + yield ['somethingElse://accountSid:authToken@host.test']; // missing "from" option + } +} diff --git a/src/Symfony/Component/Notifier/Bridge/Mobyt/Tests/MobytTransportTest.php b/src/Symfony/Component/Notifier/Bridge/Mobyt/Tests/MobytTransportTest.php new file mode 100644 index 0000000000..906ecebcf4 --- /dev/null +++ b/src/Symfony/Component/Notifier/Bridge/Mobyt/Tests/MobytTransportTest.php @@ -0,0 +1,52 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Notifier\Bridge\Mobyt\Tests; + +use Symfony\Component\Notifier\Bridge\Mobyt\MobytOptions; +use Symfony\Component\Notifier\Bridge\Mobyt\MobytTransport; +use Symfony\Component\Notifier\Message\ChatMessage; +use Symfony\Component\Notifier\Message\MessageInterface; +use Symfony\Component\Notifier\Message\SmsMessage; +use Symfony\Component\Notifier\Tests\TransportTestCase; +use Symfony\Component\Notifier\Transport\TransportInterface; +use Symfony\Contracts\HttpClient\HttpClientInterface; + +/** + * @author Oskar Stark + */ +final class MobytTransportTest extends TransportTestCase +{ + /** + * @return MobytTransport + */ + public function createTransport(?HttpClientInterface $client = null, string $messageType = MobytOptions::MESSAGE_TYPE_QUALITY_LOW): TransportInterface + { + return (new MobytTransport('accountSid', 'authToken', 'from', $messageType, $client ?: $this->createMock(HttpClientInterface::class)))->setHost('host.test'); + } + + public function toStringProvider(): iterable + { + yield ['mobyt://host.test?from=from&type_quality=LL', $this->createTransport()]; + yield ['mobyt://host.test?from=from&type_quality=N', $this->createTransport(null, MobytOptions::MESSAGE_TYPE_QUALITY_HIGH)]; + } + + public function supportedMessagesProvider(): iterable + { + yield [new SmsMessage('0611223344', 'Hello!')]; + } + + public function unsupportedMessagesProvider(): iterable + { + yield [new ChatMessage('Hello!')]; + yield [$this->createMock(MessageInterface::class)]; + } +} diff --git a/src/Symfony/Component/Notifier/Bridge/Mobyt/composer.json b/src/Symfony/Component/Notifier/Bridge/Mobyt/composer.json index 83a3667ce0..1d56cc197e 100644 --- a/src/Symfony/Component/Notifier/Bridge/Mobyt/composer.json +++ b/src/Symfony/Component/Notifier/Bridge/Mobyt/composer.json @@ -19,7 +19,7 @@ "php": ">=7.2.5", "ext-json": "*", "symfony/http-client": "^4.3|^5.0", - "symfony/notifier": "~5.2.0" + "symfony/notifier": "~5.2.2" }, "autoload": { "psr-4": { "Symfony\\Component\\Notifier\\Bridge\\Mobyt\\": "" }, diff --git a/src/Symfony/Component/Notifier/Bridge/Sendinblue/Tests/SendinblueTransportFactoryTest.php b/src/Symfony/Component/Notifier/Bridge/Sendinblue/Tests/SendinblueTransportFactoryTest.php index a2a1c605ef..4e573f33e8 100644 --- a/src/Symfony/Component/Notifier/Bridge/Sendinblue/Tests/SendinblueTransportFactoryTest.php +++ b/src/Symfony/Component/Notifier/Bridge/Sendinblue/Tests/SendinblueTransportFactoryTest.php @@ -11,76 +11,43 @@ namespace Symfony\Component\Notifier\Bridge\Sendinblue\Tests; -use PHPUnit\Framework\TestCase; use Symfony\Component\Notifier\Bridge\Sendinblue\SendinblueTransportFactory; -use Symfony\Component\Notifier\Exception\IncompleteDsnException; -use Symfony\Component\Notifier\Exception\UnsupportedSchemeException; -use Symfony\Component\Notifier\Transport\Dsn; +use Symfony\Component\Notifier\Tests\TransportFactoryTestCase; +use Symfony\Component\Notifier\Transport\TransportFactoryInterface; -final class SendinblueTransportFactoryTest extends TestCase +final class SendinblueTransportFactoryTest extends TransportFactoryTestCase { - public function testCreateWithDsn() - { - $factory = $this->createFactory(); - - $transport = $factory->create(Dsn::fromString('sendinblue://apiKey@host.test?sender=0611223344')); - - $this->assertSame('sendinblue://host.test?sender=0611223344', (string) $transport); - } - - public function testCreateWithMissingOptionSenderThrowsIncompleteDsnException() - { - $factory = $this->createFactory(); - - $this->expectException(IncompleteDsnException::class); - - $factory->create(Dsn::fromString('sendinblue://apiKey@host.test')); - } - - public function testCreateWithNoApiKeyThrowsIncompleteDsnException() - { - $factory = $this->createFactory(); - - $this->expectException(IncompleteDsnException::class); - - $factory->create(Dsn::fromString('sendinblue://default?sender=0611223344')); - } - - public function testSupportsReturnsTrueWithSupportedScheme() - { - $factory = $this->createFactory(); - - $this->assertTrue($factory->supports(Dsn::fromString('sendinblue://apiKey@default?sender=0611223344'))); - } - - public function testSupportsReturnsFalseWithUnsupportedScheme() - { - $factory = $this->createFactory(); - - $this->assertFalse($factory->supports(Dsn::fromString('somethingElse://apiKey@default?sender=0611223344'))); - } - - public function testUnsupportedSchemeThrowsUnsupportedSchemeException() - { - $factory = $this->createFactory(); - - $this->expectException(UnsupportedSchemeException::class); - - $factory->create(Dsn::fromString('somethingElse://apiKey@default?sender=0611223344')); - } - - public function testUnsupportedSchemeThrowsUnsupportedSchemeExceptionEvenIfRequiredOptionIsMissing() - { - $factory = $this->createFactory(); - - $this->expectException(UnsupportedSchemeException::class); - - // unsupported scheme and missing "from" option - $factory->create(Dsn::fromString('somethingElse://apiKey@host')); - } - - private function createFactory(): SendinblueTransportFactory + /** + * @return SendinblueTransportFactory + */ + public function createFactory(): TransportFactoryInterface { return new SendinblueTransportFactory(); } + + public function createProvider(): iterable + { + yield [ + 'sendinblue://host.test?sender=0611223344', + 'sendinblue://apiKey@host.test?sender=0611223344', + ]; + } + + public function supportsProvider(): iterable + { + yield [true, 'sendinblue://apiKey@default?sender=0611223344']; + yield [false, 'somethingElse://apiKey@default?sender=0611223344']; + } + + public function incompleteDsnProvider(): iterable + { + yield 'missing api_key' => ['sendinblue://default?sender=0611223344']; + yield 'missing option: sender' => ['sendinblue://apiKey@host.test']; + } + + public function unsupportedSchemeProvider(): iterable + { + yield ['somethingElse://apiKey@default?sender=0611223344']; + yield ['somethingElse://apiKey@host']; // missing "sender" option + } } diff --git a/src/Symfony/Component/Notifier/Bridge/Sendinblue/Tests/SendinblueTransportTest.php b/src/Symfony/Component/Notifier/Bridge/Sendinblue/Tests/SendinblueTransportTest.php index 438ba57960..f784b08105 100644 --- a/src/Symfony/Component/Notifier/Bridge/Sendinblue/Tests/SendinblueTransportTest.php +++ b/src/Symfony/Component/Notifier/Bridge/Sendinblue/Tests/SendinblueTransportTest.php @@ -11,42 +11,44 @@ namespace Symfony\Component\Notifier\Bridge\Sendinblue\Tests; -use PHPUnit\Framework\TestCase; use Symfony\Component\HttpClient\MockHttpClient; use Symfony\Component\Notifier\Bridge\Sendinblue\SendinblueTransport; -use Symfony\Component\Notifier\Exception\LogicException; use Symfony\Component\Notifier\Exception\TransportException; +use Symfony\Component\Notifier\Message\ChatMessage; use Symfony\Component\Notifier\Message\MessageInterface; use Symfony\Component\Notifier\Message\SmsMessage; +use Symfony\Component\Notifier\Tests\TransportTestCase; +use Symfony\Component\Notifier\Transport\TransportInterface; use Symfony\Contracts\HttpClient\HttpClientInterface; use Symfony\Contracts\HttpClient\ResponseInterface; -final class SendinblueTransportTest extends TestCase +final class SendinblueTransportTest extends TransportTestCase { - public function testToStringContainsProperties() + /** + * @return SendinblueTransport + */ + public function createTransport(?HttpClientInterface $client = null): TransportInterface { - $transport = $this->createTransport(); - - $this->assertSame('sendinblue://host.test?sender=0611223344', (string) $transport); + return (new SendinblueTransport('api-key', '0611223344', $client ?: $this->createMock(HttpClientInterface::class)))->setHost('host.test'); } - public function testSupportsMessageInterface() + public function toStringProvider(): iterable { - $transport = $this->createTransport(); - - $this->assertTrue($transport->supports(new SmsMessage('0611223344', 'Hello!'))); - $this->assertFalse($transport->supports($this->createMock(MessageInterface::class))); + yield ['sendinblue://host.test?sender=0611223344', $this->createTransport()]; } - public function testSendNonSmsMessageThrowsLogicException() + public function supportedMessagesProvider(): iterable { - $transport = $this->createTransport(); - - $this->expectException(LogicException::class); - $transport->send($this->createMock(MessageInterface::class)); + yield [new SmsMessage('0611223344', 'Hello!')]; } - public function testSendWithErrorResponseThrows() + public function unsupportedMessagesProvider(): iterable + { + yield [new ChatMessage('Hello!')]; + yield [$this->createMock(MessageInterface::class)]; + } + + public function testSendWithErrorResponseThrowsTransportException() { $response = $this->createMock(ResponseInterface::class); $response->expects($this->exactly(2)) @@ -64,11 +66,7 @@ final class SendinblueTransportTest extends TestCase $this->expectException(TransportException::class); $this->expectExceptionMessage('Unable to send the SMS: bad request'); + $transport->send(new SmsMessage('phone', 'testMessage')); } - - private function createTransport(?HttpClientInterface $client = null): SendinblueTransport - { - return (new SendinblueTransport('api-key', '0611223344', $client ?: $this->createMock(HttpClientInterface::class)))->setHost('host.test'); - } } diff --git a/src/Symfony/Component/Notifier/Bridge/Sendinblue/composer.json b/src/Symfony/Component/Notifier/Bridge/Sendinblue/composer.json index 7a9579d7bc..02a0217a13 100644 --- a/src/Symfony/Component/Notifier/Bridge/Sendinblue/composer.json +++ b/src/Symfony/Component/Notifier/Bridge/Sendinblue/composer.json @@ -19,7 +19,7 @@ "php": ">=7.2.5", "ext-json": "*", "symfony/http-client": "^4.3|^5.0", - "symfony/notifier": "~5.2.0" + "symfony/notifier": "~5.2.2" }, "autoload": { "psr-4": { "Symfony\\Component\\Notifier\\Bridge\\Sendinblue\\": "" }, diff --git a/src/Symfony/Component/Notifier/Bridge/Slack/SlackTransport.php b/src/Symfony/Component/Notifier/Bridge/Slack/SlackTransport.php index 6cdfefaddc..5a98638ab3 100644 --- a/src/Symfony/Component/Notifier/Bridge/Slack/SlackTransport.php +++ b/src/Symfony/Component/Notifier/Bridge/Slack/SlackTransport.php @@ -43,6 +43,10 @@ final class SlackTransport extends AbstractTransport public function __toString(): string { + if (null === $this->chatChannel) { + return sprintf('slack://%s', $this->getEndpoint()); + } + return sprintf('slack://%s?channel=%s', $this->getEndpoint(), urlencode($this->chatChannel)); } diff --git a/src/Symfony/Component/Notifier/Bridge/Slack/Tests/SlackTransportFactoryTest.php b/src/Symfony/Component/Notifier/Bridge/Slack/Tests/SlackTransportFactoryTest.php index 39c5396179..8b7db84bb8 100644 --- a/src/Symfony/Component/Notifier/Bridge/Slack/Tests/SlackTransportFactoryTest.php +++ b/src/Symfony/Component/Notifier/Bridge/Slack/Tests/SlackTransportFactoryTest.php @@ -11,31 +11,38 @@ namespace Symfony\Component\Notifier\Bridge\Slack\Tests; -use PHPUnit\Framework\TestCase; use Symfony\Component\Notifier\Bridge\Slack\SlackTransportFactory; -use Symfony\Component\Notifier\Exception\IncompleteDsnException; use Symfony\Component\Notifier\Exception\InvalidArgumentException; -use Symfony\Component\Notifier\Exception\UnsupportedSchemeException; +use Symfony\Component\Notifier\Tests\TransportFactoryTestCase; use Symfony\Component\Notifier\Transport\Dsn; +use Symfony\Component\Notifier\Transport\TransportFactoryInterface; -final class SlackTransportFactoryTest extends TestCase +final class SlackTransportFactoryTest extends TransportFactoryTestCase { - public function testCreateWithDsn() + /** + * @return SlackTransportFactory + */ + public function createFactory(): TransportFactoryInterface { - $factory = $this->createFactory(); - - $transport = $factory->create(Dsn::fromString('slack://testUser@host.test/?channel=testChannel')); - - $this->assertSame('slack://host.test?channel=testChannel', (string) $transport); + return new SlackTransportFactory(); } - public function testCreateWithDsnWithoutPath() + public function createProvider(): iterable { - $factory = $this->createFactory(); + yield [ + 'slack://host.test', + 'slack://testUser@host.test', + ]; - $transport = $factory->create(Dsn::fromString('slack://testUser@host.test?channel=testChannel')); + yield 'with path' => [ + 'slack://host.test?channel=testChannel', + 'slack://testUser@host.test/?channel=testChannel', + ]; - $this->assertSame('slack://host.test?channel=testChannel', (string) $transport); + yield 'without path' => [ + 'slack://host.test?channel=testChannel', + 'slack://testUser@host.test?channel=testChannel', + ]; } public function testCreateWithDeprecatedDsn() @@ -48,38 +55,19 @@ final class SlackTransportFactoryTest extends TestCase $factory->create(Dsn::fromString('slack://default/XXXXXXXXX/XXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXX')); } - public function testCreateWithNoTokenThrowsInclompleteDsnException() + public function supportsProvider(): iterable { - $factory = $this->createFactory(); - - $this->expectException(IncompleteDsnException::class); - $factory->create(Dsn::fromString('slack://host.test?channel=testChannel')); + yield [true, 'slack://host?channel=testChannel']; + yield [false, 'somethingElse://host?channel=testChannel']; } - public function testSupportsReturnsTrueWithSupportedScheme() + public function incompleteDsnProvider(): iterable { - $factory = $this->createFactory(); - - $this->assertTrue($factory->supports(Dsn::fromString('slack://host?channel=testChannel'))); + yield 'missing token' => ['slack://host.test?channel=testChannel']; } - public function testSupportsReturnsFalseWithUnsupportedScheme() + public function unsupportedSchemeProvider(): iterable { - $factory = $this->createFactory(); - - $this->assertFalse($factory->supports(Dsn::fromString('somethingElse://host?channel=testChannel'))); - } - - public function testUnsupportedSchemeThrowsUnsupportedSchemeException() - { - $factory = $this->createFactory(); - - $this->expectException(UnsupportedSchemeException::class); - $factory->create(Dsn::fromString('somethingElse://host?channel=testChannel')); - } - - private function createFactory(): SlackTransportFactory - { - return new SlackTransportFactory(); + yield ['somethingElse://host?channel=testChannel']; } } diff --git a/src/Symfony/Component/Notifier/Bridge/Slack/Tests/SlackTransportTest.php b/src/Symfony/Component/Notifier/Bridge/Slack/Tests/SlackTransportTest.php index defcd0d535..3b7a3c6f8f 100644 --- a/src/Symfony/Component/Notifier/Bridge/Slack/Tests/SlackTransportTest.php +++ b/src/Symfony/Component/Notifier/Bridge/Slack/Tests/SlackTransportTest.php @@ -11,7 +11,6 @@ namespace Symfony\Component\Notifier\Bridge\Slack\Tests; -use PHPUnit\Framework\TestCase; use Symfony\Component\HttpClient\MockHttpClient; use Symfony\Component\Notifier\Bridge\Slack\SlackOptions; use Symfony\Component\Notifier\Bridge\Slack\SlackTransport; @@ -20,40 +19,41 @@ use Symfony\Component\Notifier\Exception\TransportException; use Symfony\Component\Notifier\Message\ChatMessage; use Symfony\Component\Notifier\Message\MessageInterface; use Symfony\Component\Notifier\Message\MessageOptionsInterface; +use Symfony\Component\Notifier\Message\SmsMessage; use Symfony\Component\Notifier\Notification\Notification; +use Symfony\Component\Notifier\Tests\TransportTestCase; +use Symfony\Component\Notifier\Transport\TransportInterface; use Symfony\Contracts\HttpClient\HttpClientInterface; use Symfony\Contracts\HttpClient\ResponseInterface; -final class SlackTransportTest extends TestCase +final class SlackTransportTest extends TransportTestCase { - public function testToStringContainsProperties() + /** + * @return SlackTransport + */ + public function createTransport(?HttpClientInterface $client = null, string $channel = null): TransportInterface { - $channel = 'test Channel'; // invalid channel name to test url encoding of the channel - - $transport = new SlackTransport('testToken', $channel, $this->createMock(HttpClientInterface::class)); - $transport->setHost('host.test'); - - $this->assertSame('slack://host.test?channel=test+Channel', (string) $transport); + return new SlackTransport('testToken', $channel, $client ?: $this->createMock(HttpClientInterface::class)); } - public function testSupportsChatMessage() + public function toStringProvider(): iterable { - $transport = new SlackTransport('testToken', 'testChannel', $this->createMock(HttpClientInterface::class)); - - $this->assertTrue($transport->supports(new ChatMessage('testChatMessage'))); - $this->assertFalse($transport->supports($this->createMock(MessageInterface::class))); + yield ['slack://slack.com', $this->createTransport()]; + yield ['slack://slack.com?channel=test+Channel', $this->createTransport(null, 'test Channel')]; } - public function testSendNonChatMessageThrowsLogicException() + public function supportedMessagesProvider(): iterable { - $transport = new SlackTransport('testToken', 'testChannel', $this->createMock(HttpClientInterface::class)); - - $this->expectException(LogicException::class); - - $transport->send($this->createMock(MessageInterface::class)); + yield [new ChatMessage('Hello!')]; } - public function testSendWithEmptyArrayResponseThrows() + public function unsupportedMessagesProvider(): iterable + { + yield [new SmsMessage('0611223344', 'Hello!')]; + yield [$this->createMock(MessageInterface::class)]; + } + + public function testSendWithEmptyArrayResponseThrowsTransportException() { $this->expectException(TransportException::class); @@ -69,12 +69,12 @@ final class SlackTransportTest extends TestCase return $response; }); - $transport = new SlackTransport('testToken', 'testChannel', $client); + $transport = $this->createTransport($client, 'testChannel'); $transport->send(new ChatMessage('testMessage')); } - public function testSendWithErrorResponseThrows() + public function testSendWithErrorResponseThrowsTransportException() { $this->expectException(TransportException::class); $this->expectExceptionMessageMatches('/testErrorCode/'); @@ -92,14 +92,13 @@ final class SlackTransportTest extends TestCase return $response; }); - $transport = new SlackTransport('testToken', 'testChannel', $client); + $transport = $this->createTransport($client, 'testChannel'); $transport->send(new ChatMessage('testMessage')); } public function testSendWithOptions() { - $token = 'testToken'; $channel = 'testChannel'; $message = 'testMessage'; @@ -121,14 +120,13 @@ final class SlackTransportTest extends TestCase return $response; }); - $transport = new SlackTransport($token, $channel, $client); + $transport = $this->createTransport($client, $channel); $transport->send(new ChatMessage('testMessage')); } public function testSendWithNotification() { - $token = 'testToken'; $channel = 'testChannel'; $message = 'testMessage'; @@ -158,7 +156,7 @@ final class SlackTransportTest extends TestCase return $response; }); - $transport = new SlackTransport($token, $channel, $client); + $transport = $this->createTransport($client, $channel); $transport->send($chatMessage); } @@ -171,14 +169,13 @@ final class SlackTransportTest extends TestCase return $this->createMock(ResponseInterface::class); }); - $transport = new SlackTransport('testToken', 'testChannel', $client); + $transport = $this->createTransport($client, 'testChannel'); $transport->send(new ChatMessage('testMessage', $this->createMock(MessageOptionsInterface::class))); } public function testSendWith200ResponseButNotOk() { - $token = 'testToken'; $channel = 'testChannel'; $message = 'testMessage'; @@ -202,7 +199,7 @@ final class SlackTransportTest extends TestCase return $response; }); - $transport = new SlackTransport($token, $channel, $client); + $transport = $this->createTransport($client, $channel); $transport->send(new ChatMessage('testMessage')); } diff --git a/src/Symfony/Component/Notifier/Bridge/Smsapi/Tests/SmsapiTransportFactoryTest.php b/src/Symfony/Component/Notifier/Bridge/Smsapi/Tests/SmsapiTransportFactoryTest.php index 86c8ee63a5..ed7af22dbc 100644 --- a/src/Symfony/Component/Notifier/Bridge/Smsapi/Tests/SmsapiTransportFactoryTest.php +++ b/src/Symfony/Component/Notifier/Bridge/Smsapi/Tests/SmsapiTransportFactoryTest.php @@ -11,74 +11,43 @@ namespace Symfony\Component\Notifier\Bridge\Smsapi\Tests; -use PHPUnit\Framework\TestCase; use Symfony\Component\Notifier\Bridge\Smsapi\SmsapiTransportFactory; -use Symfony\Component\Notifier\Exception\IncompleteDsnException; -use Symfony\Component\Notifier\Exception\UnsupportedSchemeException; -use Symfony\Component\Notifier\Transport\Dsn; +use Symfony\Component\Notifier\Tests\TransportFactoryTestCase; +use Symfony\Component\Notifier\Transport\TransportFactoryInterface; -final class SmsapiTransportFactoryTest extends TestCase +final class SmsapiTransportFactoryTest extends TransportFactoryTestCase { - public function testCreateWithDsn() - { - $factory = $this->createFactory(); - - $transport = $factory->create(Dsn::fromString('smsapi://token@host.test?from=testFrom')); - - $this->assertSame('smsapi://host.test?from=testFrom', (string) $transport); - } - - public function testCreateWithMissingOptionFromThrowsIncompleteDsnException() - { - $factory = $this->createFactory(); - - $this->expectException(IncompleteDsnException::class); - - $factory->create(Dsn::fromString('smsapi://token@host')); - } - - public function testCreateWithNoTokenThrowsIncompleteDsnException() - { - $factory = $this->createFactory(); - - $this->expectException(IncompleteDsnException::class); - $factory->create(Dsn::fromString('smsapi://host.test?from=testFrom')); - } - - public function testSupportsReturnsTrueWithSupportedScheme() - { - $factory = $this->createFactory(); - - $this->assertTrue($factory->supports(Dsn::fromString('smsapi://host?from=testFrom'))); - } - - public function testSupportsReturnsFalseWithUnsupportedScheme() - { - $factory = $this->createFactory(); - - $this->assertFalse($factory->supports(Dsn::fromString('somethingElse://host?from=testFrom'))); - } - - public function testUnsupportedSchemeThrowsUnsupportedSchemeException() - { - $factory = $this->createFactory(); - - $this->expectException(UnsupportedSchemeException::class); - $factory->create(Dsn::fromString('somethingElse://token@host?from=testFrom')); - } - - public function testUnsupportedSchemeThrowsUnsupportedSchemeExceptionEvenIfRequiredOptionIsMissing() - { - $factory = $this->createFactory(); - - $this->expectException(UnsupportedSchemeException::class); - - // unsupported scheme and missing "from" option - $factory->create(Dsn::fromString('somethingElse://token@host')); - } - - private function createFactory(): SmsapiTransportFactory + /** + * @return SmsapiTransportFactory + */ + public function createFactory(): TransportFactoryInterface { return new SmsapiTransportFactory(); } + + public function createProvider(): iterable + { + yield [ + 'smsapi://host.test?from=testFrom', + 'smsapi://token@host.test?from=testFrom', + ]; + } + + public function supportsProvider(): iterable + { + yield [true, 'smsapi://host?from=testFrom']; + yield [false, 'somethingElse://host?from=testFrom']; + } + + public function incompleteDsnProvider(): iterable + { + yield 'missing token' => ['smsapi://host.test?from=testFrom']; + yield 'missing option: from' => ['smsapi://token@host']; + } + + public function unsupportedSchemeProvider(): iterable + { + yield ['somethingElse://token@host?from=testFrom']; + yield ['somethingElse://token@host']; // missing "from" option + } } diff --git a/src/Symfony/Component/Notifier/Bridge/Smsapi/Tests/SmsapiTransportTest.php b/src/Symfony/Component/Notifier/Bridge/Smsapi/Tests/SmsapiTransportTest.php index 1aed295e36..24d6730fe4 100644 --- a/src/Symfony/Component/Notifier/Bridge/Smsapi/Tests/SmsapiTransportTest.php +++ b/src/Symfony/Component/Notifier/Bridge/Smsapi/Tests/SmsapiTransportTest.php @@ -11,40 +11,37 @@ namespace Symfony\Component\Notifier\Bridge\Smsapi\Tests; -use PHPUnit\Framework\TestCase; use Symfony\Component\Notifier\Bridge\Smsapi\SmsapiTransport; -use Symfony\Component\Notifier\Exception\LogicException; +use Symfony\Component\Notifier\Message\ChatMessage; use Symfony\Component\Notifier\Message\MessageInterface; use Symfony\Component\Notifier\Message\SmsMessage; +use Symfony\Component\Notifier\Tests\TransportTestCase; +use Symfony\Component\Notifier\Transport\TransportInterface; use Symfony\Contracts\HttpClient\HttpClientInterface; -final class SmsapiTransportTest extends TestCase +final class SmsapiTransportTest extends TransportTestCase { - public function testToStringContainsProperties() + /** + * @return SmsapiTransport + */ + public function createTransport(?HttpClientInterface $client = null): TransportInterface { - $transport = $this->createTransport(); - - $this->assertSame('smsapi://test.host?from=testFrom', (string) $transport); + return (new SmsapiTransport('testToken', 'testFrom', $client ?: $this->createMock(HttpClientInterface::class)))->setHost('test.host'); } - public function testSupportsMessageInterface() + public function toStringProvider(): iterable { - $transport = $this->createTransport(); - - $this->assertTrue($transport->supports(new SmsMessage('0611223344', 'Hello!'))); - $this->assertFalse($transport->supports($this->createMock(MessageInterface::class))); + yield ['smsapi://test.host?from=testFrom', $this->createTransport()]; } - public function testSendNonChatMessageThrows() + public function supportedMessagesProvider(): iterable { - $transport = $this->createTransport(); - - $this->expectException(LogicException::class); - $transport->send($this->createMock(MessageInterface::class)); + yield [new SmsMessage('0611223344', 'Hello!')]; } - private function createTransport(): SmsapiTransport + public function unsupportedMessagesProvider(): iterable { - return (new SmsapiTransport('testToken', 'testFrom', $this->createMock(HttpClientInterface::class)))->setHost('test.host'); + yield [new ChatMessage('Hello!')]; + yield [$this->createMock(MessageInterface::class)]; } } diff --git a/src/Symfony/Component/Notifier/Bridge/Smsapi/composer.json b/src/Symfony/Component/Notifier/Bridge/Smsapi/composer.json index f0ac5e753f..9e1e4db894 100644 --- a/src/Symfony/Component/Notifier/Bridge/Smsapi/composer.json +++ b/src/Symfony/Component/Notifier/Bridge/Smsapi/composer.json @@ -18,7 +18,7 @@ "require": { "php": ">=7.2.5", "symfony/http-client": "^4.3|^5.0", - "symfony/notifier": "~5.2.0" + "symfony/notifier": "~5.2.2" }, "autoload": { "psr-4": { "Symfony\\Component\\Notifier\\Bridge\\Smsapi\\": "" }, diff --git a/src/Symfony/Component/Notifier/Bridge/Telegram/Tests/TelegramTransportTest.php b/src/Symfony/Component/Notifier/Bridge/Telegram/Tests/TelegramTransportTest.php index d02adb010b..eeed3b5024 100644 --- a/src/Symfony/Component/Notifier/Bridge/Telegram/Tests/TelegramTransportTest.php +++ b/src/Symfony/Component/Notifier/Bridge/Telegram/Tests/TelegramTransportTest.php @@ -50,7 +50,7 @@ final class TelegramTransportTest extends TransportTestCase yield [$this->createMock(MessageInterface::class)]; } - public function testSendWithErrorResponseThrows() + public function testSendWithErrorResponseThrowsTransportException() { $this->expectException(TransportException::class); $this->expectExceptionMessageMatches('/testDescription.+testErrorCode/'); diff --git a/src/Symfony/Component/Notifier/Bridge/Zulip/Tests/ZulipTransportFactoryTest.php b/src/Symfony/Component/Notifier/Bridge/Zulip/Tests/ZulipTransportFactoryTest.php index d60c7ad80f..e551460435 100644 --- a/src/Symfony/Component/Notifier/Bridge/Zulip/Tests/ZulipTransportFactoryTest.php +++ b/src/Symfony/Component/Notifier/Bridge/Zulip/Tests/ZulipTransportFactoryTest.php @@ -11,74 +11,43 @@ namespace Symfony\Component\Notifier\Bridge\Zulip\Tests; -use PHPUnit\Framework\TestCase; use Symfony\Component\Notifier\Bridge\Zulip\ZulipTransportFactory; -use Symfony\Component\Notifier\Exception\IncompleteDsnException; -use Symfony\Component\Notifier\Exception\UnsupportedSchemeException; -use Symfony\Component\Notifier\Transport\Dsn; +use Symfony\Component\Notifier\Tests\TransportFactoryTestCase; +use Symfony\Component\Notifier\Transport\TransportFactoryInterface; -final class ZulipTransportFactoryTest extends TestCase +final class ZulipTransportFactoryTest extends TransportFactoryTestCase { - public function testCreateWithDsn() - { - $factory = $this->createFactory(); - - $transport = $factory->create(Dsn::fromString('zulip://email:token@host.test?channel=testChannel')); - - $this->assertSame('zulip://host.test?channel=testChannel', (string) $transport); - } - - public function testCreateWithMissingOptionChannelThrowsIncompleteDsnException() - { - $factory = $this->createFactory(); - - $this->expectException(IncompleteDsnException::class); - - $factory->create(Dsn::fromString('zulip://email:token@host')); - } - - public function testCreateWithOnlyEmailOrTokenThrowsIncompleteDsnException() - { - $factory = $this->createFactory(); - - $this->expectException(IncompleteDsnException::class); - $factory->create(Dsn::fromString('zulip://testOneOfEmailOrToken@host.test?channel=testChannel')); - } - - public function testSupportsReturnsTrueWithSupportedScheme() - { - $factory = $this->createFactory(); - - $this->assertTrue($factory->supports(Dsn::fromString('zulip://host?channel=testChannel'))); - } - - public function testSupportsReturnsFalseWithUnsupportedScheme() - { - $factory = $this->createFactory(); - - $this->assertFalse($factory->supports(Dsn::fromString('somethingElse://host?channel=testChannel'))); - } - - public function testUnsupportedSchemeThrowsUnsupportedSchemeException() - { - $factory = $this->createFactory(); - - $this->expectException(UnsupportedSchemeException::class); - $factory->create(Dsn::fromString('somethingElse://email:token@host?channel=testChannel')); - } - - public function testUnsupportedSchemeThrowsUnsupportedSchemeExceptionEvenIfRequiredOptionIsMissing() - { - $factory = $this->createFactory(); - - $this->expectException(UnsupportedSchemeException::class); - - // unsupported scheme and missing "channel" option - $factory->create(Dsn::fromString('somethingElse://email:token@host')); - } - - private function createFactory(): ZulipTransportFactory + /** + * @return ZulipTransportFactory + */ + public function createFactory(): TransportFactoryInterface { return new ZulipTransportFactory(); } + + public function createProvider(): iterable + { + yield [ + 'zulip://host.test?channel=testChannel', + 'zulip://email:token@host.test?channel=testChannel', + ]; + } + + public function supportsProvider(): iterable + { + yield [true, 'zulip://host?channel=testChannel']; + yield [false, 'somethingElse://host?channel=testChannel']; + } + + public function incompleteDsnProvider(): iterable + { + yield 'missing email or token' => ['zulip://testOneOfEmailOrToken@host.test?channel=testChannel']; + yield 'missing option: channel' => ['zulip://email:token@host']; + } + + public function unsupportedSchemeProvider(): iterable + { + yield ['somethingElse://email:token@host?channel=testChannel']; + yield ['somethingElse://email:token@host']; // missing "channel" option + } } diff --git a/src/Symfony/Component/Notifier/Bridge/Zulip/Tests/ZulipTransportTest.php b/src/Symfony/Component/Notifier/Bridge/Zulip/Tests/ZulipTransportTest.php index 1af5b06eca..422a04d118 100644 --- a/src/Symfony/Component/Notifier/Bridge/Zulip/Tests/ZulipTransportTest.php +++ b/src/Symfony/Component/Notifier/Bridge/Zulip/Tests/ZulipTransportTest.php @@ -11,40 +11,37 @@ namespace Symfony\Component\Notifier\Bridge\Zulip\Tests; -use PHPUnit\Framework\TestCase; use Symfony\Component\Notifier\Bridge\Zulip\ZulipTransport; -use Symfony\Component\Notifier\Exception\LogicException; use Symfony\Component\Notifier\Message\ChatMessage; use Symfony\Component\Notifier\Message\MessageInterface; +use Symfony\Component\Notifier\Message\SmsMessage; +use Symfony\Component\Notifier\Tests\TransportTestCase; +use Symfony\Component\Notifier\Transport\TransportInterface; use Symfony\Contracts\HttpClient\HttpClientInterface; -final class ZulipTransportTest extends TestCase +final class ZulipTransportTest extends TransportTestCase { - public function testToStringContainsProperties() + /** + * @return ZulipTransport + */ + public function createTransport(?HttpClientInterface $client = null): TransportInterface { - $transport = $this->createTransport(); - - $this->assertSame('zulip://test.host?channel=testChannel', (string) $transport); + return (new ZulipTransport('testEmail', 'testToken', 'testChannel', $client ?: $this->createMock(HttpClientInterface::class)))->setHost('test.host'); } - public function testSupportsChatMessage() + public function toStringProvider(): iterable { - $transport = $this->createTransport(); - - $this->assertTrue($transport->supports(new ChatMessage('testChatMessage'))); - $this->assertFalse($transport->supports($this->createMock(MessageInterface::class))); + yield ['zulip://test.host?channel=testChannel', $this->createTransport()]; } - public function testSendNonChatMessageThrows() + public function supportedMessagesProvider(): iterable { - $transport = $this->createTransport(); - - $this->expectException(LogicException::class); - $transport->send($this->createMock(MessageInterface::class)); + yield [new ChatMessage('Hello!')]; } - private function createTransport(): ZulipTransport + public function unsupportedMessagesProvider(): iterable { - return (new ZulipTransport('testEmail', 'testToken', 'testChannel', $this->createMock(HttpClientInterface::class)))->setHost('test.host'); + yield [new SmsMessage('0611223344', 'Hello!')]; + yield [$this->createMock(MessageInterface::class)]; } } diff --git a/src/Symfony/Component/Notifier/Bridge/Zulip/composer.json b/src/Symfony/Component/Notifier/Bridge/Zulip/composer.json index 61bf5bec51..7c23541598 100644 --- a/src/Symfony/Component/Notifier/Bridge/Zulip/composer.json +++ b/src/Symfony/Component/Notifier/Bridge/Zulip/composer.json @@ -18,7 +18,7 @@ "require": { "php": ">=7.2.5", "symfony/http-client": "^4.3|^5.0", - "symfony/notifier": "~5.2.0" + "symfony/notifier": "~5.2.2" }, "autoload": { "psr-4": { "Symfony\\Component\\Notifier\\Bridge\\Zulip\\": "" },