Skip to content

Commit 6c8b03c

Browse files
authored
Add seeEvent/dontSeeEvent event assertions (#173)
* Add seeEvent/dontSeeEvent
1 parent 19c86fc commit 6c8b03c

File tree

1 file changed

+91
-26
lines changed

1 file changed

+91
-26
lines changed

src/Codeception/Module/Symfony/EventsAssertionsTrait.php

Lines changed: 91 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,40 @@ public function dontSeeOrphanEvent(array|object|string $expected = null): void
3939
if ($expected === null) {
4040
$this->assertSame(0, $data->count());
4141
} else {
42-
$this->assertEventNotTriggered($data, $expected);
42+
$this->assertEventTriggered($data, $expected, true);
43+
}
44+
}
45+
46+
/**
47+
* Verifies that there were no events during the test.
48+
* Both regular and orphan events are checked.
49+
*
50+
* ```php
51+
* <?php
52+
* $I->dontSeeEvent();
53+
* $I->dontSeeEvent('App\MyEvent');
54+
* $I->dontSeeEvent(new App\Events\MyEvent());
55+
* $I->dontSeeEvent(['App\MyEvent', 'App\MyOtherEvent']);
56+
* ```
57+
*
58+
* @param array|object|string|null $expected
59+
*/
60+
public function dontSeeEvent(array|object|string $expected = null): void
61+
{
62+
$eventCollector = $this->grabEventCollector(__FUNCTION__);
63+
64+
$data = [
65+
$eventCollector->getOrphanedEvents(),
66+
$eventCollector->getCalledListeners(),
67+
];
68+
$expected = is_array($expected) ? $expected : [$expected];
69+
70+
if ($expected === null) {
71+
foreach ($data as $dataItem) {
72+
$this->assertSame(0, $dataItem->count());
73+
}
74+
} else {
75+
$this->assertEventTriggered($data, $expected, true);
4376
}
4477
}
4578

@@ -123,6 +156,35 @@ public function seeOrphanEvent(array|object|string $expected): void
123156
$this->assertEventTriggered($data, $expected);
124157
}
125158

159+
/**
160+
* Verifies that one or more events were dispatched during the test.
161+
* Both regular and orphan events are checked.
162+
*
163+
* If you need to verify that expected event is not orphan,
164+
* add `dontSeeOrphanEvent` call.
165+
*
166+
* ```php
167+
* <?php
168+
* $I->seeEvent('App\MyEvent');
169+
* $I->seeEvent(new App\Events\MyEvent());
170+
* $I->seeEvent(['App\MyEvent', 'App\MyOtherEvent']);
171+
* ```
172+
*
173+
* @param array|object|string $expected
174+
*/
175+
public function seeEvent(array|object|string $expected): void
176+
{
177+
$eventCollector = $this->grabEventCollector(__FUNCTION__);
178+
179+
$data = [
180+
$eventCollector->getOrphanedEvents(),
181+
$eventCollector->getCalledListeners(),
182+
];
183+
$expected = is_array($expected) ? $expected : [$expected];
184+
185+
$this->assertEventTriggered($data, $expected);
186+
}
187+
126188
/**
127189
* Verifies that one or more event listeners were called during the test.
128190
*
@@ -177,33 +239,38 @@ public function seeEventListenerIsCalled(
177239
$this->assertListenerCalled($data, $expected, $withEvents);
178240
}
179241

180-
protected function assertEventNotTriggered(Data $data, array $expected): void
181-
{
182-
$actual = $data->getValue(true);
183-
184-
foreach ($expected as $expectedEvent) {
185-
$expectedEvent = is_object($expectedEvent) ? $expectedEvent::class : $expectedEvent;
186-
$this->assertFalse(
187-
$this->eventWasTriggered($actual, (string)$expectedEvent),
188-
"The '{$expectedEvent}' event triggered"
189-
);
190-
}
191-
}
242+
protected function assertEventTriggered(
243+
array|Data $data,
244+
array $expected,
245+
bool $invertAssertion = false
246+
): void {
247+
$assertTrue = !$invertAssertion;
248+
$data = is_array($data) ? $data : [$data];
249+
$totalEvents = array_sum(array_map('count', $data));
192250

193-
protected function assertEventTriggered(Data $data, array $expected): void
194-
{
195-
if ($data->count() === 0) {
251+
if ($assertTrue && $totalEvents === 0) {
196252
$this->fail('No event was triggered');
197253
}
198254

199-
$actual = $data->getValue(true);
255+
$actualEventsCollection = array_map(static fn (Data $data) => $data->getValue(true), $data);
200256

201257
foreach ($expected as $expectedEvent) {
202258
$expectedEvent = is_object($expectedEvent) ? $expectedEvent::class : $expectedEvent;
203-
$this->assertTrue(
204-
$this->eventWasTriggered($actual, (string)$expectedEvent),
205-
"The '{$expectedEvent}' event did not trigger"
206-
);
259+
$message = $assertTrue
260+
? "The '{$expectedEvent}' event did not trigger"
261+
: "The '{$expectedEvent}' event triggered";
262+
263+
$eventTriggered = false;
264+
265+
foreach ($actualEventsCollection as $actualEvents) {
266+
$eventTriggered = $eventTriggered || $this->eventWasTriggered($actualEvents, (string)$expectedEvent);
267+
}
268+
269+
if ($assertTrue) {
270+
$this->assertTrue($eventTriggered, $message);
271+
} else {
272+
$this->assertFalse($eventTriggered, $message);
273+
}
207274
}
208275
}
209276

@@ -246,13 +313,11 @@ protected function eventWasTriggered(array $actual, string $expectedEvent): bool
246313

247314
foreach ($actual as $actualEvent) {
248315
if (is_array($actualEvent)) { // Called Listeners
249-
if (str_starts_with($actualEvent['pretty'], $expectedEvent)) {
250-
$triggered = true;
251-
}
252-
} else { // Orphan Events
253-
if ($actualEvent === $expectedEvent) {
316+
if ($actualEvent['event'] === $expectedEvent) {
254317
$triggered = true;
255318
}
319+
} elseif ($actualEvent === $expectedEvent) { // Orphan Events
320+
$triggered = true;
256321
}
257322
}
258323

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy