From af1517ecb14e6be78579f943bc6468a90be17537 Mon Sep 17 00:00:00 2001 From: Jeroen Bouwmans Date: Fri, 15 Dec 2023 13:22:31 +0100 Subject: [PATCH] [Messenger] Fix using negative delay --- .../Transport/DoctrineIntegrationTest.php | 26 +++++++++++++++++-- .../Bridge/Doctrine/Transport/Connection.php | 2 +- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/Symfony/Component/Messenger/Bridge/Doctrine/Tests/Transport/DoctrineIntegrationTest.php b/src/Symfony/Component/Messenger/Bridge/Doctrine/Tests/Transport/DoctrineIntegrationTest.php index e4e22565717f6..e1b4d4afdda44 100644 --- a/src/Symfony/Component/Messenger/Bridge/Doctrine/Tests/Transport/DoctrineIntegrationTest.php +++ b/src/Symfony/Component/Messenger/Bridge/Doctrine/Tests/Transport/DoctrineIntegrationTest.php @@ -73,11 +73,33 @@ public function testSendWithDelay() $stmt = $stmt->execute(); } - $available_at = new \DateTime($stmt instanceof Result || $stmt instanceof DriverResult ? $stmt->fetchOne() : $stmt->fetchColumn()); + $availableAt = new \DateTime($stmt instanceof Result || $stmt instanceof DriverResult ? $stmt->fetchOne() : $stmt->fetchColumn()); $now = new \DateTime(); $now->modify('+60 seconds'); - $this->assertGreaterThan($now, $available_at); + $this->assertGreaterThan($now, $availableAt); + } + + public function testSendWithNegativeDelay() + { + $this->connection->send('{"message": "Hi I am not actually delayed"}', ['type' => DummyMessage::class], -600000); + + $stmt = $this->driverConnection->createQueryBuilder() + ->select('m.available_at') + ->from('messenger_messages', 'm') + ->where('m.body = :body') + ->setParameter('body', '{"message": "Hi I am not actually delayed"}'); + if (method_exists($stmt, 'executeQuery')) { + $stmt = $stmt->executeQuery(); + } else { + $stmt = $stmt->execute(); + } + + $availableAt = new \DateTime($stmt instanceof Result || $stmt instanceof DriverResult ? $stmt->fetchOne() : $stmt->fetchColumn()); + + $now = new \DateTime(); + $now->modify('-60 seconds'); + $this->assertLessThan($now, $availableAt); } public function testItRetrieveTheFirstAvailableMessage() diff --git a/src/Symfony/Component/Messenger/Bridge/Doctrine/Transport/Connection.php b/src/Symfony/Component/Messenger/Bridge/Doctrine/Transport/Connection.php index bb322e760fbdb..ed9a57a0ce568 100644 --- a/src/Symfony/Component/Messenger/Bridge/Doctrine/Transport/Connection.php +++ b/src/Symfony/Component/Messenger/Bridge/Doctrine/Transport/Connection.php @@ -125,7 +125,7 @@ public static function buildConfiguration(string $dsn, array $options = []): arr public function send(string $body, array $headers, int $delay = 0): string { $now = new \DateTime(); - $availableAt = (clone $now)->modify(sprintf('+%d seconds', $delay / 1000)); + $availableAt = (clone $now)->modify(sprintf('%+d seconds', $delay / 1000)); $queryBuilder = $this->driverConnection->createQueryBuilder() ->insert($this->configuration['table_name'])