diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 945e77c..7ac1958 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,8 +12,6 @@ jobs: strategy: matrix: php: - - 7.4 - - 8.0 - 8.1 - 8.2 - 8.3 diff --git a/README.md b/README.md index 6bc8c06..499bb9c 100644 --- a/README.md +++ b/README.md @@ -13,20 +13,21 @@ Rapid pagination without using OFFSET ## Requirements -- PHP: ^7.4 || ^8.0 -- CakePHP: ^4.5 +- PHP: ^8.1 +- CakePHP: ^5.0 - [lampager/lampager][]: ^0.4 ### Note - For CakePHP 2.x, use [lampager/lampager-cakephp2][]. - For CakePHP 3.x, use [lampager/lampager-cakephp v1.x][]. -- For CakePHP 4.x, use lampager/lampager-cakephp v2.x (this version). +- For CakePHP 4.x, use [lampager/lampager-cakephp v2.x][]. +- For CakePHP 5.x, use lampager/lampager-cakephp v3.x (this version). ## Installing ```bash -composer require lampager/lampager-cakephp:^2.0 +composer require lampager/lampager-cakephp:^3.0 ``` For SQLite users, see [SQLite](#sqlite) to configure. @@ -64,8 +65,8 @@ are specific to Lampager such as `forward`, `seekable`, or `cursor`. ```php $query = $this->Posts ->where(['Posts.type' => 'public']) - ->orderDesc('created') - ->orderDesc('id') + ->orderByDesc('created') + ->orderByDesc('id') ->limit(10); $posts = $this->paginate($query, [ @@ -121,9 +122,10 @@ $latest = $this->lampager() ->seekable() ->cursor($cursor) ->limit(10) - ->orderDesc('Posts.modified') - ->orderDesc('Posts.created') - ->orderDesc('Posts.id'); + ->orderByDesc('Posts.modified') + ->orderByDesc('Posts.created') + ->orderByDesc('Posts.id') + ->paginate(); foreach ($latest as $post) { /** @var \Cake\ORM\Entity $post */ @@ -144,9 +146,10 @@ $drafts = $this->lampager() ->seekable() ->cursor($cursor) ->limit(10) - ->orderDesc($this->selectQuery()->newExpr('modified')) - ->orderDesc($this->selectQuery()->newExpr('created')) - ->orderDesc($this->selectQuery()->newExpr('id')); + ->orderByDesc($this->selectQuery()->newExpr('modified')) + ->orderByDesc($this->selectQuery()->newExpr('created')) + ->orderByDesc($this->selectQuery()->newExpr('id')) + ->paginate(); /** @var \Cake\ORM\Entity $sample */ $sample = $drafts->sample(); @@ -159,20 +162,16 @@ $count = $drafts->count(); See also: [lampager/lampager][]. -| Name | Type | Parent Class
Implemented Interface | Description | -|:----------------------------------------------------|:------|:---------------------------------------|:------------------------------------------------------------------------------------| -| Lampager\\Cake\\ORM\\`Query` | Class | Cake\\ORM\\`Query` | Fluent factory implementation for CakePHP | -| Lampager\\Cake\\Model\\Behavior\\`LampagerBehavior` | Class | Cake\\ORM\\`Behavior` | CakePHP behavior which returns Lampager\\Cake\\ORM\\`Query` | -| Lampager\\Cake\\Datasource\\`Paginator` | Class | Cake\\Datasource\\`Paginator` | CakePHP paginatior which delegates to Lampager\\Cake\\ORM\\`Query` | -| Lampager\\Cake\\`Paginator` | Class | Lampager\\`Paginator` | Paginator implementation for CakePHP | -| Lampager\\Cake\\`ArrayProcessor` | Class | Lampager\\`ArrayProcessor` | Processor implementation for CakePHP | -| Lampager\\Cake\\`PaginationResult` | Class | Cake\\Datasource\\`ResultSetInterface` | PaginationResult implementation for CakePHP | -| Lampager\\Cake\\Database\\`SqliteCompiler` | Class | Cake\\Database\\`SqliteCompiler` | Query compiler implementation for SQLite | -| Lampager\\Cake\\Database\\Driver\\`Sqlite` | Class | Cake\\Database\\Driver\\`Sqlite` | Driver implementation which delegates to Lampager\\Cake\\Database\\`SqliteCompiler` | - -Note that `\Lampager\Cake\PaginationResult` does not extend -`\Lampager\PaginationResult` as it conflicts with -`\Cake\Datasource\ResultSetInterface`. +| Name | Type | Parent Class
Implemented Interface | Description | +|:----------------------------------------------------|:------|:-------------------------------------------------------------------------------|:------------------------------------------------------------------------------------| +| Lampager\\Cake\\ORM\\`Query` | Class | Cake\\ORM\\`Query` | Fluent factory implementation for CakePHP | +| Lampager\\Cake\\Model\\Behavior\\`LampagerBehavior` | Class | Cake\\ORM\\`Behavior` | CakePHP behavior which returns Lampager\\Cake\\ORM\\`Query` | +| Lampager\\Cake\\Datasource\\`Paginator` | Class | Cake\\Datasource\\`Paginator` | CakePHP paginatior which delegates to Lampager\\Cake\\ORM\\`Query` | +| Lampager\\Cake\\`Paginator` | Class | Lampager\\`Paginator` | Paginator implementation for CakePHP | +| Lampager\\Cake\\`ArrayProcessor` | Class | Lampager\\`ArrayProcessor` | Processor implementation for CakePHP | +| Lampager\\Cake\\`PaginationResult` | Class | Lampager\\`PaginationResult`
Cake\\Datasource\\Paging\\`PaginatedInterface` | PaginationResult implementation for CakePHP | +| Lampager\\Cake\\Database\\`SqliteCompiler` | Class | Cake\\Database\\`SqliteCompiler` | Query compiler implementation for SQLite | +| Lampager\\Cake\\Database\\Driver\\`Sqlite` | Class | Cake\\Database\\Driver\\`Sqlite` | Driver implementation which delegates to Lampager\\Cake\\Database\\`SqliteCompiler` | ## API @@ -192,8 +191,8 @@ Create a new paginator instance. These methods are not intended to be directly used in your code. ```php -static Paginator::create(\Cake\ORM\Query $builder): static -Paginator::__construct(\Cake\ORM\Query $builder) +static Paginator::create(\Cake\ORM\Query\SelectQuery $builder): static +Paginator::__construct(\Cake\ORM\Query\SelectQuery $builder) ``` ### Paginator::transform() @@ -201,7 +200,7 @@ Paginator::__construct(\Cake\ORM\Query $builder) Transform a Lampager query into a CakePHP query. ```php -Paginator::transform(\Lampager\Query $query): \Cake\ORM\Query +Paginator::transform(\Lampager\Query $query): \Cake\ORM\Query\SelectQuery ``` ### Paginator::build() @@ -209,7 +208,7 @@ Paginator::transform(\Lampager\Query $query): \Cake\ORM\Query Perform configure + transform. ```php -Paginator::build(\Lampager\Contracts\Cursor|array $cursor = []): \Cake\ORM\Query +Paginator::build(\Lampager\Contracts\Cursor|array $cursor = []): \Cake\ORM\Query\SelectQuery ``` ### Paginator::paginate() @@ -270,8 +269,7 @@ object(Lampager\Cake\PaginationResult)#1 (6) { ### PaginationResult::\_\_call() `\Lampager\Cake\PaginationResult` implements -`\Cake\Datasource\ResultSetInterface`. For how to make the best use of the -`PaginationResult`, please refer to the Cookbook: [Working with Result Sets][]. +`\Cake\Datasource\Paging\PaginatedInterface`. ## Examples @@ -303,8 +301,8 @@ class PostsController extends AppController // Query expression can be passed to PaginatorComponent::paginate() as normal $query = $this->Posts ->where(['Posts.type' => 'public']) - ->orderDesc('created') - ->orderDesc('id') + ->orderByDesc('created') + ->orderByDesc('id') ->limit(15); /** @var \Lampager\Cake\PaginationResult<\Cake\ORM\Entity> $posts */ @@ -415,6 +413,6 @@ return [ [lampager/lampager]: https://github.com/lampager/lampager [lampager/lampager-cakephp v1.x]: https://github.com/lampager/lampager-cakephp/tree/v1.x +[lampager/lampager-cakephp v2.x]: https://github.com/lampager/lampager-cakephp/tree/v2.x [lampager/lampager-cakephp2]: https://github.com/lampager/lampager-cakephp2 -[Pagination]: https://book.cakephp.org/4/en/controllers/pagination.html -[Working with Result Sets]: https://book.cakephp.org/4/en/orm/retrieving-data-and-resultsets.html#working-with-result-sets +[Pagination]: https://book.cakephp.org/5/en/controllers/pagination.html diff --git a/composer.json b/composer.json index 45d57c4..fd8ce9e 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "lampager/lampager-cakephp", - "description": "Rapid pagination for CakePHP 4", + "description": "Rapid pagination for CakePHP 5", "type": "cakephp-plugin", "license": "MIT", "authors": [ @@ -21,12 +21,12 @@ } }, "require": { - "php": "^7.4 || ^8.0", - "cakephp/cakephp": "^4.5", + "php": "^8.1", + "cakephp/cakephp": "^5.0", "lampager/lampager": "^0.4" }, "require-dev": { - "phpunit/phpunit": "^8.0 || ^9.0", + "phpunit/phpunit": "^10.1", "nilportugues/sql-query-formatter": "^1.2" }, "scripts": { diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 6a71c27..9034787 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -1,10 +1,16 @@ + + + src/ + + + tests/TestCase/ @@ -12,13 +18,10 @@ - + - - src/ - diff --git a/src/ArrayProcessor.php b/src/ArrayProcessor.php index efa33a5..ef66d7e 100644 --- a/src/ArrayProcessor.php +++ b/src/ArrayProcessor.php @@ -16,7 +16,9 @@ class ArrayProcessor extends BaseArrayProcessor */ protected function defaultFormat($rows, array $meta, LampagerQuery $query) { - return new PaginationResult($rows, $meta); + return new PaginationResult($rows, $meta + [ + 'limit' => $query->limit(), + ]); } /** diff --git a/src/Datasource/Paginator.php b/src/Datasource/Paginator.php index 5127835..9258524 100644 --- a/src/Datasource/Paginator.php +++ b/src/Datasource/Paginator.php @@ -5,12 +5,13 @@ namespace Lampager\Cake\Datasource; use Cake\Datasource\Paging\NumericPaginator as CakePaginator; +use Cake\Datasource\Paging\PaginatedInterface; use Cake\Datasource\QueryInterface; -use Cake\Datasource\ResultSetInterface; use Exception; use Lampager\Cake\ORM\Query; use Lampager\Cake\PaginationResult; use Lampager\Exceptions\InvalidArgumentException; +use function Cake\Core\triggerWarning; class Paginator extends CakePaginator { @@ -19,13 +20,13 @@ class Paginator extends CakePaginator * @throws InvalidArgumentException if the \Lampager\Cake\ORM\Query is given * @return PaginationResult */ - public function paginate(object $object, array $params = [], array $settings = []): ResultSetInterface + public function paginate(mixed $target, array $params = [], array $settings = []): PaginatedInterface { $query = null; - if ($object instanceof QueryInterface) { - $query = $object; - $object = $query->getRepository(); - if ($object === null) { + if ($target instanceof QueryInterface) { + $query = $target; + $target = $query->getRepository(); + if ($target === null) { throw new Exception('No repository set for query.'); } } @@ -34,25 +35,49 @@ public function paginate(object $object, array $params = [], array $settings = [ throw new InvalidArgumentException(Query::class . ' cannot be paginated by ' . __METHOD__ . '()'); } - $alias = $object->getAlias(); + $alias = $target->getAlias(); $defaults = $this->getDefaults($alias, $settings); + + $validSettings = [ + ...array_keys($this->_defaultConfig), + 'order', + 'forward', + 'backward', + 'exclusive', + 'inclusive', + 'seekable', + 'unseekable', + 'cursor', + ]; + $extraSettings = array_diff_key($defaults, array_flip($validSettings)); + if ($extraSettings) { + triggerWarning( + 'Passing query options as paginator settings is no longer supported.' + . ' Use a custom finder through the `finder` config or pass a Query instance to paginate().' + . ' Extra keys found are: `' . implode('`, `', array_keys($extraSettings)) . '`.' + ); + } + $options = $this->mergeOptions($params, $defaults); - $options = $this->validateSort($object, $options); + $options = $this->validateSort($target, $options); $options = $this->checkLimit($options); $options += ['cursor' => [], 'scope' => null]; - list($finder, $options) = $this->_extractFinder($options); - - if (empty($query)) { - $query = Query::fromQuery($object->find($finder, $options)); - } else { - $query = Query::fromQuery($query->applyOptions($options)); + if ($query === null) { + $args = []; + $type = $options['finder'] ?? 'all'; + if (is_array($type)) { + $args = (array)current($type); + $type = key($type); + } + $query = $target->find($type, ...$args); } + $query = Query::fromQuery($query->applyOptions($options)); $query->fromArray($options); $query->cursor($options['cursor']); - return $query->all(); + return $query->paginate(); } } diff --git a/src/Model/Behavior/LampagerBehavior.php b/src/Model/Behavior/LampagerBehavior.php index 106c936..44dc941 100644 --- a/src/Model/Behavior/LampagerBehavior.php +++ b/src/Model/Behavior/LampagerBehavior.php @@ -5,16 +5,12 @@ namespace Lampager\Cake\Model\Behavior; use Cake\ORM\Behavior; -use Cake\ORM\Table; use Lampager\Cake\ORM\Query; class LampagerBehavior extends Behavior { public function lampager(): Query { - $query = new Query($this->table()->getConnection(), $this->table()); - $query->select(); - - return $query; + return new Query($this->table()); } } diff --git a/src/ORM/Query.php b/src/ORM/Query.php index 37fa2ed..a271573 100644 --- a/src/ORM/Query.php +++ b/src/ORM/Query.php @@ -4,15 +4,15 @@ namespace Lampager\Cake\ORM; -use Cake\Database\Connection; use Cake\Database\Expression\OrderByExpression; use Cake\Database\Expression\OrderClauseExpression; use Cake\Database\Expression\QueryExpression; use Cake\Database\ExpressionInterface; +use Cake\Datasource\Paging\PaginatedInterface; use Cake\Datasource\ResultSetInterface; -use Cake\ORM\Query as BaseQuery; +use Cake\ORM\Query\SelectQuery; +use Cake\ORM\ResultSet; use Cake\ORM\Table; -use Lampager\Cake\PaginationResult; use Lampager\Cake\Paginator; use Lampager\Contracts\Cursor; use Lampager\Exceptions\Query\BadKeywordException; @@ -28,7 +28,7 @@ * @method $this unseekable(bool $unseekable = true) Define that the query can detect only either "has_previous" or "has_next". * @method $this fromArray(mixed[] $options) Define options from an associative array. */ -class Query extends BaseQuery +class Query extends SelectQuery { /** @var Paginator */ protected $_paginator; @@ -39,12 +39,11 @@ class Query extends BaseQuery /** * Construct query. * - * @param Connection $connection The connection object - * @param Table $table The table this query is starting on + * @param Table $table The table this query is starting on */ - public function __construct(Connection $connection, Table $table) + public function __construct(Table $table) { - parent::__construct($connection, $table); + parent::__construct($table); $this->_paginator = Paginator::create($this); } @@ -53,9 +52,9 @@ public function __construct(Connection $connection, Table $table) * Create query based on the existing query. This factory copies the internal * state of the given query to a new instance. */ - public static function fromQuery(BaseQuery $query) + public static function fromQuery(SelectQuery $query) { - $obj = new static($query->getConnection(), $query->getRepository()); + $obj = new static($query->getRepository()); foreach (get_object_vars($query) as $k => $v) { $obj->$k = $v; @@ -79,12 +78,20 @@ public function cursor($cursor = []) return $this; } + /** + * Execute query and paginate them. + */ + public function paginate(): PaginatedInterface + { + return $this->_paginator->paginate($this->_cursor); + } + /** * {@inheritdoc} */ - public function order($fields, $overwrite = false) + public function orderBy(ExpressionInterface|\Closure|array|string $fields, bool $overwrite = false) { - parent::order($fields, $overwrite); + parent::orderBy($fields, $overwrite); $this->_executeOrder($this->clause('order')); return $this; @@ -93,9 +100,9 @@ public function order($fields, $overwrite = false) /** * {@inheritdoc} */ - public function orderAsc($field, $overwrite = false) + public function orderByAsc(ExpressionInterface|\Closure|string $field, bool $overwrite = false) { - parent::orderAsc($field, $overwrite); + parent::orderByAsc($field, $overwrite); $this->_executeOrder($this->clause('order')); return $this; @@ -104,9 +111,9 @@ public function orderAsc($field, $overwrite = false) /** * {@inheritdoc} */ - public function orderDesc($field, $overwrite = false) + public function orderByDesc(ExpressionInterface|\Closure|string $field, bool $overwrite = false) { - parent::orderDesc($field, $overwrite); + parent::orderByDesc($field, $overwrite); $this->_executeOrder($this->clause('order')); return $this; @@ -125,11 +132,11 @@ public function limit($num) /** * {@inheritdoc} - * @return PaginationResult */ public function all(): ResultSetInterface { - return $this->_paginator->paginate($this->_cursor); + $items = $this->paginate()->items(); + return new ResultSet(is_array($items) ? $items : iterator_to_array($items)); } /** @@ -236,7 +243,7 @@ public function __call(string $method, array $arguments) return $this; } - return parent::__call($method, $arguments); + throw new \BadMethodCallException('Method ' . __CLASS__ . '::' . $method . ' does not exist'); } /** @@ -252,9 +259,8 @@ public function __debugInfo(): array 'params' => [], 'defaultTypes' => $this->getDefaultTypes(), 'decorators' => count($this->_resultDecorators), - 'executed' => (bool)$this->_iterator, + 'executed' => (bool)$this->_statement, 'hydrate' => $this->_hydrate, - 'buffered' => $this->_useBufferedResults, 'formatters' => count($this->_formatters), 'mapReducers' => count($this->_mapReduce), 'contain' => $this->_eagerLoader ? $this->_eagerLoader->getContain() : [], diff --git a/src/PaginationResult.php b/src/PaginationResult.php index 4118b43..a3b4bf3 100644 --- a/src/PaginationResult.php +++ b/src/PaginationResult.php @@ -4,92 +4,72 @@ namespace Lampager\Cake; -use Cake\Collection\CollectionTrait; -use Cake\Datasource\ResultSetInterface; -use Iterator; -use IteratorAggregate; +use Cake\Datasource\Paging\PaginatedInterface; +use Countable; +use JsonSerializable; use Lampager\PaginationResult as LampagerPaginationResult; -use Traversable; /** * Class PaginationResult - * - * This class intentionally does not extend \Lampager\PaginationResult - * but has the same signature because \Cake\Datasource\ResultSetInterface - * already implements \Iterator which conflicts with \IteratorAggregate. - * - * @property-read mixed $records - * @property-read null|bool $hasPrevious - * @property-read null|mixed $previousCursor - * @property-read null|bool $hasNext - * @property-read null|mixed $nextCursor */ -class PaginationResult implements ResultSetInterface +class PaginationResult extends LampagerPaginationResult implements JsonSerializable, PaginatedInterface { - /** @var LampagerPaginationResult */ - protected $result; + protected ?iterable $iterator = null; - /** @var Iterator */ - protected $iterator; - - use CollectionTrait; + protected int $limit; /** - * PaginationResult constructor. - * Merge $meta entries into $this. - * - * @param mixed $rows + * {@inheritdoc} */ - public function __construct($rows, array $meta) + public function currentPage(): int { - $this->result = new LampagerPaginationResult($rows, $meta); + return 0; } /** * {@inheritdoc} */ - public function current() + public function perPage(): int { - return $this->unwrap()->current(); + return $this->limit; } /** * {@inheritdoc} */ - public function key() + public function totalCount(): ?int { - return $this->unwrap()->key(); + return null; } /** * {@inheritdoc} */ - public function next() + public function pageCount(): ?int { - $this->unwrap()->next(); + return null; } /** * {@inheritdoc} */ - public function rewind() + public function hasPrevPage(): bool { - $this->unwrap()->rewind(); + return (bool)$this->hasPrevious; } /** * {@inheritdoc} */ - public function valid() + public function hasNextPage(): bool { - return $this->unwrap()->valid(); + return (bool)$this->hasNext; } /** * {@inheritdoc} - * @return Iterator */ - public function unwrap(): Traversable + public function items(): iterable { if (!$this->iterator) { $this->iterator = $this->getIterator(); @@ -101,68 +81,48 @@ public function unwrap(): Traversable /** * {@inheritdoc} */ - public function toArray(bool $preserveKeys = true): array - { - $array = (array)$this->result; - $array['records'] = iterator_to_array($this->unwrap()); - - return $array; - } - - /** - * {@inheritdoc} - */ - public function jsonSerialize(): array + public function pagingParam(string $name): mixed { - return $this->toArray(); + return $this->pagingParams()[$name] ?? null; } /** * {@inheritdoc} */ - public function serialize() + public function pagingParams(): array { - return json_encode($this->jsonSerialize()); + return [ + 'count' => $this->count(), + 'totalCount' => $this->totalCount(), + 'perPage' => $this->perPage(), + 'pageCount' => $this->pageCount(), + 'currentPage' => $this->currentPage(), + 'hasPrevPage' => $this->hasPrevPage(), + 'hasNextPage' => $this->hasNextPage(), + ]; } /** * {@inheritdoc} */ - public function unserialize($serialized) - { - $obj = json_decode($serialized, true); - $meta = $obj; - unset($meta['records']); - - $this->result = new LampagerPaginationResult($obj['records'], $meta); - } - - protected function getIterator(): Iterator + public function jsonSerialize(): array { - /** @var Iterator|IteratorAggregate */ - $iterator = $this->result->getIterator(); + $items = $this->items(); + $array = get_object_vars($this); + $array['records'] = is_array($items) ? $items : iterator_to_array($items); + unset($array['iterator']); + unset($array['limit']); - if ($iterator instanceof IteratorAggregate) { - $iterator = $iterator->getIterator(); - } - - return $iterator; + return $array; } /** - * @param string $name The name of the parameter to fetch + * {@inheritdoc} */ - public function __get(string $name) + public function count(): int { - if (property_exists($this->result, $name)) { - return $this->result->{$name}; - } - - $trace = debug_backtrace(); - trigger_error( - 'Undefined property via __get(): ' . $name . ' in ' . $trace[0]['file'] . ' on line ' . $trace[0]['line'], - E_USER_NOTICE - ); + $items = $this->items(); + return $items instanceof Countable ? count($items) : iterator_count($items); } /** diff --git a/src/Paginator.php b/src/Paginator.php index d71a301..9fab457 100644 --- a/src/Paginator.php +++ b/src/Paginator.php @@ -4,7 +4,7 @@ namespace Lampager\Cake; -use Cake\ORM\Query; +use Cake\ORM\Query\SelectQuery; use Cake\ORM\Table; use Generator; use Lampager\Concerns\HasProcessor; @@ -22,7 +22,7 @@ class Paginator extends BasePaginator { use HasProcessor; - /** @var Query $builder */ + /** @var SelectQuery $builder */ public $builder; /** @@ -30,7 +30,7 @@ class Paginator extends BasePaginator * * @return static */ - public static function create(Query $builder) + public static function create(SelectQuery $builder) { return new static($builder); } @@ -38,7 +38,7 @@ public static function create(Query $builder) /** * Construct paginator. */ - public function __construct(Query $builder) + public function __construct(SelectQuery $builder) { $this->builder = $builder; $this->processor = new ArrayProcessor(); @@ -47,7 +47,7 @@ public function __construct(Query $builder) /** * Build CakePHP Query instance from Lampager Query config. */ - public function transform(LampagerQuery $query): Query + public function transform(LampagerQuery $query): SelectQuery { return $this->compileSelectOrUnionAll($query->selectOrUnionAll()); } @@ -57,7 +57,7 @@ public function transform(LampagerQuery $query): Query * * @param Cursor|int[]|string[] $cursor */ - public function build($cursor = []): Query + public function build($cursor = []): SelectQuery { return $this->transform($this->configure($cursor)); } @@ -74,7 +74,7 @@ public function paginate($cursor = []) return $this->process($query, $this->transform($query)->toArray()); } - protected function compileSelectOrUnionAll(SelectOrUnionAll $selectOrUnionAll): Query + protected function compileSelectOrUnionAll(SelectOrUnionAll $selectOrUnionAll): SelectQuery { if ($selectOrUnionAll instanceof Select) { return $this->compileSelect($selectOrUnionAll); @@ -91,7 +91,7 @@ protected function compileSelectOrUnionAll(SelectOrUnionAll $selectOrUnionAll): // @codeCoverageIgnoreEnd } - protected function compileSelect(Select $select): Query + protected function compileSelect(Select $select): SelectQuery { if ($this->builder->clause('group') || $this->builder->clause('union')) { throw new InsufficientConstraintsException('group()/union() are not supported'); @@ -100,7 +100,7 @@ protected function compileSelect(Select $select): Query /** @var Table $repository */ $repository = $this->builder->getRepository(); - /** @var Query $builder */ + /** @var SelectQuery $builder */ $builder = $repository->selectQuery() ->where($this->builder->clause('where')) ->modifier($this->builder->clause('modifier')) @@ -119,7 +119,7 @@ protected function compileSelect(Select $select): Query /** * @return $this */ - protected function compileWhere(Query $builder, Select $select) + protected function compileWhere(SelectQuery $builder, Select $select) { $conditions = []; foreach ($select->where() as $group) { @@ -145,7 +145,7 @@ protected function compileWhereGroup(ConditionGroup $group): Generator /** * @return $this */ - protected function compileOrderBy(Query $builder, Select $select) + protected function compileOrderBy(SelectQuery $builder, Select $select) { $alias = $builder->getRepository()->getAlias(); @@ -154,7 +154,7 @@ protected function compileOrderBy(Query $builder, Select $select) if (strpos($column, '.') === false) { $column = $alias . '.' . $column; } - $builder->order([$column => $order->order()], $i === 0); + $builder->orderBy([$column => $order->order()], $i === 0); } return $this; } @@ -162,7 +162,7 @@ protected function compileOrderBy(Query $builder, Select $select) /** * @return $this */ - protected function compileLimit(Query $builder, Select $select) + protected function compileLimit(SelectQuery $builder, Select $select) { $builder->limit($select->limit()->toInteger()); return $this; diff --git a/tests/Fixture/PostsFixture.php b/tests/Fixture/PostsFixture.php index 4a88b2f..88f4b02 100644 --- a/tests/Fixture/PostsFixture.php +++ b/tests/Fixture/PostsFixture.php @@ -8,7 +8,7 @@ class PostsFixture extends TestFixture { - public $records = [ + public array $records = [ ['id' => 1, 'modified' => '2017-01-01 10:00:00'], ['id' => 3, 'modified' => '2017-01-01 10:00:00'], ['id' => 5, 'modified' => '2017-01-01 10:00:00'], diff --git a/tests/TestCase/Database/SqliteCompilerTest.php b/tests/TestCase/Database/SqliteCompilerTest.php index f374d4d..3bb8aad 100644 --- a/tests/TestCase/Database/SqliteCompilerTest.php +++ b/tests/TestCase/Database/SqliteCompilerTest.php @@ -10,7 +10,7 @@ class SqliteCompilerTest extends TestCase { - public $fixtures = [ + public array $fixtures = [ 'plugin.Lampager\\Cake.Posts', ]; diff --git a/tests/TestCase/Datasource/PaginatorTest.php b/tests/TestCase/Datasource/PaginatorTest.php index 2d3e9bd..f6e560b 100644 --- a/tests/TestCase/Datasource/PaginatorTest.php +++ b/tests/TestCase/Datasource/PaginatorTest.php @@ -7,7 +7,8 @@ use Cake\Controller\Controller; use Cake\Database\Expression\OrderClauseExpression; use Cake\Datasource\QueryInterface; -use Cake\I18n\FrozenTime; +use Cake\Http\ServerRequest; +use Cake\I18n\DateTime; use Cake\ORM\Entity; use Cake\ORM\Table; use Exception; @@ -21,7 +22,7 @@ class PaginatorTest extends TestCase { - public $fixtures = [ + public array $fixtures = [ 'plugin.Lampager\\Cake.Posts', ]; @@ -31,11 +32,13 @@ class PaginatorTest extends TestCase */ public function testPaginateTable(callable $factory, PaginationResult $expected): void { - $controller = new Controller(); - $controller->Posts = null; - $controller->paginate = [ - 'className' => Paginator::class, - ]; + $controller = new class(new ServerRequest()) extends Controller { + public $Posts = null; + + public array $paginate = [ + 'className' => Paginator::class, + ]; + }; $posts = $controller->fetchTable('Posts'); @@ -49,14 +52,42 @@ public function testPaginateTable(callable $factory, PaginationResult $expected) * @dataProvider valueProvider * @dataProvider queryExpressionProvider */ - public function testPaginateCakeQuery(callable $factory, PaginationResult $expected): void + public function testPaginateTableFinder(callable $factory, PaginationResult $expected): void { - $controller = new Controller(); - $controller->Posts = null; - $controller->paginate = [ - 'className' => Paginator::class, + $controller = new class(new ServerRequest()) extends Controller { + public $Posts = null; + + public array $paginate = [ + 'className' => Paginator::class, + ]; + }; + + $posts = $controller->fetchTable('Posts'); + + /** @var mixed[] $options */ + $options = $factory($posts) + [ + 'finder' => [ + 'all' => [], + ], ]; + $this->assertJsonEquals($expected, $controller->paginate('Posts', $options)); + } + + /** + * @dataProvider valueProvider + * @dataProvider queryExpressionProvider + */ + public function testPaginateCakeQuery(callable $factory, PaginationResult $expected): void + { + $controller = new class(new ServerRequest()) extends Controller { + public $Posts = null; + + public array $paginate = [ + 'className' => Paginator::class, + ]; + }; + $posts = $controller->fetchTable('Posts'); /** @var mixed[] $options */ @@ -65,6 +96,32 @@ public function testPaginateCakeQuery(callable $factory, PaginationResult $expec $this->assertJsonEquals($expected, $controller->paginate($posts->find('all'), $options)); } + /** + * @dataProvider valueProvider + * @dataProvider queryExpressionProvider + */ + public function testPaginateExtraSettings(callable $factory): void + { + $controller = new class(new ServerRequest()) extends Controller { + public $Posts = null; + + public array $paginate = [ + 'className' => Paginator::class, + ]; + }; + + $posts = $controller->fetchTable('Posts'); + + /** @var mixed[] $options */ + $options = $factory($posts) + [ + 'extraOption' => true, + ]; + + $this->expectWarningMessageMatches('/Extra keys found are: `extraOption`\./', function () use ($controller, $options) { + $controller->paginate('Posts', $options); + }); + } + /** * @dataProvider valueProvider * @dataProvider queryExpressionProvider @@ -74,11 +131,13 @@ public function testPaginateLampagerCakeQuery(callable $factory): void $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('Lampager\Cake\ORM\Query cannot be paginated by Lampager\Cake\Datasource\Paginator::paginate()'); - $controller = new Controller(); - $controller->Posts = null; - $controller->paginate = [ - 'className' => Paginator::class, - ]; + $controller = new class(new ServerRequest()) extends Controller { + public $Posts = null; + + public array $paginate = [ + 'className' => Paginator::class, + ]; + }; /** @var LampagerBehavior&Table $posts */ $posts = $controller->fetchTable('Posts'); @@ -95,11 +154,13 @@ public function testPaginateInvalidQuery(): void $this->expectException(Exception::class); $this->expectExceptionMessage('No repository set for query.'); - $controller = new Controller(); - $controller->Posts = null; - $controller->paginate = [ - 'className' => Paginator::class, - ]; + $controller = new class(new ServerRequest()) extends Controller { + public $Posts = null; + + public array $paginate = [ + 'className' => Paginator::class, + ]; + }; /** @var MockObject&QueryInterface $query */ $query = $this->getMockBuilder(QueryInterface::class)->getMock(); @@ -108,7 +169,7 @@ public function testPaginateInvalidQuery(): void $controller->paginate($query); } - public function valueProvider(): Generator + public static function valueProvider(): Generator { yield 'Ascending forward start inclusive' => [ function () { @@ -126,15 +187,15 @@ function () { [ new Entity([ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ @@ -143,7 +204,7 @@ function () { 'hasNext' => true, 'nextCursor' => [ 'Posts.id' => 2, - 'Posts.modified' => new FrozenTime('2017-01-01 11:00:00'), + 'Posts.modified' => new DateTime('2017-01-01 11:00:00'), ], ] ), @@ -166,15 +227,15 @@ function () { [ new Entity([ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ @@ -183,7 +244,7 @@ function () { 'hasNext' => true, 'nextCursor' => [ 'Posts.id' => 5, - 'Posts.modified' => new FrozenTime('2017-01-01 10:00:00'), + 'Posts.modified' => new DateTime('2017-01-01 10:00:00'), ], ] ), @@ -201,7 +262,7 @@ function () { ], 'cursor' => [ 'Posts.id' => 3, - 'Posts.modified' => new FrozenTime('2017-01-01 10:00:00'), + 'Posts.modified' => new DateTime('2017-01-01 10:00:00'), ], ]; }, @@ -209,27 +270,27 @@ function () { [ new Entity([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 2, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), ], [ 'hasPrevious' => true, 'previousCursor' => [ 'Posts.id' => 1, - 'Posts.modified' => new FrozenTime('2017-01-01 10:00:00'), + 'Posts.modified' => new DateTime('2017-01-01 10:00:00'), ], 'hasNext' => true, 'nextCursor' => [ 'Posts.id' => 4, - 'Posts.modified' => new FrozenTime('2017-01-01 11:00:00'), + 'Posts.modified' => new DateTime('2017-01-01 11:00:00'), ], ] ), @@ -248,7 +309,7 @@ function () { ], 'cursor' => [ 'Posts.id' => 3, - 'Posts.modified' => new FrozenTime('2017-01-01 10:00:00'), + 'Posts.modified' => new DateTime('2017-01-01 10:00:00'), ], ]; }, @@ -256,22 +317,22 @@ function () { [ new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 2, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), new Entity([ 'id' => 4, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), ], [ 'hasPrevious' => true, 'previousCursor' => [ 'Posts.id' => 5, - 'Posts.modified' => new FrozenTime('2017-01-01 10:00:00'), + 'Posts.modified' => new DateTime('2017-01-01 10:00:00'), ], 'hasNext' => false, 'nextCursor' => null, @@ -295,22 +356,22 @@ function () { [ new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 2, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), new Entity([ 'id' => 4, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), ], [ 'hasPrevious' => true, 'previousCursor' => [ 'Posts.id' => 3, - 'Posts.modified' => new FrozenTime('2017-01-01 10:00:00'), + 'Posts.modified' => new DateTime('2017-01-01 10:00:00'), ], 'hasNext' => null, 'nextCursor' => null, @@ -335,22 +396,22 @@ function () { [ new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 2, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), new Entity([ 'id' => 4, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), ], [ 'hasPrevious' => true, 'previousCursor' => [ 'Posts.id' => 5, - 'Posts.modified' => new FrozenTime('2017-01-01 10:00:00'), + 'Posts.modified' => new DateTime('2017-01-01 10:00:00'), ], 'hasNext' => null, 'nextCursor' => null, @@ -370,7 +431,7 @@ function () { ], 'cursor' => [ 'Posts.id' => 3, - 'Posts.modified' => new FrozenTime('2017-01-01 10:00:00'), + 'Posts.modified' => new DateTime('2017-01-01 10:00:00'), ], ]; }, @@ -378,11 +439,11 @@ function () { [ new Entity([ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ @@ -391,7 +452,7 @@ function () { 'hasNext' => true, 'nextCursor' => [ 'Posts.id' => 5, - 'Posts.modified' => new FrozenTime('2017-01-01 10:00:00'), + 'Posts.modified' => new DateTime('2017-01-01 10:00:00'), ], ] ), @@ -410,7 +471,7 @@ function () { ], 'cursor' => [ 'Posts.id' => 3, - 'Posts.modified' => new FrozenTime('2017-01-01 10:00:00'), + 'Posts.modified' => new DateTime('2017-01-01 10:00:00'), ], ]; }, @@ -418,7 +479,7 @@ function () { [ new Entity([ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ @@ -427,7 +488,7 @@ function () { 'hasNext' => true, 'nextCursor' => [ 'Posts.id' => 1, - 'Posts.modified' => new FrozenTime('2017-01-01 10:00:00'), + 'Posts.modified' => new DateTime('2017-01-01 10:00:00'), ], ] ), @@ -449,15 +510,15 @@ function () { [ new Entity([ 'id' => 4, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), new Entity([ 'id' => 2, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ @@ -466,7 +527,7 @@ function () { 'hasNext' => true, 'nextCursor' => [ 'Posts.id' => 3, - 'Posts.modified' => new FrozenTime('2017-01-01 10:00:00'), + 'Posts.modified' => new DateTime('2017-01-01 10:00:00'), ], ] ), @@ -489,15 +550,15 @@ function () { [ new Entity([ 'id' => 4, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), new Entity([ 'id' => 2, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ @@ -506,7 +567,7 @@ function () { 'hasNext' => true, 'nextCursor' => [ 'Posts.id' => 5, - 'Posts.modified' => new FrozenTime('2017-01-01 10:00:00'), + 'Posts.modified' => new DateTime('2017-01-01 10:00:00'), ], ] ), @@ -524,7 +585,7 @@ function () { ], 'cursor' => [ 'Posts.id' => 3, - 'Posts.modified' => new FrozenTime('2017-01-01 10:00:00'), + 'Posts.modified' => new DateTime('2017-01-01 10:00:00'), ], ]; }, @@ -532,18 +593,18 @@ function () { [ new Entity([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ 'hasPrevious' => true, 'previousCursor' => [ 'Posts.id' => 5, - 'Posts.modified' => new FrozenTime('2017-01-01 10:00:00'), + 'Posts.modified' => new DateTime('2017-01-01 10:00:00'), ], 'hasNext' => false, 'nextCursor' => null, @@ -564,7 +625,7 @@ function () { ], 'cursor' => [ 'Posts.id' => 3, - 'Posts.modified' => new FrozenTime('2017-01-01 10:00:00'), + 'Posts.modified' => new DateTime('2017-01-01 10:00:00'), ], ]; }, @@ -572,14 +633,14 @@ function () { [ new Entity([ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ 'hasPrevious' => true, 'previousCursor' => [ 'Posts.id' => 1, - 'Posts.modified' => new FrozenTime('2017-01-01 10:00:00'), + 'Posts.modified' => new DateTime('2017-01-01 10:00:00'), ], 'hasNext' => false, 'nextCursor' => null, @@ -603,22 +664,22 @@ function () { [ new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ 'hasPrevious' => true, 'previousCursor' => [ 'Posts.id' => 2, - 'Posts.modified' => new FrozenTime('2017-01-01 11:00:00'), + 'Posts.modified' => new DateTime('2017-01-01 11:00:00'), ], 'hasNext' => null, 'nextCursor' => null, @@ -643,22 +704,22 @@ function () { [ new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ 'hasPrevious' => true, 'previousCursor' => [ 'Posts.id' => 5, - 'Posts.modified' => new FrozenTime('2017-01-01 10:00:00'), + 'Posts.modified' => new DateTime('2017-01-01 10:00:00'), ], 'hasNext' => null, 'nextCursor' => null, @@ -678,7 +739,7 @@ function () { ], 'cursor' => [ 'Posts.id' => 3, - 'Posts.modified' => new FrozenTime('2017-01-01 10:00:00'), + 'Posts.modified' => new DateTime('2017-01-01 10:00:00'), ], ]; }, @@ -686,27 +747,27 @@ function () { [ new Entity([ 'id' => 2, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ 'hasPrevious' => true, 'previousCursor' => [ 'Posts.id' => 4, - 'Posts.modified' => new FrozenTime('2017-01-01 11:00:00'), + 'Posts.modified' => new DateTime('2017-01-01 11:00:00'), ], 'hasNext' => true, 'nextCursor' => [ 'Posts.id' => 1, - 'Posts.modified' => new FrozenTime('2017-01-01 10:00:00'), + 'Posts.modified' => new DateTime('2017-01-01 10:00:00'), ], ] ), @@ -725,7 +786,7 @@ function () { ], 'cursor' => [ 'Posts.id' => 3, - 'Posts.modified' => new FrozenTime('2017-01-01 10:00:00'), + 'Posts.modified' => new DateTime('2017-01-01 10:00:00'), ], ]; }, @@ -733,15 +794,15 @@ function () { [ new Entity([ 'id' => 4, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), new Entity([ 'id' => 2, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ @@ -750,14 +811,14 @@ function () { 'hasNext' => true, 'nextCursor' => [ 'Posts.id' => 5, - 'Posts.modified' => new FrozenTime('2017-01-01 10:00:00'), + 'Posts.modified' => new DateTime('2017-01-01 10:00:00'), ], ] ), ]; } - public function queryExpressionProvider(): Generator + public static function queryExpressionProvider(): Generator { yield 'Ascending forward start inclusive with QueryExpression' => [ function () { @@ -775,15 +836,15 @@ function () { [ new Entity([ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ @@ -792,7 +853,7 @@ function () { 'hasNext' => true, 'nextCursor' => [ 'id' => 2, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ], ] ), @@ -815,15 +876,15 @@ function () { [ new Entity([ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ @@ -832,7 +893,7 @@ function () { 'hasNext' => true, 'nextCursor' => [ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], ] ), @@ -850,7 +911,7 @@ function () { ], 'cursor' => [ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], ]; }, @@ -858,27 +919,27 @@ function () { [ new Entity([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 2, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), ], [ 'hasPrevious' => true, 'previousCursor' => [ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], 'hasNext' => true, 'nextCursor' => [ 'id' => 4, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ], ] ), @@ -897,7 +958,7 @@ function () { ], 'cursor' => [ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], ]; }, @@ -905,22 +966,22 @@ function () { [ new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 2, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), new Entity([ 'id' => 4, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), ], [ 'hasPrevious' => true, 'previousCursor' => [ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], 'hasNext' => false, 'nextCursor' => null, @@ -944,22 +1005,22 @@ function () { [ new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 2, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), new Entity([ 'id' => 4, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), ], [ 'hasPrevious' => true, 'previousCursor' => [ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], 'hasNext' => null, 'nextCursor' => null, @@ -984,22 +1045,22 @@ function () { [ new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 2, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), new Entity([ 'id' => 4, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), ], [ 'hasPrevious' => true, 'previousCursor' => [ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], 'hasNext' => null, 'nextCursor' => null, @@ -1019,7 +1080,7 @@ function () { ], 'cursor' => [ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], ]; }, @@ -1027,11 +1088,11 @@ function () { [ new Entity([ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ @@ -1040,7 +1101,7 @@ function () { 'hasNext' => true, 'nextCursor' => [ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], ] ), @@ -1059,7 +1120,7 @@ function () { ], 'cursor' => [ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], ]; }, @@ -1067,7 +1128,7 @@ function () { [ new Entity([ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ @@ -1076,7 +1137,7 @@ function () { 'hasNext' => true, 'nextCursor' => [ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], ] ), @@ -1098,15 +1159,15 @@ function () { [ new Entity([ 'id' => 4, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), new Entity([ 'id' => 2, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ @@ -1115,7 +1176,7 @@ function () { 'hasNext' => true, 'nextCursor' => [ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], ] ), @@ -1138,15 +1199,15 @@ function () { [ new Entity([ 'id' => 4, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), new Entity([ 'id' => 2, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ @@ -1155,7 +1216,7 @@ function () { 'hasNext' => true, 'nextCursor' => [ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], ] ), @@ -1173,7 +1234,7 @@ function () { ], 'cursor' => [ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], ]; }, @@ -1181,18 +1242,18 @@ function () { [ new Entity([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ 'hasPrevious' => true, 'previousCursor' => [ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], 'hasNext' => false, 'nextCursor' => null, @@ -1213,7 +1274,7 @@ function () { ], 'cursor' => [ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], ]; }, @@ -1221,14 +1282,14 @@ function () { [ new Entity([ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ 'hasPrevious' => true, 'previousCursor' => [ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], 'hasNext' => false, 'nextCursor' => null, @@ -1252,22 +1313,22 @@ function () { [ new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ 'hasPrevious' => true, 'previousCursor' => [ 'id' => 2, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ], 'hasNext' => null, 'nextCursor' => null, @@ -1292,22 +1353,22 @@ function () { [ new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ 'hasPrevious' => true, 'previousCursor' => [ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], 'hasNext' => null, 'nextCursor' => null, @@ -1327,7 +1388,7 @@ function () { ], 'cursor' => [ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], ]; }, @@ -1335,27 +1396,27 @@ function () { [ new Entity([ 'id' => 2, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ 'hasPrevious' => true, 'previousCursor' => [ 'id' => 4, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ], 'hasNext' => true, 'nextCursor' => [ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], ] ), @@ -1374,7 +1435,7 @@ function () { ], 'cursor' => [ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], ]; }, @@ -1382,15 +1443,15 @@ function () { [ new Entity([ 'id' => 4, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), new Entity([ 'id' => 2, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ @@ -1399,7 +1460,7 @@ function () { 'hasNext' => true, 'nextCursor' => [ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], ] ), diff --git a/tests/TestCase/Model/ArrayProcessorTest.php b/tests/TestCase/Model/ArrayProcessorTest.php index 15e5ec8..ce73769 100644 --- a/tests/TestCase/Model/ArrayProcessorTest.php +++ b/tests/TestCase/Model/ArrayProcessorTest.php @@ -4,7 +4,7 @@ namespace Lampager\Cake\Test\TestCase\Model; -use Cake\I18n\FrozenTime; +use Cake\I18n\DateTime; use Cake\ORM\Entity; use Cake\ORM\Table; use Generator; @@ -42,7 +42,7 @@ public function testProcess(array $options, ?array $cursor, array $rows, Paginat $this->assertEquals($expected, $actual); } - public function processProvider(): Generator + public static function processProvider(): Generator { yield 'Option has prefix but entity does not have prefix' => [ [ @@ -56,55 +56,56 @@ public function processProvider(): Generator ], [ 'Posts.id' => 3, - 'Posts.modified' => new FrozenTime('2017-01-01 10:00:00'), + 'Posts.modified' => new DateTime('2017-01-01 10:00:00'), ], [ new Entity([ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 2, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), new Entity([ 'id' => 4, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), ], new PaginationResult( [ new Entity([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 2, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), ], [ 'hasPrevious' => true, 'previousCursor' => [ 'Posts.id' => 1, - 'Posts.modified' => new FrozenTime('2017-01-01 10:00:00'), + 'Posts.modified' => new DateTime('2017-01-01 10:00:00'), ], 'hasNext' => true, 'nextCursor' => [ 'Posts.id' => 4, - 'Posts.modified' => new FrozenTime('2017-01-01 11:00:00'), + 'Posts.modified' => new DateTime('2017-01-01 11:00:00'), ], + 'limit' => 3, ] ), ]; @@ -121,55 +122,56 @@ public function processProvider(): Generator ], [ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], [ new Entity([ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 2, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), new Entity([ 'id' => 4, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), ], new PaginationResult( [ new Entity([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 2, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), ], [ 'hasPrevious' => true, 'previousCursor' => [ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], 'hasNext' => true, 'nextCursor' => [ 'id' => 4, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ], + 'limit' => 3, ] ), ]; @@ -186,55 +188,56 @@ public function processProvider(): Generator ], [ 'id' => 3, - 'Posts.modified' => new FrozenTime('2017-01-01 10:00:00'), + 'Posts.modified' => new DateTime('2017-01-01 10:00:00'), ], [ new Entity([ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 2, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), new Entity([ 'id' => 4, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), ], new PaginationResult( [ new Entity([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 2, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), ], [ 'hasPrevious' => true, 'previousCursor' => [ 'id' => 1, - 'Posts.modified' => new FrozenTime('2017-01-01 10:00:00'), + 'Posts.modified' => new DateTime('2017-01-01 10:00:00'), ], 'hasNext' => true, 'nextCursor' => [ 'id' => 4, - 'Posts.modified' => new FrozenTime('2017-01-01 11:00:00'), + 'Posts.modified' => new DateTime('2017-01-01 11:00:00'), ], + 'limit' => 3, ] ), ]; diff --git a/tests/TestCase/Model/Behavior/LampagerBehaviorTest.php b/tests/TestCase/Model/Behavior/LampagerBehaviorTest.php index 2b9bb7c..7147da2 100644 --- a/tests/TestCase/Model/Behavior/LampagerBehaviorTest.php +++ b/tests/TestCase/Model/Behavior/LampagerBehaviorTest.php @@ -4,7 +4,7 @@ namespace Lampager\Cake\Test\TestCase\Model\Behavior; -use Cake\I18n\FrozenTime; +use Cake\I18n\DateTime; use Cake\ORM\Entity; use Cake\ORM\Table; use Cake\ORM\TableRegistry; @@ -16,7 +16,7 @@ class LampagerBehaviorTest extends TestCase { - public $fixtures = [ + public array $fixtures = [ 'plugin.Lampager\\Cake.Posts', ]; @@ -32,10 +32,10 @@ public function testLampager(callable $factory, PaginationResult $expected): voi /** @var Query $query */ $query = $factory($posts); - $this->assertJsonEquals($expected, $query->all()); + $this->assertJsonEquals($expected, $query->paginate()); } - public function valueProvider(): Generator + public static function valueProvider(): Generator { yield 'Ascending forward start inclusive' => [ function (Table $posts) { @@ -44,22 +44,22 @@ function (Table $posts) { ->forward() ->seekable() ->limit(3) - ->orderAsc('modified') - ->orderAsc('id'); + ->orderByAsc('modified') + ->orderByAsc('id'); }, new PaginationResult( [ new Entity([ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ @@ -68,7 +68,7 @@ function (Table $posts) { 'hasNext' => true, 'nextCursor' => [ 'id' => 2, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ], ] ), @@ -82,22 +82,22 @@ function (Table $posts) { ->seekable() ->exclusive() ->limit(3) - ->orderAsc('modified') - ->orderAsc('id'); + ->orderByAsc('modified') + ->orderByAsc('id'); }, new PaginationResult( [ new Entity([ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ @@ -106,7 +106,7 @@ function (Table $posts) { 'hasNext' => true, 'nextCursor' => [ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], ] ), @@ -119,38 +119,38 @@ function (Table $posts) { ->forward() ->seekable() ->limit(3) - ->orderAsc('modified') - ->orderAsc('id') + ->orderByAsc('modified') + ->orderByAsc('id') ->cursor([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]); }, new PaginationResult( [ new Entity([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 2, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), ], [ 'hasPrevious' => true, 'previousCursor' => [ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], 'hasNext' => true, 'nextCursor' => [ 'id' => 4, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ], ] ), @@ -164,33 +164,33 @@ function (Table $posts) { ->seekable() ->exclusive() ->limit(3) - ->orderAsc('modified') - ->orderAsc('id') + ->orderByAsc('modified') + ->orderByAsc('id') ->cursor([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]); }, new PaginationResult( [ new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 2, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), new Entity([ 'id' => 4, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), ], [ 'hasPrevious' => true, 'previousCursor' => [ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], 'hasNext' => false, 'nextCursor' => null, @@ -205,29 +205,29 @@ function (Table $posts) { ->backward() ->seekable() ->limit(3) - ->orderAsc('modified') - ->orderAsc('id'); + ->orderByAsc('modified') + ->orderByAsc('id'); }, new PaginationResult( [ new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 2, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), new Entity([ 'id' => 4, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), ], [ 'hasPrevious' => true, 'previousCursor' => [ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], 'hasNext' => null, 'nextCursor' => null, @@ -243,29 +243,29 @@ function (Table $posts) { ->seekable() ->exclusive() ->limit(3) - ->orderAsc('modified') - ->orderAsc('id'); + ->orderByAsc('modified') + ->orderByAsc('id'); }, new PaginationResult( [ new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 2, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), new Entity([ 'id' => 4, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), ], [ 'hasPrevious' => true, 'previousCursor' => [ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], 'hasNext' => null, 'nextCursor' => null, @@ -280,22 +280,22 @@ function (Table $posts) { ->backward() ->seekable() ->limit(3) - ->orderAsc('modified') - ->orderAsc('id') + ->orderByAsc('modified') + ->orderByAsc('id') ->cursor([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]); }, new PaginationResult( [ new Entity([ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ @@ -304,7 +304,7 @@ function (Table $posts) { 'hasNext' => true, 'nextCursor' => [ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], ] ), @@ -318,18 +318,18 @@ function (Table $posts) { ->seekable() ->exclusive() ->limit(3) - ->orderAsc('modified') - ->orderAsc('id') + ->orderByAsc('modified') + ->orderByAsc('id') ->cursor([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]); }, new PaginationResult( [ new Entity([ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ @@ -338,7 +338,7 @@ function (Table $posts) { 'hasNext' => true, 'nextCursor' => [ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], ] ), @@ -351,22 +351,22 @@ function (Table $posts) { ->forward() ->seekable() ->limit(3) - ->orderDesc('modified') - ->orderDesc('id'); + ->orderByDesc('modified') + ->orderByDesc('id'); }, new PaginationResult( [ new Entity([ 'id' => 4, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), new Entity([ 'id' => 2, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ @@ -375,7 +375,7 @@ function (Table $posts) { 'hasNext' => true, 'nextCursor' => [ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], ] ), @@ -389,22 +389,22 @@ function (Table $posts) { ->seekable() ->exclusive() ->limit(3) - ->orderDesc('modified') - ->orderDesc('id'); + ->orderByDesc('modified') + ->orderByDesc('id'); }, new PaginationResult( [ new Entity([ 'id' => 4, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), new Entity([ 'id' => 2, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ @@ -413,7 +413,7 @@ function (Table $posts) { 'hasNext' => true, 'nextCursor' => [ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], ] ), @@ -426,29 +426,29 @@ function (Table $posts) { ->forward() ->seekable() ->limit(3) - ->orderDesc('modified') - ->orderDesc('id') + ->orderByDesc('modified') + ->orderByDesc('id') ->cursor([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]); }, new PaginationResult( [ new Entity([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ 'hasPrevious' => true, 'previousCursor' => [ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], 'hasNext' => false, 'nextCursor' => null, @@ -464,25 +464,25 @@ function (Table $posts) { ->seekable() ->exclusive() ->limit(3) - ->orderDesc('modified') - ->orderDesc('id') + ->orderByDesc('modified') + ->orderByDesc('id') ->cursor([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]); }, new PaginationResult( [ new Entity([ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ 'hasPrevious' => true, 'previousCursor' => [ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], 'hasNext' => false, 'nextCursor' => null, @@ -497,29 +497,29 @@ function (Table $posts) { ->backward() ->seekable() ->limit(3) - ->orderDesc('modified') - ->orderDesc('id'); + ->orderByDesc('modified') + ->orderByDesc('id'); }, new PaginationResult( [ new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ 'hasPrevious' => true, 'previousCursor' => [ 'id' => 2, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ], 'hasNext' => null, 'nextCursor' => null, @@ -535,29 +535,29 @@ function (Table $posts) { ->seekable() ->exclusive() ->limit(3) - ->orderDesc('modified') - ->orderDesc('id'); + ->orderByDesc('modified') + ->orderByDesc('id'); }, new PaginationResult( [ new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ 'hasPrevious' => true, 'previousCursor' => [ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], 'hasNext' => null, 'nextCursor' => null, @@ -572,38 +572,38 @@ function (Table $posts) { ->backward() ->seekable() ->limit(3) - ->orderDesc('modified') - ->orderDesc('id') + ->orderByDesc('modified') + ->orderByDesc('id') ->cursor([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]); }, new PaginationResult( [ new Entity([ 'id' => 2, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ 'hasPrevious' => true, 'previousCursor' => [ 'id' => 4, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ], 'hasNext' => true, 'nextCursor' => [ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], ] ), @@ -617,26 +617,26 @@ function (Table $posts) { ->seekable() ->exclusive() ->limit(3) - ->orderDesc('modified') - ->orderDesc('id') + ->orderByDesc('modified') + ->orderByDesc('id') ->cursor([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]); }, new PaginationResult( [ new Entity([ 'id' => 4, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), new Entity([ 'id' => 2, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ @@ -645,14 +645,14 @@ function (Table $posts) { 'hasNext' => true, 'nextCursor' => [ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], ] ), ]; } - public function queryExpressionProvider(): Generator + public static function queryExpressionProvider(): Generator { yield 'Ascending forward start inclusive with QueryExpression' => [ function (Table $posts) { @@ -661,22 +661,22 @@ function (Table $posts) { ->forward() ->seekable() ->limit(3) - ->orderAsc($posts->selectQuery()->expr('modified')) - ->orderAsc($posts->selectQuery()->expr('id')); + ->orderByAsc($posts->selectQuery()->expr('modified')) + ->orderByAsc($posts->selectQuery()->expr('id')); }, new PaginationResult( [ new Entity([ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ @@ -685,7 +685,7 @@ function (Table $posts) { 'hasNext' => true, 'nextCursor' => [ 'id' => 2, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ], ] ), @@ -698,38 +698,38 @@ function (Table $posts) { ->forward() ->seekable() ->limit(3) - ->orderAsc($posts->selectQuery()->expr('modified')) - ->orderAsc($posts->selectQuery()->expr('id')) + ->orderByAsc($posts->selectQuery()->expr('modified')) + ->orderByAsc($posts->selectQuery()->expr('id')) ->cursor([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]); }, new PaginationResult( [ new Entity([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 2, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), ], [ 'hasPrevious' => true, 'previousCursor' => [ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], 'hasNext' => true, 'nextCursor' => [ 'id' => 4, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ], ] ), @@ -743,33 +743,33 @@ function (Table $posts) { ->seekable() ->exclusive() ->limit(3) - ->orderAsc($posts->selectQuery()->expr('modified')) - ->orderAsc($posts->selectQuery()->expr('id')) + ->orderByAsc($posts->selectQuery()->expr('modified')) + ->orderByAsc($posts->selectQuery()->expr('id')) ->cursor([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]); }, new PaginationResult( [ new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 2, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), new Entity([ 'id' => 4, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), ], [ 'hasPrevious' => true, 'previousCursor' => [ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], 'hasNext' => false, 'nextCursor' => null, @@ -784,29 +784,29 @@ function (Table $posts) { ->backward() ->seekable() ->limit(3) - ->orderAsc($posts->selectQuery()->expr('modified')) - ->orderAsc($posts->selectQuery()->expr('id')); + ->orderByAsc($posts->selectQuery()->expr('modified')) + ->orderByAsc($posts->selectQuery()->expr('id')); }, new PaginationResult( [ new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 2, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), new Entity([ 'id' => 4, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), ], [ 'hasPrevious' => true, 'previousCursor' => [ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], 'hasNext' => null, 'nextCursor' => null, @@ -822,29 +822,29 @@ function (Table $posts) { ->seekable() ->exclusive() ->limit(3) - ->orderAsc($posts->selectQuery()->expr('modified')) - ->orderAsc($posts->selectQuery()->expr('id')); + ->orderByAsc($posts->selectQuery()->expr('modified')) + ->orderByAsc($posts->selectQuery()->expr('id')); }, new PaginationResult( [ new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 2, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), new Entity([ 'id' => 4, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), ], [ 'hasPrevious' => true, 'previousCursor' => [ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], 'hasNext' => null, 'nextCursor' => null, @@ -859,22 +859,22 @@ function (Table $posts) { ->backward() ->seekable() ->limit(3) - ->orderAsc($posts->selectQuery()->expr('modified')) - ->orderAsc($posts->selectQuery()->expr('id')) + ->orderByAsc($posts->selectQuery()->expr('modified')) + ->orderByAsc($posts->selectQuery()->expr('id')) ->cursor([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]); }, new PaginationResult( [ new Entity([ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ @@ -883,7 +883,7 @@ function (Table $posts) { 'hasNext' => true, 'nextCursor' => [ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], ] ), @@ -897,18 +897,18 @@ function (Table $posts) { ->seekable() ->exclusive() ->limit(3) - ->orderAsc($posts->selectQuery()->expr('modified')) - ->orderAsc($posts->selectQuery()->expr('id')) + ->orderByAsc($posts->selectQuery()->expr('modified')) + ->orderByAsc($posts->selectQuery()->expr('id')) ->cursor([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]); }, new PaginationResult( [ new Entity([ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ @@ -917,7 +917,7 @@ function (Table $posts) { 'hasNext' => true, 'nextCursor' => [ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], ] ), @@ -930,22 +930,22 @@ function (Table $posts) { ->forward() ->seekable() ->limit(3) - ->orderDesc($posts->selectQuery()->expr('modified')) - ->orderDesc($posts->selectQuery()->expr('id')); + ->orderByDesc($posts->selectQuery()->expr('modified')) + ->orderByDesc($posts->selectQuery()->expr('id')); }, new PaginationResult( [ new Entity([ 'id' => 4, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), new Entity([ 'id' => 2, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ @@ -954,7 +954,7 @@ function (Table $posts) { 'hasNext' => true, 'nextCursor' => [ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], ] ), @@ -968,22 +968,22 @@ function (Table $posts) { ->seekable() ->exclusive() ->limit(3) - ->orderDesc($posts->selectQuery()->expr('modified')) - ->orderDesc($posts->selectQuery()->expr('id')); + ->orderByDesc($posts->selectQuery()->expr('modified')) + ->orderByDesc($posts->selectQuery()->expr('id')); }, new PaginationResult( [ new Entity([ 'id' => 4, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), new Entity([ 'id' => 2, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ @@ -992,7 +992,7 @@ function (Table $posts) { 'hasNext' => true, 'nextCursor' => [ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], ] ), @@ -1005,29 +1005,29 @@ function (Table $posts) { ->forward() ->seekable() ->limit(3) - ->orderDesc($posts->selectQuery()->expr('modified')) - ->orderDesc($posts->selectQuery()->expr('id')) + ->orderByDesc($posts->selectQuery()->expr('modified')) + ->orderByDesc($posts->selectQuery()->expr('id')) ->cursor([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]); }, new PaginationResult( [ new Entity([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ 'hasPrevious' => true, 'previousCursor' => [ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], 'hasNext' => false, 'nextCursor' => null, @@ -1043,25 +1043,25 @@ function (Table $posts) { ->seekable() ->exclusive() ->limit(3) - ->orderDesc($posts->selectQuery()->expr('modified')) - ->orderDesc($posts->selectQuery()->expr('id')) + ->orderByDesc($posts->selectQuery()->expr('modified')) + ->orderByDesc($posts->selectQuery()->expr('id')) ->cursor([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]); }, new PaginationResult( [ new Entity([ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ 'hasPrevious' => true, 'previousCursor' => [ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], 'hasNext' => false, 'nextCursor' => null, @@ -1076,29 +1076,29 @@ function (Table $posts) { ->backward() ->seekable() ->limit(3) - ->orderDesc($posts->selectQuery()->expr('modified')) - ->orderDesc($posts->selectQuery()->expr('id')); + ->orderByDesc($posts->selectQuery()->expr('modified')) + ->orderByDesc($posts->selectQuery()->expr('id')); }, new PaginationResult( [ new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ 'hasPrevious' => true, 'previousCursor' => [ 'id' => 2, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ], 'hasNext' => null, 'nextCursor' => null, @@ -1114,29 +1114,29 @@ function (Table $posts) { ->seekable() ->exclusive() ->limit(3) - ->orderDesc($posts->selectQuery()->expr('modified')) - ->orderDesc($posts->selectQuery()->expr('id')); + ->orderByDesc($posts->selectQuery()->expr('modified')) + ->orderByDesc($posts->selectQuery()->expr('id')); }, new PaginationResult( [ new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ 'hasPrevious' => true, 'previousCursor' => [ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], 'hasNext' => null, 'nextCursor' => null, @@ -1151,38 +1151,38 @@ function (Table $posts) { ->backward() ->seekable() ->limit(3) - ->orderDesc($posts->selectQuery()->expr('modified')) - ->orderDesc($posts->selectQuery()->expr('id')) + ->orderByDesc($posts->selectQuery()->expr('modified')) + ->orderByDesc($posts->selectQuery()->expr('id')) ->cursor([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]); }, new PaginationResult( [ new Entity([ 'id' => 2, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ 'hasPrevious' => true, 'previousCursor' => [ 'id' => 4, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ], 'hasNext' => true, 'nextCursor' => [ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], ] ), @@ -1196,26 +1196,26 @@ function (Table $posts) { ->seekable() ->exclusive() ->limit(3) - ->orderDesc($posts->selectQuery()->expr('modified')) - ->orderDesc($posts->selectQuery()->expr('id')) + ->orderByDesc($posts->selectQuery()->expr('modified')) + ->orderByDesc($posts->selectQuery()->expr('id')) ->cursor([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]); }, new PaginationResult( [ new Entity([ 'id' => 4, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), new Entity([ 'id' => 2, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ @@ -1224,7 +1224,7 @@ function (Table $posts) { 'hasNext' => true, 'nextCursor' => [ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], ] ), diff --git a/tests/TestCase/ORM/QueryTest.php b/tests/TestCase/ORM/QueryTest.php index 19054f8..f96a32b 100644 --- a/tests/TestCase/ORM/QueryTest.php +++ b/tests/TestCase/ORM/QueryTest.php @@ -5,7 +5,7 @@ namespace Lampager\Cake\Test\TestCase\ORM; use Cake\Database\Expression\OrderClauseExpression; -use Cake\I18n\FrozenTime; +use Cake\I18n\DateTime; use Cake\ORM\Entity; use Cake\ORM\Table; use Cake\ORM\TableRegistry; @@ -23,7 +23,7 @@ class QueryTest extends TestCase { - public $fixtures = [ + public array $fixtures = [ 'plugin.Lampager\\Cake.Posts', ]; @@ -49,7 +49,7 @@ public function tearDown(): void /** * @dataProvider orderProvider */ - public function testOrder(callable $factory, PaginationResult $expected): void + public function testorderBy(callable $factory, PaginationResult $expected): void { /** @var LampagerBehavior&Table $posts */ $posts = TableRegistry::getTableLocator()->get('Posts'); @@ -57,7 +57,7 @@ public function testOrder(callable $factory, PaginationResult $expected): void /** @var Query $query */ $query = $factory($posts); - $this->assertJsonEquals($expected, $query->all()); + $this->assertJsonEquals($expected, $query->paginate()); } /** @@ -74,8 +74,8 @@ public function testOrderClear(callable $factory): void /** @var Query $query */ $query = $factory($posts); - $query->order([], true); - $query->all(); + $query->orderBy([], true); + $query->paginate(); } public function testOrderIllegal(): void @@ -91,8 +91,8 @@ public function testOrderIllegal(): void $posts = TableRegistry::getTableLocator()->get('Posts'); $posts->addBehavior(LampagerBehavior::class); $posts->lampager() - ->order([$expression]) - ->all(); + ->orderBy([$expression]) + ->paginate(); } public function testOrderQueryExpression(): void @@ -105,7 +105,7 @@ public function testOrderQueryExpression(): void [ new Entity([ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ @@ -114,16 +114,16 @@ public function testOrderQueryExpression(): void 'hasNext' => true, 'nextCursor' => [ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], ] ); $actual = $posts->lampager() - ->order([$posts->selectQuery()->expr('modified')]) - ->order([$posts->selectQuery()->expr('id')]) + ->orderBy([$posts->selectQuery()->expr('modified')]) + ->orderBy([$posts->selectQuery()->expr('id')]) ->limit(1) - ->all(); + ->paginate(); $this->assertJsonEquals($expected, $actual); } @@ -138,7 +138,7 @@ public function testLimitQueryExpression(): void [ new Entity([ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ @@ -147,16 +147,16 @@ public function testLimitQueryExpression(): void 'hasNext' => true, 'nextCursor' => [ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], ] ); $actual = $posts->lampager() - ->orderAsc('modified') - ->orderAsc('id') + ->orderByAsc('modified') + ->orderByAsc('id') ->limit($posts->selectQuery()->expr('1')) - ->all(); + ->paginate(); $this->assertJsonEquals($expected, $actual); } @@ -170,10 +170,10 @@ public function testLimitIllegalQueryExpression(): void $posts = TableRegistry::getTableLocator()->get('Posts'); $posts->addBehavior(LampagerBehavior::class); $posts->lampager() - ->orderAsc('modified') - ->orderAsc('id') + ->orderByAsc('modified') + ->orderByAsc('id') ->limit($posts->selectQuery()->expr('1 + 1')) - ->all(); + ->paginate(); } public function testWhere(): void @@ -186,7 +186,7 @@ public function testWhere(): void [ new Entity([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ @@ -195,17 +195,17 @@ public function testWhere(): void 'hasNext' => true, 'nextCursor' => [ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], ] ); $actual = $posts->lampager() ->where(['id >' => 1]) - ->orderAsc('modified') - ->orderAsc('id') + ->orderByAsc('modified') + ->orderByAsc('id') ->limit(1) - ->all(); + ->paginate(); $this->assertJsonEquals($expected, $actual); } @@ -219,10 +219,10 @@ public function testGroup(): void $posts = TableRegistry::getTableLocator()->get('Posts'); $posts->addBehavior(LampagerBehavior::class); $posts->lampager() - ->orderAsc('modified') - ->orderAsc('id') - ->group('modified') - ->all(); + ->orderByAsc('modified') + ->orderByAsc('id') + ->groupBy('modified') + ->paginate(); } public function testUnion(): void @@ -234,22 +234,22 @@ public function testUnion(): void $posts = TableRegistry::getTableLocator()->get('Posts'); $posts->addBehavior(LampagerBehavior::class); $posts->lampager() - ->orderAsc('modified') - ->orderAsc('id') + ->orderByAsc('modified') + ->orderByAsc('id') ->union($posts->selectQuery()->select()) - ->all(); + ->paginate(); } public function testCall(): void { - $this->expectException(\ErrorException::class); - $this->expectExceptionMessage('Instead call `$query->all()->take(...)` instead.'); + $this->expectException(\BadMethodCallException::class); + $this->expectExceptionMessage('Method Lampager\Cake\ORM\Query::take does not exist'); /** @var LampagerBehavior&Table $posts */ $posts = TableRegistry::getTableLocator()->get('Posts'); $posts->addBehavior(LampagerBehavior::class); $posts->lampager() - ->orderAsc('id') + ->orderByAsc('id') ->take(); } @@ -260,8 +260,8 @@ public function testDebugInfo(): void $posts->addBehavior(LampagerBehavior::class); $actual = $posts->lampager() - ->orderAsc('modified') - ->orderAsc('id') + ->orderByAsc('modified') + ->orderByAsc('id') ->limit(3) ->__debugInfo(); @@ -275,7 +275,6 @@ public function testDebugInfo(): void $this->assertArrayHasKey('decorators', $actual); $this->assertArrayHasKey('executed', $actual); $this->assertArrayHasKey('hydrate', $actual); - $this->assertArrayHasKey('buffered', $actual); $this->assertArrayHasKey('formatters', $actual); $this->assertArrayHasKey('mapReducers', $actual); $this->assertArrayHasKey('contain', $actual); @@ -303,7 +302,6 @@ public function testDebugInfoIncomplete(): void $this->assertArrayHasKey('decorators', $actual); $this->assertArrayHasKey('executed', $actual); $this->assertArrayHasKey('hydrate', $actual); - $this->assertArrayHasKey('buffered', $actual); $this->assertArrayHasKey('formatters', $actual); $this->assertArrayHasKey('mapReducers', $actual); $this->assertArrayHasKey('contain', $actual); @@ -323,7 +321,7 @@ public function testCount(callable $factory, int $expected): void $this->assertSame($expected, $factory($posts)); } - public function orderProvider(): Generator + public static function orderProvider(): Generator { yield 'Ascending and ascending' => [ function (Table $posts) { @@ -332,7 +330,7 @@ function (Table $posts) { ->forward() ->seekable() ->limit(3) - ->order([ + ->orderBy([ 'modified' => 'asc', 'id' => 'asc', ]); @@ -341,15 +339,15 @@ function (Table $posts) { [ new Entity([ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ @@ -358,7 +356,7 @@ function (Table $posts) { 'hasNext' => true, 'nextCursor' => [ 'id' => 2, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ], ] ), @@ -371,7 +369,7 @@ function (Table $posts) { ->forward() ->seekable() ->limit(3) - ->order([ + ->orderBy([ 'modified' => 'desc', 'id' => 'desc', ]); @@ -380,15 +378,15 @@ function (Table $posts) { [ new Entity([ 'id' => 4, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), new Entity([ 'id' => 2, - 'modified' => new FrozenTime('2017-01-01 11:00:00'), + 'modified' => new DateTime('2017-01-01 11:00:00'), ]), new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ @@ -397,14 +395,14 @@ function (Table $posts) { 'hasNext' => true, 'nextCursor' => [ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ], ] ), ]; } - public function countProvider(): Generator + public static function countProvider(): Generator { yield 'Ascending forward start inclusive' => [ function (Table $posts) { @@ -413,8 +411,8 @@ function (Table $posts) { ->forward() ->seekable() ->limit(3) - ->orderAsc('modified') - ->orderAsc('id') + ->orderByAsc('modified') + ->orderByAsc('id') ->count(); }, 3, @@ -428,8 +426,8 @@ function (Table $posts) { ->seekable() ->exclusive() ->limit(3) - ->orderAsc('modified') - ->orderAsc('id') + ->orderByAsc('modified') + ->orderByAsc('id') ->count(); }, 3, @@ -442,11 +440,11 @@ function (Table $posts) { ->forward() ->seekable() ->limit(3) - ->orderAsc('modified') - ->orderAsc('id') + ->orderByAsc('modified') + ->orderByAsc('id') ->cursor([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]) ->count(); }, @@ -461,11 +459,11 @@ function (Table $posts) { ->seekable() ->exclusive() ->limit(3) - ->orderAsc('modified') - ->orderAsc('id') + ->orderByAsc('modified') + ->orderByAsc('id') ->cursor([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]) ->count(); }, @@ -479,8 +477,8 @@ function (Table $posts) { ->backward() ->seekable() ->limit(3) - ->orderAsc('modified') - ->orderAsc('id') + ->orderByAsc('modified') + ->orderByAsc('id') ->count(); }, 3, @@ -494,8 +492,8 @@ function (Table $posts) { ->seekable() ->exclusive() ->limit(3) - ->orderAsc('modified') - ->orderAsc('id') + ->orderByAsc('modified') + ->orderByAsc('id') ->count(); }, 3, @@ -508,11 +506,11 @@ function (Table $posts) { ->backward() ->seekable() ->limit(3) - ->orderAsc('modified') - ->orderAsc('id') + ->orderByAsc('modified') + ->orderByAsc('id') ->cursor([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]) ->count(); }, @@ -527,11 +525,11 @@ function (Table $posts) { ->seekable() ->exclusive() ->limit(3) - ->orderAsc('modified') - ->orderAsc('id') + ->orderByAsc('modified') + ->orderByAsc('id') ->cursor([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]) ->count(); }, @@ -545,8 +543,8 @@ function (Table $posts) { ->forward() ->seekable() ->limit(3) - ->orderDesc('modified') - ->orderDesc('id') + ->orderByDesc('modified') + ->orderByDesc('id') ->count(); }, 3, @@ -560,8 +558,8 @@ function (Table $posts) { ->seekable() ->exclusive() ->limit(3) - ->orderDesc('modified') - ->orderDesc('id') + ->orderByDesc('modified') + ->orderByDesc('id') ->count(); }, 3, @@ -574,11 +572,11 @@ function (Table $posts) { ->forward() ->seekable() ->limit(3) - ->orderDesc('modified') - ->orderDesc('id') + ->orderByDesc('modified') + ->orderByDesc('id') ->cursor([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]) ->count(); }, @@ -593,11 +591,11 @@ function (Table $posts) { ->seekable() ->exclusive() ->limit(3) - ->orderDesc('modified') - ->orderDesc('id') + ->orderByDesc('modified') + ->orderByDesc('id') ->cursor([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]) ->count(); }, @@ -611,8 +609,8 @@ function (Table $posts) { ->backward() ->seekable() ->limit(3) - ->orderDesc('modified') - ->orderDesc('id') + ->orderByDesc('modified') + ->orderByDesc('id') ->count(); }, 3, @@ -626,8 +624,8 @@ function (Table $posts) { ->seekable() ->exclusive() ->limit(3) - ->orderDesc('modified') - ->orderDesc('id') + ->orderByDesc('modified') + ->orderByDesc('id') ->count(); }, 3, @@ -640,11 +638,11 @@ function (Table $posts) { ->backward() ->seekable() ->limit(3) - ->orderDesc('modified') - ->orderDesc('id') + ->orderByDesc('modified') + ->orderByDesc('id') ->cursor([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]) ->count(); }, @@ -659,11 +657,11 @@ function (Table $posts) { ->seekable() ->exclusive() ->limit(3) - ->orderDesc('modified') - ->orderDesc('id') + ->orderByDesc('modified') + ->orderByDesc('id') ->cursor([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]) ->count(); }, diff --git a/tests/TestCase/PaginationResultTest.php b/tests/TestCase/PaginationResultTest.php index 510165d..bf1a88b 100644 --- a/tests/TestCase/PaginationResultTest.php +++ b/tests/TestCase/PaginationResultTest.php @@ -5,7 +5,7 @@ namespace Lampager\Cake\Test\TestCase; use ArrayIterator; -use Cake\I18n\FrozenTime; +use Cake\I18n\DateTime; use Cake\ORM\Entity; use Generator; use IteratorAggregate; @@ -40,29 +40,10 @@ public function tearDown(): void * @dataProvider arrayProvider * @dataProvider iteratorAggregateProvider */ - public function testIteratorCurrent(array $entities, $records, array $meta): void + public function testCurrentPage(array $entities, $records, array $meta): void { $actual = new PaginationResult($records, $meta); - - $this->assertEquals($entities[0], $actual->current()); - - $actual->next(); - $this->assertTrue($actual->valid()); - $this->assertEquals(1, $actual->key()); - $this->assertEquals($entities[1], $actual->current()); - - $actual->next(); - $this->assertTrue($actual->valid()); - $this->assertEquals(2, $actual->key()); - $this->assertEquals($entities[2], $actual->current()); - - $actual->next(); - $this->assertFalse($actual->valid()); - - $actual->rewind(); - $this->assertTrue($actual->valid()); - $this->assertEquals(0, $actual->key()); - $this->assertEquals($entities[0], $actual->current()); + $this->assertEquals(0, $actual->currentPage()); } /** @@ -72,29 +53,10 @@ public function testIteratorCurrent(array $entities, $records, array $meta): voi * @dataProvider arrayProvider * @dataProvider iteratorAggregateProvider */ - public function testIteratorKey(array $entities, $records, array $meta): void + public function testPerPage(array $entities, $records, array $meta): void { $actual = new PaginationResult($records, $meta); - - $this->assertEquals(0, $actual->key()); - - $actual->next(); - $this->assertTrue($actual->valid()); - $this->assertEquals(1, $actual->key()); - $this->assertEquals($entities[1], $actual->current()); - - $actual->next(); - $this->assertTrue($actual->valid()); - $this->assertEquals(2, $actual->key()); - $this->assertEquals($entities[2], $actual->current()); - - $actual->next(); - $this->assertFalse($actual->valid()); - - $actual->rewind(); - $this->assertTrue($actual->valid()); - $this->assertEquals(0, $actual->key()); - $this->assertEquals($entities[0], $actual->current()); + $this->assertEquals(3, $actual->perPage()); } /** @@ -104,27 +66,10 @@ public function testIteratorKey(array $entities, $records, array $meta): void * @dataProvider arrayProvider * @dataProvider iteratorAggregateProvider */ - public function testIteratorNext(array $entities, $records, array $meta): void + public function testTotalCount(array $entities, $records, array $meta): void { $actual = new PaginationResult($records, $meta); - - $actual->next(); - $this->assertTrue($actual->valid()); - $this->assertEquals(1, $actual->key()); - $this->assertEquals($entities[1], $actual->current()); - - $actual->next(); - $this->assertTrue($actual->valid()); - $this->assertEquals(2, $actual->key()); - $this->assertEquals($entities[2], $actual->current()); - - $actual->next(); - $this->assertFalse($actual->valid()); - - $actual->rewind(); - $this->assertTrue($actual->valid()); - $this->assertEquals(0, $actual->key()); - $this->assertEquals($entities[0], $actual->current()); + $this->assertNull($actual->totalCount()); } /** @@ -134,31 +79,49 @@ public function testIteratorNext(array $entities, $records, array $meta): void * @dataProvider arrayProvider * @dataProvider iteratorAggregateProvider */ - public function testIteratorValid(array $entities, $records, array $meta): void + public function testPageCount(array $entities, $records, array $meta): void { $actual = new PaginationResult($records, $meta); + $this->assertNull($actual->pageCount()); + } - $this->assertTrue($actual->valid()); - $this->assertEquals(0, $actual->key()); - $this->assertEquals($entities[0], $actual->current()); - - $actual->next(); - $this->assertTrue($actual->valid()); - $this->assertEquals(1, $actual->key()); - $this->assertEquals($entities[1], $actual->current()); - - $actual->next(); - $this->assertTrue($actual->valid()); - $this->assertEquals(2, $actual->key()); - $this->assertEquals($entities[2], $actual->current()); + /** + * @param Entity[] $entities + * @param Entity[]|Traversable $records + * @param mixed[] $meta + * @dataProvider arrayProvider + * @dataProvider iteratorAggregateProvider + */ + public function testHasPrevPage(array $entities, $records, array $meta): void + { + $actual = new PaginationResult($records, $meta); + $this->assertEquals((bool)$meta['hasPrevious'], $actual->hasPrevPage()); + } - $actual->next(); - $this->assertFalse($actual->valid()); + /** + * @param Entity[] $entities + * @param Entity[]|Traversable $records + * @param mixed[] $meta + * @dataProvider arrayProvider + * @dataProvider iteratorAggregateProvider + */ + public function testHasNextPage(array $entities, $records, array $meta): void + { + $actual = new PaginationResult($records, $meta); + $this->assertEquals((bool)$meta['hasNext'], $actual->hasNextPage()); + } - $actual->rewind(); - $this->assertTrue($actual->valid()); - $this->assertEquals(0, $actual->key()); - $this->assertEquals($entities[0], $actual->current()); + /** + * @param Entity[] $entities + * @param Entity[]|Traversable $records + * @param mixed[] $meta + * @dataProvider arrayProvider + * @dataProvider iteratorAggregateProvider + */ + public function testItems(array $entities, $records, array $meta): void + { + $actual = new PaginationResult($records, $meta); + $this->assertEquals(iterator_to_array($records), iterator_to_array($actual->items())); } /** @@ -168,10 +131,16 @@ public function testIteratorValid(array $entities, $records, array $meta): void * @dataProvider arrayProvider * @dataProvider iteratorAggregateProvider */ - public function testJsonSerialize(array $entities, $records, array $meta, string $expected): void + public function testPagingParam(array $entities, $records, array $meta): void { - $actual = json_encode(new PaginationResult($records, $meta)); - $this->assertJsonStringEqualsJsonString($expected, $actual); + $actual = new PaginationResult($records, $meta); + $this->assertEquals(count($entities), $actual->pagingParam('count')); + $this->assertNull($actual->pagingParam('totalCount')); + $this->assertEquals($meta['limit'], $actual->pagingParam('perPage')); + $this->assertNull($actual->pagingParam('pageCount')); + $this->assertEquals(0, $actual->pagingParam('currentPage')); + $this->assertEquals($meta['hasPrevious'], $actual->pagingParam('hasPrevPage')); + $this->assertEquals($meta['hasNext'], $actual->pagingParam('hasNextPage')); } /** @@ -181,11 +150,10 @@ public function testJsonSerialize(array $entities, $records, array $meta, string * @dataProvider arrayProvider * @dataProvider iteratorAggregateProvider */ - public function testSerializeAndUnserialize(array $entities, $records, array $meta): void + public function testJsonSerialize(array $entities, $records, array $meta, string $expected): void { - $actual = unserialize(serialize(new PaginationResult($records, $meta))); - $expected = new PaginationResult($records, $meta); - $this->assertJsonEquals($expected, $actual); + $actual = json_encode(new PaginationResult($records, $meta)); + $this->assertJsonStringEqualsJsonString($expected, $actual); } /** @@ -226,51 +194,35 @@ public function testPublicProperties(array $entities, $records, array $meta): vo $this->assertEquals($meta['nextCursor'], $paginationResult->nextCursor); } - /** - * @param Entity[] $entities - * @param Entity[]|Traversable $records - * @param mixed[] $meta - * @dataProvider arrayProvider - * @dataProvider iteratorAggregateProvider - */ - public function testUndefinedProperties(array $entities, $records, array $meta): void - { - $this->expectException(\ErrorException::class); - $this->expectExceptionMessageMatches('/^Undefined property via __get\(\): undefinedProperty/'); - - $paginationResult = new PaginationResult($records, $meta); - $paginationResult->undefinedProperty; - } - - public function arrayProvider(): Generator + public static function arrayProvider(): Generator { yield 'Array iteration' => [ [ new Entity([ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ new Entity([ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], [ @@ -279,8 +231,9 @@ public function arrayProvider(): Generator 'hasNext' => true, 'nextCursor' => [ 'Posts.id' => 2, - 'Posts.modified' => new FrozenTime('2017-01-01 11:00:00'), + 'Posts.modified' => new DateTime('2017-01-01 11:00:00'), ], + 'limit' => 3, ], '{ "records": [ @@ -311,29 +264,29 @@ public function arrayProvider(): Generator [ new Entity([ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], new ArrayIterator([ new Entity([ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ]), [ @@ -342,8 +295,9 @@ public function arrayProvider(): Generator 'hasNext' => true, 'nextCursor' => [ 'Posts.id' => 2, - 'Posts.modified' => new FrozenTime('2017-01-01 11:00:00'), + 'Posts.modified' => new DateTime('2017-01-01 11:00:00'), ], + 'limit' => 3, ], '{ "records": [ @@ -371,21 +325,21 @@ public function arrayProvider(): Generator ]; } - public function iteratorAggregateProvider(): Generator + public static function iteratorAggregateProvider(): Generator { yield 'IteratorAggregate iteration' => [ [ new Entity([ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ], new class implements IteratorAggregate { @@ -394,15 +348,15 @@ public function getIterator(): Traversable return new ArrayIterator([ new Entity([ 'id' => 1, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 3, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), new Entity([ 'id' => 5, - 'modified' => new FrozenTime('2017-01-01 10:00:00'), + 'modified' => new DateTime('2017-01-01 10:00:00'), ]), ]); } @@ -413,8 +367,9 @@ public function getIterator(): Traversable 'hasNext' => true, 'nextCursor' => [ 'Posts.id' => 2, - 'Posts.modified' => new FrozenTime('2017-01-01 11:00:00'), + 'Posts.modified' => new DateTime('2017-01-01 11:00:00'), ], + 'limit' => 3, ], '{ "records": [ diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 39875ed..f906826 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -2,16 +2,19 @@ declare(strict_types=1); +use function Cake\Core\env; +use Cake\Core\Configure; use Cake\Database\Connection; use Cake\Datasource\ConnectionManager; use Cake\TestSuite\Fixture\SchemaLoader; use Lampager\Cake\Database\Driver\Sqlite; -require_once __DIR__ . '/../vendor/cakephp/cakephp/src/basics.php'; require_once __DIR__ . '/../vendor/autoload.php'; define('ROOT', dirname(__DIR__)); +Configure::write('App.encoding', 'utf-8'); + ConnectionManager::setConfig('test', [ 'url' => env('DB_DSN') ?: 'sqlite:///:memory:?className=' . Connection::class . '&driver=' . Sqlite::class . '"eIdentifiers=true', ]);