From 85febaa9160533f7612398adbef4b8f021d2731b Mon Sep 17 00:00:00 2001 From: Martin Eiber Date: Mon, 23 Sep 2024 08:20:45 +0200 Subject: [PATCH] Introduce two new interfaces for DataIndex Query (#430) * Refactor QueryInterface * Apply php-cs-fixer changes * Add some unit tests for Asset Filter. * Apply php-cs-fixer changes --------- Co-authored-by: martineiber --- docker-compose.yml | 3 +- .../Filter/Asset/IsAssetFilterTrait.php | 6 +- .../Filter/Asset/Metadata/AssetFilter.php | 4 +- .../Filter/Asset/Metadata/CheckboxFilter.php | 4 +- .../Filter/Asset/Metadata/DateFilter.php | 4 +- .../Filter/Asset/Metadata/DocumentFilter.php | 4 +- .../Filter/Asset/Metadata/InputFilter.php | 4 +- .../Filter/Asset/Metadata/ObjectFilter.php | 4 +- .../Filter/Asset/Metadata/SelectFilter.php | 4 +- .../Filter/Asset/Metadata/TextAreaFilter.php | 4 +- src/DataIndex/Filter/Asset/SortFilter.php | 4 +- .../Filter/Asset/System/DatetimeFilter.php | 6 +- .../Filter/Asset/System/StringFilter.php | 4 +- .../Filter/DataObject/ClassNameFilter.php | 4 +- src/DataIndex/Query/AssetQuery.php | 2 +- src/DataIndex/Query/AssetQueryInterface.php | 44 +++++++ src/DataIndex/Query/DataObjectQuery.php | 2 +- .../Query/DataObjectQueryInterface.php | 30 +++++ .../Filter/Asset/IsAssetFilterTraitTest.php | 72 ++++++++++++ .../Filter/Asset/Metadata/AssetFilterTest.php | 65 ++++++++++ .../Asset/Metadata/CheckboxFilterTest.php | 65 ++++++++++ .../Asset/Metadata/ColumnFilterMockTrait.php | 37 ++++++ .../Filter/Asset/Metadata/DateFilterTest.php | 105 +++++++++++++++++ .../Asset/Metadata/DocumentFilterTest.php | 65 ++++++++++ .../Filter/Asset/Metadata/InputFilterTest.php | 65 ++++++++++ .../Asset/Metadata/ObjectFilterTest.php | 65 ++++++++++ .../Asset/Metadata/SelectFilterTest.php | 65 ++++++++++ .../Asset/Metadata/TextAreaFilterTest.php | 65 ++++++++++ .../DataIndex/Filter/Asset/SortFilterTest.php | 83 +++++++++++++ .../Asset/System/DatetimeFilterTest.php | 111 ++++++++++++++++++ .../Filter/Asset/System/StringFilterTest.php | 75 ++++++++++++ 31 files changed, 1044 insertions(+), 31 deletions(-) create mode 100644 src/DataIndex/Query/AssetQueryInterface.php create mode 100644 src/DataIndex/Query/DataObjectQueryInterface.php create mode 100644 tests/Unit/DataIndex/Filter/Asset/IsAssetFilterTraitTest.php create mode 100644 tests/Unit/DataIndex/Filter/Asset/Metadata/AssetFilterTest.php create mode 100644 tests/Unit/DataIndex/Filter/Asset/Metadata/CheckboxFilterTest.php create mode 100644 tests/Unit/DataIndex/Filter/Asset/Metadata/ColumnFilterMockTrait.php create mode 100644 tests/Unit/DataIndex/Filter/Asset/Metadata/DateFilterTest.php create mode 100644 tests/Unit/DataIndex/Filter/Asset/Metadata/DocumentFilterTest.php create mode 100644 tests/Unit/DataIndex/Filter/Asset/Metadata/InputFilterTest.php create mode 100644 tests/Unit/DataIndex/Filter/Asset/Metadata/ObjectFilterTest.php create mode 100644 tests/Unit/DataIndex/Filter/Asset/Metadata/SelectFilterTest.php create mode 100644 tests/Unit/DataIndex/Filter/Asset/Metadata/TextAreaFilterTest.php create mode 100644 tests/Unit/DataIndex/Filter/Asset/SortFilterTest.php create mode 100644 tests/Unit/DataIndex/Filter/Asset/System/DatetimeFilterTest.php create mode 100644 tests/Unit/DataIndex/Filter/Asset/System/StringFilterTest.php diff --git a/docker-compose.yml b/docker-compose.yml index 210020e65..f5099324b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,4 +5,5 @@ services: environment: PHP_IDE_CONFIG: serverName=localhost volumes: - - .:/var/cli/ \ No newline at end of file + - .:/var/cli/ + - ./.docker/30-xdebug.ini:/usr/local/etc/php/conf.d/30-xdebug.ini \ No newline at end of file diff --git a/src/DataIndex/Filter/Asset/IsAssetFilterTrait.php b/src/DataIndex/Filter/Asset/IsAssetFilterTrait.php index c51b36979..53ad45b8e 100644 --- a/src/DataIndex/Filter/Asset/IsAssetFilterTrait.php +++ b/src/DataIndex/Filter/Asset/IsAssetFilterTrait.php @@ -16,7 +16,7 @@ namespace Pimcore\Bundle\StudioBackendBundle\DataIndex\Filter\Asset; -use Pimcore\Bundle\StudioBackendBundle\DataIndex\Query\AssetQuery; +use Pimcore\Bundle\StudioBackendBundle\DataIndex\Query\AssetQueryInterface; use Pimcore\Bundle\StudioBackendBundle\MappedParameter\Filter\ColumnFiltersParameterInterface; /** @@ -33,9 +33,9 @@ public function validateParameterType(mixed $parameters): ?ColumnFiltersParamete return null; } - public function validateQueryType(mixed $query): ?AssetQuery + public function validateQueryType(mixed $query): ?AssetQueryInterface { - if ($query instanceof AssetQuery) { + if ($query instanceof AssetQueryInterface) { return $query; } diff --git a/src/DataIndex/Filter/Asset/Metadata/AssetFilter.php b/src/DataIndex/Filter/Asset/Metadata/AssetFilter.php index 38cda1d23..64bfe0797 100644 --- a/src/DataIndex/Filter/Asset/Metadata/AssetFilter.php +++ b/src/DataIndex/Filter/Asset/Metadata/AssetFilter.php @@ -18,7 +18,7 @@ use Pimcore\Bundle\StudioBackendBundle\DataIndex\Filter\Asset\IsAssetFilterTrait; use Pimcore\Bundle\StudioBackendBundle\DataIndex\Filter\FilterInterface; -use Pimcore\Bundle\StudioBackendBundle\DataIndex\Query\AssetQuery; +use Pimcore\Bundle\StudioBackendBundle\DataIndex\Query\AssetQueryInterface; use Pimcore\Bundle\StudioBackendBundle\DataIndex\Query\QueryInterface; use Pimcore\Bundle\StudioBackendBundle\Exception\Api\InvalidArgumentException; use Pimcore\Bundle\StudioBackendBundle\Grid\Column\ColumnType; @@ -48,7 +48,7 @@ public function apply(mixed $parameters, QueryInterface $query): QueryInterface return $assetQuery; } - private function applyAssetFilter(ColumnFilter $column, AssetQuery $query): AssetQuery + private function applyAssetFilter(ColumnFilter $column, AssetQueryInterface $query): AssetQueryInterface { if (!is_int($column->getFilterValue())) { throw new InvalidArgumentException('Filter value for asset must be a integer (ID of the asset)'); diff --git a/src/DataIndex/Filter/Asset/Metadata/CheckboxFilter.php b/src/DataIndex/Filter/Asset/Metadata/CheckboxFilter.php index bd8032b02..48704fc95 100644 --- a/src/DataIndex/Filter/Asset/Metadata/CheckboxFilter.php +++ b/src/DataIndex/Filter/Asset/Metadata/CheckboxFilter.php @@ -18,7 +18,7 @@ use Pimcore\Bundle\StudioBackendBundle\DataIndex\Filter\Asset\IsAssetFilterTrait; use Pimcore\Bundle\StudioBackendBundle\DataIndex\Filter\FilterInterface; -use Pimcore\Bundle\StudioBackendBundle\DataIndex\Query\AssetQuery; +use Pimcore\Bundle\StudioBackendBundle\DataIndex\Query\AssetQueryInterface; use Pimcore\Bundle\StudioBackendBundle\DataIndex\Query\QueryInterface; use Pimcore\Bundle\StudioBackendBundle\Exception\Api\InvalidArgumentException; use Pimcore\Bundle\StudioBackendBundle\Grid\Column\ColumnType; @@ -48,7 +48,7 @@ public function apply(mixed $parameters, QueryInterface $query): QueryInterface return $assetQuery; } - private function applyCheckboxFilter(ColumnFilter $column, AssetQuery $query): AssetQuery + private function applyCheckboxFilter(ColumnFilter $column, AssetQueryInterface $query): AssetQueryInterface { if (!is_bool($column->getFilterValue())) { throw new InvalidArgumentException('Filter value for checkbox must be a boolean'); diff --git a/src/DataIndex/Filter/Asset/Metadata/DateFilter.php b/src/DataIndex/Filter/Asset/Metadata/DateFilter.php index 3fb713823..3992d8c16 100644 --- a/src/DataIndex/Filter/Asset/Metadata/DateFilter.php +++ b/src/DataIndex/Filter/Asset/Metadata/DateFilter.php @@ -19,7 +19,7 @@ use Pimcore\Bundle\GenericDataIndexBundle\Model\OpenSearch\Query\DateFilter as GenericDateFilter; use Pimcore\Bundle\StudioBackendBundle\DataIndex\Filter\Asset\IsAssetFilterTrait; use Pimcore\Bundle\StudioBackendBundle\DataIndex\Filter\FilterInterface; -use Pimcore\Bundle\StudioBackendBundle\DataIndex\Query\AssetQuery; +use Pimcore\Bundle\StudioBackendBundle\DataIndex\Query\AssetQueryInterface; use Pimcore\Bundle\StudioBackendBundle\DataIndex\Query\QueryInterface; use Pimcore\Bundle\StudioBackendBundle\Exception\Api\InvalidArgumentException; use Pimcore\Bundle\StudioBackendBundle\Grid\Column\ColumnType; @@ -49,7 +49,7 @@ public function apply(mixed $parameters, QueryInterface $query): QueryInterface return $assetQuery; } - private function applyDateFilter(ColumnFilter $column, AssetQuery $query): AssetQuery + private function applyDateFilter(ColumnFilter $column, AssetQueryInterface $query): AssetQueryInterface { if (!is_array($column->getFilterValue())) { throw new InvalidArgumentException('Filter value for date must be an array'); diff --git a/src/DataIndex/Filter/Asset/Metadata/DocumentFilter.php b/src/DataIndex/Filter/Asset/Metadata/DocumentFilter.php index b6df25779..b0ed62b73 100644 --- a/src/DataIndex/Filter/Asset/Metadata/DocumentFilter.php +++ b/src/DataIndex/Filter/Asset/Metadata/DocumentFilter.php @@ -18,7 +18,7 @@ use Pimcore\Bundle\StudioBackendBundle\DataIndex\Filter\Asset\IsAssetFilterTrait; use Pimcore\Bundle\StudioBackendBundle\DataIndex\Filter\FilterInterface; -use Pimcore\Bundle\StudioBackendBundle\DataIndex\Query\AssetQuery; +use Pimcore\Bundle\StudioBackendBundle\DataIndex\Query\AssetQueryInterface; use Pimcore\Bundle\StudioBackendBundle\DataIndex\Query\QueryInterface; use Pimcore\Bundle\StudioBackendBundle\Exception\Api\InvalidArgumentException; use Pimcore\Bundle\StudioBackendBundle\Grid\Column\ColumnType; @@ -48,7 +48,7 @@ public function apply(mixed $parameters, QueryInterface $query): QueryInterface return $assetQuery; } - private function applyDocumentFilter(ColumnFilter $column, AssetQuery $query): AssetQuery + private function applyDocumentFilter(ColumnFilter $column, AssetQueryInterface $query): AssetQueryInterface { if (!is_int($column->getFilterValue())) { throw new InvalidArgumentException('Filter value for document must be a integer (ID of the document)'); diff --git a/src/DataIndex/Filter/Asset/Metadata/InputFilter.php b/src/DataIndex/Filter/Asset/Metadata/InputFilter.php index 9c1e3026b..beabecbb1 100644 --- a/src/DataIndex/Filter/Asset/Metadata/InputFilter.php +++ b/src/DataIndex/Filter/Asset/Metadata/InputFilter.php @@ -18,7 +18,7 @@ use Pimcore\Bundle\StudioBackendBundle\DataIndex\Filter\Asset\IsAssetFilterTrait; use Pimcore\Bundle\StudioBackendBundle\DataIndex\Filter\FilterInterface; -use Pimcore\Bundle\StudioBackendBundle\DataIndex\Query\AssetQuery; +use Pimcore\Bundle\StudioBackendBundle\DataIndex\Query\AssetQueryInterface; use Pimcore\Bundle\StudioBackendBundle\DataIndex\Query\QueryInterface; use Pimcore\Bundle\StudioBackendBundle\Exception\Api\InvalidArgumentException; use Pimcore\Bundle\StudioBackendBundle\Grid\Column\ColumnType; @@ -48,7 +48,7 @@ public function apply(mixed $parameters, QueryInterface $query): QueryInterface return $assetQuery; } - private function applyInputFilter(ColumnFilter $column, AssetQuery $query): AssetQuery + private function applyInputFilter(ColumnFilter $column, AssetQueryInterface $query): AssetQueryInterface { if (!is_string($column->getFilterValue())) { throw new InvalidArgumentException('Filter value for input must be a string'); diff --git a/src/DataIndex/Filter/Asset/Metadata/ObjectFilter.php b/src/DataIndex/Filter/Asset/Metadata/ObjectFilter.php index 91d11c313..aad77405d 100644 --- a/src/DataIndex/Filter/Asset/Metadata/ObjectFilter.php +++ b/src/DataIndex/Filter/Asset/Metadata/ObjectFilter.php @@ -18,7 +18,7 @@ use Pimcore\Bundle\StudioBackendBundle\DataIndex\Filter\Asset\IsAssetFilterTrait; use Pimcore\Bundle\StudioBackendBundle\DataIndex\Filter\FilterInterface; -use Pimcore\Bundle\StudioBackendBundle\DataIndex\Query\AssetQuery; +use Pimcore\Bundle\StudioBackendBundle\DataIndex\Query\AssetQueryInterface; use Pimcore\Bundle\StudioBackendBundle\DataIndex\Query\QueryInterface; use Pimcore\Bundle\StudioBackendBundle\Exception\Api\InvalidArgumentException; use Pimcore\Bundle\StudioBackendBundle\Grid\Column\ColumnType; @@ -48,7 +48,7 @@ public function apply(mixed $parameters, QueryInterface $query): QueryInterface return $assetQuery; } - private function applyAssetFilter(ColumnFilter $column, AssetQuery $query): AssetQuery + private function applyAssetFilter(ColumnFilter $column, AssetQueryInterface $query): AssetQueryInterface { if (!is_int($column->getFilterValue())) { throw new InvalidArgumentException('Filter value for object must be a integer (ID of the object)'); diff --git a/src/DataIndex/Filter/Asset/Metadata/SelectFilter.php b/src/DataIndex/Filter/Asset/Metadata/SelectFilter.php index 407c41b32..e08c09807 100644 --- a/src/DataIndex/Filter/Asset/Metadata/SelectFilter.php +++ b/src/DataIndex/Filter/Asset/Metadata/SelectFilter.php @@ -18,7 +18,7 @@ use Pimcore\Bundle\StudioBackendBundle\DataIndex\Filter\Asset\IsAssetFilterTrait; use Pimcore\Bundle\StudioBackendBundle\DataIndex\Filter\FilterInterface; -use Pimcore\Bundle\StudioBackendBundle\DataIndex\Query\AssetQuery; +use Pimcore\Bundle\StudioBackendBundle\DataIndex\Query\AssetQueryInterface; use Pimcore\Bundle\StudioBackendBundle\DataIndex\Query\QueryInterface; use Pimcore\Bundle\StudioBackendBundle\Exception\Api\InvalidArgumentException; use Pimcore\Bundle\StudioBackendBundle\Grid\Column\ColumnType; @@ -48,7 +48,7 @@ public function apply(mixed $parameters, QueryInterface $query): QueryInterface return $assetQuery; } - private function applySelectFilter(ColumnFilter $column, AssetQuery $query): AssetQuery + private function applySelectFilter(ColumnFilter $column, AssetQueryInterface $query): AssetQueryInterface { if (!is_string($column->getFilterValue())) { throw new InvalidArgumentException('Filter value for select must be a string'); diff --git a/src/DataIndex/Filter/Asset/Metadata/TextAreaFilter.php b/src/DataIndex/Filter/Asset/Metadata/TextAreaFilter.php index 3a043d91a..539863406 100644 --- a/src/DataIndex/Filter/Asset/Metadata/TextAreaFilter.php +++ b/src/DataIndex/Filter/Asset/Metadata/TextAreaFilter.php @@ -18,7 +18,7 @@ use Pimcore\Bundle\StudioBackendBundle\DataIndex\Filter\Asset\IsAssetFilterTrait; use Pimcore\Bundle\StudioBackendBundle\DataIndex\Filter\FilterInterface; -use Pimcore\Bundle\StudioBackendBundle\DataIndex\Query\AssetQuery; +use Pimcore\Bundle\StudioBackendBundle\DataIndex\Query\AssetQueryInterface; use Pimcore\Bundle\StudioBackendBundle\DataIndex\Query\QueryInterface; use Pimcore\Bundle\StudioBackendBundle\Exception\Api\InvalidArgumentException; use Pimcore\Bundle\StudioBackendBundle\Grid\Column\ColumnType; @@ -48,7 +48,7 @@ public function apply(mixed $parameters, QueryInterface $query): QueryInterface return $assetQuery; } - private function applyTextAreaFilter(ColumnFilter $column, AssetQuery $query): AssetQuery + private function applyTextAreaFilter(ColumnFilter $column, AssetQueryInterface $query): AssetQueryInterface { if (!is_string($column->getFilterValue())) { throw new InvalidArgumentException('Filter value for textarea must be a string'); diff --git a/src/DataIndex/Filter/Asset/SortFilter.php b/src/DataIndex/Filter/Asset/SortFilter.php index 59b43a1db..8e7c5bbd2 100644 --- a/src/DataIndex/Filter/Asset/SortFilter.php +++ b/src/DataIndex/Filter/Asset/SortFilter.php @@ -18,7 +18,7 @@ use Pimcore\Bundle\GenericDataIndexBundle\Enum\Search\SortDirection; use Pimcore\Bundle\StudioBackendBundle\DataIndex\Filter\FilterInterface; -use Pimcore\Bundle\StudioBackendBundle\DataIndex\Query\AssetQuery; +use Pimcore\Bundle\StudioBackendBundle\DataIndex\Query\AssetQueryInterface; use Pimcore\Bundle\StudioBackendBundle\DataIndex\Query\QueryInterface; use Pimcore\Bundle\StudioBackendBundle\MappedParameter\Filter\SortFilterParameterInterface; @@ -29,7 +29,7 @@ final class SortFilter implements FilterInterface { public function apply(mixed $parameters, QueryInterface $query): QueryInterface { - if (!$query instanceof AssetQuery) { + if (!$query instanceof AssetQueryInterface) { return $query; } diff --git a/src/DataIndex/Filter/Asset/System/DatetimeFilter.php b/src/DataIndex/Filter/Asset/System/DatetimeFilter.php index 60096c71f..52e703993 100644 --- a/src/DataIndex/Filter/Asset/System/DatetimeFilter.php +++ b/src/DataIndex/Filter/Asset/System/DatetimeFilter.php @@ -18,7 +18,7 @@ use Pimcore\Bundle\StudioBackendBundle\DataIndex\Filter\Asset\IsAssetFilterTrait; use Pimcore\Bundle\StudioBackendBundle\DataIndex\Filter\FilterInterface; -use Pimcore\Bundle\StudioBackendBundle\DataIndex\Query\AssetQuery; +use Pimcore\Bundle\StudioBackendBundle\DataIndex\Query\AssetQueryInterface; use Pimcore\Bundle\StudioBackendBundle\DataIndex\Query\QueryInterface; use Pimcore\Bundle\StudioBackendBundle\Exception\Api\InvalidArgumentException; use Pimcore\Bundle\StudioBackendBundle\Grid\Column\ColumnType; @@ -48,7 +48,7 @@ public function apply(mixed $parameters, QueryInterface $query): QueryInterface return $assetQuery; } - private function applyDatetimeFilter(ColumnFilter $column, AssetQuery $query): AssetQuery + private function applyDatetimeFilter(ColumnFilter $column, AssetQueryInterface $query): AssetQueryInterface { if (!is_array($column->getFilterValue())) { throw new InvalidArgumentException('Filter value for this filter must be an array'); @@ -57,7 +57,7 @@ private function applyDatetimeFilter(ColumnFilter $column, AssetQuery $query): A $filterValue = $column->getFilterValue(); if (isset($filterValue['on'])) { - $query->filterDatetime($column->getKey(), null, $filterValue['on']); + $query->filterDatetime($column->getKey(), null, null, $filterValue['on']); } if (isset($filterValue['to'])) { diff --git a/src/DataIndex/Filter/Asset/System/StringFilter.php b/src/DataIndex/Filter/Asset/System/StringFilter.php index 3eea4c48a..7d21e6e5e 100644 --- a/src/DataIndex/Filter/Asset/System/StringFilter.php +++ b/src/DataIndex/Filter/Asset/System/StringFilter.php @@ -18,7 +18,7 @@ use Pimcore\Bundle\StudioBackendBundle\DataIndex\Filter\Asset\IsAssetFilterTrait; use Pimcore\Bundle\StudioBackendBundle\DataIndex\Filter\FilterInterface; -use Pimcore\Bundle\StudioBackendBundle\DataIndex\Query\AssetQuery; +use Pimcore\Bundle\StudioBackendBundle\DataIndex\Query\AssetQueryInterface; use Pimcore\Bundle\StudioBackendBundle\DataIndex\Query\QueryInterface; use Pimcore\Bundle\StudioBackendBundle\Exception\Api\InvalidArgumentException; use Pimcore\Bundle\StudioBackendBundle\Grid\Column\ColumnType; @@ -48,7 +48,7 @@ public function apply(mixed $parameters, QueryInterface $query): QueryInterface return $assetQuery; } - private function applyStringFilter(ColumnFilter $column, AssetQuery $query): AssetQuery + private function applyStringFilter(ColumnFilter $column, AssetQueryInterface $query): AssetQueryInterface { if (!is_string($column->getFilterValue())) { throw new InvalidArgumentException('Filter value for this filter must be a string'); diff --git a/src/DataIndex/Filter/DataObject/ClassNameFilter.php b/src/DataIndex/Filter/DataObject/ClassNameFilter.php index bd448855b..e7a09e194 100644 --- a/src/DataIndex/Filter/DataObject/ClassNameFilter.php +++ b/src/DataIndex/Filter/DataObject/ClassNameFilter.php @@ -18,7 +18,7 @@ use Exception; use Pimcore\Bundle\StudioBackendBundle\DataIndex\Filter\FilterInterface; -use Pimcore\Bundle\StudioBackendBundle\DataIndex\Query\DataObjectQuery; +use Pimcore\Bundle\StudioBackendBundle\DataIndex\Query\DataObjectQueryInterface; use Pimcore\Bundle\StudioBackendBundle\DataIndex\Query\QueryInterface; use Pimcore\Bundle\StudioBackendBundle\DataIndex\Request\ClassNameParametersInterface; @@ -34,7 +34,7 @@ public function apply(mixed $parameters, QueryInterface $query): QueryInterface { if ( !$parameters instanceof ClassNameParametersInterface || - !$query instanceof DataObjectQuery || + !$query instanceof DataObjectQueryInterface || !$parameters->getClassName() ) { return $query; diff --git a/src/DataIndex/Query/AssetQuery.php b/src/DataIndex/Query/AssetQuery.php index df97b3d65..ac32baddb 100644 --- a/src/DataIndex/Query/AssetQuery.php +++ b/src/DataIndex/Query/AssetQuery.php @@ -31,7 +31,7 @@ use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Sort\OrderByField; use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Sort\Tree\OrderByFullPath; -final class AssetQuery implements QueryInterface +final class AssetQuery implements AssetQueryInterface { public const ASSET_QUERY_ID = 'asset_query'; diff --git a/src/DataIndex/Query/AssetQueryInterface.php b/src/DataIndex/Query/AssetQueryInterface.php new file mode 100644 index 000000000..ecf95bf59 --- /dev/null +++ b/src/DataIndex/Query/AssetQueryInterface.php @@ -0,0 +1,44 @@ +assertNull( + $myTestClass->validateParameterType(new DateTime()) + ); + } + + public function testValidateParameterType(): void + { + $myTestClass = new MyTestClass(); + $columnFiltersParameterInterfaceMock = $this->makeEmpty(ColumnFiltersParameterInterface::class); + $this->assertSame( + $columnFiltersParameterInterfaceMock, + $myTestClass->validateParameterType($columnFiltersParameterInterfaceMock) + ); + } + + public function testValidateQueryTypeNullIfWrongInterface(): void + { + $myTestClass = new MyTestClass(); + + $this->assertNull( + $myTestClass->validateQueryType(new DateTime()) + ); + } + + public function testValidateQueryType(): void + { + $myTestClass = new MyTestClass(); + $columnFiltersParameterInterfaceMock = $this->makeEmpty(AssetQueryInterface::class); + $this->assertSame( + $columnFiltersParameterInterfaceMock, + $myTestClass->validateQueryType($columnFiltersParameterInterfaceMock) + ); + } +} + +final class MyTestClass +{ + use IsAssetFilterTrait; +} diff --git a/tests/Unit/DataIndex/Filter/Asset/Metadata/AssetFilterTest.php b/tests/Unit/DataIndex/Filter/Asset/Metadata/AssetFilterTest.php new file mode 100644 index 000000000..2c71be9bc --- /dev/null +++ b/tests/Unit/DataIndex/Filter/Asset/Metadata/AssetFilterTest.php @@ -0,0 +1,65 @@ +makeEmpty(AssetQueryInterface::class, [ + 'filterMetadata' => Expected::never(), + ]); + + $columnFilterMock = $this->getColumnFilterMock('key', 'type', 'not_at'); + + $stringFilter = new AssetFilter(); + + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionMessage('Filter value for asset must be a integer (ID of the asset)'); + $stringFilter->apply($columnFilterMock, $queryMock); + } + + public function testApplyAssetFilter(): void + { + $columnFilterMock = $this->getColumnFilterMock('key', 'type', 1); + + $queryMock = $this->makeEmpty(AssetQueryInterface::class, [ + 'filterMetadata' => Expected::once(function ($key, $type, $value) { + $this->assertSame('key', $key); + $this->assertSame(FilterType::ASSET->value, $type); + $this->assertSame(1, $value); + + return $this->makeEmpty(AssetQueryInterface::class); + }), + ]); + + $textAreaFilter = new AssetFilter(); + $textAreaFilter->apply($columnFilterMock, $queryMock); + } +} diff --git a/tests/Unit/DataIndex/Filter/Asset/Metadata/CheckboxFilterTest.php b/tests/Unit/DataIndex/Filter/Asset/Metadata/CheckboxFilterTest.php new file mode 100644 index 000000000..d51aaca59 --- /dev/null +++ b/tests/Unit/DataIndex/Filter/Asset/Metadata/CheckboxFilterTest.php @@ -0,0 +1,65 @@ +makeEmpty(AssetQueryInterface::class, [ + 'filterMetadata' => Expected::never(), + ]); + + $columnFilterMock = $this->getColumnFilterMock('key', 'type', 'not_bool'); + + $stringFilter = new CheckboxFilter(); + + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionMessage('Filter value for checkbox must be a boolean'); + $stringFilter->apply($columnFilterMock, $queryMock); + } + + public function testApplyCheckboxFilter(): void + { + $columnFilterMock = $this->getColumnFilterMock('key', 'type', true); + + $queryMock = $this->makeEmpty(AssetQueryInterface::class, [ + 'filterMetadata' => Expected::once(function ($key, $type, $value) { + $this->assertSame('key', $key); + $this->assertSame(FilterType::CHECKBOX->value, $type); + $this->assertSame(true, $value); + + return $this->makeEmpty(AssetQueryInterface::class); + }), + ]); + + $textAreaFilter = new CheckboxFilter(); + $textAreaFilter->apply($columnFilterMock, $queryMock); + } +} diff --git a/tests/Unit/DataIndex/Filter/Asset/Metadata/ColumnFilterMockTrait.php b/tests/Unit/DataIndex/Filter/Asset/Metadata/ColumnFilterMockTrait.php new file mode 100644 index 000000000..b00b1383e --- /dev/null +++ b/tests/Unit/DataIndex/Filter/Asset/Metadata/ColumnFilterMockTrait.php @@ -0,0 +1,37 @@ +makeEmpty(ColumnFiltersParameterInterface::class, [ + 'getColumnFilterByType' => function () use ($key, $type, $value) { + return [ + new ColumnFilter($key, $type, $value), + ]; + }, + ]); + } +} diff --git a/tests/Unit/DataIndex/Filter/Asset/Metadata/DateFilterTest.php b/tests/Unit/DataIndex/Filter/Asset/Metadata/DateFilterTest.php new file mode 100644 index 000000000..f00a24c64 --- /dev/null +++ b/tests/Unit/DataIndex/Filter/Asset/Metadata/DateFilterTest.php @@ -0,0 +1,105 @@ +makeEmpty(AssetQueryInterface::class, [ + 'filterMetadata' => Expected::never(), + ]); + + $columnFilterMock = $this->getColumnFilterMock('key', 'type', 'not_array'); + + $stringFilter = new DateFilter(); + + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionMessage('Filter value for date must be an array'); + $stringFilter->apply($columnFilterMock, $queryMock); + } + + public function testApplyDateFilterForOn(): void + { + $time = 1726753660; + $columnFilterMock = $this->getColumnFilterMock('key', 'type', ['on' => $time]); + + $queryMock = $this->makeEmpty(AssetQueryInterface::class, [ + 'filterMetadata' => Expected::once(function ($key, $type, $value) use ($time) { + $this->assertSame('key', $key); + $this->assertSame(FilterType::DATE->value, $type); + $this->assertSame([GenericDateFilter::PARAM_ON => $time], $value); + + return $this->makeEmpty(AssetQueryInterface::class); + }), + ]); + + $textAreaFilter = new DateFilter(); + $textAreaFilter->apply($columnFilterMock, $queryMock); + } + + public function testApplyDateFilterForTo(): void + { + $time = 1726753660; + $columnFilterMock = $this->getColumnFilterMock('key', 'type', ['to' => $time]); + + $queryMock = $this->makeEmpty(AssetQueryInterface::class, [ + 'filterMetadata' => Expected::once(function ($key, $type, $value) use ($time) { + $this->assertSame('key', $key); + $this->assertSame(FilterType::DATE->value, $type); + $this->assertSame([GenericDateFilter::PARAM_END => $time], $value); + + return $this->makeEmpty(AssetQueryInterface::class); + }), + ]); + + $textAreaFilter = new DateFilter(); + $textAreaFilter->apply($columnFilterMock, $queryMock); + } + + public function testApplyDateFilterForFrom(): void + { + $time = 1726753660; + $columnFilterMock = $this->getColumnFilterMock('key', 'type', ['from' => $time]); + + $queryMock = $this->makeEmpty(AssetQueryInterface::class, [ + 'filterMetadata' => Expected::once(function ($key, $type, $value) use ($time) { + $this->assertSame('key', $key); + $this->assertSame(FilterType::DATE->value, $type); + $this->assertSame([GenericDateFilter::PARAM_START => $time], $value); + + return $this->makeEmpty(AssetQueryInterface::class); + }), + ]); + + $textAreaFilter = new DateFilter(); + $textAreaFilter->apply($columnFilterMock, $queryMock); + } +} diff --git a/tests/Unit/DataIndex/Filter/Asset/Metadata/DocumentFilterTest.php b/tests/Unit/DataIndex/Filter/Asset/Metadata/DocumentFilterTest.php new file mode 100644 index 000000000..ddb7c5016 --- /dev/null +++ b/tests/Unit/DataIndex/Filter/Asset/Metadata/DocumentFilterTest.php @@ -0,0 +1,65 @@ +makeEmpty(AssetQueryInterface::class, [ + 'filterMetadata' => Expected::never(), + ]); + + $columnFilterMock = $this->getColumnFilterMock('key', 'type', 'not_int'); + + $stringFilter = new DocumentFilter(); + + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionMessage('Filter value for document must be a integer (ID of the document)'); + $stringFilter->apply($columnFilterMock, $queryMock); + } + + public function testApplyDocumentFilter(): void + { + $columnFilterMock = $this->getColumnFilterMock('key', 'type', 1); + + $queryMock = $this->makeEmpty(AssetQueryInterface::class, [ + 'filterMetadata' => Expected::once(function ($key, $type, $value) { + $this->assertSame('key', $key); + $this->assertSame(FilterType::DOCUMENT->value, $type); + $this->assertSame(1, $value); + + return $this->makeEmpty(AssetQueryInterface::class); + }), + ]); + + $textAreaFilter = new DocumentFilter(); + $textAreaFilter->apply($columnFilterMock, $queryMock); + } +} diff --git a/tests/Unit/DataIndex/Filter/Asset/Metadata/InputFilterTest.php b/tests/Unit/DataIndex/Filter/Asset/Metadata/InputFilterTest.php new file mode 100644 index 000000000..59c5b3f00 --- /dev/null +++ b/tests/Unit/DataIndex/Filter/Asset/Metadata/InputFilterTest.php @@ -0,0 +1,65 @@ +makeEmpty(AssetQueryInterface::class, [ + 'filterMetadata' => Expected::never(), + ]); + + $columnFilterMock = $this->getColumnFilterMock('key', 'type', 123); + + $stringFilter = new InputFilter(); + + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionMessage('Filter value for input must be a string'); + $stringFilter->apply($columnFilterMock, $queryMock); + } + + public function testApplyInputFilter(): void + { + $columnFilterMock = $this->getColumnFilterMock('key', 'type', 'test_value'); + + $queryMock = $this->makeEmpty(AssetQueryInterface::class, [ + 'filterMetadata' => Expected::once(function ($key, $type, $value) { + $this->assertSame('key', $key); + $this->assertSame(FilterType::INPUT->value, $type); + $this->assertSame('test_value', $value); + + return $this->makeEmpty(AssetQueryInterface::class); + }), + ]); + + $textAreaFilter = new InputFilter(); + $textAreaFilter->apply($columnFilterMock, $queryMock); + } +} diff --git a/tests/Unit/DataIndex/Filter/Asset/Metadata/ObjectFilterTest.php b/tests/Unit/DataIndex/Filter/Asset/Metadata/ObjectFilterTest.php new file mode 100644 index 000000000..b6786ad03 --- /dev/null +++ b/tests/Unit/DataIndex/Filter/Asset/Metadata/ObjectFilterTest.php @@ -0,0 +1,65 @@ +makeEmpty(AssetQueryInterface::class, [ + 'filterMetadata' => Expected::never(), + ]); + + $columnFilterMock = $this->getColumnFilterMock('key', 'type', 'not_int'); + + $stringFilter = new ObjectFilter(); + + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionMessage('Filter value for object must be a integer (ID of the object)'); + $stringFilter->apply($columnFilterMock, $queryMock); + } + + public function testApplyObjectFilter(): void + { + $columnFilterMock = $this->getColumnFilterMock('key', 'type', 1); + + $queryMock = $this->makeEmpty(AssetQueryInterface::class, [ + 'filterMetadata' => Expected::once(function ($key, $type, $value) { + $this->assertSame('key', $key); + $this->assertSame(FilterType::OBJECT->value, $type); + $this->assertSame(1, $value); + + return $this->makeEmpty(AssetQueryInterface::class); + }), + ]); + + $textAreaFilter = new ObjectFilter(); + $textAreaFilter->apply($columnFilterMock, $queryMock); + } +} diff --git a/tests/Unit/DataIndex/Filter/Asset/Metadata/SelectFilterTest.php b/tests/Unit/DataIndex/Filter/Asset/Metadata/SelectFilterTest.php new file mode 100644 index 000000000..71cfce2d9 --- /dev/null +++ b/tests/Unit/DataIndex/Filter/Asset/Metadata/SelectFilterTest.php @@ -0,0 +1,65 @@ +makeEmpty(AssetQueryInterface::class, [ + 'filterMetadata' => Expected::never(), + ]); + + $columnFilterMock = $this->getColumnFilterMock('key', 'type', 123); + + $stringFilter = new SelectFilter(); + + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionMessage('Filter value for select must be a string'); + $stringFilter->apply($columnFilterMock, $queryMock); + } + + public function testApplySelectFilter(): void + { + $columnFilterMock = $this->getColumnFilterMock('key', 'type', 'value'); + + $queryMock = $this->makeEmpty(AssetQueryInterface::class, [ + 'filterMetadata' => Expected::once(function ($key, $type, $value) { + $this->assertSame('key', $key); + $this->assertSame(FilterType::SELECT->value, $type); + $this->assertSame('value', $value); + + return $this->makeEmpty(AssetQueryInterface::class); + }), + ]); + + $textAreaFilter = new SelectFilter(); + $textAreaFilter->apply($columnFilterMock, $queryMock); + } +} diff --git a/tests/Unit/DataIndex/Filter/Asset/Metadata/TextAreaFilterTest.php b/tests/Unit/DataIndex/Filter/Asset/Metadata/TextAreaFilterTest.php new file mode 100644 index 000000000..461b5d856 --- /dev/null +++ b/tests/Unit/DataIndex/Filter/Asset/Metadata/TextAreaFilterTest.php @@ -0,0 +1,65 @@ +makeEmpty(AssetQueryInterface::class, [ + 'filterMetadata' => Expected::never(), + ]); + + $columnFilterMock = $this->getColumnFilterMock('key', 'type', 123); + + $stringFilter = new TextAreaFilter(); + + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionMessage('Filter value for textarea must be a string'); + $stringFilter->apply($columnFilterMock, $queryMock); + } + + public function testApplyTextAreaFilter(): void + { + $columnFilterMock = $this->getColumnFilterMock('key', 'type', 'value'); + + $queryMock = $this->makeEmpty(AssetQueryInterface::class, [ + 'filterMetadata' => Expected::once(function ($key, $type, $value) { + $this->assertSame('key', $key); + $this->assertSame(FilterType::TEXTAREA->value, $type); + $this->assertSame('value', $value); + + return $this->makeEmpty(AssetQueryInterface::class); + }), + ]); + + $textAreaFilter = new TextAreaFilter(); + $textAreaFilter->apply($columnFilterMock, $queryMock); + } +} diff --git a/tests/Unit/DataIndex/Filter/Asset/SortFilterTest.php b/tests/Unit/DataIndex/Filter/Asset/SortFilterTest.php new file mode 100644 index 000000000..91aabeea3 --- /dev/null +++ b/tests/Unit/DataIndex/Filter/Asset/SortFilterTest.php @@ -0,0 +1,83 @@ +makeEmpty(AssetQueryInterface::class, [ + 'orderByField' => Expected::never(), + ]); + + $sortFilter->apply('test', $query); + } + + public function testSortDirectionWithDesc(): void + { + $sortFilter = new SortFilter(); + $parameter = $this->makeEmpty(SortFilterParameterInterface::class, [ + 'getSortFilter' => function () { + return new SortFilterParameter('key', 'desc'); + }, + ]); + + $query = $this->makeEmpty(AssetQueryInterface::class, [ + 'orderByField' => function ($key, $direction) { + $this->assertSame('key', $key); + $this->assertSame(SortDirection::DESC, $direction); + + return $this->makeEmpty(AssetQueryInterface::class); + }, + ]); + + $sortFilter->apply($parameter, $query); + } + + public function testSortDirectionWithDefaultValue(): void + { + $sortFilter = new SortFilter(); + $parameter = $this->makeEmpty(SortFilterParameterInterface::class, [ + 'getSortFilter' => function () { + return new SortFilterParameter(); + }, + ]); + + $query = $this->makeEmpty(AssetQueryInterface::class, [ + 'orderByField' => function ($key, $direction) { + $this->assertSame('id', $key); + $this->assertSame(SortDirection::ASC, $direction); + + return $this->makeEmpty(AssetQueryInterface::class); + }, + ]); + + $sortFilter->apply($parameter, $query); + } +} diff --git a/tests/Unit/DataIndex/Filter/Asset/System/DatetimeFilterTest.php b/tests/Unit/DataIndex/Filter/Asset/System/DatetimeFilterTest.php new file mode 100644 index 000000000..e7cfa6174 --- /dev/null +++ b/tests/Unit/DataIndex/Filter/Asset/System/DatetimeFilterTest.php @@ -0,0 +1,111 @@ +makeEmpty(ColumnFiltersParameterInterface::class, [ + 'getColumnFilterByType' => function () { + return [ + new ColumnFilter('key', 'type', 123), + ]; + }, + ]); + + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionMessage('Filter value for this filter must be an array'); + $datetimeFilter->apply($columnParameterMock, $this->makeEmpty(AssetQueryInterface::class)); + } + + public function testDateTimeFilterWithOn(): void + { + $time = 1726753660; + $datetimeFilter = new DatetimeFilter(); + $queryMock = $this->makeEmpty(AssetQueryInterface::class, [ + 'filterDatetime' => Expected::once(function ($key, $start, $end, $on) use ($time) { + $this->assertSame('key', $key); + $this->assertNull($start); + $this->assertNull($end); + $this->assertSame($time, $on); + + return $this->makeEmpty(AssetQueryInterface::class); + }), + ]); + + $columnParameterMock = $this->getColumnFilterMock('key', 'type', ['on' => $time]); + + $datetimeFilter->apply($columnParameterMock, $queryMock); + + } + + public function testDateTimeFilterWithFrom(): void + { + $time = 1726753660; + $datetimeFilter = new DatetimeFilter(); + $queryMock = $this->makeEmpty(AssetQueryInterface::class, [ + 'filterDatetime' => Expected::once(function ($key, $start, $end, $on) use ($time) { + $this->assertSame('key', $key); + $this->assertSame($time, $start); + $this->assertNull($end); + $this->assertNull($on); + + return $this->makeEmpty(AssetQueryInterface::class); + }), + ]); + + $columnParameterMock = $this->getColumnFilterMock('key', 'type', ['from' => $time]); + + $datetimeFilter->apply($columnParameterMock, $queryMock); + } + + public function testDateTimeFilterWithTo(): void + { + $time = 1726753660; + $datetimeFilter = new DatetimeFilter(); + $queryMock = $this->makeEmpty(AssetQueryInterface::class, [ + 'filterDatetime' => Expected::once(function ($key, $start, $end, $on) use ($time) { + $this->assertSame('key', $key); + $this->assertNull($start); + $this->assertSame($time, $end); + $this->assertNull($on); + + return $this->makeEmpty(AssetQueryInterface::class); + }), + ]); + + $columnParameterMock = $this->getColumnFilterMock('key', 'type', ['to' => $time]); + + $datetimeFilter->apply($columnParameterMock, $queryMock); + } +} diff --git a/tests/Unit/DataIndex/Filter/Asset/System/StringFilterTest.php b/tests/Unit/DataIndex/Filter/Asset/System/StringFilterTest.php new file mode 100644 index 000000000..8785cb744 --- /dev/null +++ b/tests/Unit/DataIndex/Filter/Asset/System/StringFilterTest.php @@ -0,0 +1,75 @@ +makeEmpty(AssetQueryInterface::class, [ + 'wildcardSearch' => Expected::never(), + ]); + + $columnFilterMock = $this->makeEmpty(ColumnFiltersParameterInterface::class, [ + 'getColumnFilterByType' => function () { + return [ + new ColumnFilter('key', 'type', 123), + ]; + }, + ]); + + $stringFilter = new StringFilter(); + + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionMessage('Filter value for this filter must be a string'); + $stringFilter->apply($columnFilterMock, $queryMock); + } + + public function testApplyStringFilter(): void + { + $queryMock = $this->makeEmpty(AssetQueryInterface::class, [ + 'wildcardSearch' => Expected::once(function ($key, $value) { + $this->assertSame('key', $key); + $this->assertSame('value', $value); + + return $this->makeEmpty(AssetQueryInterface::class); + }), + ]); + + $columnFilterMock = $this->makeEmpty(ColumnFiltersParameterInterface::class, [ + 'getColumnFilterByType' => function () { + return [ + new ColumnFilter('key', 'type', 'value'), + ]; + }, + ]); + + $stringFilter = new StringFilter(); + $stringFilter->apply($columnFilterMock, $queryMock); + } +}