66use GuzzleHttp \Exception \GuzzleException ;
77use GuzzleHttp \Handler \MockHandler ;
88use GuzzleHttp \HandlerStack ;
9+ use GuzzleHttp \Promise \Promise ;
910use GuzzleHttp \Psr7 \Response ;
1011use GuzzleHttp \Psr7 \Utils ;
1112use Http \Promise \FulfilledPromise ;
@@ -24,6 +25,7 @@ class PageIteratorTest extends TestCase
2425 private Client $ testClient ;
2526 private RequestAdapter $ mockRequestAdapter ;
2627 private RequestInformation $ requestInfoMock ;
28+ private ?array $ nextPageContent = null ;
2729 private $ firstPageContent ;
2830
2931 /**
@@ -104,7 +106,7 @@ protected function setUp(): void {
104106 }
105107 ' ;
106108 $ this ->mockRequestAdapter ->method ('sendAsync ' )
107- ->willReturn ($ usersPage );
109+ ->willReturn (( $ this -> nextPageContent !== null ? new FulfilledPromise ( $ this -> nextPageContent ) : $ usersPage) );
108110 $ this ->mock = new MockHandler ([
109111 new Response (200 , ['X-Foo ' => 'Bar ' ], $ firstPageData ),
110112 ]);
@@ -119,7 +121,7 @@ protected function setUp(): void {
119121 public function testHandlerCanWork (): void {
120122 $ pageIterator = new PageIterator ($ this ->firstPageContent , $ this ->mockRequestAdapter , [UsersResponse::class, 'createFromDiscriminator ' ]);
121123 $ count = 0 ;
122- $ pageIterator ->iterate (function ($ value ) use (&$ count ) {
124+ $ pageIterator ->iterate (function () use (&$ count ) {
123125 $ count ++;
124126 return true ;
125127 });
@@ -147,6 +149,10 @@ public function testCanResumeIteration(): void{
147149 $ this ->assertEquals (4 , $ count );
148150 }
149151
152+ /**
153+ * @throws \JsonException
154+ * @throws \Exception
155+ */
150156 public function testCanPauseIteration (): void {
151157 $ pageIterator = new PageIterator ($ this ->firstPageContent , $ this ->mockRequestAdapter , [UsersResponse::class, 'createFromDiscriminator ' ]);
152158 $ count = 0 ;
@@ -179,4 +185,43 @@ public function testCanDeserializeUsingCallback(): void {
179185
180186 $ this ->assertInstanceOf (User::class, $ usersArray [0 ]);
181187 }
188+
189+ /**
190+ * @throws \Exception
191+ */
192+ public function testCanPaginateWithoutCallableClass (): void {
193+ $ pageIterator = new PageIterator ($ this ->firstPageContent , $ this ->mockRequestAdapter );
194+ $ count = 0 ;
195+ $ usersArray = [];
196+ $ pageIterator ->iterate (function ($ value ) use (&$ count ,&$ usersArray ) {
197+ $ parseNode = new JsonParseNode ($ value );
198+ /** @var User $user */
199+ $ user = $ parseNode ->getObjectValue ([User::class, 'createFromDiscriminator ' ]);
200+ $ usersArray []= $ user ;
201+ $ count ++;
202+ return true ;
203+ });
204+
205+ $ this ->assertInstanceOf (User::class, $ usersArray [0 ]);
206+ }
207+
208+ /**
209+ * @throws \JsonException
210+ * @throws \Exception
211+ */
212+ public function testCanGetFromParsablePageObject (): void
213+ {
214+ $ parsable = (new JsonParseNode ($ this ->firstPageContent ))->getObjectValue ([UsersResponse::class, 'createFromDiscriminator ' ]);
215+ $ pageIterator = new PageIterator ($ parsable , $ this ->mockRequestAdapter , [UsersResponse::class, 'createFromDiscriminator ' ]);
216+ $ count = 0 ;
217+ $ this ->nextPageContent = [];
218+ $ data = [];
219+ $ pageIterator ->iterate (static function ($ value ) use (&$ count , &$ data ) {
220+ $ data []= $ value ;
221+ $ count ++;
222+ return $ count < 2 ;
223+ });
224+ $ this ->assertEquals (2 , $ count );
225+ $ this ->assertInstanceOf (User::class, $ data [0 ]);
226+ }
182227}
0 commit comments