diff --git a/src/batch-symfony-messenger/src/DispatchMessageJobLauncher.php b/src/batch-symfony-messenger/src/DispatchMessageJobLauncher.php index 202d2730..19be62fb 100644 --- a/src/batch-symfony-messenger/src/DispatchMessageJobLauncher.php +++ b/src/batch-symfony-messenger/src/DispatchMessageJobLauncher.php @@ -43,6 +43,7 @@ public function launch(string $name, array $configuration = []): JobExecution // create and store execution before dispatching message // guarantee job execution exists if message bus transport is asynchronous $jobExecution = $this->jobExecutionFactory->create($name, $configuration); + $configuration['_id'] = $configuration['_id'] ?? $jobExecution->getId(); $jobExecution->setStatus(BatchStatus::PENDING); $this->jobExecutionStorage->store($jobExecution); diff --git a/src/batch-symfony-messenger/tests/DispatchMessageJobLauncherTest.php b/src/batch-symfony-messenger/tests/DispatchMessageJobLauncherTest.php index 00c71a2c..0c97c98b 100644 --- a/src/batch-symfony-messenger/tests/DispatchMessageJobLauncherTest.php +++ b/src/batch-symfony-messenger/tests/DispatchMessageJobLauncherTest.php @@ -7,7 +7,6 @@ use PHPUnit\Framework\TestCase; use Prophecy\Argument; use Prophecy\PhpUnit\ProphecyTrait; -use Prophecy\Prophecy\ObjectProphecy; use Symfony\Component\Messenger\Envelope; use Symfony\Component\Messenger\MessageBusInterface; use Yokai\Batch\BatchStatus; @@ -17,6 +16,7 @@ use Yokai\Batch\Factory\UniqidJobExecutionIdGenerator; use Yokai\Batch\JobExecution; use Yokai\Batch\Storage\JobExecutionStorageInterface; +use Yokai\Batch\Test\Factory\SequenceJobExecutionIdGenerator; final class DispatchMessageJobLauncherTest extends TestCase { @@ -63,4 +63,44 @@ static function ($message): bool { $jobLauncher->launch('testing', ['_id' => '123456789', 'foo' => ['bar']]) ); } + + public function testLaunchWithNoId(): void + { + $storage = $this->prophesize(JobExecutionStorageInterface::class); + $jobExecutionAssertions = Argument::that( + static function ($jobExecution): bool { + return $jobExecution instanceof JobExecution + && $jobExecution->getJobName() === 'testing' + && $jobExecution->getId() === '123456789'; + } + ); + $storage->store($jobExecutionAssertions) + ->shouldBeCalled(); + $storage->retrieve('testing', '123456789') + ->shouldBeCalled() + ->willReturn($jobExecution = JobExecution::createRoot('123456789-refreshed', 'testing')); + + $messageBus = $this->prophesize(MessageBusInterface::class); + $messageAssertions = Argument::that( + static function ($message): bool { + return $message instanceof LaunchJobMessage + && $message->getJobName() === 'testing' + && $message->getConfiguration() === ['_id' => '123456789']; + } + ); + $messageBus->dispatch($messageAssertions) + ->shouldBeCalled() + ->willReturn(new Envelope(new LaunchJobMessage('unused'))); + + $jobLauncher = new DispatchMessageJobLauncher( + new JobExecutionFactory(new SequenceJobExecutionIdGenerator(['123456789'])), + $storage->reveal(), + $messageBus->reveal() + ); + + self::assertSame( + $jobExecution, + $jobLauncher->launch('testing') + ); + } } diff --git a/src/batch/src/Test/Factory/SequenceJobExecutionIdGenerator.php b/src/batch/src/Test/Factory/SequenceJobExecutionIdGenerator.php new file mode 100644 index 00000000..2da4b535 --- /dev/null +++ b/src/batch/src/Test/Factory/SequenceJobExecutionIdGenerator.php @@ -0,0 +1,26 @@ +sequence = \array_values($sequence); + } + + public function generate(): string + { + $current = $this->sequence[$this->current] ?? ''; + $this->current++; + + return (string)$current; + } +} diff --git a/src/batch/tests/Test/Factory/SequenceJobExecutionIdGeneratorTest.php b/src/batch/tests/Test/Factory/SequenceJobExecutionIdGeneratorTest.php new file mode 100644 index 00000000..9198b29c --- /dev/null +++ b/src/batch/tests/Test/Factory/SequenceJobExecutionIdGeneratorTest.php @@ -0,0 +1,25 @@ +generate()); + self::assertSame('456', $generator->generate()); + self::assertSame('789', $generator->generate()); + + // at this point we are out of sequence bounds + // generator will keep returning empty string + self::assertSame('', $generator->generate()); + self::assertSame('', $generator->generate()); + } +}