From 132e53eaed395e08334adcff87127bad995849db Mon Sep 17 00:00:00 2001 From: max-baranikov Date: Wed, 7 Jul 2021 16:42:41 +0300 Subject: [PATCH] Added page limit for orders and customers history --- retailcrm/lib/RetailcrmHistory.php | 2 + .../lib/api/RetailcrmApiPaginatedRequest.php | 23 +++++ .../api/RetailcrmApiPaginatedRequestTest.php | 95 +++++++++++++++++++ 3 files changed, 120 insertions(+) create mode 100644 tests/lib/api/RetailcrmApiPaginatedRequestTest.php diff --git a/retailcrm/lib/RetailcrmHistory.php b/retailcrm/lib/RetailcrmHistory.php index c00cbb3..2647e7f 100644 --- a/retailcrm/lib/RetailcrmHistory.php +++ b/retailcrm/lib/RetailcrmHistory.php @@ -65,6 +65,7 @@ class RetailcrmHistory ->setParams(array($filter, '{{page}}')) ->setDataKey('history') ->setLimit(100) + ->setPageLimit(50) ->execute() ->getData(); @@ -204,6 +205,7 @@ class RetailcrmHistory ->setParams(array($filter, '{{page}}')) ->setDataKey('history') ->setLimit(100) + ->setPageLimit(50) ->execute() ->getData(); diff --git a/retailcrm/lib/api/RetailcrmApiPaginatedRequest.php b/retailcrm/lib/api/RetailcrmApiPaginatedRequest.php index c6f1c1d..1ef0cea 100644 --- a/retailcrm/lib/api/RetailcrmApiPaginatedRequest.php +++ b/retailcrm/lib/api/RetailcrmApiPaginatedRequest.php @@ -62,6 +62,11 @@ class RetailcrmApiPaginatedRequest */ private $limit; + /** + * @var int|null + */ + private $pageLimit; + /** * @var array */ @@ -140,6 +145,19 @@ class RetailcrmApiPaginatedRequest return $this; } + /** + * Sets page limit per call + * + * @param int $pageLimit + * + * @return RetailcrmApiPaginatedRequest + */ + public function setPageLimit($pageLimit) + { + $this->pageLimit = $pageLimit; + return $this; + } + /** * Executes request * @@ -162,6 +180,10 @@ class RetailcrmApiPaginatedRequest $page = $response['pagination']['currentPage'] + 1; } + if($this->pageLimit !== null && $page > $this->pageLimit) { + break; + } + time_nanosleep(0, 300000000); } while ($response && (isset($response['pagination']) && $response['pagination']['currentPage'] < $response['pagination']['totalPageCount'])); @@ -188,6 +210,7 @@ class RetailcrmApiPaginatedRequest { $this->method = ''; $this->limit = 100; + $this->pageLimit = null; $this->data = array(); return $this; diff --git a/tests/lib/api/RetailcrmApiPaginatedRequestTest.php b/tests/lib/api/RetailcrmApiPaginatedRequestTest.php new file mode 100644 index 0000000..b12149b --- /dev/null +++ b/tests/lib/api/RetailcrmApiPaginatedRequestTest.php @@ -0,0 +1,95 @@ +apiMock = $this->getMockBuilder('RetailcrmProxy') + ->disableOriginalConstructor() + ->setMethods( + array( + 'ordersHistory', + ) + ) + ->getMock(); + } + + public function getPageLimits() + { + return array( + 'Big history' => array(2, 3, 12, 6), + 'Equal history' => array(2, 3, 6, 6), + 'Small history' => array(2, 3, 3, 3), + ); + } + + /** + * @dataProvider getPageLimits + */ + public function testPageLimit($limit, $pageLimit, $totalCount, $expectedTotalCount) + { + $this->apiMock->expects($this->any()) + ->method('ordersHistory') + ->willReturnOnConsecutiveCalls(...$this->getHistory($limit, $totalCount)); + + $request = new RetailcrmApiPaginatedRequest(); + $history = $request + ->setApi($this->apiMock) + ->setMethod('ordersHistory') + ->setParams(array(array(), '{{page}}')) + ->setDataKey('history') + ->setLimit($limit) + ->setPageLimit($pageLimit) + ->execute() + ->getData(); + + $lastId = end($history)['id']; + + $this->assertEquals($expectedTotalCount, count($history)); + $this->assertEquals($expectedTotalCount, $lastId); + } + + private function getHistory($limit, $totalCount) + { + $totalPageCount = ceil($totalCount / $limit); + $currentPage = 0; + + while ($currentPage < $totalPageCount) { + $history = array(); + + $from = ($limit * $currentPage) + 1; + $to = ($limit * $currentPage) + $limit; + if ($to > $totalCount) { + $to = $totalCount; + } + + foreach (range($from, $to) as $historyId) { + $history[] = array( + 'id' => $historyId, + ); + } + $currentPage++; + + yield new RetailcrmApiResponse( + '200', + json_encode( + array( + 'success' => true, + 'history' => $history, + 'pagination' => array( + 'limit' => $limit, + 'totalCount' => $totalCount, + 'currentPage' => $currentPage, + 'totalPageCount' => $totalPageCount + ) + ) + ) + ); + } + + } +} \ No newline at end of file