diff --git a/AdobeStockImage/Test/Unit/Model/GetImageListTest.php b/AdobeStockImage/Test/Unit/Model/GetImageListTest.php new file mode 100644 index 000000000000..bc188852e390 --- /dev/null +++ b/AdobeStockImage/Test/Unit/Model/GetImageListTest.php @@ -0,0 +1,216 @@ + [ + 'type' => 'content_type_filter', + 'condition' => 'or', + 'field' => 'illustration', + ], + 'photo_filter' => [ + 'type' => 'content_type_filter', + 'condition' => 'or', + 'field' => 'photo', + ], + 'premium_filter' => [ + 'type' => 'premium_price_filter', + 'condition' => 'eq', + 'field' => 'ALL', + ] + ]; + + /** + * @var GetAssetListInterface|MockObject + */ + private $getAssetListMock; + + /** + * @var GetImageList + */ + private $getImageListModel; + + /** + * @var FilterGroupBuilder|MockObject + */ + private $filterGroupBuilderMock; + + /** + * @var FilterBuilder|MockObject + */ + private $filterBuilderMock; + + /** + * @inheritDoc + */ + public function setUp() + { + $objectManager = new ObjectManager($this); + $this->getAssetListMock = $this->createMock(GetAssetListInterface::class); + $this->filterGroupBuilderMock = $this->createMock(FilterGroupBuilder::class); + $this->filterBuilderMock = $this->createMock(FilterBuilder::class); + + $this->getImageListModel = $objectManager->getObject( + GetImageList::class, + [ + 'getAssetList' => $this->getAssetListMock, + 'filterGroupBuilder' => $this->filterGroupBuilderMock, + 'filterBuilder' => $this->filterBuilderMock, + 'defaultFilters' => self::DEFAULT_FILTERS + ] + ); + } + + /** + * Test 'execute' method of GetImageList class. + * + * @dataProvider appliedFilterNamesProvider + * @throws LocalizedException + */ + public function testWithDefaultFilters(array $appliedFilterNames) + { + $appliedFilterGroup = $this->getAppliedFilterGroup($appliedFilterNames); + + /** @var MockObject|SearchCriteriaInterface $searchCriteria */ + $searchCriteria = $this->getMockForAbstractClass(SearchCriteriaInterface::class); + $searchCriteria->expects($this->once()) + ->method('getFilterGroups') + ->willReturn([$appliedFilterGroup]); + $searchCriteria->expects($this->once()) + ->method('setFilterGroups') + ->with([$appliedFilterGroup, $this->getDefaultFilterGroup($appliedFilterNames)]); + + $searchResult = $this->getMockForAbstractClass(SearchResultInterface::class); + + $this->getAssetListMock->expects($this->once()) + ->method('execute') + ->with($searchCriteria) + ->willReturn($searchResult); + + $this->assertEquals($searchResult, $this->getImageListModel->execute($searchCriteria)); + } + + /** + * Data provider for testWithDefaultFilters + * + * @return array + */ + public function appliedFilterNamesProvider() + { + return [ + [ + ['content_type_filter'] + ], + [ + ['words'] + ], + [ + ['premium_price_filter'] + ], + [ + [] + ] + ]; + } + + /** + * Get filter group with applied filters + * + * @param array $appliedFilterNames + * @return FilterGroup + */ + private function getAppliedFilterGroup(array $appliedFilterNames): FilterGroup + { + $filters = []; + + foreach ($appliedFilterNames as $field) { + /** @var \Magento\Framework\Api\Filter|MockObject $filter */ + $filter = $this->createMock(Filter::class); + $filter->expects($this->once()) + ->method('getField') + ->willReturn($field); + $filters[] = $filter; + } + + /** @var FilterGroup|MockObject $filterGroup */ + $filterGroup = $this->createMock(FilterGroup::class); + $filterGroup->expects($this->once()) + ->method('getFilters') + ->willReturn($filters); + + return $filterGroup; + } + + /** + * Get filter group with default filters that should be applied + * + * @param array $appliedFilterNames + * @return FilterGroup + */ + private function getDefaultFilterGroup(array $appliedFilterNames): FilterGroup + { + $filters = []; + $filterBuilderCallIndex = 0; + + foreach (self::DEFAULT_FILTERS as $defaultFilter) { + if (!in_array($defaultFilter['type'], $appliedFilterNames)) { + $this->filterBuilderMock->expects($this->at($filterBuilderCallIndex++)) + ->method('setField') + ->with($defaultFilter['type']) + ->willReturnSelf(); + $this->filterBuilderMock->expects($this->at($filterBuilderCallIndex++)) + ->method('setConditionType') + ->with($defaultFilter['condition']) + ->willReturnSelf(); + $this->filterBuilderMock->expects($this->at($filterBuilderCallIndex++)) + ->method('setValue') + ->with($defaultFilter['field']) + ->willReturnSelf(); + + $filter = $this->createMock(Filter::class); + + $this->filterBuilderMock->expects($this->at($filterBuilderCallIndex++)) + ->method('create') + ->willReturn($filter); + + $filters[] = $filter; + } + } + + /** @var FilterGroup|MockObject $filterGroup */ + $filterGroup = $this->createMock(FilterGroup::class); + + $this->filterGroupBuilderMock->expects($this->once()) + ->method('setFilters') + ->with($filters) + ->willReturnSelf(); + $this->filterGroupBuilderMock->expects($this->once()) + ->method('create') + ->willReturn($filterGroup); + + return $filterGroup; + } +}