eca-1.0.x-dev/tests/src/Unit/ProcessorTest.php
tests/src/Unit/ProcessorTest.php
<?php
namespace Drupal\Tests\eca\Unit;
use Drupal\Core\Logger\LoggerChannelInterface;
use Drupal\Core\State\StateInterface;
use Drupal\eca\Entity\Eca;
use Drupal\eca\Entity\Objects\EcaEvent;
use Drupal\eca\Plugin\ECA\Event\EventInterface;
use Drupal\eca\PluginManager\Event as EventPluginManager;
use Drupal\eca\Processor;
use Drupal\eca\Token\TokenInterface;
use PHPUnit\Framework\Attributes\Group;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
/**
* Unit tests for the ECA processor engine.
*/
#[Group('eca')]
#[Group('eca_core')]
class ProcessorTest extends EcaUnitTestBase {
/**
* The logger channel.
*
* @var \Drupal\Core\Logger\LoggerChannelInterface
*/
protected LoggerChannelInterface $logger;
/**
* The Token services.
*
* @var \Drupal\eca\Token\TokenInterface
*/
protected TokenInterface $tokenService;
/**
* The event dispatcher.
*
* @var \Symfony\Component\EventDispatcher\EventDispatcherInterface
*/
protected EventDispatcherInterface $eventDispatcher;
/**
* The ECA event plugin manager.
*
* @var \Drupal\eca\PluginManager\Event
*/
protected EventPluginManager $eventPluginManager;
/**
* The state.
*
* @var \Drupal\Core\State\StateInterface
*/
protected StateInterface $state;
/**
* {@inheritdoc}
*/
protected function setUp(): void {
parent::setUp();
$this->logger = $this->createMock(LoggerChannelInterface::class);
$this->tokenService = $this->createMock(TokenInterface::class);
$this->eventDispatcher = $this->createMock(EventDispatcherInterface::class);
$this->eventPluginManager = $this->createMock(EventPluginManager::class);
$this->state = $this->createMock(StateInterface::class);
}
/**
* Tests the recursionThresholdSurpassed without history.
*
* @throws \ReflectionException
*/
public function testRecursionThresholdWithoutHistory(): void {
$processor = new Processor($this->entityTypeManager, $this->logger, $this->eventDispatcher, $this->eventPluginManager, $this->state, 3);
$method = $this->getPrivateMethod(Processor::class, 'recursionThresholdSurpassed');
$eca = $this->getEca('1');
$result = $method->invokeArgs($processor, [
$eca,
$this->getEcaEvent($eca, '1'),
]);
$this->assertFalse($result);
}
/**
* Tests the recursionThreshold is surpassed.
*
* @throws \ReflectionException
*/
public function testRecursionThresholdSurpassed(): void {
$processor = new Processor($this->entityTypeManager, $this->logger, $this->eventDispatcher, $this->eventPluginManager, $this->state, 2);
$this->assertTrue($this->isThresholdComplied($processor));
}
/**
* Tests the recursionThreshold is not surpassed.
*
* @throws \ReflectionException
*/
public function testRecursionThresholdNotSurpassed(): void {
$processor = new Processor($this->entityTypeManager, $this->logger, $this->eventDispatcher, $this->eventPluginManager, $this->state, 3);
$this->assertFalse($this->isThresholdComplied($processor));
}
/**
* Check whether the threshold is complied.
*
* @param \Drupal\eca\Processor $processor
* The ECA processor service.
*
* @return bool
* Returns TRUE, if the recursion threshold got exceeded, FALSE otherwise.
*
* @throws \ReflectionException
*/
private function isThresholdComplied(Processor $processor): bool {
$method = $this->getPrivateMethod(Processor::class, 'recursionThresholdSurpassed');
$executionHistory = $this->getPrivateProperty(Processor::class, 'executionHistory');
$eca = $this->getEca('1');
$ecaEvent = $this->getEcaEvent($eca, '1');
$ecaEventHistory = [];
$ecaEventHistory[] = $eca->id() . ':' . $ecaEvent->getId();
$ecaEventHistory[] = $eca->id() . ':' . $this->getEcaEvent($eca, '2')->getId();
$ecaEventHistory[] = $eca->id() . ':' . $this->getEcaEvent($eca, '3')->getId();
$ecaEventHistory[] = $eca->id() . ':' . $ecaEvent->getId();
$ecaEventHistory[] = $eca->id() . ':' . $ecaEvent->getId();
$ecaEventHistory[] = $eca->id() . ':' . $ecaEvent->getId();
$executionHistory->setValue($processor, $ecaEventHistory);
return $method->invokeArgs($processor, [$eca, $ecaEvent]);
}
/**
* Gets an ECA config entity initialized with mocks.
*
* @param string $id
* The ID of the ECA config entity.
*
* @return \Drupal\eca\Entity\Eca
* The mocked ECA config entity.
*/
private function getEca(string $id): Eca {
$eca = $this->createMock(Eca::class);
$eca->set('id', $id);
$eca->method('id')->willReturn($id);
return $eca;
}
/**
* Gets a EcaEvent initialized with mocks.
*
* @param \Drupal\eca\Entity\Eca $eca
* An ECA config entity.
* @param string $id
* The ID of the event.
*
* @return \Drupal\eca\Entity\Objects\EcaEvent
* The mocked event.
*/
private function getEcaEvent(Eca $eca, string $id): EcaEvent {
$event = $this->createMock(EventInterface::class);
return new EcaEvent($eca, $id, 'label', $event);
}
}
