diff --git a/app/code/Magento/Review/Ui/DataProvider/Product/ReviewDataProvider.php b/app/code/Magento/Review/Ui/DataProvider/Product/ReviewDataProvider.php index a9c011d4a4865..315739e94fc0c 100644 --- a/app/code/Magento/Review/Ui/DataProvider/Product/ReviewDataProvider.php +++ b/app/code/Magento/Review/Ui/DataProvider/Product/ReviewDataProvider.php @@ -5,14 +5,14 @@ */ namespace Magento\Review\Ui\DataProvider\Product; +use Magento\Framework\Api\Filter; use Magento\Framework\App\RequestInterface; -use Magento\Ui\DataProvider\AbstractDataProvider; -use Magento\Review\Model\ResourceModel\Review\Product\CollectionFactory; use Magento\Review\Model\ResourceModel\Review\Product\Collection; -use Magento\Review\Model\Review; +use Magento\Review\Model\ResourceModel\Review\Product\CollectionFactory; +use Magento\Ui\DataProvider\AbstractDataProvider; /** - * Class ReviewDataProvider + * DataProvider for product reviews * * @api * @@ -58,7 +58,7 @@ public function __construct( } /** - * {@inheritdoc} + * @inheritdoc * @since 100.1.0 */ public function getData() @@ -79,24 +79,42 @@ public function getData() } /** - * {@inheritdoc} - * @since 100.1.0 + * Returns prepared field name + * + * @param string $name + * @return string */ - public function addFilter(\Magento\Framework\Api\Filter $filter) + private function getPreparedField(string $name): string { - $field = $filter->getField(); + $preparedName = ''; - if (in_array($field, ['review_id', 'created_at', 'status_id'])) { - $filter->setField('rt.' . $field); + if (in_array($name, ['review_id', 'created_at', 'status_id'])) { + $preparedName = 'rt.' . $name; + } elseif (in_array($name, ['title', 'nickname', 'detail'])) { + $preparedName = 'rdt.' . $name; + } elseif ($name === 'review_created_at') { + $preparedName = 'rt.created_at'; } - if (in_array($field, ['title', 'nickname', 'detail'])) { - $filter->setField('rdt.' . $field); - } + return $preparedName ?: $name; + } - if ($field === 'review_created_at') { - $filter->setField('rt.created_at'); - } + /** + * @inheritDoc + */ + public function addOrder($field, $direction) + { + $this->getCollection()->setOrder($this->getPreparedField($field), $direction); + } + + /** + * @inheritdoc + * @since 100.1.0 + */ + public function addFilter(Filter $filter) + { + $field = $filter->getField(); + $filter->setField($this->getPreparedField($field)); parent::addFilter($filter); } diff --git a/dev/tests/integration/testsuite/Magento/Review/Ui/DataProvider/Product/ReviewDataProviderTest.php b/dev/tests/integration/testsuite/Magento/Review/Ui/DataProvider/Product/ReviewDataProviderTest.php new file mode 100644 index 0000000000000..5cd594a37d0e0 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Review/Ui/DataProvider/Product/ReviewDataProviderTest.php @@ -0,0 +1,138 @@ + 'review_listing_data_source', + 'primaryFieldName' => 'review_id', + 'requestFieldName' => 'entity_id', + ]; + + /** + * @var ObjectManagerInterface + */ + private $objectManager; + + /** + * @inheritDoc + */ + protected function setUp(): void + { + $this->objectManager = Bootstrap::getObjectManager(); + } + + /** + * Sorting dataProvider test + * + * @magentoDataFixture Magento/Review/_files/different_reviews.php + * @dataProvider sortingDataProvider + * + * @param string $field + * @param string $direction + * @param array $expectedSortedTitles + * @return void + */ + public function testSorting(string $field, string $direction, array $expectedSortedTitles): void + { + $request = $this->objectManager->create(RequestInterface::class); + $request->setParam('current_product_id', 1); + + $dataProvider = $this->objectManager->create( + ReviewDataProvider::class, + array_merge($this->modelParams, ['request' => $request]) + ); + $dataProvider->addOrder($field, $direction); + $result = $dataProvider->getData(); + + $this->assertEquals($this->getItemsField($result, 'title'), $expectedSortedTitles); + } + + /** + * Return items field data + * + * @param array $arrItems + * @param string $field + * @return array + */ + private function getItemsField(array $arrItems, string $field): array + { + $data = []; + foreach ($arrItems['items'] as $review) { + $data[] = $review[$field]; + } + + return $data; + } + + /** + * DataProvider for testSorting + * + * @return array + */ + public function sortingDataProvider(): array + { + return [ + 'sort by title field ascending' => [ + 'title', + 'asc', + ['1 filter second review', '2 filter first review', 'Review Summary'], + ], + 'sort by title field descending' => [ + 'title', + 'desc', + ['Review Summary', '2 filter first review', '1 filter second review'], + ], + ]; + } + + /** + * Filter dataProvider test + * + * @magentoDataFixture Magento/Review/_files/different_reviews.php + * + * @return void + */ + public function testFilter(): void + { + $searchTitle = '2 filter first review'; + + $request = $this->objectManager->create(RequestInterface::class); + $request->setParam('current_product_id', 1); + + /** @var ReviewDataProvider $dataProvider */ + $dataProvider = $this->objectManager->create( + ReviewDataProvider::class, + array_merge($this->modelParams, ['request' => $request]) + ); + + /** @var Filter $filter */ + $filter = $this->objectManager->create(Filter::class); + $filter->setField('title') + ->setValue($searchTitle); + + $dataProvider->addFilter($filter); + $result = $dataProvider->getData(); + + $this->assertEquals($this->getItemsField($result, 'title'), [$searchTitle]); + } +}