From e6cda7c1feb94066355bcbf020ce14ec18729e60 Mon Sep 17 00:00:00 2001 From: Volodymyr Hadomskyi Date: Tue, 30 Apr 2024 23:12:18 +0200 Subject: [PATCH] Fix sync concurrency for send translation ENG-15286 --- src/modules/ManualJobSync.php | 3 +- .../integration/modules/ManualJobSyncCest.php | 122 ++++++++++++++++++ 2 files changed, 124 insertions(+), 1 deletion(-) diff --git a/src/modules/ManualJobSync.php b/src/modules/ManualJobSync.php index 646b9f8f..e77e9c24 100644 --- a/src/modules/ManualJobSync.php +++ b/src/modules/ManualJobSync.php @@ -27,12 +27,13 @@ class ManualJobSync extends BaseJob public const DELAY_IN_SECONDS = 0; public const PRIORITY = 512; - private const SUPPORTED_JOBS = [ + public const SUPPORTED_JOBS = [ FetchJobStatusFromConnector::class, FetchInstantJobTranslationsFromConnector::class, FetchVerifiedJobTranslationsFromConnector::class, FetchTranslationFromConnector::class, SendJobToConnector::class, + SendTranslationToConnector::class, ]; /** diff --git a/tests/integration/modules/ManualJobSyncCest.php b/tests/integration/modules/ManualJobSyncCest.php index 03c0c886..275447c8 100644 --- a/tests/integration/modules/ManualJobSyncCest.php +++ b/tests/integration/modules/ManualJobSyncCest.php @@ -13,7 +13,10 @@ use LiltConnectorSDK\Model\JobResponse; use lilthq\craftliltplugin\Craftliltplugin; use lilthq\craftliltplugin\elements\Job; +use lilthq\craftliltplugin\modules\FetchInstantJobTranslationsFromConnector; use lilthq\craftliltplugin\modules\FetchJobStatusFromConnector; +use lilthq\craftliltplugin\modules\FetchTranslationFromConnector; +use lilthq\craftliltplugin\modules\FetchVerifiedJobTranslationsFromConnector; use lilthq\craftliltplugin\modules\ManualJobSync; use lilthq\craftliltplugin\modules\SendJobToConnector; use lilthq\craftliltplugin\modules\SendTranslationToConnector; @@ -22,9 +25,21 @@ use lilthq\craftliltplugintests\integration\AbstractIntegrationCest; use lilthq\tests\fixtures\EntriesFixture; use PHPUnit\Framework\Assert; +use yii\db\Expression; class ManualJobSyncCest extends AbstractIntegrationCest { + const RESERVED_STATUS = 2; + + const SUPPORTED_JOBS = [ + FetchJobStatusFromConnector::class, + FetchInstantJobTranslationsFromConnector::class, + FetchVerifiedJobTranslationsFromConnector::class, + FetchTranslationFromConnector::class, + SendJobToConnector::class, + SendTranslationToConnector::class, + ]; + public function _fixtures(): array { return [ @@ -281,6 +296,113 @@ public function testDelayedJob(IntegrationTester $I): void Assert::assertEquals(0, $jobDetails['delay']); } + public function testDelayedJobAllTypes(IntegrationTester $I): void + { + foreach (self::SUPPORTED_JOBS as $supportedJob) { + $job = $I->createJob([ + 'title' => 'Awesome test job', + 'elementIds' => [123, 456, 789], + 'targetSiteIds' => '*', + 'sourceSiteId' => Craftliltplugin::getInstance()->languageMapper->getSiteIdByLanguage('en-US'), + 'translationWorkflow' => CraftliltpluginParameters::TRANSLATION_WORKFLOW_INSTANT, + 'status' => Job::STATUS_IN_PROGRESS, + 'versions' => [], + 'authorId' => 1, + ]); + + $queue = Craft::$app->getQueue(); + $queueId = $queue + ->priority(1024) + ->delay(99999) + ->ttr(null) + ->push( + new $supportedJob( + ['jobId' => $job->id] + ) + ); + + $I->executeQueue( + ManualJobSync::class, + [ + 'jobIds' => [$job->id], + ] + ); + + $jobInfos = Craft::$app->queue->getJobInfo(); + Assert::assertNotEmpty($jobInfos); + + $I->assertJobInQueue( + new $supportedJob( + ['jobId' => $job->id] + ), + $job->status + ); + + $jobDetails = Craft::$app->queue->getJobDetails((string)$queueId); + Assert::assertEquals(0, $jobDetails['delay']); + } + } + + public function testReservedJobAllTypes(IntegrationTester $I): void + { + foreach (self::SUPPORTED_JOBS as $supportedJob) { + $I->clearQueue(); + + $job = $I->createJob([ + 'title' => 'Awesome test job', + 'elementIds' => [123, 456, 789], + 'targetSiteIds' => '*', + 'sourceSiteId' => Craftliltplugin::getInstance()->languageMapper->getSiteIdByLanguage('en-US'), + 'translationWorkflow' => CraftliltpluginParameters::TRANSLATION_WORKFLOW_INSTANT, + 'status' => Job::STATUS_IN_PROGRESS, + 'versions' => [], + 'authorId' => 1, + ]); + + $queue = Craft::$app->getQueue(); + $queueId = $queue + ->priority(1024) + ->delay(99999) + ->ttr(null) + ->push( + new $supportedJob( + ['jobId' => $job->id] + ) + ); + + $db = Craft::$app->getDb(); + $db->createCommand() + ->update(Table::QUEUE, + [ + 'timeUpdated' => new Expression('UNIX_TIMESTAMP()') + ], + ['id' => $queueId]) + ->execute(); + + $I->executeQueue( + ManualJobSync::class, + [ + 'jobIds' => [$job->id], + ] + ); + + $jobInfos = Craft::$app->queue->getJobInfo(); + Assert::assertNotEmpty($jobInfos); + + Assert::assertCount(1, $jobInfos); + + // Job still in reserved + Assert::assertEquals(self::RESERVED_STATUS, $jobInfos[0]['status']); + + $I->assertJobInQueue( + new $supportedJob( + ['jobId' => $job->id] + ), + $job->status + ); + } + } + public function testFailedJob(IntegrationTester $I): void { $job = $I->createJob([