From 35efaaa83fd9391091b1c2d77e97f5f00b30f7a6 Mon Sep 17 00:00:00 2001 From: Andrii Beziazychnyi Date: Sat, 4 Apr 2020 19:54:29 +0300 Subject: [PATCH 1/7] Magento2/ISSUE#16425: Fixed "OR Condition in searchCriteria (REST API) dosn't work" --- .../CollectionProcessor/FilterProcessor.php | 39 +++++++++++++++- .../FilterProcessorTest.php | 44 +++++++++++-------- 2 files changed, 62 insertions(+), 21 deletions(-) diff --git a/app/code/Magento/Eav/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor.php b/app/code/Magento/Eav/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor.php index 8f0a3fb2baa69..577acec59255d 100644 --- a/app/code/Magento/Eav/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor.php +++ b/app/code/Magento/Eav/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor.php @@ -64,20 +64,55 @@ private function addFilterGroupToCollection( AbstractDb $collection ) { $fields = []; + $customFilters = []; foreach ($filterGroup->getFilters() as $filter) { $isApplied = false; + $applyLater = false; $customFilter = $this->getCustomFilterForField($filter->getField()); if ($customFilter) { - $isApplied = $customFilter->apply($filter, $collection); + if ($filter->getConditionType() == 'eq') { + $customFilters = array_map( + function ($customFilter) { + if (count($values = $customFilter['values']) > 1) { + $filter = reset($customFilter['filter']); + $filter->setValue(implode(',', $values)); + $filter->setConditionType('in'); + $customFilter['filter'] = $filter; + } + + return $customFilter; + }, + array_merge_recursive( + $customFilters, + [$filter->getField() => [ + 'filter' => [clone $filter], + 'values' => [$filter->getValue()] + ]] + ) + ); + + $applyLater = true; + } + + if (!$applyLater) { + $isApplied = $customFilter->apply($filter, $collection); + } } - if (!$isApplied) { + if (!$isApplied && !$applyLater) { $field = $this->getFieldMapping($filter->getField()); $condition = $filter->getConditionType() ? $filter->getConditionType() : 'eq'; $fields[] = ['attribute' => $field, $condition => $filter->getValue()]; } } + if ($applyLater && count($customFilters)) { + foreach ($customFilters as $field => $filter) { + $customFilter = $this->getCustomFilterForField($field); + $customFilter->apply($filter['filter'], $collection); + } + } + if ($fields) { $collection->addFieldToFilter($fields); } diff --git a/app/code/Magento/Eav/Test/Unit/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessorTest.php b/app/code/Magento/Eav/Test/Unit/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessorTest.php index 5103eaed3d72f..b986aaa0004b4 100644 --- a/app/code/Magento/Eav/Test/Unit/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessorTest.php +++ b/app/code/Magento/Eav/Test/Unit/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessorTest.php @@ -5,14 +5,18 @@ */ namespace Magento\Eav\Test\Unit\Model\Api\SearchCriteria\CollectionProcessor; +use InvalidArgumentException; use Magento\Eav\Model\Api\SearchCriteria\CollectionProcessor\FilterProcessor; use Magento\Framework\Api\Filter; use Magento\Framework\Api\Search\FilterGroup; use Magento\Framework\Api\SearchCriteria\CollectionProcessor\FilterProcessor\CustomFilterInterface; use Magento\Framework\Api\SearchCriteriaInterface; use Magento\Framework\Data\Collection\AbstractDb; +use PHPUnit\Framework\MockObject\MockObject; +use PHPUnit\Framework\TestCase; +use stdClass; -class FilterProcessorTest extends \PHPUnit\Framework\TestCase +class FilterProcessorTest extends TestCase { /** * Return model @@ -31,8 +35,11 @@ private function getModel(array $customFilters, array $fieldMapping) */ public function testProcess() { - /** @var CustomFilterInterface|\PHPUnit_Framework_MockObject_MockObject $customFilterMock */ - $customFilterMock = $this->createPartialMock(CustomFilterInterface::class, ['apply']); + /** @var CustomFilterInterface|MockObject $customFilterMock */ + $customFilterMock = $this->createPartialMock( + CustomFilterInterface::class, + ['apply'] + ); $customFilterField = 'customFilterField'; $customFilters = [$customFilterField => $customFilterMock]; @@ -62,17 +69,17 @@ public function testProcess() $model = $this->getModel($customFilters, $fieldMapping); - /** @var FilterGroup|\PHPUnit_Framework_MockObject_MockObject $filterGroupOneMock */ + /** @var FilterGroup|MockObject $filterGroupOneMock */ $filterGroupOneMock = $this->getMockBuilder(FilterGroup::class) ->disableOriginalConstructor() ->getMock(); - /** @var FilterGroup|\PHPUnit_Framework_MockObject_MockObject $filterGroupTwoMock */ + /** @var FilterGroup|MockObject $filterGroupTwoMock */ $filterGroupTwoMock = $this->getMockBuilder(FilterGroup::class) ->disableOriginalConstructor() ->getMock(); - /** @var Filter|\PHPUnit_Framework_MockObject_MockObject $filterOneMock */ + /** @var Filter|MockObject $filterOneMock */ $filterOneMock = $this->getMockBuilder(Filter::class) ->disableOriginalConstructor() ->getMock(); @@ -80,7 +87,7 @@ public function testProcess() ->method('getField') ->willReturn($customFilterField); - /** @var Filter|\PHPUnit_Framework_MockObject_MockObject $filterTwoMock */ + /** @var Filter|MockObject $filterTwoMock */ $filterTwoMock = $this->getMockBuilder(Filter::class) ->disableOriginalConstructor() ->getMock(); @@ -94,7 +101,7 @@ public function testProcess() ->method('getConditionType') ->willReturn($otherFilterFieldCondition); - /** @var Filter|\PHPUnit_Framework_MockObject_MockObject $filterThreeMock */ + /** @var Filter|MockObject $filterThreeMock */ $filterThreeMock = $this->getMockBuilder(Filter::class) ->disableOriginalConstructor() ->getMock(); @@ -116,7 +123,7 @@ public function testProcess() ->method('getFilters') ->willReturn([$filterThreeMock]); - /** @var SearchCriteriaInterface|\PHPUnit_Framework_MockObject_MockObject $searchCriteriaMock */ + /** @var SearchCriteriaInterface|MockObject $searchCriteriaMock */ $searchCriteriaMock = $this->getMockBuilder(SearchCriteriaInterface::class) ->getMock(); @@ -124,7 +131,7 @@ public function testProcess() ->method('getFilterGroups') ->willReturn([$filterGroupOneMock, $filterGroupTwoMock]); - /** @var AbstractDb|\PHPUnit_Framework_MockObject_MockObject $searchCriteriarMock */ + /** @var AbstractDb|MockObject $searchCriteriarMock */ $collectionMock = $this->getMockBuilder(AbstractDb::class) ->disableOriginalConstructor() ->getMock(); @@ -144,25 +151,24 @@ public function testProcess() $model->process($searchCriteriaMock, $collectionMock); } - /** - * @expectedException \InvalidArgumentException - */ public function testProcessWithException() { - /** @var \stdClass|\PHPUnit_Framework_MockObject_MockObject $customFilterMock */ - $customFilterMock = $this->createPartialMock(\stdClass::class, ['apply']); + $this->expectException(InvalidArgumentException::class); + + /** @var stdClass|MockObject $customFilterMock */ + $customFilterMock = $this->createPartialMock(stdClass::class, ['apply']); $customFilterField = 'customFilterField'; $customFilters = [$customFilterField => $customFilterMock]; $model = $this->getModel($customFilters, []); - /** @var FilterGroup|\PHPUnit_Framework_MockObject_MockObject $filterGroupOneMock */ + /** @var FilterGroup|MockObject $filterGroupOneMock */ $filterGroupOneMock = $this->getMockBuilder(FilterGroup::class) ->disableOriginalConstructor() ->getMock(); - /** @var Filter|\PHPUnit_Framework_MockObject_MockObject $filterOneMock */ + /** @var Filter|MockObject $filterOneMock */ $filterOneMock = $this->getMockBuilder(Filter::class) ->disableOriginalConstructor() ->getMock(); @@ -174,7 +180,7 @@ public function testProcessWithException() ->method('getFilters') ->willReturn([$filterOneMock]); - /** @var SearchCriteriaInterface|\PHPUnit_Framework_MockObject_MockObject $searchCriteriaMock */ + /** @var SearchCriteriaInterface|MockObject $searchCriteriaMock */ $searchCriteriaMock = $this->getMockBuilder(SearchCriteriaInterface::class) ->getMock(); @@ -182,7 +188,7 @@ public function testProcessWithException() ->method('getFilterGroups') ->willReturn([$filterGroupOneMock]); - /** @var AbstractDb|\PHPUnit_Framework_MockObject_MockObject $searchCriteriarMock */ + /** @var AbstractDb|MockObject $searchCriteriarMock */ $collectionMock = $this->getMockBuilder(AbstractDb::class) ->disableOriginalConstructor() ->getMock(); From 004aa286275b4a5de4436f1d6a38510b74698ef1 Mon Sep 17 00:00:00 2001 From: Andrii Beziazychnyi Date: Sat, 4 Apr 2020 23:15:34 +0300 Subject: [PATCH 2/7] Fixed code according to reviewer suggestions --- .../CollectionProcessor/FilterProcessor.php | 9 +++-- .../FilterProcessorTest.php | 35 ++++++++++--------- 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/app/code/Magento/Eav/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor.php b/app/code/Magento/Eav/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor.php index 577acec59255d..f3c1aa72e9365 100644 --- a/app/code/Magento/Eav/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor.php +++ b/app/code/Magento/Eav/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor.php @@ -5,6 +5,7 @@ */ namespace Magento\Eav\Model\Api\SearchCriteria\CollectionProcessor; +use Magento\Framework\Api\Filter; use Magento\Framework\Api\Search\FilterGroup; use Magento\Framework\Api\SearchCriteria\CollectionProcessor\FilterProcessor\CustomFilterInterface; use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface; @@ -58,6 +59,8 @@ public function process(SearchCriteriaInterface $searchCriteria, AbstractDb $col * @param FilterGroup $filterGroup * @param AbstractDb $collection * @return void + * @SuppressWarnings(PHPMD.CyclomaticComplexity) + * @SuppressWarnings(PHPMD.NPathComplexity) */ private function addFilterGroupToCollection( FilterGroup $filterGroup, @@ -70,7 +73,7 @@ private function addFilterGroupToCollection( $applyLater = false; $customFilter = $this->getCustomFilterForField($filter->getField()); if ($customFilter) { - if ($filter->getConditionType() == 'eq') { + if ($filter->getConditionType() === 'eq') { $customFilters = array_map( function ($customFilter) { if (count($values = $customFilter['values']) > 1) { @@ -109,7 +112,9 @@ function ($customFilter) { if ($applyLater && count($customFilters)) { foreach ($customFilters as $field => $filter) { $customFilter = $this->getCustomFilterForField($field); - $customFilter->apply($filter['filter'], $collection); + /** @var Filter $filter */ + $filter = $filter['filter']; + $customFilter->apply($filter, $collection); } } diff --git a/app/code/Magento/Eav/Test/Unit/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessorTest.php b/app/code/Magento/Eav/Test/Unit/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessorTest.php index b986aaa0004b4..1718fec1f3c52 100644 --- a/app/code/Magento/Eav/Test/Unit/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessorTest.php +++ b/app/code/Magento/Eav/Test/Unit/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessorTest.php @@ -3,6 +3,8 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types = 1); + namespace Magento\Eav\Test\Unit\Model\Api\SearchCriteria\CollectionProcessor; use InvalidArgumentException; @@ -18,22 +20,10 @@ class FilterProcessorTest extends TestCase { - /** - * Return model - * - * @param CustomFilterInterface[] $customFilters - * @param array $fieldMapping - * @return FilterProcessor - */ - private function getModel(array $customFilters, array $fieldMapping) - { - return new FilterProcessor($customFilters, $fieldMapping); - } - /** * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ - public function testProcess() + public function testProcess(): void { /** @var CustomFilterInterface|MockObject $customFilterMock */ $customFilterMock = $this->createPartialMock( @@ -151,10 +141,8 @@ public function testProcess() $model->process($searchCriteriaMock, $collectionMock); } - public function testProcessWithException() + public function testProcessWithException(): void { - $this->expectException(InvalidArgumentException::class); - /** @var stdClass|MockObject $customFilterMock */ $customFilterMock = $this->createPartialMock(stdClass::class, ['apply']); @@ -199,6 +187,21 @@ public function testProcessWithException() $collectionMock->expects($this->never()) ->method('addFieldToFilter'); + $this->expectException(InvalidArgumentException::class); $model->process($searchCriteriaMock, $collectionMock); } + + /** + * Returns model + * + * @param CustomFilterInterface[] $customFilters + * @param array $fieldMapping + * @return FilterProcessor + */ + private function getModel( + array $customFilters, + array $fieldMapping + ): FilterProcessor { + return new FilterProcessor($customFilters, $fieldMapping); + } } From bb6e5d44228256d47cc4df58ab012374e9e44c62 Mon Sep 17 00:00:00 2001 From: Andrii Beziazychnyi Date: Fri, 2 Oct 2020 18:12:46 +0300 Subject: [PATCH 3/7] Fixes for different conditions --- .../CollectionProcessor/FilterProcessor.php | 54 ++++++++++++++++--- .../FilterProcessorTest.php | 4 ++ 2 files changed, 51 insertions(+), 7 deletions(-) diff --git a/app/code/Magento/Eav/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor.php b/app/code/Magento/Eav/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor.php index f3c1aa72e9365..e877f63b7114b 100644 --- a/app/code/Magento/Eav/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor.php +++ b/app/code/Magento/Eav/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor.php @@ -11,6 +11,8 @@ use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface; use Magento\Framework\Api\SearchCriteriaInterface; use Magento\Framework\Data\Collection\AbstractDb; +use Magento\Framework\DB\Select; +use Zend_Db_Select_Exception; /** * SearchCriteria FilterProcessor @@ -59,6 +61,7 @@ public function process(SearchCriteriaInterface $searchCriteria, AbstractDb $col * @param FilterGroup $filterGroup * @param AbstractDb $collection * @return void + * @throws Zend_Db_Select_Exception * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) */ @@ -68,9 +71,9 @@ private function addFilterGroupToCollection( ) { $fields = []; $customFilters = []; + $applyLater = false; foreach ($filterGroup->getFilters() as $filter) { $isApplied = false; - $applyLater = false; $customFilter = $this->getCustomFilterForField($filter->getField()); if ($customFilter) { if ($filter->getConditionType() === 'eq') { @@ -80,7 +83,7 @@ function ($customFilter) { $filter = reset($customFilter['filter']); $filter->setValue(implode(',', $values)); $filter->setConditionType('in'); - $customFilter['filter'] = $filter; + $customFilter['filter'] = [$filter]; } return $customFilter; @@ -102,25 +105,62 @@ function ($customFilter) { } } - if (!$isApplied && !$applyLater) { + if (!$isApplied && !$customFilter) { $field = $this->getFieldMapping($filter->getField()); $condition = $filter->getConditionType() ? $filter->getConditionType() : 'eq'; $fields[] = ['attribute' => $field, $condition => $filter->getValue()]; } } - if ($applyLater && count($customFilters)) { + $whereParts = $collection->getSelect()->getPart(Select::WHERE); + $whereSql = $this->applyFilters($collection, $fields, $customFilters); + $collection->getSelect()->setPart(Select::WHERE, $whereParts); + $collection->getSelect()->where($whereSql); + } + + /** + * Apply filters and retrieve `where` conditions + * + * @param AbstractDb $collection + * @param array $fields + * @param array $customFilters + * @return string + * @throws Zend_Db_Select_Exception + */ + private function applyFilters( + AbstractDb $collection, + array $fields, + array $customFilters + ): string { + $select = $collection->getSelect(); + $select->reset(Select::WHERE); + $whereParts = []; + if (count($fields)) { + $collection->addFieldToFilter($fields); + $whereParts[] = $select->getPart(Select::WHERE)[0]; + $select->reset(Select::WHERE); + } + + if (count($customFilters)) { foreach ($customFilters as $field => $filter) { $customFilter = $this->getCustomFilterForField($field); /** @var Filter $filter */ - $filter = $filter['filter']; + $filter = reset($filter['filter']); $customFilter->apply($filter, $collection); + $whereCondition = $select->getPart(Select::WHERE); + if (is_array($whereCondition) && count($whereCondition)) { + $whereParts[] = $whereCondition[0]; + $select->reset(Select::WHERE); + } } } + $resultCondition = ''; - if ($fields) { - $collection->addFieldToFilter($fields); + if (count($whereParts)) { + $resultCondition = '(' . implode(') ' . Select::SQL_OR . ' (', $whereParts) . ')'; } + + return $resultCondition; } /** diff --git a/app/code/Magento/Eav/Test/Unit/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessorTest.php b/app/code/Magento/Eav/Test/Unit/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessorTest.php index 16a2c23358e9e..2ce2e160afedb 100644 --- a/app/code/Magento/Eav/Test/Unit/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessorTest.php +++ b/app/code/Magento/Eav/Test/Unit/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessorTest.php @@ -14,6 +14,7 @@ use Magento\Framework\Api\SearchCriteria\CollectionProcessor\FilterProcessor\CustomFilterInterface; use Magento\Framework\Api\SearchCriteriaInterface; use Magento\Framework\Data\Collection\AbstractDb; +use Magento\Framework\DB\Select; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use stdClass; @@ -138,6 +139,9 @@ public function testProcess(): void [$resultTwo] )->willReturnSelf(); + $selectMock = $this->createMock(Select::class); + $collectionMock->method('getSelect')->willReturn($selectMock); + $model->process($searchCriteriaMock, $collectionMock); } From 4700db863b6fc71f8ee118bf285c1fec4abdadbd Mon Sep 17 00:00:00 2001 From: Andrii Beziazychnyi Date: Mon, 5 Oct 2020 11:20:59 +0300 Subject: [PATCH 4/7] Fixed unit tests --- .../SearchCriteria/CollectionProcessor/FilterProcessorTest.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/code/Magento/Eav/Test/Unit/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessorTest.php b/app/code/Magento/Eav/Test/Unit/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessorTest.php index 2ce2e160afedb..ee522283eb394 100644 --- a/app/code/Magento/Eav/Test/Unit/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessorTest.php +++ b/app/code/Magento/Eav/Test/Unit/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessorTest.php @@ -141,6 +141,9 @@ public function testProcess(): void $selectMock = $this->createMock(Select::class); $collectionMock->method('getSelect')->willReturn($selectMock); + $selectMock->method('getPart') + ->with(Select::WHERE) + ->willReturn([0 => '']); $model->process($searchCriteriaMock, $collectionMock); } From 950d8a0dec5db63e4925aec356b1590fb11207b3 Mon Sep 17 00:00:00 2001 From: Pavel Bystritsky Date: Tue, 13 Oct 2020 13:56:17 +0300 Subject: [PATCH 5/7] magento/magento2#26967: Fix for queue numeric argument conversion - tests fix. --- .../SearchCriteria/CollectionProcessor/FilterProcessor.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/code/Magento/Eav/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor.php b/app/code/Magento/Eav/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor.php index e877f63b7114b..007fcb7a6f509 100644 --- a/app/code/Magento/Eav/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor.php +++ b/app/code/Magento/Eav/Model/Api/SearchCriteria/CollectionProcessor/FilterProcessor.php @@ -115,7 +115,9 @@ function ($customFilter) { $whereParts = $collection->getSelect()->getPart(Select::WHERE); $whereSql = $this->applyFilters($collection, $fields, $customFilters); $collection->getSelect()->setPart(Select::WHERE, $whereParts); - $collection->getSelect()->where($whereSql); + if ($whereSql) { + $collection->getSelect()->where($whereSql); + } } /** From d1710bef52c753df036ef92a6e5f80dad8e756c8 Mon Sep 17 00:00:00 2001 From: Pavel Bystritsky Date: Tue, 13 Oct 2020 17:56:56 +0300 Subject: [PATCH 6/7] magento/magento2#16425: OR Condition in searchCriteria (REST API) doesn't work - web-api test added. --- .../Api/ProductRepositoryInterfaceTest.php | 114 ++++++++++++++++++ 1 file changed, 114 insertions(+) diff --git a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductRepositoryInterfaceTest.php b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductRepositoryInterfaceTest.php index 1fcfe79f39478..242e62ec43ab7 100644 --- a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductRepositoryInterfaceTest.php +++ b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductRepositoryInterfaceTest.php @@ -921,6 +921,120 @@ public function testGetList() $this->assertEquals($expectedResult, $response['items'][0]['custom_attributes'][$index]['value']); } + /** + * Test getList() method with 'OR' criteria. + * + * @param array $searchCriteria + * @param int $totalCount + * @magentoApiDataFixture Magento/Catalog/_files/categories.php + * @dataProvider getListOrCriteriaDataProvider + */ + public function testGetListOrCriteria(array $searchCriteria, int $totalCount) + { + $serviceInfo = [ + 'rest' => [ + 'resourcePath' => self::RESOURCE_PATH . '?' . http_build_query($searchCriteria), + 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET, + ], + 'soap' => [ + 'service' => self::SERVICE_NAME, + 'serviceVersion' => self::SERVICE_VERSION, + 'operation' => self::SERVICE_NAME . 'GetList', + ], + ]; + + $response = $this->_webApiCall($serviceInfo, $searchCriteria); + + $this->assertArrayHasKey('search_criteria', $response); + $this->assertArrayHasKey('total_count', $response); + $this->assertArrayHasKey('items', $response); + + $this->assertEquals($searchCriteria['searchCriteria'], $response['search_criteria']); + $this->assertEquals($response['total_count'], $totalCount); + $this->assertEquals(count($response['items']), $totalCount); + } + + /** + * Data provider for testGetListOrCriteria. + * + * @return array + */ + public function getListOrCriteriaDataProvider(): array + { + return [ + [ + [ + 'searchCriteria' => [ + 'filter_groups' => [ + [ + 'filters' => [ + [ + 'field' => 'category_id', + 'value' => '12', + 'condition_type' => 'eq', + ], + ], + ], + ], + 'current_page' => 1, + 'page_size' => 10, + ], + ], + 2, + ], + [ + [ + 'searchCriteria' => [ + 'filter_groups' => [ + [ + 'filters' => [ + [ + 'field' => 'category_id', + 'value' => '12', + 'condition_type' => 'eq', + ], + [ + 'field' => 'category_id', + 'value' => '13', + 'condition_type' => 'eq', + ], + ], + ], + ], + 'current_page' => 1, + 'page_size' => 10, + ], + ], + 3, + ], + [ + [ + 'searchCriteria' => [ + 'filter_groups' => [ + [ + 'filters' => [ + [ + 'field' => 'category_id', + 'value' => '12', + 'condition_type' => 'eq', + ], + [ + 'field' => 'sku', + 'value' => 'simple', + 'condition_type' => 'eq', + ], + ], + ], + ], + 'current_page' => 1, + 'page_size' => 10, + ], + ], + 3, + ], + ]; + } + /** * Test getList() method with additional params * From f6e4aced9074563a8c09ea2f446895d8c809facf Mon Sep 17 00:00:00 2001 From: Pavel Bystritsky Date: Thu, 15 Oct 2020 16:00:06 +0300 Subject: [PATCH 7/7] magento/magento2#16425: OR Condition in searchCriteria (REST API) doesn't work - static test fix. --- .../Magento/Catalog/Api/ProductRepositoryInterfaceTest.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductRepositoryInterfaceTest.php b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductRepositoryInterfaceTest.php index 242e62ec43ab7..a5f1686b940ac 100644 --- a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductRepositoryInterfaceTest.php +++ b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductRepositoryInterfaceTest.php @@ -34,6 +34,7 @@ * * @magentoAppIsolation enabled * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + * @SuppressWarnings(PHPMD.ExcessiveClassComplexity) */ class ProductRepositoryInterfaceTest extends WebapiAbstract { @@ -211,6 +212,7 @@ public function productCreationProvider() private function loadWebsiteByCode($websiteCode) { $websiteRepository = Bootstrap::getObjectManager()->get(WebsiteRepository::class); + $website = null; try { $website = $websiteRepository->get($websiteCode); } catch (NoSuchEntityException $e) {