/** * @magentoDataFixture Magento/Catalog/_files/row_fixture.php * @magentoConfigFixture current_store catalog/frontend/flat_catalog_product 1 * @magentoAppArea frontend */ public function testProductUpdate() { $this->markTestSkipped('Incomplete due to MAGETWO-21369'); $categoryFactory = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create('Magento\\Catalog\\Model\\CategoryFactory'); $listProduct = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create('Magento\\Catalog\\Block\\Product\\ListProduct'); $this->_processor->getIndexer()->setScheduled(false); $this->assertFalse($this->_processor->getIndexer()->isScheduled(), 'Indexer is in scheduled mode when turned to update on save mode'); $this->_processor->reindexAll(); $this->_product->load(1); $this->_product->setName('Updated Product'); $this->_product->save(); $category = $categoryFactory->create()->load(9); $layer = $listProduct->getLayer(); $layer->setCurrentCategory($category); /** @var \Magento\Catalog\Model\Resource\Product\Collection $productCollection */ $productCollection = $layer->getProductCollection(); $this->assertTrue($productCollection->isEnabledFlat(), 'Product collection is not using flat resource when flat is on'); $this->assertEquals(2, $productCollection->count(), 'Product collection items count must be exactly 2'); foreach ($productCollection as $product) { /** @var $product \Magento\Catalog\Model\Product */ if ($product->getId() == 1) { $this->assertEquals('Updated Product', $product->getName(), 'Product name from flat does not match with updated name'); } } }
public function testIndexerAfterDeleteAttribute() { $this->_processor->expects($this->once())->method('markIndexerAsInvalid'); $this->_model->setOrigData('id', 2); $this->_model->setOrigData('used_in_product_listing', 1); $this->_model->afterDeleteCommit(); }
/** * @param string $matcherMethod * @param bool $websiteChanged * @dataProvider storeGroupWebsiteDataProvider */ public function testChangedWebsiteBeforeSave($matcherMethod, $websiteChanged) { $this->processorMock->expects($this->{$matcherMethod}())->method('markIndexerAsInvalid'); $this->storeGroupMock->expects($this->once())->method('getId')->will($this->returnValue(1)); $this->storeGroupMock->expects($this->once())->method('dataHasChangedFor')->with('root_category_id')->will($this->returnValue($websiteChanged)); $model = new \Magento\Catalog\Model\Indexer\Product\Flat\Plugin\StoreGroup($this->processorMock); $model->beforeSave($this->subjectMock, $this->storeGroupMock); }
/** * Process flat enabled mode change * * @return void */ public function processValue() { if ((bool) $this->getValue() != (bool) $this->getOldValue()) { if ((bool) $this->getValue()) { $this->indexerState->loadByIndexer(\Magento\Catalog\Model\Indexer\Product\Flat\Processor::INDEXER_ID); $this->indexerState->setStatus(\Magento\Framework\Indexer\StateInterface::STATUS_INVALID); $this->indexerState->save(); } else { $this->_productFlatIndexerProcessor->getIndexer()->setScheduled(false); } } }
public function testReindex() { $this->categoryIndexerMock->expects($this->once())->method('reindexRow'); $this->productFlatProcessor->expects($this->once())->method('reindexRow'); $this->prepareCategoryIndexer(); $this->assertNull($this->model->reindex()); }
/** * @magentoDbIsolation enabled * @magentoAppIsolation enabled * @magentoAppArea adminhtml * @magentoConfigFixture current_store catalog/frontend/flat_catalog_product 1 */ public function testAddNewStoreGroup() { /** @var \Magento\Store\Model\Group $storeGroup */ $storeGroup = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create('Magento\\Store\\Model\\Group'); $storeGroup->setData(['website_id' => 1, 'name' => 'New Store Group', 'root_category_id' => 2, 'group_id' => null]); $storeGroup->save(); $this->assertTrue($this->_processor->getIndexer()->isInvalid()); }
/** * @magentoDbIsolation enabled * @magentoAppIsolation enabled * @magentoConfigFixture current_store catalog/frontend/flat_catalog_product 1 * @magentoDataFixture Magento/Catalog/_files/product_simple.php */ public function testReindexAll() { $this->assertTrue($this->_state->isFlatEnabled()); $this->_processor->reindexAll(); $categoryFactory = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get('Magento\\Catalog\\Model\\CategoryFactory'); $listProduct = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get('Magento\\Catalog\\Block\\Product\\ListProduct'); $category = $categoryFactory->create()->load(2); $layer = $listProduct->getLayer(); $layer->setCurrentCategory($category); $productCollection = $layer->getProductCollection(); $this->assertCount(1, $productCollection); /** @var $product \Magento\Catalog\Model\Product */ foreach ($productCollection as $product) { $this->assertEquals('Simple Product', $product->getName()); $this->assertEquals('Short description', $product->getShortDescription()); } }
/** * @magentoDbIsolation enabled * @magentoAppIsolation enabled * @magentoConfigFixture current_store catalog/frontend/flat_catalog_product 1 * @magentoDataFixture Magento/Catalog/_files/product_simple.php */ public function testProductsUpdate() { $this->markTestSkipped('Should be fixed in MAGETWO-25641'); $this->_product->load(1); $this->_processor->reindexList(array($this->_product->getId())); $categoryFactory = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get('Magento\\Catalog\\Model\\CategoryFactory'); $listProduct = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get('Magento\\Catalog\\Block\\Product\\ListProduct'); $category = $categoryFactory->create()->load(2); $layer = $listProduct->getLayer(); $layer->setCurrentCategory($category); $productCollection = $layer->getProductCollection(); $this->assertCount(1, $productCollection); /** @var $product \Magento\Catalog\Model\Product */ foreach ($productCollection as $product) { $this->assertEquals($this->_product->getName(), $product->getName()); $this->assertEquals($this->_product->getShortDescription(), $product->getShortDescription()); } }
public function testReindexListForce() { $ids = [1]; $this->_stateMock->expects($this->once())->method('isFlatEnabled')->willReturn(true); $indexerMock = $this->getMockBuilder('Magento\\Indexer\\Model\\Indexer')->disableOriginalConstructor()->getMock(); $this->indexerRegistryMock->expects($this->any())->method('get')->with(Processor::INDEXER_ID)->willReturn($indexerMock); $indexerMock->expects($this->any())->method('isScheduled')->willReturn(true); $indexerMock->expects($this->any())->method('reindexList')->with($ids)->willReturnSelf(); $this->_model->reindexList($ids, true); }
/** * Init indexing process after catalog eav attribute delete commit * * @return $this */ public function afterDeleteCommit() { parent::afterDeleteCommit(); if ($this->_isOriginalEnabledInFlat()) { $this->_productFlatIndexerProcessor->markIndexerAsInvalid(); } if ($this->_isOriginalIndexable()) { $this->_indexerEavProcessor->markIndexerAsInvalid(); } return $this; }
/** * @param $productChanged * @param $isScheduled * @param $productFlatCount * @param $categoryIndexerCount * * @dataProvider getProductReindexProvider */ public function testReindex($productChanged, $isScheduled, $productFlatCount, $categoryIndexerCount) { $this->model->setData('entity_id', 1); $this->_catalogProduct->expects($this->once())->method('isDataForProductCategoryIndexerWasChanged')->willReturn($productChanged); if ($productChanged) { $this->indexerRegistryMock->expects($this->exactly($productFlatCount))->method('get')->with(\Magento\Catalog\Model\Indexer\Product\Category::INDEXER_ID)->will($this->returnValue($this->categoryIndexerMock)); $this->categoryIndexerMock->expects($this->any())->method('isScheduled')->will($this->returnValue($isScheduled)); $this->categoryIndexerMock->expects($this->exactly($categoryIndexerCount))->method('reindexRow'); } $this->productFlatProcessor->expects($this->exactly($productFlatCount))->method('reindexRow'); $this->model->reindex(); }
/** * @param string $oldValue * @param string $value * @dataProvider dataProviderProcessValueOff */ public function testProcessValueOff($oldValue, $value) { $this->configMock->expects($this->once())->method('getValue')->with(null, 'default')->will($this->returnValue($oldValue)); $this->model->setValue($value); $this->indexerStateMock->expects($this->never())->method('loadByIndexer'); $this->indexerStateMock->expects($this->never())->method('setStatus'); $this->indexerStateMock->expects($this->never())->method('save'); $indexerMock = $this->getMockForAbstractClass('Magento\\Indexer\\Model\\IndexerInterface', array(), '', false, false, true, array('setScheduled', '__wakeup')); $indexerMock->expects($this->once())->method('setScheduled')->with(false); $this->indexerProcessorMock->expects($this->once())->method('getIndexer')->will($this->returnValue($indexerMock)); $this->model->processValue(); }
/** * Init indexing process after product save * * @return void */ public function reindex() { if ($this->_catalogProduct->isDataForProductCategoryIndexerWasChanged($this) || $this->isDeleted()) { $productCategoryIndexer = $this->indexerRegistry->get(Indexer\Product\Category::INDEXER_ID); if (!$productCategoryIndexer->isScheduled()) { $productCategoryIndexer->reindexRow($this->getId()); } } $this->_productFlatIndexerProcessor->reindexRow($this->getEntityId()); }
/** * Before save handler * * @param \Magento\Store\Model\ResourceModel\Group $subject * @param \Magento\Framework\Model\AbstractModel $object * * @return void * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function beforeSave(\Magento\Store\Model\ResourceModel\Group $subject, \Magento\Framework\Model\AbstractModel $object) { if (!$object->getId() || $object->dataHasChangedFor('root_category_id')) { $this->_productFlatIndexerProcessor->markIndexerAsInvalid(); } }
/** * After import handler * * @param \Magento\ImportExport\Model\Import $subject * @param Object $import * * @return mixed * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function afterImportSource(\Magento\ImportExport\Model\Import $subject, $import) { $this->_productFlatIndexerProcessor->markIndexerAsInvalid(); return $import; }
/** * Test mark indexer as invalid if disabled */ public function testMarkDisabledIndexerAsInvalid() { $this->_stateMock->expects($this->once())->method('isFlatEnabled')->will($this->returnValue(false)); $this->_indexerMock->expects($this->never())->method('invalidate'); $this->_model->markIndexerAsInvalid(); }
/** * Update product attributes * * @return \Magento\Backend\Model\View\Result\Redirect * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function execute() { if (!$this->_validateProducts()) { return $this->resultRedirectFactory->create()->setPath('catalog/product/', ['_current' => true]); } /* Collect Data */ $inventoryData = $this->getRequest()->getParam('inventory', []); $attributesData = $this->getRequest()->getParam('attributes', []); $websiteRemoveData = $this->getRequest()->getParam('remove_website_ids', []); $websiteAddData = $this->getRequest()->getParam('add_website_ids', []); /* Prepare inventory data item options (use config settings) */ $options = $this->_objectManager->get('Magento\\CatalogInventory\\Api\\StockConfigurationInterface')->getConfigItemOptions(); foreach ($options as $option) { if (isset($inventoryData[$option]) && !isset($inventoryData['use_config_' . $option])) { $inventoryData['use_config_' . $option] = 0; } } try { $storeId = $this->attributeHelper->getSelectedStoreId(); if ($attributesData) { $dateFormat = $this->_objectManager->get('Magento\\Framework\\Stdlib\\DateTime\\TimezoneInterface')->getDateFormat(\IntlDateFormatter::SHORT); foreach ($attributesData as $attributeCode => $value) { $attribute = $this->_objectManager->get('Magento\\Eav\\Model\\Config')->getAttribute(\Magento\Catalog\Model\Product::ENTITY, $attributeCode); if (!$attribute->getAttributeId()) { unset($attributesData[$attributeCode]); continue; } if ($attribute->getBackendType() == 'datetime') { if (!empty($value)) { $filterInput = new \Zend_Filter_LocalizedToNormalized(['date_format' => $dateFormat]); $filterInternal = new \Zend_Filter_NormalizedToLocalized(['date_format' => \Magento\Framework\Stdlib\DateTime::DATE_INTERNAL_FORMAT]); $value = $filterInternal->filter($filterInput->filter($value)); } else { $value = null; } $attributesData[$attributeCode] = $value; } elseif ($attribute->getFrontendInput() == 'multiselect') { // Check if 'Change' checkbox has been checked by admin for this attribute $isChanged = (bool) $this->getRequest()->getPost($attributeCode . '_checkbox'); if (!$isChanged) { unset($attributesData[$attributeCode]); continue; } if (is_array($value)) { $value = implode(',', $value); } $attributesData[$attributeCode] = $value; } } $this->_objectManager->get('Magento\\Catalog\\Model\\Product\\Action')->updateAttributes($this->attributeHelper->getProductIds(), $attributesData, $storeId); } if ($inventoryData) { // TODO why use ObjectManager? /** @var \Magento\CatalogInventory\Api\StockRegistryInterface $stockRegistry */ $stockRegistry = $this->_objectManager->create('Magento\\CatalogInventory\\Api\\StockRegistryInterface'); /** @var \Magento\CatalogInventory\Api\StockItemRepositoryInterface $stockItemRepository */ $stockItemRepository = $this->_objectManager->create('Magento\\CatalogInventory\\Api\\StockItemRepositoryInterface'); foreach ($this->attributeHelper->getProductIds() as $productId) { $stockItemDo = $stockRegistry->getStockItem($productId, $this->attributeHelper->getStoreWebsiteId($storeId)); if (!$stockItemDo->getProductId()) { $inventoryData[] = $productId; } $stockItemId = $stockItemDo->getId(); $this->dataObjectHelper->populateWithArray($stockItemDo, $inventoryData, '\\Magento\\CatalogInventory\\Api\\Data\\StockItemInterface'); $stockItemDo->setItemId($stockItemId); $stockItemRepository->save($stockItemDo); } $this->_stockIndexerProcessor->reindexList($this->attributeHelper->getProductIds()); } if ($websiteAddData || $websiteRemoveData) { /* @var $actionModel \Magento\Catalog\Model\Product\Action */ $actionModel = $this->_objectManager->get('Magento\\Catalog\\Model\\Product\\Action'); $productIds = $this->attributeHelper->getProductIds(); if ($websiteRemoveData) { $actionModel->updateWebsites($productIds, $websiteRemoveData, 'remove'); } if ($websiteAddData) { $actionModel->updateWebsites($productIds, $websiteAddData, 'add'); } $this->_eventManager->dispatch('catalog_product_to_website_change', ['products' => $productIds]); } $this->messageManager->addSuccess(__('A total of %1 record(s) were updated.', count($this->attributeHelper->getProductIds()))); $this->_productFlatIndexerProcessor->reindexList($this->attributeHelper->getProductIds()); if ($this->_catalogProduct->isDataForPriceIndexerWasChanged($attributesData) || !empty($websiteRemoveData) || !empty($websiteAddData)) { $this->_productPriceIndexerProcessor->reindexList($this->attributeHelper->getProductIds()); } } catch (\Magento\Framework\Exception\LocalizedException $e) { $this->messageManager->addError($e->getMessage()); } catch (\Exception $e) { $this->messageManager->addException($e, __('Something went wrong while updating the product(s) attributes.')); } return $this->resultRedirectFactory->create()->setPath('catalog/product/', ['store' => $this->attributeHelper->getSelectedStoreId()]); }
/** * Update product attributes * * @return void */ public function execute() { if (!$this->_validateProducts()) { return; } /* Collect Data */ $inventoryData = $this->getRequest()->getParam('inventory', array()); $attributesData = $this->getRequest()->getParam('attributes', array()); $websiteRemoveData = $this->getRequest()->getParam('remove_website_ids', array()); $websiteAddData = $this->getRequest()->getParam('add_website_ids', array()); /* Prepare inventory data item options (use config settings) */ $options = $this->_objectManager->get('Magento\\CatalogInventory\\Helper\\Data')->getConfigItemOptions(); foreach ($options as $option) { if (isset($inventoryData[$option]) && !isset($inventoryData['use_config_' . $option])) { $inventoryData['use_config_' . $option] = 0; } } try { if ($attributesData) { $dateFormat = $this->_objectManager->get('Magento\\Framework\\Stdlib\\DateTime\\TimezoneInterface')->getDateFormat(\Magento\Framework\Stdlib\DateTime\TimezoneInterface::FORMAT_TYPE_SHORT); $storeId = $this->attributeHelper->getSelectedStoreId(); foreach ($attributesData as $attributeCode => $value) { $attribute = $this->_objectManager->get('Magento\\Eav\\Model\\Config')->getAttribute(\Magento\Catalog\Model\Product::ENTITY, $attributeCode); if (!$attribute->getAttributeId()) { unset($attributesData[$attributeCode]); continue; } if ($attribute->getBackendType() == 'datetime') { if (!empty($value)) { $filterInput = new \Zend_Filter_LocalizedToNormalized(array('date_format' => $dateFormat)); $filterInternal = new \Zend_Filter_NormalizedToLocalized(array('date_format' => \Magento\Framework\Stdlib\DateTime::DATE_INTERNAL_FORMAT)); $value = $filterInternal->filter($filterInput->filter($value)); } else { $value = null; } $attributesData[$attributeCode] = $value; } elseif ($attribute->getFrontendInput() == 'multiselect') { // Check if 'Change' checkbox has been checked by admin for this attribute $isChanged = (bool) $this->getRequest()->getPost($attributeCode . '_checkbox'); if (!$isChanged) { unset($attributesData[$attributeCode]); continue; } if (is_array($value)) { $value = implode(',', $value); } $attributesData[$attributeCode] = $value; } } $this->_objectManager->get('Magento\\Catalog\\Model\\Product\\Action')->updateAttributes($this->attributeHelper->getProductIds(), $attributesData, $storeId); } if ($inventoryData) { /** @var \Magento\CatalogInventory\Service\V1\StockItemService $stockItemService */ $stockItemService = $this->_objectManager->create('Magento\\CatalogInventory\\Service\\V1\\StockItemService'); foreach ($this->_helper->getProductIds() as $productId) { $stockItemDo = $stockItemService->getStockItem($productId); if (!$stockItemDo->getProductId()) { $inventoryData[] = $productId; } $stockItemService->saveStockItem($this->stockItemBuilder->mergeDataObjectWithArray($stockItemDo, $inventoryData)); } $this->_stockIndexerProcessor->reindexList($this->_helper->getProductIds()); } if ($websiteAddData || $websiteRemoveData) { /* @var $actionModel \Magento\Catalog\Model\Product\Action */ $actionModel = $this->_objectManager->get('Magento\\Catalog\\Model\\Product\\Action'); $productIds = $this->attributeHelper->getProductIds(); if ($websiteRemoveData) { $actionModel->updateWebsites($productIds, $websiteRemoveData, 'remove'); } if ($websiteAddData) { $actionModel->updateWebsites($productIds, $websiteAddData, 'add'); } $this->_eventManager->dispatch('catalog_product_to_website_change', array('products' => $productIds)); $this->messageManager->addNotice(__('Please refresh "Catalog URL Rewrites" and "Product Attributes" in System -> ' . '<a href="%1">Index Management</a>.', $this->getUrl('adminhtml/process/list'))); } $this->messageManager->addSuccess(__('A total of %1 record(s) were updated.', count($this->attributeHelper->getProductIds()))); $this->_productFlatIndexerProcessor->reindexList($this->attributeHelper->getProductIds()); if ($this->_catalogProduct->isDataForPriceIndexerWasChanged($attributesData) || !empty($websiteRemoveData) || !empty($websiteAddData)) { $this->_productPriceIndexerProcessor->reindexList($this->attributeHelper->getProductIds()); } } catch (\Magento\Framework\Model\Exception $e) { $this->messageManager->addError($e->getMessage()); } catch (\Exception $e) { $this->messageManager->addException($e, __('Something went wrong while updating the product(s) attributes.')); } $this->_redirect('catalog/product/', array('store' => $this->attributeHelper->getSelectedStoreId())); }
/** * Init indexing process after product save * * @return void */ public function reindex() { $this->_productFlatIndexerProcessor->reindexRow($this->getEntityId()); if (!$this->getCategoryIndexer()->isScheduled()) { $this->getCategoryIndexer()->reindexRow($this->getId()); } }