Spaces:
No application file
No application file
mautic
/
app
/bundles
/WebhookBundle
/Tests
/Functional
/Command
/ProcessWebhookQueuesCommandTest.php
declare(strict_types=1); | |
namespace Mautic\WebhookBundle\Tests\Functional\Command; | |
use GuzzleHttp\Handler\MockHandler; | |
use GuzzleHttp\Psr7\Response; | |
use Mautic\CoreBundle\Test\MauticMysqlTestCase; | |
use Mautic\WebhookBundle\Command\ProcessWebhookQueuesCommand; | |
use Mautic\WebhookBundle\Entity\Event; | |
use Mautic\WebhookBundle\Entity\Log; | |
use Mautic\WebhookBundle\Entity\Webhook; | |
use Mautic\WebhookBundle\Entity\WebhookQueue; | |
use Mautic\WebhookBundle\Model\WebhookModel; | |
use PHPUnit\Framework\Assert; | |
use Psr\Http\Message\RequestInterface; | |
use Symfony\Component\HttpFoundation\Response as SymfonyResponse; | |
final class ProcessWebhookQueuesCommandTest extends MauticMysqlTestCase | |
{ | |
protected function setUp(): void | |
{ | |
$this->configParams['queue_mode'] = WebhookModel::COMMAND_PROCESS; | |
$this->configParams['webhook_limit'] = 3; | |
parent::setUp(); | |
} | |
public function testCommand(): void | |
{ | |
$webhook = $this->createWebhook('test', 'http://domain.tld', 'secret'); | |
$event = $this->createWebhookEvent($webhook, 'Type'); | |
$handlerStack = static::getContainer()->get(MockHandler::class); | |
$queueIds = []; | |
// Generate 10 queue records. | |
for ($i = 1; $i <= 10; ++$i) { | |
$addedLog = $this->createWebhookQueue($webhook, $event, "Some payload {$i}"); | |
array_push($queueIds, $addedLog->getId()); | |
$handlerStack->append( | |
function (RequestInterface $request) { | |
Assert::assertSame('POST', $request->getMethod()); | |
Assert::assertSame('http://domain.tld', $request->getUri()->__toString()); | |
return new Response(SymfonyResponse::HTTP_OK); | |
} | |
); | |
} | |
// Process queue records from 4 to 9 including. 6 in total. | |
$output = $this->testSymfonyCommand( | |
ProcessWebhookQueuesCommand::COMMAND_NAME, | |
['--webhook-id' => $webhook->getId(), '--min-id' => $queueIds[3], '--max-id' => $queueIds[8]] | |
); | |
Assert::assertStringContainsString('Webhook Processing Complete', $output->getDisplay()); | |
// There will be 2 batches of webhook events sent. We've set we want to send 3 events per batch. | |
Assert::assertCount(2, $this->em->getRepository(Log::class)->findBy(['webhook' => $webhook])); | |
// And 4 out of 10 queue records will be left alone as they did not fit the ID range. | |
Assert::assertCount(4, $this->em->getRepository(WebhookQueue::class)->findBy(['webhook' => $webhook])); | |
} | |
private function createWebhook(string $name, string $url, string $secret): Webhook | |
{ | |
$webhook = new Webhook(); | |
$webhook->setName($name); | |
$webhook->setWebhookUrl($url); | |
$webhook->setSecret($secret); | |
$this->em->persist($webhook); | |
return $webhook; | |
} | |
private function createWebhookEvent(Webhook $webhook, string $type): Event | |
{ | |
$event = new Event(); | |
$event->setWebhook($webhook); | |
$event->setEventType($type); | |
$this->em->persist($event); | |
return $event; | |
} | |
private function createWebhookQueue(Webhook $webhook, Event $event, string $payload): WebhookQueue | |
{ | |
$record = new WebhookQueue(); | |
$record->setWebhook($webhook); | |
$record->setEvent($event); | |
$record->setPayload($payload); | |
$record->setDateAdded(new \DateTime()); | |
$this->em->persist($record); | |
$this->em->flush(); | |
return $record; | |
} | |
} | |