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)