diff --git a/src/Api/Providers/Core/Provider.php b/src/Api/Providers/Core/Provider.php index 12f8d1fb..f9fb23ad 100644 --- a/src/Api/Providers/Core/Provider.php +++ b/src/Api/Providers/Core/Provider.php @@ -127,6 +127,8 @@ protected function paginate($data, $resourceUrl, $limit = Pagination::DEFAULT_LI } /** + * Accepts callback which should return PaginatedResponse object. + * * @param callable $callback * @param int $limit * @return Pagination diff --git a/src/Helpers/Pagination.php b/src/Helpers/Pagination.php index 1a4aab57..eb189b6f 100644 --- a/src/Helpers/Pagination.php +++ b/src/Helpers/Pagination.php @@ -54,7 +54,7 @@ public function __construct($limit = self::DEFAULT_LIMIT) } /** - * Sets a callback to make requests. Should be a closure. + * Sets a callback to make requests. Callback should return PaginatedResponse object. * * @param callable $callback * @return $this diff --git a/tests/Bot/PaginationTest.php b/tests/Bot/PaginationTest.php index 33f5405c..6c4b3e0f 100644 --- a/tests/Bot/PaginationTest.php +++ b/tests/Bot/PaginationTest.php @@ -19,7 +19,7 @@ class PaginationTest extends PHPUnit_Framework_TestCase public function it_returns_first_result_when_no_bookmarks() { $pagination = new Pagination(); - $responseData = $this->createPaginatedResponse($this->paginatedResponse); + $responseData = $this->createSuccessApiResponse($this->paginatedResponse); $pagination->paginateOver(function() use ($responseData){ return (new Response())->fill($responseData); diff --git a/tests/Bot/ProviderTest.php b/tests/Bot/ProviderTest.php index 9916accd..6f774a5d 100644 --- a/tests/Bot/ProviderTest.php +++ b/tests/Bot/ProviderTest.php @@ -6,6 +6,7 @@ use PHPUnit_Framework_TestCase; use seregazhuk\PinterestBot\Api\Request; use seregazhuk\PinterestBot\Api\Response; +use seregazhuk\tests\Helpers\ResponseHelper; use seregazhuk\PinterestBot\Api\Providers\Core\Provider; /** @@ -13,6 +14,7 @@ */ class ProviderTest extends PHPUnit_Framework_TestCase { + use ResponseHelper; protected function tearDown() { @@ -31,18 +33,121 @@ public function it_returns_data_for_response() $this->assertEquals($responseData, $provider->visitPage()); } + /** @test */ + public function it_should_return_response_object_for_pagination() + { + $paginatedResponse = $this->createPaginatedResponse($this->paginatedResponse); + + $request = $this->makeRequest($paginatedResponse, 2); + $request + ->shouldReceive('exec') + ->once() + ->andReturn(json_encode([])); + + /** @var DummyProvider $provider */ + $provider = Mockery::mock(DummyProvider::class, [$request, new Response()]) + ->makePartial(); + + $provider->dummyPaginate(['test' => 'test'], 'http://example.com')->toArray(); + } + + /** @test */ + public function it_should_clear_response_before_pagination() + { + $response = Mockery::mock(Response::class) + ->shouldReceive('clear') + ->once() + ->getMock() + ->makePartial(); + + /** @var DummyProvider $provider */ + $provider = Mockery::mock(DummyProvider::class, [$this->makeRequest([]), $response]) + ->makePartial(); + + $provider->dummyPaginate(['test' => 'test'], 'http://example.com')->toArray(); + } + + /** @test */ + public function it_should_return_response_object_if_required_for_get_request() + { + $provider = $this->makeProvider([]); + + $this->assertInstanceOf(Response::class, $provider->dummyGet(true)); + } + + /** @test */ + public function it_should_return_response_object_if_required_for_post_request() + { + $provider = $this->makeProvider([]); + + $this->assertInstanceOf(Response::class, $provider->dummyPost(true)); + } + + /** @test */ + public function it_should_return_bool_if_required_for_post_request() + { + $response = ['resource_response' => ['data' => 'value']]; + + $provider = $this->makeProvider($response); + + $this->assertTrue($provider->dummyPost(false)); + } + /** - * @param $response - * @return Mockery\Mock|Provider + * @param mixed $response + * @param int $times + * @return Mockery\Mock|Provider|DummyProvider */ - protected function makeProvider($response) + protected function makeProvider($response, $times = 1) { - $request = Mockery::mock(Request::class) + $request = $this->makeRequest($response, $times); + + return Mockery::mock(DummyProvider::class, [$request, new Response()]) + ->makePartial(); + } + + /** + * @param mixed $response + * @param int $times + * @return Mockery\MockInterface + */ + protected function makeRequest($response, $times = 1) + { + return Mockery::mock(Request::class) ->shouldReceive('exec') + ->times($times) ->andReturn(json_encode($response)) ->getMock(); - - return Mockery::mock(Provider::class, [$request, new Response()]) - ->makePartial(); } } + +class DummyProvider extends Provider { + + /** + * @param mixed $data + * @param string $resourceUrl + * @return \seregazhuk\PinterestBot\Helpers\Pagination + */ + public function dummyPaginate($data, $resourceUrl) + { + return $this->paginate($data, $resourceUrl); + } + + /** + * @param bool $returnResponse + * @return array|bool|Response + */ + public function dummyGet($returnResponse) + { + return $this->get([], '', $returnResponse); + } + + /** + * @param bool $returnResponse + * @return array|bool|Response + */ + public function dummyPost($returnResponse) + { + return $this->post([], '', $returnResponse); + } +} \ No newline at end of file diff --git a/tests/Helpers/ResponseHelper.php b/tests/Helpers/ResponseHelper.php index 0779e0b9..d4601e7a 100644 --- a/tests/Helpers/ResponseHelper.php +++ b/tests/Helpers/ResponseHelper.php @@ -2,8 +2,6 @@ namespace seregazhuk\tests\Helpers; -use seregazhuk\PinterestBot\Helpers\Pagination; - /** * Class ResponseHelper. * @@ -34,11 +32,12 @@ public function createApiResponse($data = []) /** * Create a success dummy response. * + * @param mixed $data * @return array */ - public function createSuccessApiResponse() + public function createSuccessApiResponse($data = 'success') { - return $this->createApiResponse(['data' => 'success']); + return $this->createApiResponse(['data' => $data]); } /** @@ -70,6 +69,9 @@ public function createPaginatedResponse($response) 'resource_response' => [ 'data' => $response, ], + 'resource' => [ + 'options' => ['bookmarks' => 'my_bookrmarks'] + ] ]; } }