From ad08041e57d1642bf71b39ae005d3401dc30b705 Mon Sep 17 00:00:00 2001 From: Jan Pintr Date: Sat, 2 Aug 2025 20:28:53 +0200 Subject: [PATCH] [Scheduler] Fix `scheduler.task` tag arguments optionality --- .../AddScheduleMessengerPass.php | 2 +- .../AddScheduleMessengerPassTest.php | 64 +++++++++++++++++++ 2 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 src/Symfony/Component/Scheduler/Tests/DependencyInjection/AddScheduleMessengerPassTest.php diff --git a/src/Symfony/Component/Scheduler/DependencyInjection/AddScheduleMessengerPass.php b/src/Symfony/Component/Scheduler/DependencyInjection/AddScheduleMessengerPass.php index 03d73a7c333a5..6a102ef38abe9 100644 --- a/src/Symfony/Component/Scheduler/DependencyInjection/AddScheduleMessengerPass.php +++ b/src/Symfony/Component/Scheduler/DependencyInjection/AddScheduleMessengerPass.php @@ -60,7 +60,7 @@ public function process(ContainerBuilder $container): void $attribute = ($container->getReflectionClass($serviceDefinition->getClass())->getAttributes(AsCommand::class)[0] ?? null)?->newInstance(); $commandName = $attribute?->name ?? $serviceDefinition->getClass()::getDefaultName(); - $message = new Definition(RunCommandMessage::class, [$commandName.($tagAttributes['arguments'] ? " {$tagAttributes['arguments']}" : '')]); + $message = new Definition(RunCommandMessage::class, [$commandName.(($tagAttributes['arguments'] ?? null) ? " {$tagAttributes['arguments']}" : '')]); } else { $message = new Definition(ServiceCallMessage::class, [$serviceId, $tagAttributes['method'] ?? '__invoke', (array) ($tagAttributes['arguments'] ?? [])]); } diff --git a/src/Symfony/Component/Scheduler/Tests/DependencyInjection/AddScheduleMessengerPassTest.php b/src/Symfony/Component/Scheduler/Tests/DependencyInjection/AddScheduleMessengerPassTest.php new file mode 100644 index 0000000000000..6d598255dda97 --- /dev/null +++ b/src/Symfony/Component/Scheduler/Tests/DependencyInjection/AddScheduleMessengerPassTest.php @@ -0,0 +1,64 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Tests\DependencyInjection; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\Console\Attribute\AsCommand; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Definition; +use Symfony\Component\Scheduler\DependencyInjection\AddScheduleMessengerPass; + +class AddScheduleMessengerPassTest extends TestCase +{ + /** + * @dataProvider processSchedulerTaskCommandProvider + */ + public function testProcessSchedulerTaskCommand(array $arguments, string $exceptedCommand) + { + $container = new ContainerBuilder(); + + $definition = new Definition(SchedulableCommand::class); + $definition->addTag('console.command'); + $definition->addTag('scheduler.task', $arguments); + $container->setDefinition(SchedulableCommand::class, $definition); + + (new AddScheduleMessengerPass())->process($container); + + $schedulerProvider = $container->getDefinition('scheduler.provider.default'); + $calls = $schedulerProvider->getMethodCalls(); + + $this->assertCount(1, $calls); + $this->assertCount(2, $calls[0]); + + $messageDefinition = $calls[0][1][0]; + $messageArguments = $messageDefinition->getArgument('$message'); + $command = $messageArguments->getArgument(0); + + $this->assertSame($exceptedCommand, $command); + } + + public static function processSchedulerTaskCommandProvider(): iterable + { + yield 'no arguments' => [['trigger' => 'every', 'frequency' => '1 hour'], 'schedulable']; + yield 'null arguments' => [['trigger' => 'every', 'frequency' => '1 hour', 'arguments' => null], 'schedulable']; + yield 'empty arguments' => [['trigger' => 'every', 'frequency' => '1 hour', 'arguments' => ''], 'schedulable']; + yield 'test argument' => [['trigger' => 'every', 'frequency' => '1 hour', 'arguments' => 'test'], 'schedulable test']; + } +} + +#[AsCommand(name: 'schedulable')] +class SchedulableCommand +{ + public function __invoke(): void + { + } +}