Skip to content

Commit fe0bd51

Browse files
authored
Merge pull request #153 from microsoftgraph/fix/page-iterator
Initialise `hasNext()` to false if the initial collection is empty/null
2 parents 3d15954 + abed5ba commit fe0bd51

File tree

2 files changed

+47
-4
lines changed

2 files changed

+47
-4
lines changed

src/Tasks/PageIterator.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class PageIterator
3535
private ?array $requestOptions = [];
3636

3737
/**
38-
* @param Parsable|array<mixed>|object|null $response paged collection response
38+
* @param Parsable|array<mixed>|object $response paged collection response
3939
* @param RequestAdapter $requestAdapter
4040
* @param array{class-string<T>,string}|null $constructorCallable
4141
* The method to construct a paged response object.
@@ -57,7 +57,7 @@ public function __construct($response, RequestAdapter $requestAdapter, ?array $c
5757

5858
if ($page !== null) {
5959
$this->currentPage = $page;
60-
$this->hasNext = true;
60+
$this->hasNext = !empty($page->getValue());
6161
}
6262
}
6363

@@ -124,7 +124,7 @@ public function next(): ?PageResult
124124
}
125125

126126
/**
127-
* @param object|array<mixed>|null $response
127+
* @param object|array<mixed>|Parsable|null $response
128128
* @return PageResult|null
129129
* @throws JsonException
130130
*/
@@ -137,7 +137,7 @@ public static function convertToPage($response): ?PageResult
137137

138138
$value = null;
139139
if (is_array($response)) {
140-
$value = $response['value'] ?? ['value' => []];
140+
$value = $response['value'] ?? [];
141141
} elseif ($response instanceof Parsable &&
142142
method_exists($response, 'getValue')) {
143143
$value = $response->getValue();

tests/Tasks/PageIteratorTest.php

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,4 +224,47 @@ public function testCanGetFromParsablePageObject(): void
224224
$this->assertEquals(2, $count);
225225
$this->assertInstanceOf(User::class, $data[0]);
226226
}
227+
228+
public function testHasNextIsFalseWithEmptyOrNullInitialCollection(): void
229+
{
230+
$pageIterator = new PageIterator([], $this->mockRequestAdapter);
231+
$this->assertFalse($pageIterator->hasNext());
232+
233+
$pageIterator = new PageIterator([1, 2, 3], $this->mockRequestAdapter);
234+
$this->assertFalse($pageIterator->hasNext());
235+
236+
$pageIterator = new PageIterator(['value' => []], $this->mockRequestAdapter);
237+
$this->assertFalse($pageIterator->hasNext());
238+
239+
$pageIterator = new PageIterator(['value' => null], $this->mockRequestAdapter);
240+
$this->assertFalse($pageIterator->hasNext());
241+
242+
$pageIterator = new PageIterator((object) [], $this->mockRequestAdapter);
243+
$this->assertFalse($pageIterator->hasNext());
244+
245+
$pageIterator = new PageIterator((object) [1, 2], $this->mockRequestAdapter);
246+
$this->assertFalse($pageIterator->hasNext());
247+
248+
$pageIterator = new PageIterator((object) [], $this->mockRequestAdapter);
249+
$this->assertFalse($pageIterator->hasNext());
250+
251+
$usersResponse = new UsersResponse();
252+
$usersResponse->setValue([]);
253+
$pageIterator = new PageIterator($usersResponse, $this->mockRequestAdapter);
254+
$this->assertFalse($pageIterator->hasNext());
255+
}
256+
257+
public function testHasNextInitialisedToTrueWhenValueHasItems(): void
258+
{
259+
$pageIterator = new PageIterator(['value' => [1, 2, 3]], $this->mockRequestAdapter);
260+
$this->assertTrue($pageIterator->hasNext());
261+
262+
$pageIterator = new PageIterator((object) ['value' => [1]], $this->mockRequestAdapter);
263+
$this->assertTrue($pageIterator->hasNext());
264+
265+
$usersResponse = new UsersResponse();
266+
$usersResponse->setValue([1, 2]);
267+
$pageIterator = new PageIterator($usersResponse, $this->mockRequestAdapter);
268+
$this->assertTrue($pageIterator->hasNext());
269+
}
227270
}

0 commit comments

Comments
 (0)