mautic / app /bundles /CampaignBundle /Tests /Executioner /KickoffExecutionerTest.php
chrisbryan17's picture
Upload folder using huggingface_hub
d2897cd verified
<?php
declare(strict_types=1);
namespace Mautic\CampaignBundle\Tests\Executioner;
use Doctrine\Common\Collections\ArrayCollection;
use Mautic\CampaignBundle\Entity\Campaign;
use Mautic\CampaignBundle\Entity\Event;
use Mautic\CampaignBundle\Executioner\ContactFinder\KickoffContactFinder;
use Mautic\CampaignBundle\Executioner\ContactFinder\Limiter\ContactLimiter;
use Mautic\CampaignBundle\Executioner\EventExecutioner;
use Mautic\CampaignBundle\Executioner\KickoffExecutioner;
use Mautic\CampaignBundle\Executioner\Result\Counter;
use Mautic\CampaignBundle\Executioner\Scheduler\EventScheduler;
use Mautic\CampaignBundle\Executioner\Scheduler\Exception\NotSchedulableException;
use Mautic\CoreBundle\Translation\Translator;
use Mautic\LeadBundle\Entity\Lead;
use PHPUnit\Framework\MockObject\MockObject;
use Psr\Log\NullLogger;
use Symfony\Component\Console\Output\BufferedOutput;
class KickoffExecutionerTest extends \PHPUnit\Framework\TestCase
{
/**
* @var MockObject|KickoffContactFinder
*/
private MockObject $kickoffContactFinder;
/**
* @var MockObject|Translator
*/
private MockObject $translator;
/**
* @var MockObject|EventExecutioner
*/
private MockObject $executioner;
/**
* @var MockObject|EventScheduler
*/
private MockObject $scheduler;
protected function setUp(): void
{
$this->kickoffContactFinder = $this->createMock(KickoffContactFinder::class);
$this->translator = $this->createMock(Translator::class);
$this->executioner = $this->createMock(EventExecutioner::class);
$this->scheduler = $this->createMock(EventScheduler::class);
}
public function testNoContactsResultInEmptyResults(): void
{
$campaign = $this->getMockBuilder(Campaign::class)
->getMock();
$campaign->expects($this->once())
->method('getRootEvents')
->willReturn(new ArrayCollection());
$limiter = new ContactLimiter(0, 0, 0, 0);
$counter = $this->getExecutioner()->execute($campaign, $limiter, new BufferedOutput());
$this->assertEquals(0, $counter->getTotalEvaluated());
}
public function testEventsAreScheduledAndExecuted(): void
{
$this->kickoffContactFinder->expects($this->once())
->method('getContactCount')
->willReturn(2);
$this->kickoffContactFinder->expects($this->exactly(3))
->method('getContacts')
->willReturnOnConsecutiveCalls(
new ArrayCollection([3 => new Lead()]),
new ArrayCollection([10 => new Lead()]),
new ArrayCollection([])
);
$event = new Event();
$event2 = new Event();
$campaign = new class() extends Campaign {
/**
* @var ArrayCollection<int,Event>
*/
public ArrayCollection $rootEvents;
/**
* @return ArrayCollection<int,Event>
*/
public function getRootEvents(): ArrayCollection
{
return $this->rootEvents;
}
};
$campaign->rootEvents = new ArrayCollection([$event, $event2]);
$event->setCampaign($campaign);
$event2->setCampaign($campaign);
$limiter = new ContactLimiter(0, 0, 0, 0);
$this->scheduler->expects($this->exactly(4))
->method('getExecutionDateTime')
->willReturn(new \DateTime());
$callbackCounter = 0;
$this->scheduler->expects($this->exactly(4))
->method('validateAndScheduleEventForContacts')
->willReturnCallback(
function () use (&$callbackCounter): void {
++$callbackCounter;
if (in_array($callbackCounter, [3, 4])) {
throw new NotSchedulableException();
}
}
);
$this->executioner->expects($this->exactly(1))
->method('executeEventsForContacts')
->withConsecutive(
[
$this->countOf(2),
$this->isInstanceOf(ArrayCollection::class),
$this->isInstanceOf(Counter::class),
],
[
$this->countOf(1),
$this->isInstanceOf(ArrayCollection::class),
$this->isInstanceOf(Counter::class),
]
);
$counter = $this->getExecutioner()->execute($campaign, $limiter, new BufferedOutput());
$this->assertEquals(4, $counter->getTotalEvaluated());
$this->assertEquals(2, $counter->getTotalScheduled());
}
private function getExecutioner(): KickoffExecutioner
{
return new KickoffExecutioner(
new NullLogger(),
$this->kickoffContactFinder,
$this->translator,
$this->executioner,
$this->scheduler
);
}
}