3030use PHPUnit \Framework \Attributes \DataProvider ;
3131use TestApp \TestProcessor ;
3232use TestApp \WelcomeMailer ;
33+ use Traversable ;
3334
3435class ProcessorTest extends TestCase
3536{
3637 use QueueTestTrait;
3738
38- public static $ lastProcessMessage ;
39+ /**
40+ * Convert EventList to array in a backwards-compatible way.
41+ *
42+ * In CakePHP 5.3.0+ EventList implements Traversable but array access is deprecated.
43+ * In older versions, EventList only supports array access.
44+ *
45+ * @param \Cake\Event\EventList $events The event list to convert.
46+ * @return array<\Cake\Event\EventInterface>
47+ */
48+ protected function eventListToArray (EventList $ events ): array
49+ {
50+ if ($ events instanceof Traversable) {
51+ /** @var array<\Cake\Event\EventInterface> */
52+ return iterator_to_array ($ events );
53+ }
54+
55+ $ result = [];
56+ $ count = $ events ->count ();
57+ for ($ i = 0 ; $ i < $ count ; $ i ++) {
58+ $ event = $ events [$ i ];
59+ if ($ event !== null ) {
60+ $ result [] = $ event ;
61+ }
62+ }
63+
64+ return $ result ;
65+ }
3966
4067 /**
4168 * Data provider for testProcess method
@@ -59,25 +86,27 @@ public static function dataProviderTestProcess(): array
5986 * @param string $jobMethod The method name to run
6087 * @param string $expected The expected process result.
6188 * @param string $logMessage The log message based on process result.
62- * @param string $dispacthedEvent The dispatched event based on process result.
89+ * @param string $dispatchedEvent The dispatched event based on process result.
6390 * @return void
6491 */
6592 #[DataProvider('dataProviderTestProcess ' )]
66- public function testProcess ($ jobMethod , $ expected , $ logMessage , $ dispatchedEvent )
93+ public function testProcess (string $ jobMethod , string $ expected , string $ logMessage , string $ dispatchedEvent ): void
6794 {
6895 $ messageBody = [
6996 'class ' => [TestProcessor::class, $ jobMethod ],
7097 'args ' => [],
7198 ];
7299 $ connectionFactory = new NullConnectionFactory ();
73100 $ context = $ connectionFactory ->createContext ();
74- $ queueMessage = new NullMessage (json_encode ($ messageBody ));
101+ $ queueMessage = new NullMessage (( string ) json_encode ($ messageBody ));
75102 $ message = new Message ($ queueMessage , $ context );
76103
77104 $ events = new EventList ();
78105 $ logger = new ArrayLog ();
79106 $ processor = new Processor ($ logger );
80- $ processor ->getEventManager ()->setEventList ($ events );
107+ /** @var \Cake\Event\EventManager $eventManager */
108+ $ eventManager = $ processor ->getEventManager ();
109+ $ eventManager ->setEventList ($ events );
81110
82111 $ actual = $ processor ->process ($ queueMessage , $ context );
83112 $ this ->assertSame ($ expected , $ actual );
@@ -88,17 +117,18 @@ public function testProcess($jobMethod, $expected, $logMessage, $dispatchedEvent
88117 $ this ->assertStringContainsString ($ logMessage , $ logs [0 ]);
89118
90119 $ this ->assertSame (3 , $ events ->count ());
91- $ this ->assertSame ('Processor.message.seen ' , $ events [0 ]->getName ());
92- $ this ->assertEquals (['queueMessage ' => $ queueMessage ], $ events [0 ]->getData ());
120+ $ eventsList = $ this ->eventListToArray ($ events );
121+ $ this ->assertSame ('Processor.message.seen ' , $ eventsList [0 ]->getName ());
122+ $ this ->assertEquals (['queueMessage ' => $ queueMessage ], $ eventsList [0 ]->getData ());
93123
94124 // Events should contain a message with the same payload.
95- $ this ->assertSame ('Processor.message.start ' , $ events [1 ]->getName ());
96- $ data = $ events [1 ]->getData ();
125+ $ this ->assertSame ('Processor.message.start ' , $ eventsList [1 ]->getName ());
126+ $ data = $ eventsList [1 ]->getData ();
97127 $ this ->assertArrayHasKey ('message ' , $ data );
98128 $ this ->assertSame ($ message ->jsonSerialize (), $ data ['message ' ]->jsonSerialize ());
99129
100- $ this ->assertSame ($ dispatchedEvent , $ events [2 ]->getName ());
101- $ data = $ events [2 ]->getData ();
130+ $ this ->assertSame ($ dispatchedEvent , $ eventsList [2 ]->getName ());
131+ $ data = $ eventsList [2 ]->getData ();
102132 $ this ->assertArrayHasKey ('message ' , $ data );
103133 $ this ->assertSame ($ message ->jsonSerialize (), $ data ['message ' ]->jsonSerialize ());
104134
@@ -121,12 +151,14 @@ public function testProcessNotValidCallable()
121151 ];
122152 $ connectionFactory = new NullConnectionFactory ();
123153 $ context = $ connectionFactory ->createContext ();
124- $ queueMessage = new NullMessage (json_encode ($ messageBody ));
154+ $ queueMessage = new NullMessage (( string ) json_encode ($ messageBody ));
125155
126156 $ events = new EventList ();
127157 $ logger = new ArrayLog ();
128158 $ processor = new Processor ($ logger );
129- $ processor ->getEventManager ()->setEventList ($ events );
159+ /** @var \Cake\Event\EventManager $eventManager */
160+ $ eventManager = $ processor ->getEventManager ();
161+ $ eventManager ->setEventList ($ events );
130162
131163 $ result = $ processor ->process ($ queueMessage , $ context );
132164 $ this ->assertSame (InteropProcessor::REJECT , $ result );
@@ -137,8 +169,9 @@ public function testProcessNotValidCallable()
137169 $ this ->assertStringContainsString ('Invalid callable for message. Rejecting message from queue ' , $ logs [0 ]);
138170
139171 $ this ->assertSame (2 , $ events ->count ());
140- $ this ->assertSame ('Processor.message.seen ' , $ events [0 ]->getName ());
141- $ this ->assertSame ('Processor.message.invalid ' , $ events [1 ]->getName ());
172+ $ eventsList = $ this ->eventListToArray ($ events );
173+ $ this ->assertSame ('Processor.message.seen ' , $ eventsList [0 ]->getName ());
174+ $ this ->assertSame ('Processor.message.invalid ' , $ eventsList [1 ]->getName ());
142175 }
143176
144177 /**
@@ -156,20 +189,23 @@ public function testProcessWillRequeueOnException()
156189 ];
157190 $ connectionFactory = new NullConnectionFactory ();
158191 $ context = $ connectionFactory ->createContext ();
159- $ queueMessage = new NullMessage (json_encode ($ messageBody ));
192+ $ queueMessage = new NullMessage (( string ) json_encode ($ messageBody ));
160193
161194 $ events = new EventList ();
162195 $ logger = new ArrayLog ();
163196 $ processor = new Processor ($ logger );
164- $ processor ->getEventManager ()->setEventList ($ events );
197+ /** @var \Cake\Event\EventManager $eventManager */
198+ $ eventManager = $ processor ->getEventManager ();
199+ $ eventManager ->setEventList ($ events );
165200
166201 $ result = $ processor ->process ($ queueMessage , $ context );
167202 $ this ->assertEquals (InteropProcessor::REQUEUE , $ result );
168203
169204 // Verify timing information is present in exception event
170205 $ this ->assertSame (3 , $ events ->count ());
171- $ this ->assertSame ('Processor.message.exception ' , $ events [2 ]->getName ());
172- $ data = $ events [2 ]->getData ();
206+ $ eventsList = $ this ->eventListToArray ($ events );
207+ $ this ->assertSame ('Processor.message.exception ' , $ eventsList [2 ]->getName ());
208+ $ data = $ eventsList [2 ]->getData ();
173209 $ this ->assertArrayHasKey ('duration ' , $ data );
174210 $ this ->assertIsInt ($ data ['duration ' ]);
175211 $ this ->assertGreaterThanOrEqual (0 , $ data ['duration ' ]);
@@ -193,11 +229,13 @@ public function testProcessJobObject()
193229 ];
194230 $ connectionFactory = new NullConnectionFactory ();
195231 $ context = $ connectionFactory ->createContext ();
196- $ queueMessage = new NullMessage (json_encode ($ messageBody ));
232+ $ queueMessage = new NullMessage (( string ) json_encode ($ messageBody ));
197233 $ processor = new Processor ();
198234
199235 $ result = $ processor ->process ($ queueMessage , $ context );
200- $ logs = Log::engine ('debug ' )->read ();
236+ /** @var \Cake\Log\Engine\ArrayLog $debugLog */
237+ $ debugLog = Log::engine ('debug ' );
238+ $ logs = $ debugLog ->read ();
201239 Log::drop ('debug ' );
202240
203241 $ this ->assertCount (1 , $ logs );
@@ -219,12 +257,12 @@ public function testProcessMessage()
219257 ];
220258 $ connectionFactory = new NullConnectionFactory ();
221259 $ context = $ connectionFactory ->createContext ();
222- $ queueMessage = new NullMessage (json_encode ($ messageBody ));
260+ $ queueMessage = new NullMessage (( string ) json_encode ($ messageBody ));
223261 $ message = new Message ($ queueMessage , $ context );
224262 $ processor = new Processor ();
225263
226264 $ result = $ processor ->processMessage ($ message );
227265 $ this ->assertSame (InteropProcessor::ACK , $ result );
228- $ this ->assertNotEmpty ( TestProcessor::$ lastProcessMessage );
266+ $ this ->assertInstanceOf (Message::class, TestProcessor::$ lastProcessMessage );
229267 }
230268}
0 commit comments