From c59ae2d82cbce0c495092a79c4fba4df9fba929f Mon Sep 17 00:00:00 2001 From: alex-mpoet Date: Mon, 3 Jun 2024 16:26:24 +0300 Subject: [PATCH] Add cron pinging endpoint [MAILPOET-6029] --- mailpoet/lib/API/JSON/v1/SendingQueue.php | 24 +++++++++++- .../API/JSON/v1/SendingQueueTest.php | 39 +++++++++++++++++++ 2 files changed, 62 insertions(+), 1 deletion(-) diff --git a/mailpoet/lib/API/JSON/v1/SendingQueue.php b/mailpoet/lib/API/JSON/v1/SendingQueue.php index dd8a8ec2a3..01703d9170 100644 --- a/mailpoet/lib/API/JSON/v1/SendingQueue.php +++ b/mailpoet/lib/API/JSON/v1/SendingQueue.php @@ -8,6 +8,7 @@ use MailPoet\API\JSON\Response; use MailPoet\API\JSON\ResponseBuilders\SendingQueuesResponseBuilder; use MailPoet\Config\AccessControl; use MailPoet\Cron\ActionScheduler\Actions\DaemonTrigger; +use MailPoet\Cron\CronHelper; use MailPoet\Cron\CronTrigger; use MailPoet\Cron\Triggers\WordPress; use MailPoet\Cron\Workers\SendingQueue\SendingQueue as SendingQueueWorker; @@ -59,6 +60,9 @@ class SendingQueue extends APIEndpoint { /** @var SendingQueuesResponseBuilder */ private $sendingQueuesResponseBuilder; + /** @var CronHelper */ + private $cronHelper; + public function __construct( SubscribersFeature $subscribersFeature, NewslettersRepository $newsletterRepository, @@ -69,7 +73,8 @@ class SendingQueue extends APIEndpoint { SettingsController $settings, DaemonTrigger $actionSchedulerDaemonTriggerAction, NewsletterValidator $newsletterValidator, - SendingQueuesResponseBuilder $sendingQueuesResponseBuilder + SendingQueuesResponseBuilder $sendingQueuesResponseBuilder, + CronHelper $cronHelper ) { $this->subscribersFeature = $subscribersFeature; $this->subscribersFinder = $subscribersFinder; @@ -81,6 +86,7 @@ class SendingQueue extends APIEndpoint { $this->actionSchedulerDaemonTriggerAction = $actionSchedulerDaemonTriggerAction; $this->newsletterValidator = $newsletterValidator; $this->sendingQueuesResponseBuilder = $sendingQueuesResponseBuilder; + $this->cronHelper = $cronHelper; } public function add($data = []) { @@ -245,6 +251,22 @@ class SendingQueue extends APIEndpoint { } } + public function pingCron() { + try { + $cronPingResponse = $this->cronHelper->pingDaemon(); + } catch (\Exception $e) { + return $this->errorResponse([ + APIError::UNKNOWN => $e->getMessage(), + ]); + } + if (!$this->cronHelper->validatePingResponse($cronPingResponse)) { + return $this->errorResponse([ + APIError::UNKNOWN => $cronPingResponse, + ]); + } + return $this->successResponse(); + } + /** * In case the newsletter was switched to sending trigger the background job immediately. * This is done so that user immediately sees that email is sending and doesn't have to wait on WP Cron to start it. diff --git a/mailpoet/tests/integration/API/JSON/v1/SendingQueueTest.php b/mailpoet/tests/integration/API/JSON/v1/SendingQueueTest.php index 3200a8868a..d07d555d5d 100644 --- a/mailpoet/tests/integration/API/JSON/v1/SendingQueueTest.php +++ b/mailpoet/tests/integration/API/JSON/v1/SendingQueueTest.php @@ -5,6 +5,8 @@ namespace MailPoet\Test\API\JSON\v1; use Codeception\Util\Stub; use MailPoet\API\JSON\Response as APIResponse; use MailPoet\API\JSON\v1\SendingQueue as SendingQueueAPI; +use MailPoet\Cron\CronHelper; +use MailPoet\Cron\DaemonHttpRunner; use MailPoet\Cron\Workers\SendingQueue\SendingQueue; use MailPoet\Entities\NewsletterEntity; use MailPoet\Entities\ScheduledTaskEntity; @@ -228,4 +230,41 @@ class SendingQueueTest extends \MailPoetTest { $this->assertSame($expectedResult, $data); } + + public function testItReturnsErrorIfCronPingThrowsException() { + $errorMessage = 'some error'; + $sendingQueue = $this->getServiceWithOverrides(SendingQueueAPI::class, [ + 'cronHelper' => Stub::make(CronHelper::class, ['pingDaemon' => function () use ($errorMessage) { + throw new \Exception($errorMessage); + }]), + ]); + $response = $sendingQueue->pingCron(); + $response = $response->getData(); + verify($response['errors'][0])->isArray(); + verify($response['errors'][0]['message'])->stringContainsString($errorMessage); + verify($response['errors'][0]['error'])->stringContainsString('unknown'); + } + + public function testItReturnsErrorIfCronPingResponseIsInvalid() { + $errorResponse = 'timed out'; + $sendingQueue = $this->getServiceWithOverrides(SendingQueueAPI::class, [ + 'cronHelper' => Stub::make(CronHelper::class, ['pingDaemon' => $errorResponse]), + ]); + $response = $sendingQueue->pingCron(); + $response = $response->getData(); + verify($response['errors'][0])->isArray(); + verify($response['errors'][0]['message'])->stringContainsString($errorResponse); + verify($response['errors'][0]['error'])->stringContainsString('unknown'); + } + + public function testItPingsCronSuccessfully() { + $sendingQueue = $this->getServiceWithOverrides(SendingQueueAPI::class, [ + 'cronHelper' => Stub::make(CronHelper::class, ['pingDaemon' => DaemonHttpRunner::PING_SUCCESS_RESPONSE]), + ]); + $response = $sendingQueue->pingCron(); + verify($response->status)->equals(200); + $response = $response->getData(); + verify($response['data'])->empty(); + verify(empty($response['errors']))->true(); + } }