Skip to content
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
148 changes: 135 additions & 13 deletions src/Codeception/Module/Symfony/EventsAssertionsTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ public function dontSeeOrphanEvent(array|object|string $expected = null): void
}

/**
* Verifies that one or more event listeners were not called during the test.
* Verifies that one or more events were not dispatched during the test.
*
* ```php
* <?php
Expand All @@ -57,7 +57,7 @@ public function dontSeeOrphanEvent(array|object|string $expected = null): void
*
* @param object|string|string[] $expected
*/
public function dontSeeEventTriggered(array|object|string $expected): void
public function dontSeeEvent(array|object|string $expected): void
{
$eventCollector = $this->grabEventCollector(__FUNCTION__);

Expand All @@ -68,6 +68,47 @@ public function dontSeeEventTriggered(array|object|string $expected): void
$this->assertEventNotTriggered($data, $expected);
}

/**
* Verifies that one or more event listeners were not called during the test.
*
* ```php
* <?php
* $I->dontSeeEventTriggered('App\MyEventSubscriber');
* $I->dontSeeEventTriggered(new App\Events\MyEventSubscriber());
* $I->dontSeeEventTriggered(['App\MyEventSubscriber', 'App\MyOtherEventSubscriber']);
* ```
*
* @param object|string|string[] $expected
* @deprecated Use `dontSeeEventListenerCalled` instead.
*/
public function dontSeeEventTriggered(array|object|string $expected): void
{
$this->dontSeeEventListenerCalled($expected);
}

/**
* Verifies that one or more event listeners were not called during the test.
*
* ```php
* <?php
* $I->dontSeeEventListenerCalled('App\MyEventSubscriber');
* $I->dontSeeEventListenerCalled(new App\Events\MyEventSubscriber());
* $I->dontSeeEventListenerCalled(['App\MyEventSubscriber', 'App\MyOtherEventSubscriber']);
* ```
*
* @param object|string|string[] $expected
*/
public function dontSeeEventListenerCalled(array|object|string $expected): void
{
$eventCollector = $this->grabEventCollector(__FUNCTION__);

/** @var Data $data */
$data = $eventCollector->getCalledListeners();
$expected = is_array($expected) ? $expected : [$expected];

$this->assertListenerNotCalled($data, $expected);
}

/**
* Verifies that one or more orphan events were dispatched during the test.
*
Expand Down Expand Up @@ -95,27 +136,68 @@ public function seeOrphanEvent(array|object|string $expected): void
$this->assertEventTriggered($data, $expected);
}

/**
* Verifies that one or more events were dispatched during the test.
*
* ```php
* <?php
* $I->seeEvent('App\MyEvent');
* $I->seeEvent(new App\Events\MyEvent());
* $I->seeEvent(['App\MyEvent', 'App\MyOtherEvent']);
* ```
*
* @param object|string|string[] $expected
*/
public function seeEvent(array|object|string $expected): void
{
$eventCollector = $this->grabEventCollector(__FUNCTION__);

/** @var Data $data */
$data = $eventCollector->getCalledListeners();
$expected = is_array($expected) ? $expected : [$expected];

$this->assertEventTriggered($data, $expected);
}

/**
* Verifies that one or more event listeners were called during the test.
*
* ```php
* <?php
* $I->seeEventTriggered('App\MyEvent');
* $I->seeEventTriggered(new App\Events\MyEvent());
* $I->seeEventTriggered(['App\MyEvent', 'App\MyOtherEvent']);
* $I->seeEventTriggered('App\MyEventSubscriber');
* $I->seeEventTriggered(new App\Events\MyEventSubscriber());
* $I->seeEventTriggered(['App\MyEventSubscriber', 'App\MyOtherEventSubscriber']);
* ```
*
* @param object|string|string[] $expected
* @deprecated Use `seeEventListenerCalled` instead.
*/
public function seeEventTriggered(array|object|string $expected): void
{
$this->seeEventListenerCalled($expected);
}

/**
* Verifies that one or more event listeners were called during the test.
*
* ```php
* <?php
* $I->seeEventListenerCalled('App\MyEventSubscriber');
* $I->seeEventListenerCalled(new App\Events\MyEventSubscriber());
* $I->seeEventListenerCalled(['App\MyEventSubscriber', 'App\MyOtherEventSubscriber']);
* ```
*
* @param object|string|string[] $expected
*/
public function seeEventListenerCalled(array|object|string $expected): void
{
$eventCollector = $this->grabEventCollector(__FUNCTION__);

/** @var Data $data */
$data = $eventCollector->getCalledListeners();
$expected = is_array($expected) ? $expected : [$expected];

$this->assertEventTriggered($data, $expected);
$this->assertListenerCalled($data, $expected);
}

protected function assertEventNotTriggered(Data $data, array $expected): void
Expand All @@ -131,6 +213,19 @@ protected function assertEventNotTriggered(Data $data, array $expected): void
}
}

protected function assertListenerNotCalled(Data $data, array $expected): void
{
$actual = $data->getValue(true);

foreach ($expected as $expectedListener) {
$expectedListener = is_object($expectedListener) ? $expectedListener::class : $expectedListener;
$this->assertFalse(
$this->listenerWasCalled($actual, (string)$expectedListener),
"The '{$expectedListener}' listener was called"
);
}
}

protected function assertEventTriggered(Data $data, array $expected): void
{
if ($data->count() === 0) {
Expand All @@ -148,26 +243,53 @@ protected function assertEventTriggered(Data $data, array $expected): void
}
}

protected function eventWasTriggered(array $actual, string $expectedEvent): bool
protected function assertListenerCalled(Data $data, array $expected): void
{
$triggered = false;
if ($data->count() === 0) {
$this->fail('No listener was called');
}

$actual = $data->getValue(true);

foreach ($expected as $expectedListener) {
$expectedListener = is_object($expectedListener) ? $expectedListener::class : $expectedListener;
$this->assertTrue(
$this->listenerWasCalled($actual, (string) $expectedListener),
"The '{$expectedListener}' listener was not called"
);
}
}

protected function eventWasTriggered(array $actual, string $expectedEvent): bool
{
foreach ($actual as $actualEvent) {
if (is_array($actualEvent)) { // Called Listeners
if (str_starts_with($actualEvent['pretty'], $expectedEvent)) {
$triggered = true;
if ($actualEvent['event'] === $expectedEvent) {
return true;
}
} else { // Orphan Events
if ($actualEvent === $expectedEvent) {
$triggered = true;
return true;
}
}
}
return $triggered;

return false;
}

protected function listenerWasCalled(array $actual, string $expectedListener): bool
{
foreach ($actual as $actualEvent) {
if (str_starts_with($actualEvent['pretty'], $expectedListener)) {
return true;
}
}

return false;
}

protected function grabEventCollector(string $function): EventDataCollector
{
return $this->grabCollector('events', $function);
}
}
}