6
6
7
7
use Symfony \Component \HttpKernel \DataCollector \EventDataCollector ;
8
8
use Symfony \Component \VarDumper \Cloner \Data ;
9
+
9
10
use function is_array ;
10
11
use function is_object ;
11
12
@@ -53,11 +54,14 @@ public function dontSeeOrphanEvent(array|object|string $expected = null): void
53
54
* ```
54
55
*
55
56
* @param object|string|string[] $expected
56
- * @deprecated Use `dontSeeEventListenerIsCalled() ` instead.
57
+ * @deprecated Use `dontSeeEventListenerIsCalled` instead.
57
58
*/
58
59
public function dontSeeEventTriggered (array |object |string $ expected ): void
59
60
{
60
- trigger_error ('dontSeeEventTriggered is deprecated, please use dontSeeEventListenerIsCalled instead ' , E_USER_DEPRECATED );
61
+ trigger_error (
62
+ 'dontSeeEventTriggered is deprecated, please use dontSeeEventListenerIsCalled instead ' ,
63
+ E_USER_DEPRECATED
64
+ );
61
65
$ this ->dontSeeEventListenerIsCalled ($ expected );
62
66
}
63
67
@@ -69,18 +73,28 @@ public function dontSeeEventTriggered(array|object|string $expected): void
69
73
* $I->dontSeeEventListenerIsCalled('App\MyEventListener');
70
74
* $I->dontSeeEventListenerIsCalled(new App\Events\MyEventListener());
71
75
* $I->dontSeeEventListenerIsCalled(['App\MyEventListener', 'App\MyOtherEventListener']);
76
+ * $I->dontSeeEventListenerIsCalled('App\MyEventListener', 'my.event);
77
+ * $I->dontSeeEventListenerIsCalled(new App\Events\MyEventListener(), new MyEvent());
78
+ * $I->dontSeeEventListenerIsCalled('App\MyEventListener', ['my.event', 'my.other.event']);
72
79
* ```
73
80
*
74
81
* @param object|string|string[] $expected
75
82
*/
76
- public function dontSeeEventListenerIsCalled (array |object |string $ expected ): void
77
- {
83
+ public function dontSeeEventListenerIsCalled (
84
+ array |object |string $ expected ,
85
+ array |object |string $ withEvents = []
86
+ ): void {
78
87
$ eventCollector = $ this ->grabEventCollector (__FUNCTION__ );
79
88
80
89
$ data = $ eventCollector ->getCalledListeners ();
81
90
$ expected = is_array ($ expected ) ? $ expected : [$ expected ];
91
+ $ withEvents = is_array ($ withEvents ) ? $ withEvents : [$ withEvents ];
92
+
93
+ if (!empty ($ withEvents ) && count ($ expected ) > 1 ) {
94
+ $ this ->fail ('You cannot check for events when using multiple listeners. Make multiple assertions instead. ' );
95
+ }
82
96
83
- $ this ->assertEventNotTriggered ($ data , $ expected );
97
+ $ this ->assertListenerCalled ($ data , $ expected, $ withEvents , true );
84
98
}
85
99
86
100
/**
@@ -120,11 +134,14 @@ public function seeOrphanEvent(array|object|string $expected): void
120
134
* ```
121
135
*
122
136
* @param object|string|string[] $expected
123
- * @deprecated Use `seeEventListenerIsCalled() ` instead.
137
+ * @deprecated Use `seeEventListenerIsCalled` instead.
124
138
*/
125
139
public function seeEventTriggered (array |object |string $ expected ): void
126
140
{
127
- trigger_error ('seeEventTriggered is deprecated, please use seeEventListenerIsCalled instead ' , E_USER_DEPRECATED );
141
+ trigger_error (
142
+ 'seeEventTriggered is deprecated, please use seeEventListenerIsCalled instead ' ,
143
+ E_USER_DEPRECATED
144
+ );
128
145
$ this ->seeEventListenerIsCalled ($ expected );
129
146
}
130
147
@@ -136,18 +153,28 @@ public function seeEventTriggered(array|object|string $expected): void
136
153
* $I->seeEventListenerIsCalled('App\MyEventListener');
137
154
* $I->seeEventListenerIsCalled(new App\Events\MyEventListener());
138
155
* $I->seeEventListenerIsCalled(['App\MyEventListener', 'App\MyOtherEventListener']);
156
+ * $I->seeEventListenerIsCalled('App\MyEventListener', 'my.event);
157
+ * $I->seeEventListenerIsCalled(new App\Events\MyEventListener(), new MyEvent());
158
+ * $I->seeEventListenerIsCalled('App\MyEventListener', ['my.event', 'my.other.event']);
139
159
* ```
140
160
*
141
161
* @param object|string|string[] $expected
142
162
*/
143
- public function seeEventListenerIsCalled (array |object |string $ expected ): void
144
- {
163
+ public function seeEventListenerIsCalled (
164
+ array |object |string $ expected ,
165
+ array |object |string $ withEvents = []
166
+ ): void {
145
167
$ eventCollector = $ this ->grabEventCollector (__FUNCTION__ );
146
168
147
169
$ data = $ eventCollector ->getCalledListeners ();
148
170
$ expected = is_array ($ expected ) ? $ expected : [$ expected ];
171
+ $ withEvents = is_array ($ withEvents ) ? $ withEvents : [$ withEvents ];
149
172
150
- $ this ->assertEventTriggered ($ data , $ expected );
173
+ if (!empty ($ withEvents ) && count ($ expected ) > 1 ) {
174
+ $ this ->fail ('You cannot check for events when using multiple listeners. Make multiple assertions instead. ' );
175
+ }
176
+
177
+ $ this ->assertListenerCalled ($ data , $ expected , $ withEvents );
151
178
}
152
179
153
180
protected function assertEventNotTriggered (Data $ data , array $ expected ): void
@@ -180,6 +207,39 @@ protected function assertEventTriggered(Data $data, array $expected): void
180
207
}
181
208
}
182
209
210
+ protected function assertListenerCalled (
211
+ Data $ data ,
212
+ array $ expectedListeners ,
213
+ array $ withEvents ,
214
+ bool $ invertAssertion = false
215
+ ): void {
216
+ $ assertTrue = !$ invertAssertion ;
217
+
218
+ if ($ assertTrue && $ data ->count () === 0 ) {
219
+ $ this ->fail ('No event listener was called ' );
220
+ }
221
+
222
+ $ actual = $ data ->getValue (true );
223
+ $ expectedEvents = empty ($ withEvents ) ? [null ] : $ withEvents ;
224
+
225
+ foreach ($ expectedListeners as $ expectedListener ) {
226
+ $ expectedListener = is_object ($ expectedListener ) ? $ expectedListener ::class : $ expectedListener ;
227
+
228
+ foreach ($ expectedEvents as $ expectedEvent ) {
229
+ $ message = "The ' {$ expectedListener }' listener was called "
230
+ . ($ expectedEvent ? " for the ' {$ expectedEvent }' event " : '' );
231
+
232
+ $ condition = $ this ->listenerWasCalled ($ actual , $ expectedListener , $ expectedEvent );
233
+
234
+ if ($ assertTrue ) {
235
+ $ this ->assertTrue ($ condition , $ message );
236
+ } else {
237
+ $ this ->assertFalse ($ condition , $ message );
238
+ }
239
+ }
240
+ }
241
+ }
242
+
183
243
protected function eventWasTriggered (array $ actual , string $ expectedEvent ): bool
184
244
{
185
245
$ triggered = false ;
@@ -195,9 +255,28 @@ protected function eventWasTriggered(array $actual, string $expectedEvent): bool
195
255
}
196
256
}
197
257
}
258
+
198
259
return $ triggered ;
199
260
}
200
261
262
+ protected function listenerWasCalled (array $ actual , string $ expectedListener , string |null $ expectedEvent ): bool
263
+ {
264
+ $ called = false ;
265
+
266
+ foreach ($ actual as $ actualEvent ) {
267
+ // Called Listeners
268
+ if (is_array ($ actualEvent ) && str_starts_with ($ actualEvent ['pretty ' ], $ expectedListener )) {
269
+ if ($ expectedEvent === null ) {
270
+ $ called = true ;
271
+ } elseif ($ actualEvent ['event ' ] === $ expectedEvent ) {
272
+ $ called = true ;
273
+ }
274
+ }
275
+ }
276
+
277
+ return $ called ;
278
+ }
279
+
201
280
protected function grabEventCollector (string $ function ): EventDataCollector
202
281
{
203
282
return $ this ->grabCollector ('events ' , $ function );
0 commit comments