diff --git a/CHANGELOG.md b/CHANGELOG.md index c7fba0e..87555bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ CHANGE LOG * Added the workspace pull requests endpoint for a selected user * Added repository pipelines config subresources * Fixed result pager pagination when using partial response fields +* Fixed result pager previous-page navigation * Documented Bitbucket API migration paths * Deprecated current user workspaces pass-through methods * Deprecated the top-level pull requests pass-through method diff --git a/src/ResultPager.php b/src/ResultPager.php index dcc5f1d..7a7c955 100644 --- a/src/ResultPager.php +++ b/src/ResultPager.php @@ -128,7 +128,7 @@ public function fetchNext(): array */ public function hasPrevious(): bool { - return isset($this->pagination['prev']); + return isset($this->pagination['previous']); } /** @@ -138,7 +138,7 @@ public function hasPrevious(): bool */ public function fetchPrevious(): array { - return $this->get('prev'); + return $this->get('previous'); } /** diff --git a/tests/ResultPagerTest.php b/tests/ResultPagerTest.php index 89274cf..e684529 100644 --- a/tests/ResultPagerTest.php +++ b/tests/ResultPagerTest.php @@ -84,6 +84,87 @@ public function testDirectCallsDoNotPreservePaginationFields(): void self::assertSame('values.name', $query['fields']); } + public function testHasPreviousUsesPreviousPaginationField(): void + { + $httpClient = new MockClient(); + + $httpClient->addResponse(self::jsonResponse([ + 'pagelen' => 1, + 'previous' => 'https://api.bitbucket.org/2.0/repositories/my-workspace/my-repo/refs/tags?page=1', + 'values' => [ + ['name' => 'v1.0.1'], + ], + ])); + + $client = new Client(new Builder($httpClient)); + $pager = new ResultPager($client, 1); + + $pager->fetch( + $client->repositories()->workspaces('my-workspace')->refs('my-repo')->tags(), + 'list' + ); + + self::assertTrue($pager->hasPrevious()); + } + + public function testFetchPreviousUsesPreviousPaginationField(): void + { + $previous = 'https://api.bitbucket.org/2.0/repositories/my-workspace/my-repo/refs/tags?page=1&opaque=true'; + $httpClient = new MockClient(); + + $httpClient->addResponse(self::jsonResponse([ + 'pagelen' => 1, + 'previous' => $previous, + 'values' => [ + ['name' => 'v1.0.1'], + ], + ])); + + $httpClient->addResponse(self::jsonResponse([ + 'pagelen' => 1, + 'values' => [ + ['name' => 'v1.0.0'], + ], + ])); + + $client = new Client(new Builder($httpClient)); + $pager = new ResultPager($client, 1); + + $pager->fetch( + $client->repositories()->workspaces('my-workspace')->refs('my-repo')->tags(), + 'list' + ); + + self::assertSame(['pagelen' => 1, 'values' => [['name' => 'v1.0.0']]], $pager->fetchPrevious()); + + $requests = $httpClient->getRequests(); + + self::assertSame($previous, (string) $requests[1]->getUri()); + } + + public function testFetchPreviousReturnsEmptyArrayWithoutPreviousLink(): void + { + $httpClient = new MockClient(); + + $httpClient->addResponse(self::jsonResponse([ + 'pagelen' => 1, + 'values' => [ + ['name' => 'v1.0.0'], + ], + ])); + + $client = new Client(new Builder($httpClient)); + $pager = new ResultPager($client, 1); + + $pager->fetch( + $client->repositories()->workspaces('my-workspace')->refs('my-repo')->tags(), + 'list' + ); + + self::assertFalse($pager->hasPrevious()); + self::assertSame([], $pager->fetchPrevious()); + } + private static function jsonResponse(array $data): Response { return new Response(