From 0576e3508a2ebc2552680531c1fe5415fbf41966 Mon Sep 17 00:00:00 2001 From: Michail Slabko Date: Thu, 30 Jul 2015 13:34:59 +0300 Subject: [PATCH 01/13] MAGETWO-31442: Splitting all observers with automated tool - MAGETWO-40838: Manual split of Magento\Bundle\Model\Observer --- .../AppendUpsellProducts.php} | 99 ++++--------------- .../Bundle/Observer/InitOptionRenderer.php | 22 +++++ .../Bundle/Observer/LoadProductOptions.php | 25 +++++ .../Bundle/Observer/SetAttributeTabBlock.php | 41 ++++++++ .../Magento/Bundle/etc/adminhtml/events.xml | 4 +- .../Magento/Bundle/etc/frontend/events.xml | 6 +- .../Test/Legacy/_files/obsolete_classes.php | 1 + .../Test/Legacy/_files/obsolete_methods.php | 16 +-- 8 files changed, 116 insertions(+), 98 deletions(-) rename app/code/Magento/Bundle/{Model/Observer.php => Observer/AppendUpsellProducts.php} (54%) create mode 100644 app/code/Magento/Bundle/Observer/InitOptionRenderer.php create mode 100644 app/code/Magento/Bundle/Observer/LoadProductOptions.php create mode 100644 app/code/Magento/Bundle/Observer/SetAttributeTabBlock.php diff --git a/app/code/Magento/Bundle/Model/Observer.php b/app/code/Magento/Bundle/Observer/AppendUpsellProducts.php similarity index 54% rename from app/code/Magento/Bundle/Model/Observer.php rename to app/code/Magento/Bundle/Observer/AppendUpsellProducts.php index 102b3b610edd7..719c7e7250e3e 100644 --- a/app/code/Magento/Bundle/Model/Observer.php +++ b/app/code/Magento/Bundle/Observer/AppendUpsellProducts.php @@ -3,63 +3,46 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ -namespace Magento\Bundle\Model; +namespace Magento\Bundle\Observer; -/** - * Bundle Products Observer - * - * @author Magento Core Team - */ -class Observer +class AppendUpsellProducts { /** * Bundle data * * @var \Magento\Bundle\Helper\Data */ - protected $_bundleData = null; - - /** - * Catalog helper - * - * @var \Magento\Catalog\Helper\Catalog - */ - protected $_helperCatalog = null; + protected $bundleData; /** * @var \Magento\Bundle\Model\Resource\Selection */ - protected $_bundleSelection; + protected $bundleSelection; /** * @var \Magento\Catalog\Model\Config */ - protected $_config; + protected $config; /** * @var \Magento\Catalog\Model\Product\Visibility */ - protected $_productVisibility; + protected $productVisibility; /** - * @param \Magento\Catalog\Model\Product\Visibility $productVisibility - * @param \Magento\Catalog\Model\Config $config - * @param \Magento\Bundle\Model\Resource\Selection $bundleSelection - * @param \Magento\Catalog\Helper\Catalog $helperCatalog * @param \Magento\Bundle\Helper\Data $bundleData */ public function __construct( + \Magento\Bundle\Helper\Data $bundleData, \Magento\Catalog\Model\Product\Visibility $productVisibility, \Magento\Catalog\Model\Config $config, - \Magento\Bundle\Model\Resource\Selection $bundleSelection, - \Magento\Catalog\Helper\Catalog $helperCatalog, - \Magento\Bundle\Helper\Data $bundleData + \Magento\Bundle\Model\Resource\Selection $bundleSelection + ) { - $this->_helperCatalog = $helperCatalog; - $this->_bundleData = $bundleData; - $this->_bundleSelection = $bundleSelection; - $this->_config = $config; - $this->_productVisibility = $productVisibility; + $this->bundleData = $bundleData; + $this->productVisibility = $productVisibility; + $this->config = $config; + $this->bundleSelection = $bundleSelection; } /** @@ -70,7 +53,7 @@ public function __construct( * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) */ - public function appendUpsellProducts($observer) + public function invoke($observer) { /* @var $product \Magento\Catalog\Model\Product */ $product = $observer->getEvent()->getProduct(); @@ -78,7 +61,7 @@ public function appendUpsellProducts($observer) /** * Check is current product type is allowed for bundle selection product type */ - if (!in_array($product->getTypeId(), $this->_bundleData->getAllowedSelectionTypes())) { + if (!in_array($product->getTypeId(), $this->bundleData->getAllowedSelectionTypes())) { return $this; } @@ -94,7 +77,7 @@ public function appendUpsellProducts($observer) } /* @var $resource \Magento\Bundle\Model\Resource\Selection */ - $resource = $this->_bundleSelection; + $resource = $this->bundleSelection; $productIds = array_keys($collection->getItems()); if ($limit !== null && $limit <= count($productIds)) { @@ -112,9 +95,9 @@ public function appendUpsellProducts($observer) /* @var $bundleCollection \Magento\Catalog\Model\Resource\Product\Collection */ $bundleCollection = $product->getCollection()->addAttributeToSelect( - $this->_config->getProductAttributes() + $this->config->getProductAttributes() )->addStoreFilter()->addMinimalPrice()->addFinalPrice()->addTaxPercents()->setVisibility( - $this->_productVisibility->getVisibleInCatalogIds() + $this->productVisibility->getVisibleInCatalogIds() ); if ($limit !== null) { @@ -142,50 +125,4 @@ public function appendUpsellProducts($observer) return $this; } - - /** - * Add price index data for catalog product collection - * only for front end - * - * @param \Magento\Framework\Event\Observer $observer - * @return $this - */ - public function loadProductOptions($observer) - { - $collection = $observer->getEvent()->getCollection(); - /* @var $collection \Magento\Catalog\Model\Resource\Product\Collection */ - $collection->addPriceData(); - - return $this; - } - - /** - * Setting attribute tab block for bundle - * - * @param \Magento\Framework\Object $observer - * @return $this - */ - public function setAttributeTabBlock($observer) - { - $product = $observer->getEvent()->getProduct(); - if ($product->getTypeId() == \Magento\Catalog\Model\Product\Type::TYPE_BUNDLE) { - $this->_helperCatalog->setAttributeTabBlock( - 'Magento\Bundle\Block\Adminhtml\Catalog\Product\Edit\Tab\Attributes' - ); - } - return $this; - } - - /** - * Initialize product options renderer with bundle specific params - * - * @param \Magento\Framework\Event\Observer $observer - * @return $this - */ - public function initOptionRenderer(\Magento\Framework\Event\Observer $observer) - { - $block = $observer->getBlock(); - $block->addOptionsRenderCfg('bundle', 'Magento\Bundle\Helper\Catalog\Product\Configuration'); - return $this; - } } diff --git a/app/code/Magento/Bundle/Observer/InitOptionRenderer.php b/app/code/Magento/Bundle/Observer/InitOptionRenderer.php new file mode 100644 index 0000000000000..504d28b6cfdb7 --- /dev/null +++ b/app/code/Magento/Bundle/Observer/InitOptionRenderer.php @@ -0,0 +1,22 @@ +getBlock(); + $block->addOptionsRenderCfg('bundle', 'Magento\Bundle\Helper\Catalog\Product\Configuration'); + return $this; + } +} diff --git a/app/code/Magento/Bundle/Observer/LoadProductOptions.php b/app/code/Magento/Bundle/Observer/LoadProductOptions.php new file mode 100644 index 0000000000000..16ba4a56ffc5f --- /dev/null +++ b/app/code/Magento/Bundle/Observer/LoadProductOptions.php @@ -0,0 +1,25 @@ +getEvent()->getCollection(); + /* @var $collection \Magento\Catalog\Model\Resource\Product\Collection */ + $collection->addPriceData(); + + return $this; + } +} diff --git a/app/code/Magento/Bundle/Observer/SetAttributeTabBlock.php b/app/code/Magento/Bundle/Observer/SetAttributeTabBlock.php new file mode 100644 index 0000000000000..24c2ace6212e6 --- /dev/null +++ b/app/code/Magento/Bundle/Observer/SetAttributeTabBlock.php @@ -0,0 +1,41 @@ +helperCatalog = $helperCatalog; + } + + /** + * Setting attribute tab block for bundle + * + * @param \Magento\Framework\Object $observer + * @return $this + */ + public function invoke($observer) + { + $product = $observer->getEvent()->getProduct(); + if ($product->getTypeId() == \Magento\Catalog\Model\Product\Type::TYPE_BUNDLE) { + $this->helperCatalog->setAttributeTabBlock( + 'Magento\Bundle\Block\Adminhtml\Catalog\Product\Edit\Tab\Attributes' + ); + } + return $this; + } +} diff --git a/app/code/Magento/Bundle/etc/adminhtml/events.xml b/app/code/Magento/Bundle/etc/adminhtml/events.xml index f5fa1686ee2c5..70bcaad27f690 100644 --- a/app/code/Magento/Bundle/etc/adminhtml/events.xml +++ b/app/code/Magento/Bundle/etc/adminhtml/events.xml @@ -7,9 +7,9 @@ --> - + - + diff --git a/app/code/Magento/Bundle/etc/frontend/events.xml b/app/code/Magento/Bundle/etc/frontend/events.xml index 01ecd34ea74a5..b5ef96272db6e 100644 --- a/app/code/Magento/Bundle/etc/frontend/events.xml +++ b/app/code/Magento/Bundle/etc/frontend/events.xml @@ -7,12 +7,12 @@ --> - + - + - + diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php index 7ce2541006061..53e7814e2dd79 100644 --- a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php +++ b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php @@ -3809,4 +3809,5 @@ 'Magento\ConfigurableProduct\Controller\Adminhtml\Product\Initialization\Helper\Plugin\Handler\ProductType' . '\Configurable' ], + ['Magento\Bundle\Model\Observer', 'corresponding classes in Magento\Bundle\Observer\*'], ]; diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php index 6c5dd12a4cafc..9a44b68dd7f22 100644 --- a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php +++ b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php @@ -265,7 +265,6 @@ '\Magento\Sales\Model\Observer', '\Magento\Shipping\Model\Observer::aggregateSalesReportShipmentData', ], - ['appendBundleSelectionData', 'Magento\Bundle\Model\Observer'], ['applyAllDataUpdates', 'Magento\Core\Model\Resource\Setup'], ['applyAllUpdates', 'Magento\Core\Model\Resource\Setup'], ['applyDesign', 'Magento\Catalog\Model\Design'], @@ -289,7 +288,6 @@ ['catalogCategoryChangeProducts', 'Magento\Catalog\Model\Product\Flat\Observer'], ['catalog' . 'EventProductCollectionAfterLoad', 'Magento\GiftMessage\Model\Observer'], ['catalogProductCompareClean', 'Magento\Catalog\Model\Observer'], - ['catalogProductLoadAfter', 'Magento\Bundle\Model\Observer'], ['changeLocaleAction', 'Magento\Backend\Controller\Adminhtml\Index'], ['chechAllowedExtension'], ['checkConfigurableProducts', 'Magento\Eav\Model\Resource\Entity\Attribute\Collection'], @@ -1376,16 +1374,6 @@ '\Magento\Catalog\Controller\Adminhtml\Product', '\Magento\GroupedProduct\Controller\Adminhtml\Edit::popupAction', ], - [ - 'prepareProductSave', - '\Magento\Bundle\Model\Observer', - '\Magento\Bundle\Controller\Adminhtml\Product\Initialization\Helper\Plugin\Bundle::afterInitialize', - ], - [ - 'duplicateProduct', - 'Magento\Bundle\Model\Observer', - 'Magento\Bundle\Model\Product\CopyConstructor\Bundle::build', - ], [ 'prepareProductSave', '\Magento\Downloadable\Model\Observer', @@ -2359,4 +2347,8 @@ 'Magento\Sales\Model\Order\Address\Validator', 'Magento\Sales\Model\Order\Address\Validator::validateForCustomer' ], + ['loadProductOptions', 'Magento\Bundle\Model\Observer', 'Magento\Bundle\Observer\LoadProductOptions::invoke'], + ['initOptionRenderer', 'Magento\Bundle\Model\Observer', 'Magento\Bundle\Observer\InitOptionRenderer::invoke'], + ['setAttributeTabBlock', 'Magento\Bundle\Model\Observer', 'Magento\Bundle\Observer\SetAttributeTabBlock::invoke'], + ['appendUpsellProducts', 'Magento\Bundle\Model\Observer', 'Magento\Bundle\Observer\AppendUpsellProducts::invoke'], ]; From c40638fcdc8e8218d78f8fb230b8bc504f40a986 Mon Sep 17 00:00:00 2001 From: Michail Slabko Date: Thu, 30 Jul 2015 18:32:09 +0300 Subject: [PATCH 02/13] MAGETWO-31442: Splitting all observers with automated tool - MAGETWO-40860: Manual split of Magento\CatalogRule\Model\Observer --- .../Magento/CatalogRule/Model/Observer.php | 259 ------------------ .../PrepareCatalogProductCollectionPrices.php | 130 +++++++++ .../Observer/ProcessAdminFinalPrice.php | 101 +++++++ .../Observer/ProcessFrontFinalPrice.php | 111 ++++++++ .../Observer/RulePricesStorage.php | 46 ++++ .../CatalogRule/etc/adminhtml/events.xml | 2 +- .../CatalogRule/etc/crontab/events.xml | 2 +- app/code/Magento/CatalogRule/etc/di.xml | 7 - .../CatalogRule/etc/frontend/events.xml | 4 +- .../CatalogRule/etc/webapi_rest/events.xml | 4 +- .../CatalogRule/etc/webapi_soap/events.xml | 4 +- .../Test/Legacy/_files/obsolete_classes.php | 1 + .../Test/Legacy/_files/obsolete_methods.php | 3 + 13 files changed, 400 insertions(+), 274 deletions(-) delete mode 100644 app/code/Magento/CatalogRule/Model/Observer.php create mode 100644 app/code/Magento/CatalogRule/Observer/PrepareCatalogProductCollectionPrices.php create mode 100644 app/code/Magento/CatalogRule/Observer/ProcessAdminFinalPrice.php create mode 100644 app/code/Magento/CatalogRule/Observer/ProcessFrontFinalPrice.php create mode 100644 app/code/Magento/CatalogRule/Observer/RulePricesStorage.php diff --git a/app/code/Magento/CatalogRule/Model/Observer.php b/app/code/Magento/CatalogRule/Model/Observer.php deleted file mode 100644 index 9d636b0ae60b1..0000000000000 --- a/app/code/Magento/CatalogRule/Model/Observer.php +++ /dev/null @@ -1,259 +0,0 @@ -_resourceRuleFactory = $resourceRuleFactory; - $this->_resourceRule = $resourceRule; - $this->_ruleCollectionFactory = $ruleCollectionFactory; - $this->_storeManager = $storeManager; - $this->_localeDate = $localeDate; - $this->_customerSession = $customerSession; - $this->_coreRegistry = $coreRegistry; - $this->dateTime = $dateTime; - $this->groupManagement = $groupManagement; - } - - /** - * Apply catalog price rules to product on frontend - * - * @param EventObserver $observer - * @return $this - */ - public function processFrontFinalPrice($observer) - { - $product = $observer->getEvent()->getProduct(); - $pId = $product->getId(); - $storeId = $product->getStoreId(); - - if ($observer->hasDate()) { - $date = new \DateTime($observer->getEvent()->getDate()); - } else { - $date = $this->_localeDate->scopeDate($storeId); - } - - if ($observer->hasWebsiteId()) { - $wId = $observer->getEvent()->getWebsiteId(); - } else { - $wId = $this->_storeManager->getStore($storeId)->getWebsiteId(); - } - - if ($observer->hasCustomerGroupId()) { - $gId = $observer->getEvent()->getCustomerGroupId(); - } elseif ($product->hasCustomerGroupId()) { - $gId = $product->getCustomerGroupId(); - } else { - $gId = $this->_customerSession->getCustomerGroupId(); - } - - $key = "{$date->format('Y-m-d H:i:s')}|{$wId}|{$gId}|{$pId}"; - if (!isset($this->_rulePrices[$key])) { - $rulePrice = $this->_resourceRuleFactory->create()->getRulePrice($date, $wId, $gId, $pId); - $this->_rulePrices[$key] = $rulePrice; - } - if ($this->_rulePrices[$key] !== false) { - $finalPrice = min($product->getData('final_price'), $this->_rulePrices[$key]); - $product->setFinalPrice($finalPrice); - } - return $this; - } - - /** - * Apply catalog price rules to product in admin - * - * @param EventObserver $observer - * @return $this - */ - public function processAdminFinalPrice($observer) - { - $product = $observer->getEvent()->getProduct(); - $storeId = $product->getStoreId(); - $date = $this->_localeDate->scopeDate($storeId); - $key = false; - - $ruleData = $this->_coreRegistry->registry('rule_data'); - if ($ruleData) { - $wId = $ruleData->getWebsiteId(); - $gId = $ruleData->getCustomerGroupId(); - $pId = $product->getId(); - - $key = "{$date->format('Y-m-d H:i:s')}|{$wId}|{$gId}|{$pId}"; - } elseif ($product->getWebsiteId() !== null && $product->getCustomerGroupId() !== null) { - $wId = $product->getWebsiteId(); - $gId = $product->getCustomerGroupId(); - $pId = $product->getId(); - $key = "{$date->format('Y-m-d H:i:s')}|{$wId}|{$gId}|{$pId}"; - } - - if ($key) { - if (!isset($this->_rulePrices[$key])) { - $rulePrice = $this->_resourceRuleFactory->create()->getRulePrice($date, $wId, $gId, $pId); - $this->_rulePrices[$key] = $rulePrice; - } - if ($this->_rulePrices[$key] !== false) { - $finalPrice = min($product->getData('final_price'), $this->_rulePrices[$key]); - $product->setFinalPrice($finalPrice); - } - } - - return $this; - } - - /** - * Clean out calculated catalog rule prices for products - * - * @return void - */ - public function flushPriceCache() - { - $this->_rulePrices = []; - } - - /** - * @param EventObserver $observer - * @return $this - */ - public function prepareCatalogProductCollectionPrices(EventObserver $observer) - { - /* @var $collection ProductCollection */ - $collection = $observer->getEvent()->getCollection(); - $store = $this->_storeManager->getStore($observer->getEvent()->getStoreId()); - $websiteId = $store->getWebsiteId(); - if ($observer->getEvent()->hasCustomerGroupId()) { - $groupId = $observer->getEvent()->getCustomerGroupId(); - } else { - if ($this->_customerSession->isLoggedIn()) { - $groupId = $this->_customerSession->getCustomerGroupId(); - } else { - $groupId = $this->groupManagement->getNotLoggedInGroup()->getId(); - } - } - if ($observer->getEvent()->hasDate()) { - $date = new \DateTime($observer->getEvent()->getDate()); - } else { - $date = (new \DateTime())->setTimestamp($this->_localeDate->scopeTimeStamp($store)); - } - - $productIds = []; - /* @var $product Product */ - foreach ($collection as $product) { - $key = implode('|', [$date->format('Y-m-d H:i:s'), $websiteId, $groupId, $product->getId()]); - if (!isset($this->_rulePrices[$key])) { - $productIds[] = $product->getId(); - } - } - - if ($productIds) { - $rulePrices = $this->_resourceRuleFactory->create()->getRulePrices( - $date, - $websiteId, - $groupId, - $productIds - ); - foreach ($productIds as $productId) { - $key = implode('|', [$date->format('Y-m-d H:i:s'), $websiteId, $groupId, $productId]); - $this->_rulePrices[$key] = isset($rulePrices[$productId]) ? $rulePrices[$productId] : false; - } - } - - return $this; - } -} diff --git a/app/code/Magento/CatalogRule/Observer/PrepareCatalogProductCollectionPrices.php b/app/code/Magento/CatalogRule/Observer/PrepareCatalogProductCollectionPrices.php new file mode 100644 index 0000000000000..b8fbd2006671a --- /dev/null +++ b/app/code/Magento/CatalogRule/Observer/PrepareCatalogProductCollectionPrices.php @@ -0,0 +1,130 @@ +rulePricesStorage = $rulePricesStorage; + $this->resourceRuleFactory = $resourceRuleFactory; + $this->storeManager = $storeManager; + $this->localeDate = $localeDate; + $this->customerSession = $customerSession; + $this->groupManagement = $groupManagement; + } + + /** + * Apply catalog price rules to product on frontend + * + * @param EventObserver $observer + * @return $this + */ + public function invoke($observer) + { + /* @var $collection ProductCollection */ + $collection = $observer->getEvent()->getCollection(); + $store = $this->storeManager->getStore($observer->getEvent()->getStoreId()); + $websiteId = $store->getWebsiteId(); + if ($observer->getEvent()->hasCustomerGroupId()) { + $groupId = $observer->getEvent()->getCustomerGroupId(); + } else { + if ($this->customerSession->isLoggedIn()) { + $groupId = $this->customerSession->getCustomerGroupId(); + } else { + $groupId = $this->groupManagement->getNotLoggedInGroup()->getId(); + } + } + if ($observer->getEvent()->hasDate()) { + $date = new \DateTime($observer->getEvent()->getDate()); + } else { + $date = (new \DateTime())->setTimestamp($this->localeDate->scopeTimeStamp($store)); + } + + $productIds = []; + /* @var $product Product */ + foreach ($collection as $product) { + $key = implode('|', [$date->format('Y-m-d H:i:s'), $websiteId, $groupId, $product->getId()]); + if (!$this->rulePricesStorage->hasRulePrice($key)) { + $productIds[] = $product->getId(); + } + } + + if ($productIds) { + $rulePrices = $this->resourceRuleFactory->create()->getRulePrices( + $date, + $websiteId, + $groupId, + $productIds + ); + foreach ($productIds as $productId) { + $key = implode('|', [$date->format('Y-m-d H:i:s'), $websiteId, $groupId, $productId]); + $this->rulePricesStorage->setRulePrice( + $key, + isset($rulePrices[$productId]) ? $rulePrices[$productId] : false + ); + } + } + + return $this; + } +} diff --git a/app/code/Magento/CatalogRule/Observer/ProcessAdminFinalPrice.php b/app/code/Magento/CatalogRule/Observer/ProcessAdminFinalPrice.php new file mode 100644 index 0000000000000..4588a2a37de10 --- /dev/null +++ b/app/code/Magento/CatalogRule/Observer/ProcessAdminFinalPrice.php @@ -0,0 +1,101 @@ +rulePricesStorage = $rulePricesStorage; + $this->coreRegistry = $coreRegistry; + $this->resourceRuleFactory = $resourceRuleFactory; + $this->localeDate = $localeDate; + } + + /** + * Apply catalog price rules to product in admin + * + * @param EventObserver $observer + * @return $this + */ + public function invoke($observer) + { + $product = $observer->getEvent()->getProduct(); + $storeId = $product->getStoreId(); + $date = $this->localeDate->scopeDate($storeId); + $key = false; + + $ruleData = $this->coreRegistry->registry('rule_data'); + if ($ruleData) { + $wId = $ruleData->getWebsiteId(); + $gId = $ruleData->getCustomerGroupId(); + $pId = $product->getId(); + + $key = "{$date->format('Y-m-d H:i:s')}|{$wId}|{$gId}|{$pId}"; + } elseif ($product->getWebsiteId() !== null && $product->getCustomerGroupId() !== null) { + $wId = $product->getWebsiteId(); + $gId = $product->getCustomerGroupId(); + $pId = $product->getId(); + $key = "{$date->format('Y-m-d H:i:s')}|{$wId}|{$gId}|{$pId}"; + } + + if ($key) { + if (!$this->rulePricesStorage->hasRulePrice($key)) { + $rulePrice = $this->resourceRuleFactory->create()->getRulePrice($date, $wId, $gId, $pId); + $this->rulePricesStorage->setRulePrice($key, $rulePrice); + } + if ($this->rulePricesStorage->getRulePrice($key) !== false) { + $finalPrice = min($product->getData('final_price'), $this->rulePricesStorage->getRulePrice($key)); + $product->setFinalPrice($finalPrice); + } + } + + return $this; + } +} diff --git a/app/code/Magento/CatalogRule/Observer/ProcessFrontFinalPrice.php b/app/code/Magento/CatalogRule/Observer/ProcessFrontFinalPrice.php new file mode 100644 index 0000000000000..ea577344fba32 --- /dev/null +++ b/app/code/Magento/CatalogRule/Observer/ProcessFrontFinalPrice.php @@ -0,0 +1,111 @@ +rulePricesStorage = $rulePricesStorage; + $this->resourceRuleFactory = $resourceRuleFactory; + $this->storeManager = $storeManager; + $this->localeDate = $localeDate; + $this->customerSession = $customerSession; + } + + /** + * Apply catalog price rules to product on frontend + * + * @param EventObserver $observer + * @return $this + */ + public function invoke($observer) + { + $product = $observer->getEvent()->getProduct(); + $pId = $product->getId(); + $storeId = $product->getStoreId(); + + if ($observer->hasDate()) { + $date = new \DateTime($observer->getEvent()->getDate()); + } else { + $date = $this->localeDate->scopeDate($storeId); + } + + if ($observer->hasWebsiteId()) { + $wId = $observer->getEvent()->getWebsiteId(); + } else { + $wId = $this->storeManager->getStore($storeId)->getWebsiteId(); + } + + if ($observer->hasCustomerGroupId()) { + $gId = $observer->getEvent()->getCustomerGroupId(); + } elseif ($product->hasCustomerGroupId()) { + $gId = $product->getCustomerGroupId(); + } else { + $gId = $this->customerSession->getCustomerGroupId(); + } + + $key = "{$date->format('Y-m-d H:i:s')}|{$wId}|{$gId}|{$pId}"; + if (!$this->rulePricesStorage->hasRulePrice($key)) { + $rulePrice = $this->resourceRuleFactory->create()->getRulePrice($date, $wId, $gId, $pId); + $this->rulePricesStorage->setRulePrice($key, $rulePrice); + } + if ($this->rulePricesStorage->getRulePrice($key) !== false) { + $finalPrice = min($product->getData('final_price'), $this->rulePricesStorage->getRulePrice($key)); + $product->setFinalPrice($finalPrice); + } + return $this; + } +} diff --git a/app/code/Magento/CatalogRule/Observer/RulePricesStorage.php b/app/code/Magento/CatalogRule/Observer/RulePricesStorage.php new file mode 100644 index 0000000000000..3630d1e5bc85d --- /dev/null +++ b/app/code/Magento/CatalogRule/Observer/RulePricesStorage.php @@ -0,0 +1,46 @@ +rulePrices[$id]) ? $this->rulePrices[$id] : false; + } + + /** + * @param string $id + * @return bool + */ + public function hasRulePrice($id) + { + return isset($this->rulePrices[$id]); + } + + /** + * @param string $id + * @param float $price + * @return void + */ + public function setRulePrice($id, $price) + { + $this->rulePrices[$id] = $price; + } +} diff --git a/app/code/Magento/CatalogRule/etc/adminhtml/events.xml b/app/code/Magento/CatalogRule/etc/adminhtml/events.xml index b8af681cc3538..240f11956e49d 100644 --- a/app/code/Magento/CatalogRule/etc/adminhtml/events.xml +++ b/app/code/Magento/CatalogRule/etc/adminhtml/events.xml @@ -7,6 +7,6 @@ --> - + diff --git a/app/code/Magento/CatalogRule/etc/crontab/events.xml b/app/code/Magento/CatalogRule/etc/crontab/events.xml index b8af681cc3538..240f11956e49d 100644 --- a/app/code/Magento/CatalogRule/etc/crontab/events.xml +++ b/app/code/Magento/CatalogRule/etc/crontab/events.xml @@ -7,6 +7,6 @@ --> - + diff --git a/app/code/Magento/CatalogRule/etc/di.xml b/app/code/Magento/CatalogRule/etc/di.xml index 8e0c3aba2a318..92866f3e6d4d0 100644 --- a/app/code/Magento/CatalogRule/etc/di.xml +++ b/app/code/Magento/CatalogRule/etc/di.xml @@ -12,13 +12,6 @@ - - - Magento\CatalogRule\Model\Resource\Rule\Proxy - Magento\Customer\Model\Session\Proxy - Magento\Backend\Model\Session\Proxy - - diff --git a/app/code/Magento/CatalogRule/etc/frontend/events.xml b/app/code/Magento/CatalogRule/etc/frontend/events.xml index 69fcd117f7700..62db26e8c8903 100644 --- a/app/code/Magento/CatalogRule/etc/frontend/events.xml +++ b/app/code/Magento/CatalogRule/etc/frontend/events.xml @@ -7,9 +7,9 @@ --> - + - + diff --git a/app/code/Magento/CatalogRule/etc/webapi_rest/events.xml b/app/code/Magento/CatalogRule/etc/webapi_rest/events.xml index 69fcd117f7700..62db26e8c8903 100644 --- a/app/code/Magento/CatalogRule/etc/webapi_rest/events.xml +++ b/app/code/Magento/CatalogRule/etc/webapi_rest/events.xml @@ -7,9 +7,9 @@ --> - + - + diff --git a/app/code/Magento/CatalogRule/etc/webapi_soap/events.xml b/app/code/Magento/CatalogRule/etc/webapi_soap/events.xml index 69fcd117f7700..62db26e8c8903 100644 --- a/app/code/Magento/CatalogRule/etc/webapi_soap/events.xml +++ b/app/code/Magento/CatalogRule/etc/webapi_soap/events.xml @@ -7,9 +7,9 @@ --> - + - + diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php index 53e7814e2dd79..be523b79a756e 100644 --- a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php +++ b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php @@ -3810,4 +3810,5 @@ . '\Configurable' ], ['Magento\Bundle\Model\Observer', 'corresponding classes in Magento\Bundle\Observer\*'], + ['Magento\CatalogRule\Model\Observer', 'corresponding classes in Magento\CatalogRule\Observer\*'], ]; diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php index 9a44b68dd7f22..460d68c67ff0f 100644 --- a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php +++ b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php @@ -2351,4 +2351,7 @@ ['initOptionRenderer', 'Magento\Bundle\Model\Observer', 'Magento\Bundle\Observer\InitOptionRenderer::invoke'], ['setAttributeTabBlock', 'Magento\Bundle\Model\Observer', 'Magento\Bundle\Observer\SetAttributeTabBlock::invoke'], ['appendUpsellProducts', 'Magento\Bundle\Model\Observer', 'Magento\Bundle\Observer\AppendUpsellProducts::invoke'], + ['prepareCatalogProductCollectionPrices', 'Magento\CatalogRule\Model\Observer', 'Magento\CatalogRule\Observer\PrepareCatalogProductCollectionPrices::invoke'], + ['processAdminFinalPrice', 'Magento\CatalogRule\Model\Observer', 'Magento\CatalogRule\Observer\ProcessAdminFinalPrice::invoke'], + ['processFrontFinalPrice', 'Magento\CatalogRule\Model\Observer', 'Magento\CatalogRule\Observer\ProcessFrontFinalPrice::invoke'], ]; From b9be8c15cfb3a8aa1926491f48253e00c6a325c3 Mon Sep 17 00:00:00 2001 From: Michail Slabko Date: Thu, 30 Jul 2015 18:57:23 +0300 Subject: [PATCH 03/13] MAGETWO-31442: Splitting all observers with automated tool - MAGETWO-40869: Manual split of Magento\Tax\Model\Observer --- app/code/Magento/Tax/Model/Observer.php | 176 ------------------ .../Observer/AggregateSalesReportTaxData.php | 59 ++++++ .../Tax/Observer/QuoteCollectTotalsBefore.php | 27 +++ .../Tax/Observer/UpdateProductOptions.php | 74 ++++++++ .../UpdateProductOptionsTest.php} | 8 +- app/code/Magento/Tax/etc/crontab.xml | 2 +- app/code/Magento/Tax/etc/events.xml | 4 +- .../Test/Legacy/_files/obsolete_classes.php | 1 + .../Test/Legacy/_files/obsolete_methods.php | 4 + 9 files changed, 172 insertions(+), 183 deletions(-) delete mode 100644 app/code/Magento/Tax/Model/Observer.php create mode 100644 app/code/Magento/Tax/Observer/AggregateSalesReportTaxData.php create mode 100644 app/code/Magento/Tax/Observer/QuoteCollectTotalsBefore.php create mode 100644 app/code/Magento/Tax/Observer/UpdateProductOptions.php rename app/code/Magento/Tax/Test/Unit/{Model/ObserverTest.php => Observer/UpdateProductOptionsTest.php} (94%) diff --git a/app/code/Magento/Tax/Model/Observer.php b/app/code/Magento/Tax/Model/Observer.php deleted file mode 100644 index 25bf3ea1b5646..0000000000000 --- a/app/code/Magento/Tax/Model/Observer.php +++ /dev/null @@ -1,176 +0,0 @@ -_taxData = $taxData; - $this->_calculation = $calculation; - $this->_localeDate = $localeDate; - $this->_reportTaxFactory = $reportTaxFactory; - $this->_localeResolver = $localeResolver; - $this->_registry = $registry; - } - - /** - * Put quote address tax information into order - * - * @param \Magento\Framework\Event\Observer $observer - * @return void - */ - public function salesEventConvertQuoteAddressToOrder(\Magento\Framework\Event\Observer $observer) - { - $address = $observer->getEvent()->getAddress(); - $order = $observer->getEvent()->getOrder(); - - $taxes = $address->getAppliedTaxes(); - if (is_array($taxes)) { - if (is_array($order->getAppliedTaxes())) { - $taxes = array_merge($order->getAppliedTaxes(), $taxes); - } - $order->setAppliedTaxes($taxes); - $order->setConvertingFromQuote(true); - } - - $itemAppliedTaxes = $address->getItemsAppliedTaxes(); - if (is_array($itemAppliedTaxes)) { - if (is_array($order->getItemAppliedTaxes())) { - $itemAppliedTaxes = array_merge($order->getItemAppliedTaxes(), $itemAppliedTaxes); - } - $order->setItemAppliedTaxes($itemAppliedTaxes); - } - } - - /** - * Refresh sales tax report statistics for last day - * - * @param \Magento\Cron\Model\Schedule $schedule - * @return $this - * @SuppressWarnings(PHPMD.UnusedFormalParameter) - */ - public function aggregateSalesReportTaxData($schedule) - { - $this->_localeResolver->emulate(0); - $currentDate = $this->_localeDate->date(); - $date = $currentDate->modify('-25 hours'); - /** @var $reportTax \Magento\Tax\Model\Resource\Report\Tax */ - $reportTax = $this->_reportTaxFactory->create(); - $reportTax->aggregate($date); - $this->_localeResolver->revert(); - return $this; - } - - /** - * Reset extra tax amounts on quote addresses before recollecting totals - * - * @param \Magento\Framework\Event\Observer $observer - * @return $this - */ - public function quoteCollectTotalsBefore(\Magento\Framework\Event\Observer $observer) - { - /* @var $quote \Magento\Quote\Model\Quote */ - $quote = $observer->getEvent()->getQuote(); - foreach ($quote->getAllAddresses() as $address) { - $address->setExtraTaxAmount(0); - $address->setBaseExtraTaxAmount(0); - } - return $this; - } - - /** - * Change default JavaScript templates for options rendering - * - * @param \Magento\Framework\Event\Observer $observer - * @return $this - */ - public function updateProductOptions(\Magento\Framework\Event\Observer $observer) - { - $response = $observer->getEvent()->getResponseObject(); - $options = $response->getAdditionalOptions(); - - $_product = $this->_registry->registry('current_product'); - if (!$_product) { - return $this; - } - - $algorithm = $this->_taxData->getCalculationAlgorithm(); - $options['calculationAlgorithm'] = $algorithm; - // prepare correct template for options render - if ($this->_taxData->displayBothPrices()) { - $options['optionTemplate'] = sprintf( - '<%%= data.label %%>' - . '<%% if (data.finalPrice.value) { %%>' - . ' +<%%= data.finalPrice.formatted %%> (%1$s <%%= data.basePrice.formatted %%>)' - . '<%% } %%>', - __('Excl. tax:') - ); - } elseif ($this->_taxData->priceIncludesTax() && $this->_taxData->displayPriceExcludingTax()) { - $options['optionTemplate'] = sprintf( - '<%%= data.label %%>' - . '<%% if (data.basePrice.value) { %%>' - . ' +<%%= data.basePrice.formatted %%>' - . '<%% } %%>' - ); - } - - $response->setAdditionalOptions($options); - return $this; - } -} diff --git a/app/code/Magento/Tax/Observer/AggregateSalesReportTaxData.php b/app/code/Magento/Tax/Observer/AggregateSalesReportTaxData.php new file mode 100644 index 0000000000000..12e25be6639af --- /dev/null +++ b/app/code/Magento/Tax/Observer/AggregateSalesReportTaxData.php @@ -0,0 +1,59 @@ +localeDate = $localeDate; + $this->reportTaxFactory = $reportTaxFactory; + $this->localeResolver = $localeResolver; + } + + /** + * Refresh sales tax report statistics for last day + * + * @param \Magento\Cron\Model\Schedule $schedule + * @return $this + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + public function invoke($schedule) + { + $this->localeResolver->emulate(0); + $currentDate = $this->localeDate->date(); + $date = $currentDate->modify('-25 hours'); + /** @var $reportTax \Magento\Tax\Model\Resource\Report\Tax */ + $reportTax = $this->reportTaxFactory->create(); + $reportTax->aggregate($date); + $this->localeResolver->revert(); + return $this; + } +} diff --git a/app/code/Magento/Tax/Observer/QuoteCollectTotalsBefore.php b/app/code/Magento/Tax/Observer/QuoteCollectTotalsBefore.php new file mode 100644 index 0000000000000..7192889b4e22c --- /dev/null +++ b/app/code/Magento/Tax/Observer/QuoteCollectTotalsBefore.php @@ -0,0 +1,27 @@ +getEvent()->getQuote(); + foreach ($quote->getAllAddresses() as $address) { + $address->setExtraTaxAmount(0); + $address->setBaseExtraTaxAmount(0); + } + return $this; + } +} diff --git a/app/code/Magento/Tax/Observer/UpdateProductOptions.php b/app/code/Magento/Tax/Observer/UpdateProductOptions.php new file mode 100644 index 0000000000000..f083e1f698679 --- /dev/null +++ b/app/code/Magento/Tax/Observer/UpdateProductOptions.php @@ -0,0 +1,74 @@ +taxData = $taxData; + $this->registry = $registry; + } + + /** + * Change default JavaScript templates for options rendering + * + * @param \Magento\Framework\Event\Observer $observer + * @return $this + */ + public function invoke(\Magento\Framework\Event\Observer $observer) + { + $response = $observer->getEvent()->getResponseObject(); + $options = $response->getAdditionalOptions(); + + $_product = $this->registry->registry('current_product'); + if (!$_product) { + return $this; + } + + $algorithm = $this->taxData->getCalculationAlgorithm(); + $options['calculationAlgorithm'] = $algorithm; + // prepare correct template for options render + if ($this->taxData->displayBothPrices()) { + $options['optionTemplate'] = sprintf( + '<%%= data.label %%>' + . '<%% if (data.finalPrice.value) { %%>' + . ' +<%%= data.finalPrice.formatted %%> (%1$s <%%= data.basePrice.formatted %%>)' + . '<%% } %%>', + __('Excl. tax:') + ); + } elseif ($this->taxData->priceIncludesTax() && $this->taxData->displayPriceExcludingTax()) { + $options['optionTemplate'] = sprintf( + '<%%= data.label %%>' + . '<%% if (data.basePrice.value) { %%>' + . ' +<%%= data.basePrice.formatted %%>' + . '<%% } %%>' + ); + } + + $response->setAdditionalOptions($options); + return $this; + } +} diff --git a/app/code/Magento/Tax/Test/Unit/Model/ObserverTest.php b/app/code/Magento/Tax/Test/Unit/Observer/UpdateProductOptionsTest.php similarity index 94% rename from app/code/Magento/Tax/Test/Unit/Model/ObserverTest.php rename to app/code/Magento/Tax/Test/Unit/Observer/UpdateProductOptionsTest.php index ade2187342a74..c6274db35ddc9 100644 --- a/app/code/Magento/Tax/Test/Unit/Model/ObserverTest.php +++ b/app/code/Magento/Tax/Test/Unit/Observer/UpdateProductOptionsTest.php @@ -7,11 +7,11 @@ /** * Test class for \Magento\Weee\Model\Observer */ -namespace Magento\Tax\Test\Unit\Model; +namespace Magento\Tax\Test\Unit\Observer; use \Magento\Framework\TestFramework\Unit\Helper\ObjectManager; -class ObserverTest extends \PHPUnit_Framework_TestCase +class UpdateProductOptionsTest extends \PHPUnit_Framework_TestCase { /** * Tests the methods that rely on the ScopeConfigInterface object to provide their return values @@ -69,14 +69,14 @@ public function testUpdateProductOptions( $objectManager = new ObjectManager($this); $taxObserverObject = $objectManager->getObject( - 'Magento\Tax\Model\Observer', + 'Magento\Tax\Observer\UpdateProductOptions', [ 'taxData' => $taxData, 'registry' => $registry, ] ); - $taxObserverObject->updateProductOptions($observerObject); + $taxObserverObject->invoke($observerObject); $this->assertEquals($expected, $frameworkObject->getAdditionalOptions()); } diff --git a/app/code/Magento/Tax/etc/crontab.xml b/app/code/Magento/Tax/etc/crontab.xml index 096ddac3da22c..b9dbc96141823 100644 --- a/app/code/Magento/Tax/etc/crontab.xml +++ b/app/code/Magento/Tax/etc/crontab.xml @@ -7,7 +7,7 @@ --> - + 0 0 * * * diff --git a/app/code/Magento/Tax/etc/events.xml b/app/code/Magento/Tax/etc/events.xml index b523cf565dd00..28ad1f982fd16 100644 --- a/app/code/Magento/Tax/etc/events.xml +++ b/app/code/Magento/Tax/etc/events.xml @@ -7,9 +7,9 @@ --> - + - + diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php index be523b79a756e..e713960c9542b 100644 --- a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php +++ b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php @@ -3811,4 +3811,5 @@ ], ['Magento\Bundle\Model\Observer', 'corresponding classes in Magento\Bundle\Observer\*'], ['Magento\CatalogRule\Model\Observer', 'corresponding classes in Magento\CatalogRule\Observer\*'], + ['Magento\Tax\Model\Observer', 'corresponding classes in Magento\Tax\Observer\*'], ]; diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php index 460d68c67ff0f..1f505ac702287 100644 --- a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php +++ b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php @@ -2354,4 +2354,8 @@ ['prepareCatalogProductCollectionPrices', 'Magento\CatalogRule\Model\Observer', 'Magento\CatalogRule\Observer\PrepareCatalogProductCollectionPrices::invoke'], ['processAdminFinalPrice', 'Magento\CatalogRule\Model\Observer', 'Magento\CatalogRule\Observer\ProcessAdminFinalPrice::invoke'], ['processFrontFinalPrice', 'Magento\CatalogRule\Model\Observer', 'Magento\CatalogRule\Observer\ProcessFrontFinalPrice::invoke'], + ['salesEventConvertQuoteAddressToOrder', 'Magento\Tax\Model\Observer'], + ['aggregateSalesReportTaxData', 'Magento\Tax\Model\Observer', 'Magento\Tax\Observer\AggregateSalesReportTaxData::invoke'], + ['quoteCollectTotalsBefore', 'Magento\Tax\Model\Observer', 'Magento\Tax\Observer\QuoteCollectTotalsBefore::invoke'], + ['updateProductOptions', 'Magento\Tax\Model\Observer', 'Magento\Tax\Observer\UpdateProductOptions::invoke'], ]; From 4f6e20a88d6536039163632b7fb8f44de914757c Mon Sep 17 00:00:00 2001 From: Michail Slabko Date: Fri, 31 Jul 2015 11:25:07 +0300 Subject: [PATCH 04/13] MAGETWO-31442: Splitting all observers with automated tool - MAGETWO-40874: Manual split of Magento\CacheInvalidate\Model\Observer --- .../CacheInvalidate/Model/Observer.php | 111 -------------- .../CacheInvalidate/Model/PurgeCache.php | 61 ++++++++ .../Observer/FlushAllCache.php | 47 ++++++ .../Observer/InvalidateVarnish.php | 56 +++++++ .../Test/Unit/Model/ObserverTest.php | 143 ------------------ .../Test/Unit/Model/PurgeCacheTest.php | 74 +++++++++ .../Test/Unit/Observer/FlushAllCacheTest.php | 66 ++++++++ .../Unit/Observer/InvalidateVarnishTest.php | 79 ++++++++++ .../Magento/CacheInvalidate/etc/events.xml | 30 ++-- .../Test/Legacy/_files/obsolete_classes.php | 1 + .../Test/Legacy/_files/obsolete_methods.php | 3 + 11 files changed, 402 insertions(+), 269 deletions(-) delete mode 100644 app/code/Magento/CacheInvalidate/Model/Observer.php create mode 100644 app/code/Magento/CacheInvalidate/Model/PurgeCache.php create mode 100644 app/code/Magento/CacheInvalidate/Observer/FlushAllCache.php create mode 100644 app/code/Magento/CacheInvalidate/Observer/InvalidateVarnish.php delete mode 100644 app/code/Magento/CacheInvalidate/Test/Unit/Model/ObserverTest.php create mode 100644 app/code/Magento/CacheInvalidate/Test/Unit/Model/PurgeCacheTest.php create mode 100644 app/code/Magento/CacheInvalidate/Test/Unit/Observer/FlushAllCacheTest.php create mode 100644 app/code/Magento/CacheInvalidate/Test/Unit/Observer/InvalidateVarnishTest.php diff --git a/app/code/Magento/CacheInvalidate/Model/Observer.php b/app/code/Magento/CacheInvalidate/Model/Observer.php deleted file mode 100644 index ece5eca4962ce..0000000000000 --- a/app/code/Magento/CacheInvalidate/Model/Observer.php +++ /dev/null @@ -1,111 +0,0 @@ -_config = $config; - $this->_helper = $helper; - $this->_curlAdapter = $curlAdapter; - $this->logger = $logger; - } - - /** - * If Varnish caching is enabled it collects array of tags - * of incoming object and asks to clean cache. - * - * @param \Magento\Framework\Event\Observer $observer - * @return void - */ - public function invalidateVarnish(\Magento\Framework\Event\Observer $observer) - { - if ($this->_config->getType() == \Magento\PageCache\Model\Config::VARNISH && $this->_config->isEnabled()) { - $object = $observer->getEvent()->getObject(); - if ($object instanceof \Magento\Framework\Object\IdentityInterface) { - $tags = []; - $pattern = "((^|,)%s(,|$))"; - foreach ($object->getIdentities() as $tag) { - $tags[] = sprintf($pattern, preg_replace("~_\\d+$~", '', $tag)); - $tags[] = sprintf($pattern, $tag); - } - $this->sendPurgeRequest(implode('|', array_unique($tags))); - } - } - } - - /** - * Flash Varnish cache - * - * @param \Magento\Framework\Event\Observer $observer - * @return void - * @SuppressWarnings(PHPMD.UnusedFormalParameter) - */ - public function flushAllCache(\Magento\Framework\Event\Observer $observer) - { - if ($this->_config->getType() == \Magento\PageCache\Model\Config::VARNISH && $this->_config->isEnabled()) { - $this->sendPurgeRequest('.*'); - } - } - - /** - * Send curl purge request - * to invalidate cache by tags pattern - * - * @param string $tagsPattern - * @return void - */ - protected function sendPurgeRequest($tagsPattern) - { - $headers = ["X-Magento-Tags-Pattern: {$tagsPattern}"]; - $this->_curlAdapter->setOptions([CURLOPT_CUSTOMREQUEST => 'PURGE']); - $this->_curlAdapter->write('', $this->_helper->getUrl('*'), '1.1', $headers); - $this->_curlAdapter->read(); - $this->_curlAdapter->close(); - - $this->logger->execute(compact('tagsPattern')); - } -} diff --git a/app/code/Magento/CacheInvalidate/Model/PurgeCache.php b/app/code/Magento/CacheInvalidate/Model/PurgeCache.php new file mode 100644 index 0000000000000..2cde853240db4 --- /dev/null +++ b/app/code/Magento/CacheInvalidate/Model/PurgeCache.php @@ -0,0 +1,61 @@ +helper = $helper; + $this->curlAdapter = $curlAdapter; + $this->logger = $logger; + } + + /** + * Send curl purge request + * to invalidate cache by tags pattern + * + * @param string $tagsPattern + * @return void + */ + public function sendPurgeRequest($tagsPattern) + { + $headers = ["X-Magento-Tags-Pattern: {$tagsPattern}"]; + $this->curlAdapter->setOptions([CURLOPT_CUSTOMREQUEST => 'PURGE']); + $this->curlAdapter->write('', $this->helper->getUrl('*'), '1.1', $headers); + $this->curlAdapter->read(); + $this->curlAdapter->close(); + + $this->logger->execute(compact('tagsPattern')); + } +} diff --git a/app/code/Magento/CacheInvalidate/Observer/FlushAllCache.php b/app/code/Magento/CacheInvalidate/Observer/FlushAllCache.php new file mode 100644 index 0000000000000..3778781159664 --- /dev/null +++ b/app/code/Magento/CacheInvalidate/Observer/FlushAllCache.php @@ -0,0 +1,47 @@ +config = $config; + $this->purgeCache = $purgeCache; + } + + /** + * Flash Varnish cache + * + * @param \Magento\Framework\Event\Observer $observer + * @return void + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + public function invoke(\Magento\Framework\Event\Observer $observer) + { + if ($this->config->getType() == \Magento\PageCache\Model\Config::VARNISH && $this->config->isEnabled()) { + $this->purgeCache->sendPurgeRequest('.*'); + } + } +} diff --git a/app/code/Magento/CacheInvalidate/Observer/InvalidateVarnish.php b/app/code/Magento/CacheInvalidate/Observer/InvalidateVarnish.php new file mode 100644 index 0000000000000..3823a53848fcf --- /dev/null +++ b/app/code/Magento/CacheInvalidate/Observer/InvalidateVarnish.php @@ -0,0 +1,56 @@ +config = $config; + $this->purgeCache = $purgeCache; + } + + /** + * If Varnish caching is enabled it collects array of tags + * of incoming object and asks to clean cache. + * + * @param \Magento\Framework\Event\Observer $observer + * @return void + */ + public function invoke(\Magento\Framework\Event\Observer $observer) + { + if ($this->config->getType() == \Magento\PageCache\Model\Config::VARNISH && $this->config->isEnabled()) { + $object = $observer->getEvent()->getObject(); + if ($object instanceof \Magento\Framework\Object\IdentityInterface) { + $tags = []; + $pattern = "((^|,)%s(,|$))"; + foreach ($object->getIdentities() as $tag) { + $tags[] = sprintf($pattern, preg_replace("~_\\d+$~", '', $tag)); + $tags[] = sprintf($pattern, $tag); + } + $this->purgeCache->sendPurgeRequest(implode('|', array_unique($tags))); + } + } + } +} diff --git a/app/code/Magento/CacheInvalidate/Test/Unit/Model/ObserverTest.php b/app/code/Magento/CacheInvalidate/Test/Unit/Model/ObserverTest.php deleted file mode 100644 index 1abb97b56f9c1..0000000000000 --- a/app/code/Magento/CacheInvalidate/Test/Unit/Model/ObserverTest.php +++ /dev/null @@ -1,143 +0,0 @@ -_configMock = $this->getMock( - 'Magento\PageCache\Model\Config', - ['getType', 'isEnabled'], - [], - '', - false - ); - $this->_helperMock = $this->getMock('Magento\PageCache\Helper\Data', ['getUrl'], [], '', false); - $this->_curlMock = $this->getMock( - '\Magento\Framework\HTTP\Adapter\Curl', - ['setOptions', 'write', 'read', 'close'], - [], - '', - false - ); - $this->logger = $this->getMock('Magento\Framework\Cache\InvalidateLogger', [], [], '', false); - $this->_model = new \Magento\CacheInvalidate\Model\Observer( - $this->_configMock, - $this->_helperMock, - $this->_curlMock, - $this->logger - ); - $this->_observerMock = $this->getMock( - 'Magento\Framework\Event\Observer', - ['getEvent'], - [], - '', - false - ); - $this->_observerObject = $this->getMock('\Magento\Store\Model\Store', [], [], '', false); - } - - /** - * Test case for cache invalidation - */ - public function testInvalidateVarnish() - { - $tags = ['cache_1', 'cache_group']; - $pattern = '((^|,)cache(,|$))|((^|,)cache_1(,|$))|((^|,)cache_group(,|$))'; - - $this->_configMock->expects($this->once())->method('isEnabled')->will($this->returnValue(true)); - $this->_configMock->expects( - $this->once() - )->method( - 'getType' - )->will( - $this->returnValue(\Magento\PageCache\Model\Config::VARNISH) - ); - $eventMock = $this->getMock('Magento\Framework\Event', ['getObject'], [], '', false); - $eventMock->expects($this->once())->method('getObject')->will($this->returnValue($this->_observerObject)); - $this->_observerMock->expects($this->once())->method('getEvent')->will($this->returnValue($eventMock)); - $this->_observerObject->expects($this->once())->method('getIdentities')->will($this->returnValue($tags)); - $this->sendPurgeRequest($pattern); - - $this->_model->invalidateVarnish($this->_observerMock); - } - - /** - * Test case for flushing all the cache - */ - public function testFlushAllCache() - { - $this->_configMock->expects($this->once())->method('isEnabled')->will($this->returnValue(true)); - $this->_configMock->expects( - $this->once() - )->method( - 'getType' - )->will( - $this->returnValue(\Magento\PageCache\Model\Config::VARNISH) - ); - - $this->sendPurgeRequest('.*'); - $this->_model->flushAllCache($this->_observerMock); - } - - /** - * @param string $tags - */ - protected function sendPurgeRequest($tags) - { - $url = 'http://mangento.index.php'; - $httpVersion = '1.1'; - $headers = ["X-Magento-Tags-Pattern: {$tags}"]; - $this->_helperMock->expects( - $this->any() - )->method( - 'getUrl' - )->with( - $this->equalTo('*'), - [] - )->will( - $this->returnValue($url) - ); - $this->_curlMock->expects($this->once())->method('setOptions')->with([CURLOPT_CUSTOMREQUEST => 'PURGE']); - $this->_curlMock->expects( - $this->once() - )->method( - 'write' - )->with( - $this->equalTo(''), - $this->equalTo($url), - $httpVersion, - $this->equalTo($headers) - ); - $this->_curlMock->expects($this->once())->method('read'); - $this->_curlMock->expects($this->once())->method('close'); - } -} diff --git a/app/code/Magento/CacheInvalidate/Test/Unit/Model/PurgeCacheTest.php b/app/code/Magento/CacheInvalidate/Test/Unit/Model/PurgeCacheTest.php new file mode 100644 index 0000000000000..844cd0dea94f7 --- /dev/null +++ b/app/code/Magento/CacheInvalidate/Test/Unit/Model/PurgeCacheTest.php @@ -0,0 +1,74 @@ +helperMock = $this->getMock('Magento\PageCache\Helper\Data', ['getUrl'], [], '', false); + $this->curlMock = $this->getMock( + '\Magento\Framework\HTTP\Adapter\Curl', + ['setOptions', 'write', 'read', 'close'], + [], + '', + false + ); + $this->logger = $this->getMock('Magento\Framework\Cache\InvalidateLogger', [], [], '', false); + $this->model = new \Magento\CacheInvalidate\Model\PurgeCache( + $this->helperMock, + $this->curlMock, + $this->logger + ); + } + + public function testSendPurgeRequest() + { + $tags = 'tags'; + $url = 'http://mangento.index.php'; + $httpVersion = '1.1'; + $headers = ["X-Magento-Tags-Pattern: {$tags}"]; + $this->helperMock->expects( + $this->any() + )->method( + 'getUrl' + )->with( + $this->equalTo('*'), + [] + )->will( + $this->returnValue($url) + ); + $this->curlMock->expects($this->once())->method('setOptions')->with([CURLOPT_CUSTOMREQUEST => 'PURGE']); + $this->curlMock->expects( + $this->once() + )->method( + 'write' + )->with( + $this->equalTo(''), + $this->equalTo($url), + $httpVersion, + $this->equalTo($headers) + ); + $this->curlMock->expects($this->once())->method('read'); + $this->curlMock->expects($this->once())->method('close'); + $this->model->sendPurgeRequest($tags); + } +} diff --git a/app/code/Magento/CacheInvalidate/Test/Unit/Observer/FlushAllCacheTest.php b/app/code/Magento/CacheInvalidate/Test/Unit/Observer/FlushAllCacheTest.php new file mode 100644 index 0000000000000..2ae56c9797179 --- /dev/null +++ b/app/code/Magento/CacheInvalidate/Test/Unit/Observer/FlushAllCacheTest.php @@ -0,0 +1,66 @@ +configMock = $this->getMock( + 'Magento\PageCache\Model\Config', + ['getType', 'isEnabled'], + [], + '', + false + ); + $this->purgeCache = $this->getMock('Magento\CacheInvalidate\Model\PurgeCache', [], [], '', false); + $this->model = new \Magento\CacheInvalidate\Observer\FlushAllCache( + $this->configMock, + $this->purgeCache + ); + $this->observerMock = $this->getMock( + 'Magento\Framework\Event\Observer', + ['getEvent'], + [], + '', + false + ); + } + + /** + * Test case for flushing all the cache + */ + public function testFlushAllCache() + { + $this->configMock->expects($this->once())->method('isEnabled')->will($this->returnValue(true)); + $this->configMock->expects( + $this->once() + )->method( + 'getType' + )->will( + $this->returnValue(\Magento\PageCache\Model\Config::VARNISH) + ); + + $this->purgeCache->expects($this->once())->method('sendPurgeRequest')->with('.*'); + $this->model->invoke($this->observerMock); + } +} diff --git a/app/code/Magento/CacheInvalidate/Test/Unit/Observer/InvalidateVarnishTest.php b/app/code/Magento/CacheInvalidate/Test/Unit/Observer/InvalidateVarnishTest.php new file mode 100644 index 0000000000000..16acbe92af637 --- /dev/null +++ b/app/code/Magento/CacheInvalidate/Test/Unit/Observer/InvalidateVarnishTest.php @@ -0,0 +1,79 @@ +configMock = $this->getMock( + 'Magento\PageCache\Model\Config', + ['getType', 'isEnabled'], + [], + '', + false + ); + $this->purgeCache = $this->getMock('Magento\CacheInvalidate\Model\PurgeCache', [], [], '', false); + $this->model = new \Magento\CacheInvalidate\Observer\InvalidateVarnish( + $this->configMock, + $this->purgeCache + ); + $this->observerMock = $this->getMock( + 'Magento\Framework\Event\Observer', + ['getEvent'], + [], + '', + false + ); + $this->observerObject = $this->getMock('\Magento\Store\Model\Store', [], [], '', false); + } + + /** + * Test case for cache invalidation + */ + public function testInvalidateVarnish() + { + $tags = ['cache_1', 'cache_group']; + $pattern = '((^|,)cache(,|$))|((^|,)cache_1(,|$))|((^|,)cache_group(,|$))'; + + $this->configMock->expects($this->once())->method('isEnabled')->will($this->returnValue(true)); + $this->configMock->expects( + $this->once() + )->method( + 'getType' + )->will( + $this->returnValue(\Magento\PageCache\Model\Config::VARNISH) + ); + $eventMock = $this->getMock('Magento\Framework\Event', ['getObject'], [], '', false); + $eventMock->expects($this->once())->method('getObject')->will($this->returnValue($this->observerObject)); + $this->observerMock->expects($this->once())->method('getEvent')->will($this->returnValue($eventMock)); + $this->observerObject->expects($this->once())->method('getIdentities')->will($this->returnValue($tags)); + $this->purgeCache->expects($this->once())->method('sendPurgeRequest')->with($pattern); + + $this->model->invoke($this->observerMock); + } + +} diff --git a/app/code/Magento/CacheInvalidate/etc/events.xml b/app/code/Magento/CacheInvalidate/etc/events.xml index d4ba3665ee66f..d29c1c0d3022e 100644 --- a/app/code/Magento/CacheInvalidate/etc/events.xml +++ b/app/code/Magento/CacheInvalidate/etc/events.xml @@ -7,45 +7,45 @@ --> - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + \ No newline at end of file diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php index e713960c9542b..11a02e81dbbe5 100644 --- a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php +++ b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php @@ -3812,4 +3812,5 @@ ['Magento\Bundle\Model\Observer', 'corresponding classes in Magento\Bundle\Observer\*'], ['Magento\CatalogRule\Model\Observer', 'corresponding classes in Magento\CatalogRule\Observer\*'], ['Magento\Tax\Model\Observer', 'corresponding classes in Magento\Tax\Observer\*'], + ['Magento\CacheInvalidate\Model\Observer', 'corresponding classes in Magento\CacheInvalidate\Observer\*'], ]; diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php index 1f505ac702287..62fe59155f1f3 100644 --- a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php +++ b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php @@ -2358,4 +2358,7 @@ ['aggregateSalesReportTaxData', 'Magento\Tax\Model\Observer', 'Magento\Tax\Observer\AggregateSalesReportTaxData::invoke'], ['quoteCollectTotalsBefore', 'Magento\Tax\Model\Observer', 'Magento\Tax\Observer\QuoteCollectTotalsBefore::invoke'], ['updateProductOptions', 'Magento\Tax\Model\Observer', 'Magento\Tax\Observer\UpdateProductOptions::invoke'], + ['invalidateVarnish', 'Magento\CacheInvalidate\Model\Observer', 'Magento\CacheInvalidate\Observer\InvalidateVarnish::invoke'], + ['flushAllCache', 'Magento\CacheInvalidate\Model\Observer', 'Magento\CacheInvalidate\Observer\FlushAllCache::invoke'], + ['sendPurgeRequest', 'Magento\CacheInvalidate\Model\Observer', 'Magento\CacheInvalidate\Model\PurgeCache::sendPurgeRequest'], ]; From e3a318bf07ac65bfb2fa4388e5470c28946a439c Mon Sep 17 00:00:00 2001 From: Michail Slabko Date: Fri, 31 Jul 2015 13:02:21 +0300 Subject: [PATCH 05/13] MAGETWO-31442: Splitting all observers with automated tool - MAGETWO-40874: Manual split of Magento\CacheInvalidate\Model\Observer -- fix static tests --- app/code/Magento/Bundle/Observer/AppendUpsellProducts.php | 4 +++- .../CacheInvalidate/Test/Unit/Model/PurgeCacheTest.php | 2 +- .../Test/Unit/Observer/InvalidateVarnishTest.php | 1 - .../Observer/PrepareCatalogProductCollectionPrices.php | 1 + .../Magento/CatalogRule/Observer/ProcessAdminFinalPrice.php | 1 + 5 files changed, 6 insertions(+), 3 deletions(-) diff --git a/app/code/Magento/Bundle/Observer/AppendUpsellProducts.php b/app/code/Magento/Bundle/Observer/AppendUpsellProducts.php index 719c7e7250e3e..633985b67bc6d 100644 --- a/app/code/Magento/Bundle/Observer/AppendUpsellProducts.php +++ b/app/code/Magento/Bundle/Observer/AppendUpsellProducts.php @@ -31,13 +31,15 @@ class AppendUpsellProducts /** * @param \Magento\Bundle\Helper\Data $bundleData + * @param \Magento\Catalog\Model\Product\Visibility $productVisibility + * @param \Magento\Catalog\Model\Config $config + * @param \Magento\Bundle\Model\Resource\Selection $bundleSelection */ public function __construct( \Magento\Bundle\Helper\Data $bundleData, \Magento\Catalog\Model\Product\Visibility $productVisibility, \Magento\Catalog\Model\Config $config, \Magento\Bundle\Model\Resource\Selection $bundleSelection - ) { $this->bundleData = $bundleData; $this->productVisibility = $productVisibility; diff --git a/app/code/Magento/CacheInvalidate/Test/Unit/Model/PurgeCacheTest.php b/app/code/Magento/CacheInvalidate/Test/Unit/Model/PurgeCacheTest.php index 844cd0dea94f7..93146a33e90b4 100644 --- a/app/code/Magento/CacheInvalidate/Test/Unit/Model/PurgeCacheTest.php +++ b/app/code/Magento/CacheInvalidate/Test/Unit/Model/PurgeCacheTest.php @@ -5,7 +5,7 @@ */ namespace Magento\CacheInvalidate\Test\Unit\Model; -class ObserverTest extends \PHPUnit_Framework_TestCase +class PurgeCacheTest extends \PHPUnit_Framework_TestCase { /** @var \PHPUnit_Framework_MockObject_MockObject | \Magento\CacheInvalidate\Model\PurgeCache */ protected $model; diff --git a/app/code/Magento/CacheInvalidate/Test/Unit/Observer/InvalidateVarnishTest.php b/app/code/Magento/CacheInvalidate/Test/Unit/Observer/InvalidateVarnishTest.php index 16acbe92af637..8a2cdb29b29a8 100644 --- a/app/code/Magento/CacheInvalidate/Test/Unit/Observer/InvalidateVarnishTest.php +++ b/app/code/Magento/CacheInvalidate/Test/Unit/Observer/InvalidateVarnishTest.php @@ -75,5 +75,4 @@ public function testInvalidateVarnish() $this->model->invoke($this->observerMock); } - } diff --git a/app/code/Magento/CatalogRule/Observer/PrepareCatalogProductCollectionPrices.php b/app/code/Magento/CatalogRule/Observer/PrepareCatalogProductCollectionPrices.php index b8fbd2006671a..927a6c1c79d74 100644 --- a/app/code/Magento/CatalogRule/Observer/PrepareCatalogProductCollectionPrices.php +++ b/app/code/Magento/CatalogRule/Observer/PrepareCatalogProductCollectionPrices.php @@ -56,6 +56,7 @@ class PrepareCatalogProductCollectionPrices * @param StoreManagerInterface $storeManager * @param TimezoneInterface $localeDate * @param CustomerModelSession $customerSession + * @param GroupManagementInterface $groupManagement */ public function __construct( RulePricesStorage $rulePricesStorage, diff --git a/app/code/Magento/CatalogRule/Observer/ProcessAdminFinalPrice.php b/app/code/Magento/CatalogRule/Observer/ProcessAdminFinalPrice.php index 4588a2a37de10..cd602af2e178e 100644 --- a/app/code/Magento/CatalogRule/Observer/ProcessAdminFinalPrice.php +++ b/app/code/Magento/CatalogRule/Observer/ProcessAdminFinalPrice.php @@ -43,6 +43,7 @@ class ProcessAdminFinalPrice /** * @param RulePricesStorage $rulePricesStorage + * @param Registry $coreRegistry * @param \Magento\CatalogRule\Model\Resource\RuleFactory $resourceRuleFactory * @param TimezoneInterface $localeDate */ From 72a8b727796fa477cd2ca6bad26977bc54eb3041 Mon Sep 17 00:00:00 2001 From: Michail Slabko Date: Fri, 31 Jul 2015 13:39:35 +0300 Subject: [PATCH 06/13] MAGETWO-31442: Splitting all observers with automated tool - MAGETWO-40882: Manual split of Magento\Catalog\Model\Observer --- .../AddCatalogToTopmenuItems.php} | 116 ++++-------------- .../CatalogCheckIsUsingStaticUrlsAllowed.php | 37 ++++++ .../AddCatalogToTopmenuItemsTest.php} | 36 ++---- .../Magento/Catalog/etc/adminhtml/events.xml | 2 +- .../Magento/Catalog/etc/frontend/events.xml | 2 +- .../Test/Legacy/_files/obsolete_classes.php | 1 + .../Test/Legacy/_files/obsolete_methods.php | 6 + .../App/Test/Unit/Config/ElementTest.php | 4 +- .../App/Test/Unit/Config/_files/element.xml | 4 +- 9 files changed, 83 insertions(+), 125 deletions(-) rename app/code/Magento/Catalog/{Model/Observer.php => Observer/AddCatalogToTopmenuItems.php} (55%) create mode 100644 app/code/Magento/Catalog/Observer/CatalogCheckIsUsingStaticUrlsAllowed.php rename app/code/Magento/Catalog/Test/Unit/{Model/ObserverTest.php => Observer/AddCatalogToTopmenuItemsTest.php} (82%) diff --git a/app/code/Magento/Catalog/Model/Observer.php b/app/code/Magento/Catalog/Observer/AddCatalogToTopmenuItems.php similarity index 55% rename from app/code/Magento/Catalog/Model/Observer.php rename to app/code/Magento/Catalog/Observer/AddCatalogToTopmenuItems.php index 5964c9194665e..acf0980c1d4b1 100644 --- a/app/code/Magento/Catalog/Model/Observer.php +++ b/app/code/Magento/Catalog/Observer/AddCatalogToTopmenuItems.php @@ -3,38 +3,28 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ -namespace Magento\Catalog\Model; +namespace Magento\Catalog\Observer; -/** - * @SuppressWarnings(PHPMD.CouplingBetweenObjects) - */ -class Observer +class AddCatalogToTopmenuItems { /** - * @var Indexer\Category\Flat\State - */ - protected $categoryFlatConfig; - - /** - * Catalog data + * Catalog category * - * @var \Magento\Catalog\Helper\Data + * @var \Magento\Catalog\Helper\Category */ - protected $_catalogData; + protected $catalogCategory; /** - * Catalog category - * - * @var \Magento\Catalog\Helper\Category + * @var \Magento\Catalog\Model\Indexer\Category\Flat\State */ - protected $_catalogCategory; + protected $categoryFlatState; /** * Catalog layer * * @var \Magento\Catalog\Model\Layer */ - private $_catalogLayer = null; + private $catalogLayer = null; /** * Catalog layer resolver @@ -43,70 +33,27 @@ class Observer */ protected $layerResolver; - /** - * Store manager - * - * @var \Magento\Store\Model\StoreManagerInterface - */ - protected $_storeManager; - - /** - * Catalog product - * - * @var \Magento\Catalog\Model\Resource\Product - */ - protected $_catalogProduct; - - /** - * Catalog category1 - * - * @var \Magento\Catalog\Model\Resource\Category - */ - protected $_categoryResource; - - /** - * Factory for product resource - * - * @var \Magento\Catalog\Model\Resource\ProductFactory - */ - protected $_productResourceFactory; - /** * @var \Magento\Framework\Registry */ - protected $_registry; + protected $registry; /** - * @param \Magento\Framework\Registry $registry - * @param Resource\Category $categoryResource - * @param Resource\Product $catalogProduct - * @param \Magento\Store\Model\StoreManagerInterface $storeManager - * @param Layer\Resolver $layerResolver * @param \Magento\Catalog\Helper\Category $catalogCategory - * @param \Magento\Catalog\Helper\Data $catalogData - * @param Indexer\Category\Flat\State $categoryFlatState - * @param Resource\ProductFactory $productResourceFactory + * @param \Magento\Catalog\Model\Indexer\Category\Flat\State $categoryFlatState + * @param \Magento\Catalog\Model\Layer\Resolver $layerResolver + * @param \Magento\Framework\Registry $registry */ public function __construct( - \Magento\Framework\Registry $registry, - \Magento\Catalog\Model\Resource\Category $categoryResource, - \Magento\Catalog\Model\Resource\Product $catalogProduct, - \Magento\Store\Model\StoreManagerInterface $storeManager, - \Magento\Catalog\Model\Layer\Resolver $layerResolver, \Magento\Catalog\Helper\Category $catalogCategory, - \Magento\Catalog\Helper\Data $catalogData, \Magento\Catalog\Model\Indexer\Category\Flat\State $categoryFlatState, - \Magento\Catalog\Model\Resource\ProductFactory $productResourceFactory + \Magento\Catalog\Model\Layer\Resolver $layerResolver, + \Magento\Framework\Registry $registry ) { - $this->_registry = $registry; - $this->_categoryResource = $categoryResource; - $this->_catalogProduct = $catalogProduct; - $this->_storeManager = $storeManager; + $this->catalogCategory = $catalogCategory; + $this->categoryFlatState = $categoryFlatState; $this->layerResolver = $layerResolver; - $this->_catalogCategory = $catalogCategory; - $this->_catalogData = $catalogData; - $this->categoryFlatConfig = $categoryFlatState; - $this->_productResourceFactory = $productResourceFactory; + $this->registry = $registry; } /** @@ -115,24 +62,11 @@ public function __construct( * @param \Magento\Framework\Event\Observer $observer * @return void */ - public function catalogCheckIsUsingStaticUrlsAllowed(\Magento\Framework\Event\Observer $observer) - { - $storeId = $observer->getEvent()->getData('store_id'); - $result = $observer->getEvent()->getData('result'); - $result->isAllowed = $this->_catalogData->setStoreId($storeId)->isUsingStaticUrlsAllowed(); - } - - /** - * Adds catalog categories to top menu - * - * @param \Magento\Framework\Event\Observer $observer - * @return void - */ - public function addCatalogToTopmenuItems(\Magento\Framework\Event\Observer $observer) + public function invoke(\Magento\Framework\Event\Observer $observer) { $block = $observer->getEvent()->getBlock(); $block->addIdentity(\Magento\Catalog\Model\Category::CACHE_TAG); - $this->_addCategoriesToMenu($this->_catalogCategory->getStoreCategories(), $observer->getMenu(), $block); + $this->_addCategoriesToMenu($this->catalogCategory->getStoreCategories(), $observer->getMenu(), $block); } /** @@ -156,7 +90,7 @@ protected function _addCategoriesToMenu($categories, $parentCategoryNode, $block $categoryNode = new \Magento\Framework\Data\Tree\Node($categoryData, 'id', $tree, $parentCategoryNode); $parentCategoryNode->addChild($categoryNode); - if ($this->categoryFlatConfig->isFlatEnabled() && $category->getUseFlatResource()) { + if ($this->categoryFlatState->isFlatEnabled() && $category->getUseFlatResource()) { $subcategories = (array)$category->getChildrenNodes(); } else { $subcategories = $category->getChildren(); @@ -178,7 +112,7 @@ public function getMenuCategoryData($category) $isActiveCategory = false; /** @var \Magento\Catalog\Model\Category $currentCategory */ - $currentCategory = $this->_registry->registry('current_category'); + $currentCategory = $this->registry->registry('current_category'); if ($currentCategory && $currentCategory->getId() == $category->getId()) { $isActiveCategory = true; } @@ -186,7 +120,7 @@ public function getMenuCategoryData($category) $categoryData = [ 'name' => $category->getName(), 'id' => $nodeId, - 'url' => $this->_catalogCategory->getCategoryUrl($category), + 'url' => $this->catalogCategory->getCategoryUrl($category), 'has_active' => $this->hasActive($category), 'is_active' => $isActiveCategory, ]; @@ -222,9 +156,9 @@ protected function hasActive($category) */ private function getCatalogLayer() { - if ($this->_catalogLayer === null) { - $this->_catalogLayer = $this->layerResolver->get(); + if ($this->catalogLayer === null) { + $this->catalogLayer = $this->layerResolver->get(); } - return $this->_catalogLayer; + return $this->catalogLayer; } } diff --git a/app/code/Magento/Catalog/Observer/CatalogCheckIsUsingStaticUrlsAllowed.php b/app/code/Magento/Catalog/Observer/CatalogCheckIsUsingStaticUrlsAllowed.php new file mode 100644 index 0000000000000..aba3635c9301e --- /dev/null +++ b/app/code/Magento/Catalog/Observer/CatalogCheckIsUsingStaticUrlsAllowed.php @@ -0,0 +1,37 @@ +catalogData = $catalogData; + } + + /** + * Checking whether the using static urls in WYSIWYG allowed event + * + * @param \Magento\Framework\Event\Observer $observer + * @return void + */ + public function invoke(\Magento\Framework\Event\Observer $observer) + { + $storeId = $observer->getEvent()->getData('store_id'); + $result = $observer->getEvent()->getData('result'); + $result->isAllowed = $this->catalogData->setStoreId($storeId)->isUsingStaticUrlsAllowed(); + } +} diff --git a/app/code/Magento/Catalog/Test/Unit/Model/ObserverTest.php b/app/code/Magento/Catalog/Test/Unit/Observer/AddCatalogToTopmenuItemsTest.php similarity index 82% rename from app/code/Magento/Catalog/Test/Unit/Model/ObserverTest.php rename to app/code/Magento/Catalog/Test/Unit/Observer/AddCatalogToTopmenuItemsTest.php index a7b9555426bd2..a02917018847c 100644 --- a/app/code/Magento/Catalog/Test/Unit/Model/ObserverTest.php +++ b/app/code/Magento/Catalog/Test/Unit/Observer/AddCatalogToTopmenuItemsTest.php @@ -6,14 +6,14 @@ // @codingStandardsIgnoreFile -namespace Magento\Catalog\Test\Unit\Model; +namespace Magento\Catalog\Test\Unit\Observer; use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; -class ObserverTest extends \PHPUnit_Framework_TestCase +class AddCatalogToTopmenuItemsTest extends \PHPUnit_Framework_TestCase { /** - * @var \Magento\Catalog\Model\Observer + * @var \Magento\Catalog\Observer\AddCatalogToTopmenuItems */ protected $_observer; @@ -25,23 +25,18 @@ class ObserverTest extends \PHPUnit_Framework_TestCase /** * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Catalog\Model\Category */ - protected $_category; + protected $_childrenCategory; /** * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Catalog\Model\Category */ - protected $_childrenCategory; + protected $_category; /** * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Catalog\Model\Indexer\Category\Flat\State */ protected $_categoryFlatState; - /** - * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Store\Model\StoreManagerInterface - */ - protected $_storeManager; - public function setUp() { $this->_catalogCategory = $this->getMock( @@ -60,30 +55,15 @@ public function setUp() false ); - $this->_storeManager = $this->getMockBuilder('Magento\Store\Model\StoreManagerInterface') - ->disableOriginalConstructor() - ->getMock(); - $layerResolver = $this->_getCleanMock('Magento\Catalog\Model\Layer\Resolver'); $layerResolver->expects($this->once())->method('get')->willReturn(null); $this->_observer = (new ObjectManager($this))->getObject( - 'Magento\Catalog\Model\Observer', + 'Magento\Catalog\Observer\AddCatalogToTopmenuItems', [ - 'categoryResource' => $this->_getCleanMock('\Magento\Catalog\Model\Resource\Category'), - 'catalogProduct' => $this->_getCleanMock('\Magento\Catalog\Model\Resource\Product'), - 'storeManager' => $this->_storeManager, 'layerResolver' => $layerResolver, - 'indexIndexer' => $this->_getCleanMock('\Magento\Index\Model\Indexer'), 'catalogCategory' => $this->_catalogCategory, 'catalogData' => $this->_getCleanMock('\Magento\Catalog\Helper\Data'), 'categoryFlatState' => $this->_categoryFlatState, - 'productResourceFactory' => $this->getMock( - 'Magento\Catalog\Model\Resource\ProductFactory', - ['create'], - [], - '', - false - ) ] ); } @@ -166,7 +146,7 @@ public function testAddCatalogToTopMenuItemsWithoutFlat() ->method('getChildren') ->will($this->returnValue([$this->_childrenCategory])); - $this->_observer->addCatalogToTopmenuItems($observer); + $this->_observer->invoke($observer); } public function testAddCatalogToTopMenuItemsWithFlat() @@ -185,7 +165,7 @@ public function testAddCatalogToTopMenuItemsWithFlat() ->method('isFlatEnabled') ->will($this->returnValue(true)); - $this->_observer->addCatalogToTopmenuItems($observer); + $this->_observer->invoke($observer); } public function testGetMenuCategoryData() diff --git a/app/code/Magento/Catalog/etc/adminhtml/events.xml b/app/code/Magento/Catalog/etc/adminhtml/events.xml index 4408494e725c8..81cdf578d7e76 100644 --- a/app/code/Magento/Catalog/etc/adminhtml/events.xml +++ b/app/code/Magento/Catalog/etc/adminhtml/events.xml @@ -7,6 +7,6 @@ --> - + diff --git a/app/code/Magento/Catalog/etc/frontend/events.xml b/app/code/Magento/Catalog/etc/frontend/events.xml index 28e20eb51381a..0b5e86fad3a2b 100644 --- a/app/code/Magento/Catalog/etc/frontend/events.xml +++ b/app/code/Magento/Catalog/etc/frontend/events.xml @@ -13,6 +13,6 @@ - + diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php index 11a02e81dbbe5..7f7e7428dcb19 100644 --- a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php +++ b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php @@ -3813,4 +3813,5 @@ ['Magento\CatalogRule\Model\Observer', 'corresponding classes in Magento\CatalogRule\Observer\*'], ['Magento\Tax\Model\Observer', 'corresponding classes in Magento\Tax\Observer\*'], ['Magento\CacheInvalidate\Model\Observer', 'corresponding classes in Magento\CacheInvalidate\Observer\*'], + ['Magento\Catalog\Model\Observer', 'corresponding classes in Magento\Catalog\Observer\*'], ]; diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php index 62fe59155f1f3..5a51d6d4593f0 100644 --- a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php +++ b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php @@ -2361,4 +2361,10 @@ ['invalidateVarnish', 'Magento\CacheInvalidate\Model\Observer', 'Magento\CacheInvalidate\Observer\InvalidateVarnish::invoke'], ['flushAllCache', 'Magento\CacheInvalidate\Model\Observer', 'Magento\CacheInvalidate\Observer\FlushAllCache::invoke'], ['sendPurgeRequest', 'Magento\CacheInvalidate\Model\Observer', 'Magento\CacheInvalidate\Model\PurgeCache::sendPurgeRequest'], + ['addCatalogToTopmenuItems', 'Magento\Catalog\Model\Observer', 'Magento\Catalog\Observer\AddCatalogToTopmenuItems::invoke'], + ['catalogCheckIsUsingStaticUrlsAllowed', 'Magento\Catalog\Model\Observer', 'Magento\Catalog\Observer\CatalogCheckIsUsingStaticUrlsAllowed::invoke'], + ['_addCategoriesToMenu', 'Magento\Catalog\Model\Observer', 'Magento\Catalog\Observer\AddCatalogToTopmenuItems::_addCategoriesToMenu'], + ['getMenuCategoryData', 'Magento\Catalog\Model\Observer', 'Magento\Catalog\Observer\AddCatalogToTopmenuItems::getMenuCategoryData'], + ['hasActive', 'Magento\Catalog\Model\Observer', 'Magento\Catalog\Observer\AddCatalogToTopmenuItems::hasActive'], + ['getCatalogLayer', 'Magento\Catalog\Model\Observer', 'Magento\Catalog\Observer\AddCatalogToTopmenuItems::getCatalogLayer'], ]; diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Config/ElementTest.php b/lib/internal/Magento/Framework/App/Test/Unit/Config/ElementTest.php index d6a109352c666..6ef80c8ba0cd5 100644 --- a/lib/internal/Magento/Framework/App/Test/Unit/Config/ElementTest.php +++ b/lib/internal/Magento/Framework/App/Test/Unit/Config/ElementTest.php @@ -33,8 +33,8 @@ public function testIs() public function testGetClassName() { - $this->assertEquals('Magento\Catalog\Model\Observer', $this->model->class_test->getClassName()); - $this->assertEquals('Magento\Catalog\Model\Observer', $this->model->model_test->getClassName()); + $this->assertEquals('Magento\ModuleName\Model\ClassName', $this->model->class_test->getClassName()); + $this->assertEquals('Magento\ModuleName\Model\ClassName', $this->model->model_test->getClassName()); $this->assertFalse($this->model->no_classname_test->getClassName()); } } diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Config/_files/element.xml b/lib/internal/Magento/Framework/App/Test/Unit/Config/_files/element.xml index 74dd61904007a..bea6e80320eed 100644 --- a/lib/internal/Magento/Framework/App/Test/Unit/Config/_files/element.xml +++ b/lib/internal/Magento/Framework/App/Test/Unit/Config/_files/element.xml @@ -17,10 +17,10 @@ - Magento\Catalog\Model\Observer + Magento\ModuleName\Model\ClassName - Magento\Catalog\Model\Observer + Magento\ModuleName\Model\ClassName From 0e485ceaffe4b073b06fc4a481f6830c9fc90109 Mon Sep 17 00:00:00 2001 From: Valeriy Nayda Date: Fri, 31 Jul 2015 14:11:47 +0300 Subject: [PATCH 07/13] MAGETWO-31442: Splitting all observers with automated tool -- MAGETWO-40835: Manual split of \Magento\CatalogInventory\Model\Observer --- .../CatalogInventory/Model/Observer.php | 546 ------------------ .../Observer/AddInventoryDataObserver.php | 45 ++ .../AddStockStatusToCollectionObserver.php | 41 ++ .../Observer/CancelOrderItemObserver.php | 56 ++ .../CheckoutAllSubmitAfterObserver.php | 53 ++ .../DisplayProductStatusInfoObserver.php | 41 ++ .../Observer/ItemsForReindex.php | 45 ++ .../CatalogInventory/Observer/ProductQty.php | 61 ++ .../Observer/RefundOrderInventoryObserver.php | 93 +++ .../ReindexQuoteInventoryObserver.php | 85 +++ .../Observer/RevertQuoteInventoryObserver.php | 75 +++ .../Observer/SaveInventoryDataObserver.php | 150 +++++ .../SubtractQuoteInventoryObserver.php | 81 +++ ...dateItemsStockUponConfigChangeObserver.php | 42 ++ .../Test/Unit/Model/ObserverTest.php | 459 --------------- .../Observer/AddInventoryDataObserverTest.php | 82 +++ ...AddStockStatusToCollectionObserverTest.php | 75 +++ .../CheckoutAllSubmitAfterObserverTest.php | 99 ++++ .../RefundOrderInventoryObserverTest.php | 175 ++++++ .../SaveInventoryDataObserverTest.php | 95 +++ ...ItemsStockUponConfigChangeObserverTest.php | 71 +++ .../CatalogInventory/etc/adminhtml/events.xml | 12 - app/code/Magento/CatalogInventory/etc/di.xml | 2 +- .../Magento/CatalogInventory/etc/events.xml | 28 +- .../Model/Resource/Quote/Item/Collection.php | 2 +- .../Test/Legacy/_files/obsolete_classes.php | 1 + .../Test/Legacy/_files/obsolete_methods.php | 10 - .../Legacy/_files/obsolete_properties.php | 1 - 28 files changed, 1482 insertions(+), 1044 deletions(-) delete mode 100644 app/code/Magento/CatalogInventory/Model/Observer.php create mode 100644 app/code/Magento/CatalogInventory/Observer/AddInventoryDataObserver.php create mode 100644 app/code/Magento/CatalogInventory/Observer/AddStockStatusToCollectionObserver.php create mode 100644 app/code/Magento/CatalogInventory/Observer/CancelOrderItemObserver.php create mode 100644 app/code/Magento/CatalogInventory/Observer/CheckoutAllSubmitAfterObserver.php create mode 100644 app/code/Magento/CatalogInventory/Observer/DisplayProductStatusInfoObserver.php create mode 100644 app/code/Magento/CatalogInventory/Observer/ItemsForReindex.php create mode 100644 app/code/Magento/CatalogInventory/Observer/ProductQty.php create mode 100644 app/code/Magento/CatalogInventory/Observer/RefundOrderInventoryObserver.php create mode 100644 app/code/Magento/CatalogInventory/Observer/ReindexQuoteInventoryObserver.php create mode 100644 app/code/Magento/CatalogInventory/Observer/RevertQuoteInventoryObserver.php create mode 100644 app/code/Magento/CatalogInventory/Observer/SaveInventoryDataObserver.php create mode 100644 app/code/Magento/CatalogInventory/Observer/SubtractQuoteInventoryObserver.php create mode 100644 app/code/Magento/CatalogInventory/Observer/UpdateItemsStockUponConfigChangeObserver.php delete mode 100644 app/code/Magento/CatalogInventory/Test/Unit/Model/ObserverTest.php create mode 100644 app/code/Magento/CatalogInventory/Test/Unit/Observer/AddInventoryDataObserverTest.php create mode 100644 app/code/Magento/CatalogInventory/Test/Unit/Observer/AddStockStatusToCollectionObserverTest.php create mode 100644 app/code/Magento/CatalogInventory/Test/Unit/Observer/CheckoutAllSubmitAfterObserverTest.php create mode 100644 app/code/Magento/CatalogInventory/Test/Unit/Observer/RefundOrderInventoryObserverTest.php create mode 100644 app/code/Magento/CatalogInventory/Test/Unit/Observer/SaveInventoryDataObserverTest.php create mode 100644 app/code/Magento/CatalogInventory/Test/Unit/Observer/UpdateItemsStockUponConfigChangeObserverTest.php delete mode 100644 app/code/Magento/CatalogInventory/etc/adminhtml/events.xml diff --git a/app/code/Magento/CatalogInventory/Model/Observer.php b/app/code/Magento/CatalogInventory/Model/Observer.php deleted file mode 100644 index 929f26fd359cc..0000000000000 --- a/app/code/Magento/CatalogInventory/Model/Observer.php +++ /dev/null @@ -1,546 +0,0 @@ - [ - 'item' => 'stock_data/min_qty', - 'config' => 'stock_data/use_config_min_qty', - ], - 'use_config_min_sale_qty' => [ - 'item' => 'stock_data/min_sale_qty', - 'config' => 'stock_data/use_config_min_sale_qty', - ], - 'use_config_max_sale_qty' => [ - 'item' => 'stock_data/max_sale_qty', - 'config' => 'stock_data/use_config_max_sale_qty', - ], - 'use_config_backorders' => [ - 'item' => 'stock_data/backorders', - 'config' => 'stock_data/use_config_backorders', - ], - 'use_config_notify_stock_qty' => [ - 'item' => 'stock_data/notify_stock_qty', - 'config' => 'stock_data/use_config_notify_stock_qty', - ], - 'use_config_enable_qty_inc' => [ - 'item' => 'stock_data/enable_qty_increments', - 'config' => 'stock_data/use_config_enable_qty_inc', - ], - 'use_config_qty_increments' => [ - 'item' => 'stock_data/qty_increments', - 'config' => 'stock_data/use_config_qty_increments', - ], - ]; - - /** - * @param \Magento\Catalog\Model\Indexer\Product\Price\Processor $priceIndexer - * @param Indexer\Stock\Processor $stockIndexerProcessor - * @param Resource\Stock $resourceStock - * @param StockRegistryInterface $stockRegistry - * @param StockManagementInterface $stockManagement - * @param StockIndexInterface $stockIndex - * @param StockConfigurationInterface $stockConfiguration - * @param \Magento\CatalogInventory\Helper\Stock $stockHelper - * @param \Magento\CatalogInventory\Api\StockItemRepositoryInterface $stockItemRepository - */ - public function __construct( - \Magento\Catalog\Model\Indexer\Product\Price\Processor $priceIndexer, - \Magento\CatalogInventory\Model\Indexer\Stock\Processor $stockIndexerProcessor, - \Magento\CatalogInventory\Model\Resource\Stock $resourceStock, - StockRegistryInterface $stockRegistry, - StockManagementInterface $stockManagement, - StockIndexInterface $stockIndex, - StockConfigurationInterface $stockConfiguration, - \Magento\CatalogInventory\Helper\Stock $stockHelper, - \Magento\CatalogInventory\Api\StockItemRepositoryInterface $stockItemRepository - ) { - $this->_priceIndexer = $priceIndexer; - $this->_stockIndexerProcessor = $stockIndexerProcessor; - $this->_resourceStock = $resourceStock; - - $this->stockRegistry = $stockRegistry; - $this->stockManagement = $stockManagement; - $this->stockIndex = $stockIndex; - $this->stockHelper = $stockHelper; - $this->stockConfiguration = $stockConfiguration; - $this->stockItemRepository = $stockItemRepository; - } - - /** - * Add stock information to product - * - * @param EventObserver $observer - * @return $this - */ - public function addInventoryData($observer) - { - $product = $observer->getEvent()->getProduct(); - if ($product instanceof \Magento\Catalog\Model\Product) { - $this->stockHelper->assignStatusToProduct( - $product, - $product->getStockStatus() - ); - } - return $this; - } - - /** - * Add information about product stock status to collection - * Used in for product collection after load - * - * @param EventObserver $observer - * @return $this - */ - public function addStockStatusToCollection($observer) - { - $productCollection = $observer->getEvent()->getCollection(); - $this->stockHelper->addStockStatusToProducts($productCollection); - return $this; - } - - /** - * Add Stock items to product collection - * - * @param EventObserver $observer - * @return $this - */ - public function addInventoryDataToCollection($observer) - { - $productCollection = $observer->getEvent()->getProductCollection(); - $this->stockHelper->addStockStatusToProducts($productCollection); - } - - /** - * Saving product inventory data. Product qty calculated dynamically. - * - * @param EventObserver $observer - * @return $this - */ - public function saveInventoryData($observer) - { - $product = $observer->getEvent()->getProduct(); - - if ($product->getStockData() === null) { - if ($product->getIsChangedWebsites() || $product->dataHasChangedFor('status')) { - $this->stockIndex->rebuild( - $product->getId(), - $product->getStore()->getWebsiteId() - ); - } - return $this; - } - - $this->saveStockItemData($product); - return $this; - } - - /** - * Prepare stock item data for save - * - * @param \Magento\Catalog\Model\Product $product - * @return $this - */ - protected function saveStockItemData($product) - { - $stockItemData = $product->getStockData(); - $stockItemData['product_id'] = $product->getId(); - - if (!isset($stockItemData['website_id'])) { - $stockItemData['website_id'] = $this->stockConfiguration->getDefaultWebsiteId(); - } - $stockItemData['stock_id'] = $this->stockRegistry->getStock($stockItemData['website_id'])->getStockId(); - - foreach ($this->paramListToCheck as $dataKey => $configPath) { - if (null !== $product->getData($configPath['item']) && null === $product->getData($configPath['config'])) { - $stockItemData[$dataKey] = false; - } - } - - $originalQty = $product->getData('stock_data/original_inventory_qty'); - if (strlen($originalQty) > 0) { - $stockItemData['qty_correction'] = (isset($stockItemData['qty']) ? $stockItemData['qty'] : 0) - - $originalQty; - } - - // todo resolve issue with builder and identity field name - $stockItem = $this->stockRegistry->getStockItem($stockItemData['product_id'], $stockItemData['website_id']); - - $stockItem->addData($stockItemData); - $this->stockItemRepository->save($stockItem); - return $this; - } - - /** - * Subtract qtys of quote item products after multishipping checkout - * - * @param EventObserver $observer - * @return $this - */ - public function checkoutAllSubmitAfter(EventObserver $observer) - { - $quote = $observer->getEvent()->getQuote(); - if (!$quote->getInventoryProcessed()) { - $this->subtractQuoteInventory($observer); - $this->reindexQuoteInventory($observer); - } - return $this; - } - - /** - * Return creditmemo items qty to stock - * - * @param EventObserver $observer - * @return void - */ - public function refundOrderInventory($observer) - { - /* @var $creditmemo \Magento\Sales\Model\Order\Creditmemo */ - $creditmemo = $observer->getEvent()->getCreditmemo(); - $itemsToUpdate = []; - foreach ($creditmemo->getAllItems() as $item) { - $qty = $item->getQty(); - if (($item->getBackToStock() && $qty) || $this->stockConfiguration->isAutoReturnEnabled()) { - $productId = $item->getProductId(); - $parentItemId = $item->getOrderItem()->getParentItemId(); - /* @var $parentItem \Magento\Sales\Model\Order\Creditmemo\Item */ - $parentItem = $parentItemId ? $creditmemo->getItemByOrderId($parentItemId) : false; - $qty = $parentItem ? $parentItem->getQty() * $qty : $qty; - if (isset($itemsToUpdate[$productId])) { - $itemsToUpdate[$productId] += $qty; - } else { - $itemsToUpdate[$productId] = $qty; - } - } - } - if (!empty($itemsToUpdate)) { - $this->stockManagement->revertProductsSale( - $itemsToUpdate, - $creditmemo->getStore()->getWebsiteId() - ); - - $updatedItemIds = array_keys($itemsToUpdate); - $this->_stockIndexerProcessor->reindexList($updatedItemIds); - $this->_priceIndexer->reindexList($updatedItemIds); - } - } - - /** - * Update items stock status and low stock date. - * - * @param EventObserver $observer - * @return void - */ - public function updateItemsStockUponConfigChange($observer) - { - $website = $observer->getEvent()->getWebsite(); - $this->_resourceStock->updateSetOutOfStock($website); - $this->_resourceStock->updateSetInStock($website); - $this->_resourceStock->updateLowStockDate($website); - } - - /** - * Subtract quote items qtys from stock items related with quote items products. - * - * Used before order placing to make order save/place transaction smaller - * Also called after every successful order placement to ensure subtraction of inventory - * - * @param EventObserver $observer - * @return $this - */ - public function subtractQuoteInventory(EventObserver $observer) - { - /** @var \Magento\Quote\Model\Quote $quote */ - $quote = $observer->getEvent()->getQuote(); - - // Maybe we've already processed this quote in some event during order placement - // e.g. call in event 'sales_model_service_quote_submit_before' and later in 'checkout_submit_all_after' - if ($quote->getInventoryProcessed()) { - return $this; - } - $items = $this->_getProductsQty($quote->getAllItems()); - - /** - * Remember items - */ - $this->_itemsForReindex = $this->stockManagement->registerProductsSale( - $items, - $quote->getStore()->getWebsiteId() - ); - - $quote->setInventoryProcessed(true); - return $this; - } - - /** - * Revert quote items inventory data (cover not success order place case) - * - * @param EventObserver $observer - * @return void - */ - public function revertQuoteInventory($observer) - { - $quote = $observer->getEvent()->getQuote(); - $items = $this->_getProductsQty($quote->getAllItems()); - $this->stockManagement->revertProductsSale($items, $quote->getStore()->getWebsiteId()); - $productIds = array_keys($items); - if (!empty($productIds)) { - $this->_stockIndexerProcessor->reindexList($productIds); - $this->_priceIndexer->reindexList($productIds); - } - // Clear flag, so if order placement retried again with success - it will be processed - $quote->setInventoryProcessed(false); - } - - /** - * Adds stock item qty to $items (creates new entry or increments existing one) - * $items is array with following structure: - * array( - * $productId => array( - * 'qty' => $qty, - * 'item' => $stockItems|null - * ) - * ) - * - * @param QuoteItem $quoteItem - * @param array &$items - * @return void - */ - protected function _addItemToQtyArray(QuoteItem $quoteItem, &$items) - { - $productId = $quoteItem->getProductId(); - if (!$productId) { - return; - } - if (isset($items[$productId])) { - $items[$productId] += $quoteItem->getTotalQty(); - } else { - $stockItem = null; - if ($quoteItem->getProduct()) { - /** @var Item $stockItem */ - $stockItem = $this->stockRegistry->getStockItem( - $quoteItem->getProduct()->getId(), - $quoteItem->getStore()->getWebsiteId() - ); - } - $items[$productId] = $quoteItem->getTotalQty(); - } - } - - /** - * Prepare array with information about used product qty and product stock item - * result is: - * array( - * $productId => array( - * 'qty' => $qty, - * 'item' => $stockItems|null - * ) - * ) - * @param array $relatedItems - * @return array - */ - protected function _getProductsQty($relatedItems) - { - $items = []; - foreach ($relatedItems as $item) { - $productId = $item->getProductId(); - if (!$productId) { - continue; - } - $children = $item->getChildrenItems(); - if ($children) { - foreach ($children as $childItem) { - $this->_addItemToQtyArray($childItem, $items); - } - } else { - $this->_addItemToQtyArray($item, $items); - } - } - return $items; - } - - /** - * Refresh stock index for specific stock items after successful order placement - * - * @param EventObserver $observer - * @return void - */ - public function reindexQuoteInventory($observer) - { - // Reindex quote ids - $quote = $observer->getEvent()->getQuote(); - $productIds = []; - foreach ($quote->getAllItems() as $item) { - $productIds[$item->getProductId()] = $item->getProductId(); - $children = $item->getChildrenItems(); - if ($children) { - foreach ($children as $childItem) { - $productIds[$childItem->getProductId()] = $childItem->getProductId(); - } - } - } - - if (count($productIds)) { - $this->_stockIndexerProcessor->reindexList($productIds); - } - - // Reindex previously remembered items - $productIds = []; - foreach ($this->_itemsForReindex as $item) { - $item->save(); - $productIds[] = $item->getProductId(); - } - - if (!empty($productIds)) { - $this->_priceIndexer->reindexList($productIds); - } - - $this->_itemsForReindex = []; - // Clear list of remembered items - we don't need it anymore - } - - /** - * Cancel order item - * - * @param EventObserver $observer - * @return void - */ - public function cancelOrderItem($observer) - { - /** @var \Magento\Sales\Model\Order\Item $item */ - $item = $observer->getEvent()->getItem(); - $children = $item->getChildrenItems(); - $qty = $item->getQtyOrdered() - max($item->getQtyShipped(), $item->getQtyInvoiced()) - $item->getQtyCanceled(); - if ($item->getId() && $item->getProductId() && empty($children) && $qty) { - $this->stockManagement->backItemQty($item->getProductId(), $qty, $item->getStore()->getWebsiteId()); - } - $this->_priceIndexer->reindexRow($item->getProductId()); - } - - /** - * Catalog Product website update - * - * @param EventObserver $observer - * @return void - */ - public function catalogProductWebsiteUpdate(EventObserver $observer) - { - $websiteIds = $observer->getEvent()->getWebsiteIds(); - $productIds = $observer->getEvent()->getProductIds(); - - foreach ($websiteIds as $websiteId) { - foreach ($productIds as $productId) { - $this->stockIndex->rebuild($productId, $websiteId); - } - } - } - - /** - * Add stock status to prepare index select - * - * @param EventObserver $observer - * @return void - */ - public function addStockStatusToPrepareIndexSelect(EventObserver $observer) - { - $website = $observer->getEvent()->getWebsite(); - $select = $observer->getEvent()->getSelect(); - $this->stockHelper->addStockStatusToSelect($select, $website); - } - - /** - * Detects whether product status should be shown - * - * @param EventObserver $observer - * @return void - */ - public function displayProductStatusInfo($observer) - { - $info = $observer->getEvent()->getStatus(); - $info->setDisplayStatus($this->stockConfiguration->isDisplayProductStockStatus()); - } -} diff --git a/app/code/Magento/CatalogInventory/Observer/AddInventoryDataObserver.php b/app/code/Magento/CatalogInventory/Observer/AddInventoryDataObserver.php new file mode 100644 index 0000000000000..5f3047cfeb770 --- /dev/null +++ b/app/code/Magento/CatalogInventory/Observer/AddInventoryDataObserver.php @@ -0,0 +1,45 @@ +stockHelper = $stockHelper; + } + + /** + * Add stock information to product + * + * @param EventObserver $observer + * @return void + */ + public function invoke(EventObserver $observer) + { + $product = $observer->getEvent()->getProduct(); + if ($product instanceof \Magento\Catalog\Model\Product) { + $this->stockHelper->assignStatusToProduct( + $product, + $product->getStockStatus() + ); + } + } +} diff --git a/app/code/Magento/CatalogInventory/Observer/AddStockStatusToCollectionObserver.php b/app/code/Magento/CatalogInventory/Observer/AddStockStatusToCollectionObserver.php new file mode 100644 index 0000000000000..43364396c8aa7 --- /dev/null +++ b/app/code/Magento/CatalogInventory/Observer/AddStockStatusToCollectionObserver.php @@ -0,0 +1,41 @@ +stockHelper = $stockHelper; + } + + /** + * Add information about product stock status to collection + * Used in for product collection after load + * + * @param EventObserver $observer + * @return void + */ + public function invoke(EventObserver $observer) + { + $productCollection = $observer->getEvent()->getCollection(); + $this->stockHelper->addStockStatusToProducts($productCollection); + } +} diff --git a/app/code/Magento/CatalogInventory/Observer/CancelOrderItemObserver.php b/app/code/Magento/CatalogInventory/Observer/CancelOrderItemObserver.php new file mode 100644 index 0000000000000..b0feda1f18271 --- /dev/null +++ b/app/code/Magento/CatalogInventory/Observer/CancelOrderItemObserver.php @@ -0,0 +1,56 @@ +stockManagement = $stockManagement; + $this->priceIndexer = $priceIndexer; + } + + /** + * Cancel order item + * + * @param EventObserver $observer + * @return void + */ + public function invoke(EventObserver $observer) + { + /** @var \Magento\Sales\Model\Order\Item $item */ + $item = $observer->getEvent()->getItem(); + $children = $item->getChildrenItems(); + $qty = $item->getQtyOrdered() - max($item->getQtyShipped(), $item->getQtyInvoiced()) - $item->getQtyCanceled(); + if ($item->getId() && $item->getProductId() && empty($children) && $qty) { + $this->stockManagement->backItemQty($item->getProductId(), $qty, $item->getStore()->getWebsiteId()); + } + $this->priceIndexer->reindexRow($item->getProductId()); + } +} diff --git a/app/code/Magento/CatalogInventory/Observer/CheckoutAllSubmitAfterObserver.php b/app/code/Magento/CatalogInventory/Observer/CheckoutAllSubmitAfterObserver.php new file mode 100644 index 0000000000000..b5c20c5974911 --- /dev/null +++ b/app/code/Magento/CatalogInventory/Observer/CheckoutAllSubmitAfterObserver.php @@ -0,0 +1,53 @@ +subtractQuoteInventoryObserver = $subtractQuoteInventoryObserver; + $this->reindexQuoteInventoryObserver = $reindexQuoteInventoryObserver; + } + + /** + * Subtract qtys of quote item products after multishipping checkout + * + * @param EventObserver $observer + * @return $this + */ + public function invoke(EventObserver $observer) + { + $quote = $observer->getEvent()->getQuote(); + if (!$quote->getInventoryProcessed()) { + $this->subtractQuoteInventoryObserver->invoke($observer); + $this->reindexQuoteInventoryObserver->invoke($observer); + } + return $this; + } +} diff --git a/app/code/Magento/CatalogInventory/Observer/DisplayProductStatusInfoObserver.php b/app/code/Magento/CatalogInventory/Observer/DisplayProductStatusInfoObserver.php new file mode 100644 index 0000000000000..7e8d9b8459a8d --- /dev/null +++ b/app/code/Magento/CatalogInventory/Observer/DisplayProductStatusInfoObserver.php @@ -0,0 +1,41 @@ +stockConfiguration = $stockConfiguration; + } + + /** + * Detects whether product status should be shown + * + * @param EventObserver $observer + * @return void + */ + public function invoke(EventObserver $observer) + { + $info = $observer->getEvent()->getStatus(); + $info->setDisplayStatus($this->stockConfiguration->isDisplayProductStockStatus()); + } +} diff --git a/app/code/Magento/CatalogInventory/Observer/ItemsForReindex.php b/app/code/Magento/CatalogInventory/Observer/ItemsForReindex.php new file mode 100644 index 0000000000000..00b5c0a53360a --- /dev/null +++ b/app/code/Magento/CatalogInventory/Observer/ItemsForReindex.php @@ -0,0 +1,45 @@ +itemsForReindex = $items; + } + + /** + * @return array + */ + public function getItems() + { + return $this->itemsForReindex; + } + + /** + * @return void + */ + public function clear() + { + $this->itemsForReindex = []; + } +} diff --git a/app/code/Magento/CatalogInventory/Observer/ProductQty.php b/app/code/Magento/CatalogInventory/Observer/ProductQty.php new file mode 100644 index 0000000000000..ac302579f6103 --- /dev/null +++ b/app/code/Magento/CatalogInventory/Observer/ProductQty.php @@ -0,0 +1,61 @@ +getProductId(); + if (!$productId) { + continue; + } + $children = $item->getChildrenItems(); + if ($children) { + foreach ($children as $childItem) { + $this->_addItemToQtyArray($childItem, $items); + } + } else { + $this->_addItemToQtyArray($item, $items); + } + } + return $items; + } + + /** + * Adds stock item qty to $items (creates new entry or increments existing one) + * + * @param QuoteItem $quoteItem + * @param array &$items + * @return void + */ + protected function _addItemToQtyArray(QuoteItem $quoteItem, &$items) + { + $productId = $quoteItem->getProductId(); + if (!$productId) { + return; + } + if (isset($items[$productId])) { + $items[$productId] += $quoteItem->getTotalQty(); + } else { + $items[$productId] = $quoteItem->getTotalQty(); + } + } +} diff --git a/app/code/Magento/CatalogInventory/Observer/RefundOrderInventoryObserver.php b/app/code/Magento/CatalogInventory/Observer/RefundOrderInventoryObserver.php new file mode 100644 index 0000000000000..4a8accda48ef0 --- /dev/null +++ b/app/code/Magento/CatalogInventory/Observer/RefundOrderInventoryObserver.php @@ -0,0 +1,93 @@ +stockConfiguration = $stockConfiguration; + $this->stockManagement = $stockManagement; + $this->stockIndexerProcessor = $stockIndexerProcessor; + $this->priceIndexer = $priceIndexer; + } + + /** + * Return creditmemo items qty to stock + * + * @param EventObserver $observer + * @return void + */ + public function invoke(EventObserver $observer) + { + /* @var $creditmemo \Magento\Sales\Model\Order\Creditmemo */ + $creditmemo = $observer->getEvent()->getCreditmemo(); + $itemsToUpdate = []; + foreach ($creditmemo->getAllItems() as $item) { + $qty = $item->getQty(); + if (($item->getBackToStock() && $qty) || $this->stockConfiguration->isAutoReturnEnabled()) { + $productId = $item->getProductId(); + $parentItemId = $item->getOrderItem()->getParentItemId(); + /* @var $parentItem \Magento\Sales\Model\Order\Creditmemo\Item */ + $parentItem = $parentItemId ? $creditmemo->getItemByOrderId($parentItemId) : false; + $qty = $parentItem ? $parentItem->getQty() * $qty : $qty; + if (isset($itemsToUpdate[$productId])) { + $itemsToUpdate[$productId] += $qty; + } else { + $itemsToUpdate[$productId] = $qty; + } + } + } + if (!empty($itemsToUpdate)) { + $this->stockManagement->revertProductsSale( + $itemsToUpdate, + $creditmemo->getStore()->getWebsiteId() + ); + + $updatedItemIds = array_keys($itemsToUpdate); + $this->stockIndexerProcessor->reindexList($updatedItemIds); + $this->priceIndexer->reindexList($updatedItemIds); + } + } +} diff --git a/app/code/Magento/CatalogInventory/Observer/ReindexQuoteInventoryObserver.php b/app/code/Magento/CatalogInventory/Observer/ReindexQuoteInventoryObserver.php new file mode 100644 index 0000000000000..61ed2bb6ba198 --- /dev/null +++ b/app/code/Magento/CatalogInventory/Observer/ReindexQuoteInventoryObserver.php @@ -0,0 +1,85 @@ +stockIndexerProcessor = $stockIndexerProcessor; + $this->priceIndexer = $priceIndexer; + $this->itemsForReindex = $itemsForReindex; + } + + /** + * Refresh stock index for specific stock items after successful order placement + * + * @param EventObserver $observer + * @return void + */ + public function invoke(EventObserver $observer) + { + // Reindex quote ids + $quote = $observer->getEvent()->getQuote(); + $productIds = []; + foreach ($quote->getAllItems() as $item) { + $productIds[$item->getProductId()] = $item->getProductId(); + $children = $item->getChildrenItems(); + if ($children) { + foreach ($children as $childItem) { + $productIds[$childItem->getProductId()] = $childItem->getProductId(); + } + } + } + + if ($productIds) { + $this->stockIndexerProcessor->reindexList($productIds); + } + + // Reindex previously remembered items + $productIds = []; + foreach ($this->itemsForReindex->getItems() as $item) { + $item->save(); + $productIds[] = $item->getProductId(); + } + + if (!empty($productIds)) { + $this->priceIndexer->reindexList($productIds); + } + + $this->itemsForReindex ->clear(); + // Clear list of remembered items - we don't need it anymore + } +} diff --git a/app/code/Magento/CatalogInventory/Observer/RevertQuoteInventoryObserver.php b/app/code/Magento/CatalogInventory/Observer/RevertQuoteInventoryObserver.php new file mode 100644 index 0000000000000..6190270c2bb25 --- /dev/null +++ b/app/code/Magento/CatalogInventory/Observer/RevertQuoteInventoryObserver.php @@ -0,0 +1,75 @@ +productQty = $productQty; + $this->stockManagement = $stockManagement; + $this->stockIndexerProcessor = $stockIndexerProcessor; + $this->priceIndexer = $priceIndexer; + } + + /** + * Revert quote items inventory data (cover not success order place case) + * + * @param EventObserver $observer + * @return void + */ + public function invoke(EventObserver $observer) + { + $quote = $observer->getEvent()->getQuote(); + $items = $this->productQty->getProductQty($quote->getAllItems()); + $this->stockManagement->revertProductsSale($items, $quote->getStore()->getWebsiteId()); + $productIds = array_keys($items); + if (!empty($productIds)) { + $this->stockIndexerProcessor->reindexList($productIds); + $this->priceIndexer->reindexList($productIds); + } + // Clear flag, so if order placement retried again with success - it will be processed + $quote->setInventoryProcessed(false); + } +} diff --git a/app/code/Magento/CatalogInventory/Observer/SaveInventoryDataObserver.php b/app/code/Magento/CatalogInventory/Observer/SaveInventoryDataObserver.php new file mode 100644 index 0000000000000..789fc3748dcd9 --- /dev/null +++ b/app/code/Magento/CatalogInventory/Observer/SaveInventoryDataObserver.php @@ -0,0 +1,150 @@ + [ + 'item' => 'stock_data/min_qty', + 'config' => 'stock_data/use_config_min_qty', + ], + 'use_config_min_sale_qty' => [ + 'item' => 'stock_data/min_sale_qty', + 'config' => 'stock_data/use_config_min_sale_qty', + ], + 'use_config_max_sale_qty' => [ + 'item' => 'stock_data/max_sale_qty', + 'config' => 'stock_data/use_config_max_sale_qty', + ], + 'use_config_backorders' => [ + 'item' => 'stock_data/backorders', + 'config' => 'stock_data/use_config_backorders', + ], + 'use_config_notify_stock_qty' => [ + 'item' => 'stock_data/notify_stock_qty', + 'config' => 'stock_data/use_config_notify_stock_qty', + ], + 'use_config_enable_qty_inc' => [ + 'item' => 'stock_data/enable_qty_increments', + 'config' => 'stock_data/use_config_enable_qty_inc', + ], + 'use_config_qty_increments' => [ + 'item' => 'stock_data/qty_increments', + 'config' => 'stock_data/use_config_qty_increments', + ], + ]; + + /** + * @param StockIndexInterface $stockIndex + * @param StockConfigurationInterface $stockConfiguration + * @param StockRegistryInterface $stockRegistry + * @param \Magento\CatalogInventory\Api\StockItemRepositoryInterface $stockItemRepository + */ + public function __construct( + StockIndexInterface $stockIndex, + StockConfigurationInterface $stockConfiguration, + StockRegistryInterface $stockRegistry, + \Magento\CatalogInventory\Api\StockItemRepositoryInterface $stockItemRepository + ) { + $this->stockIndex = $stockIndex; + $this->stockConfiguration = $stockConfiguration; + $this->stockRegistry = $stockRegistry; + $this->stockItemRepository = $stockItemRepository; + } + + /** + * Saving product inventory data. Product qty calculated dynamically. + * + * @param EventObserver $observer + * @return $this + */ + public function invoke(EventObserver $observer) + { + $product = $observer->getEvent()->getProduct(); + + if ($product->getStockData() === null) { + if ($product->getIsChangedWebsites() || $product->dataHasChangedFor('status')) { + $this->stockIndex->rebuild( + $product->getId(), + $product->getStore()->getWebsiteId() + ); + } + return $this; + } + + $this->saveStockItemData($product); + return $this; + } + + /** + * Prepare stock item data for save + * + * @param \Magento\Catalog\Model\Product $product + * @return $this + */ + protected function saveStockItemData($product) + { + $stockItemData = $product->getStockData(); + $stockItemData['product_id'] = $product->getId(); + + if (!isset($stockItemData['website_id'])) { + $stockItemData['website_id'] = $this->stockConfiguration->getDefaultWebsiteId(); + } + $stockItemData['stock_id'] = $this->stockRegistry->getStock($stockItemData['website_id'])->getStockId(); + + foreach ($this->paramListToCheck as $dataKey => $configPath) { + if (null !== $product->getData($configPath['item']) && null === $product->getData($configPath['config'])) { + $stockItemData[$dataKey] = false; + } + } + + $originalQty = $product->getData('stock_data/original_inventory_qty'); + if (strlen($originalQty) > 0) { + $stockItemData['qty_correction'] = (isset($stockItemData['qty']) ? $stockItemData['qty'] : 0) + - $originalQty; + } + + // todo resolve issue with builder and identity field name + $stockItem = $this->stockRegistry->getStockItem($stockItemData['product_id'], $stockItemData['website_id']); + + $stockItem->addData($stockItemData); + $this->stockItemRepository->save($stockItem); + return $this; + } +} diff --git a/app/code/Magento/CatalogInventory/Observer/SubtractQuoteInventoryObserver.php b/app/code/Magento/CatalogInventory/Observer/SubtractQuoteInventoryObserver.php new file mode 100644 index 0000000000000..f52e7d708dd75 --- /dev/null +++ b/app/code/Magento/CatalogInventory/Observer/SubtractQuoteInventoryObserver.php @@ -0,0 +1,81 @@ +stockManagement = $stockManagement; + $this->productQty = $productQty; + $this->itemsForReindex = $itemsForReindex; + } + + /** + * Subtract quote items qtys from stock items related with quote items products. + * + * Used before order placing to make order save/place transaction smaller + * Also called after every successful order placement to ensure subtraction of inventory + * + * @param EventObserver $observer + * @return $this + */ + public function invoke(EventObserver $observer) + { + /** @var \Magento\Quote\Model\Quote $quote */ + $quote = $observer->getEvent()->getQuote(); + + // Maybe we've already processed this quote in some event during order placement + // e.g. call in event 'sales_model_service_quote_submit_before' and later in 'checkout_submit_all_after' + if ($quote->getInventoryProcessed()) { + return $this; + } + $items = $this->productQty->getProductQty($quote->getAllItems()); + + /** + * Remember items + */ + $itemsForReindex = $this->stockManagement->registerProductsSale( + $items, + $quote->getStore()->getWebsiteId() + ); + $this->itemsForReindex->setItems($itemsForReindex); + + $quote->setInventoryProcessed(true); + return $this; + } +} diff --git a/app/code/Magento/CatalogInventory/Observer/UpdateItemsStockUponConfigChangeObserver.php b/app/code/Magento/CatalogInventory/Observer/UpdateItemsStockUponConfigChangeObserver.php new file mode 100644 index 0000000000000..de657ea66d322 --- /dev/null +++ b/app/code/Magento/CatalogInventory/Observer/UpdateItemsStockUponConfigChangeObserver.php @@ -0,0 +1,42 @@ +resourceStock = $resourceStock; + } + + /** + * Update items stock status and low stock date. + * + * @param EventObserver $observer + * @return void + */ + public function invoke(EventObserver $observer) + { + $website = $observer->getEvent()->getWebsite(); + $this->resourceStock->updateSetOutOfStock($website); + $this->resourceStock->updateSetInStock($website); + $this->resourceStock->updateLowStockDate($website); + } +} diff --git a/app/code/Magento/CatalogInventory/Test/Unit/Model/ObserverTest.php b/app/code/Magento/CatalogInventory/Test/Unit/Model/ObserverTest.php deleted file mode 100644 index 8e7b51d0ef154..0000000000000 --- a/app/code/Magento/CatalogInventory/Test/Unit/Model/ObserverTest.php +++ /dev/null @@ -1,459 +0,0 @@ -stockStatus = $this->getMockBuilder('Magento\CatalogInventory\Model\Stock\Status') - ->disableOriginalConstructor() - ->getMock(); - $this->stockFactory = $this->getMockBuilder('Magento\CatalogInventory\Model\StockFactory') - ->disableOriginalConstructor() - ->setMethods(['create']) - ->getMock(); - - $this->catalogInventoryData = $this->getMock('Magento\CatalogInventory\Helper\Data', [], [], '', false); - $this->stock = $this->getMock('Magento\CatalogInventory\Model\Stock', [], [], '', false); - $this->stockIndexProcessor = $this->getMock( - '\Magento\Catalog\Model\Indexer\Product\Stock\Processor', - ['reindexList', 'reindexRow'], - [], - '', - false - ); - $this->stockIndexerProcessor = $this->getMock( - '\Magento\CatalogInventory\Model\Indexer\Stock\Processor', - ['reindexList'], - [], - '', - false - ); - $this->resourceStock = $this->getMock( - '\Magento\CatalogInventory\Model\Resource\Stock', - ['updateSetOutOfStock', 'updateSetInStock', 'updateLowStockDate', '__wakeup'], - [], - '', - false - ); - $this->stockRegistry = $this->getMockForAbstractClass( - '\Magento\CatalogInventory\Api\StockRegistryInterface', - ['getStockItem'], - '', - false - ); - $this->stockRegistry->expects($this->any())->method('getStockItem')->willReturn($this->stockItem); - $this->stockManagement = $this->getMock( - 'Magento\CatalogInventory\Model\StockManagement', - [], - [], - '', - false - ); - $this->stockIndex = $this->getMockForAbstractClass( - '\Magento\CatalogInventory\Api\StockIndexInterface', - ['rebuild'], - '', - false - ); - - $this->stockHelper = $this->getMock( - '\Magento\CatalogInventory\Helper\Stock', - [ - 'assignStatusToProduct', - 'addStockStatusToProducts', - 'addStockStatusToSelect' - ], - [], - '', - false - ); - $this->stockConfiguration = $this->getMockForAbstractClass( - '\Magento\CatalogInventory\Api\StockConfigurationInterface', - [ - 'isAutoReturnEnabled', - 'isDisplayProductStockStatus' - ], - '', - false - ); - $this->stockItemRepository = $this->getMockForAbstractClass( - '\Magento\CatalogInventory\Api\StockItemRepositoryInterface', - ['save'], - '', - false - ); - $this->stockItemFactory = $this->getMock( - '\Magento\CatalogInventory\Api\Data\StockItemInterfaceFactory', - ['create'], - [], - '', - false - ); - $this->priceIndexer = $this->getMockBuilder('Magento\Catalog\Model\Indexer\Product\Price\Processor') - ->disableOriginalConstructor() - ->getMock(); - - $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); - $this->observer = $objectManagerHelper->getObject( - 'Magento\CatalogInventory\Model\Observer', - [ - 'priceIndexer' => $this->priceIndexer, - 'stockIndexerProcessor' => $this->stockIndexerProcessor, - 'resourceStock' => $this->resourceStock, - 'stockRegistry' => $this->stockRegistry, - 'stockManagement' => $this->stockManagement, - 'stockIndex' => $this->stockIndex, - 'stockHelper' => $this->stockHelper, - 'stockConfiguration' => $this->stockConfiguration, - 'stockItemRepository' => $this->stockItemRepository, - 'stockItemFactory' => $this->stockItemFactory - ] - ); - - $this->event = $this->getMockBuilder('Magento\Framework\Event') - ->disableOriginalConstructor() - ->setMethods(['getProduct', 'getCollection', 'getCreditmemo', 'getQuote', 'getWebsite']) - ->getMock(); - $this->eventObserver = $this->getMockBuilder('Magento\Framework\Event\Observer') - ->disableOriginalConstructor() - ->setMethods(['getEvent']) - ->getMock(); - } - - public function testAddInventoryData() - { - $stockStatus = true; - $product = $this->getMockBuilder('Magento\Catalog\Model\Product') - ->disableOriginalConstructor() - ->setMethods(['__wakeup', 'getStockStatus']) - ->getMock(); - $product->expects($this->once()) - ->method('getStockStatus') - ->will($this->returnValue($stockStatus)); - - $this->event->expects($this->once()) - ->method('getProduct') - ->will($this->returnValue($product)); - $this->stockHelper->expects($this->once()) - ->method('assignStatusToProduct') - ->with($product, $stockStatus) - ->will($this->returnSelf()); - - $this->eventObserver->expects($this->atLeastOnce()) - ->method('getEvent') - ->will($this->returnValue($this->event)); - $this->assertEquals($this->observer, $this->observer->addInventoryData($this->eventObserver)); - } - - public function testAddStockStatusToCollection() - { - $productCollection = $this->getMockBuilder('Magento\Catalog\Model\Resource\Product\Collection') - ->disableOriginalConstructor() - ->getMock(); - $this->event->expects($this->once()) - ->method('getCollection') - ->will($this->returnValue($productCollection)); - $this->stockHelper->expects($this->once()) - ->method('addStockStatusToProducts') - ->with($productCollection) - ->will($this->returnSelf()); - - $this->eventObserver->expects($this->atLeastOnce()) - ->method('getEvent') - ->will($this->returnValue($this->event)); - $this->assertEquals($this->observer, $this->observer->addStockStatusToCollection($this->eventObserver)); - } - - public function testAddInventoryDataToCollection() - { - $productCollection = $this->getMockBuilder('Magento\Catalog\Model\Resource\Product\Collection') - ->disableOriginalConstructor() - ->getMock(); - $this->event->expects($this->once()) - ->method('getCollection') - ->will($this->returnValue($productCollection)); - $this->stockHelper->expects($this->once()) - ->method('addStockStatusToProducts') - ->with($productCollection) - ->will($this->returnSelf()); - - $this->eventObserver->expects($this->atLeastOnce()) - ->method('getEvent') - ->will($this->returnValue($this->event)); - $this->assertEquals($this->observer, $this->observer->addStockStatusToCollection($this->eventObserver)); - } - - public function testSaveInventoryData() - { - $productId = 4; - $websiteId = 5; - $stockData = null; - $websitesChanged = true; - $statusChanged = true; - - $product = $this->getMock( - 'Magento\Catalog\Model\Product', - ['getStockData', 'getIsChangedWebsites', 'dataHasChangedFor', 'getId', 'getStore', '__wakeup'], - [], - '', - false - ); - $product->expects($this->once())->method('getStockData')->will($this->returnValue($stockData)); - if ($stockData === null) { - $product->expects($this->any())->method('getIsChangedWebsites')->will($this->returnValue($websitesChanged)); - $product->expects($this->any())->method('dataHasChangedFor')->will($this->returnValue($statusChanged)); - if ($websitesChanged || $statusChanged) { - $product->expects($this->once())->method('getId')->will($this->returnValue($productId)); - $store = $this->getMock( - 'Magento\Store\Model\Store', - ['getWebsiteId', '__wakeup'], - [], - '', - false - ); - $store->expects($this->once())->method('getWebsiteId')->will($this->returnValue($websiteId)); - $product->expects($this->once())->method('getStore')->will($this->returnValue($store)); - $this->stockIndex->expects($this->once())->method('rebuild')->will( - $this->returnValue(true) - ); - } - } else { - $stockItem = $this->getMockForAbstractClass( - 'Magento\CatalogInventory\Api\Data\StockItem', - ['__wakeup'], - '', - false - ); - $this->stockRegistry->expects($this->once()) - ->method('getStockItem') - ->with($productId, $websiteId) - ->will($this->returnValue($stockItem)); - } - - $this->event->expects($this->once()) - ->method('getProduct') - ->will($this->returnValue($product)); - - $this->eventObserver->expects($this->atLeastOnce()) - ->method('getEvent') - ->will($this->returnValue($this->event)); - $this->assertEquals($this->observer, $this->observer->saveInventoryData($this->eventObserver)); - } - - public function testCheckoutAllSubmitAfter() - { - $inventoryProcessed = false; - $websiteId = 0; - $itemsToRegister = []; - $itemsToReindex = []; - - $quote = $this->getMock( - '\Magento\Quote\Model\Quote', - ['getInventoryProcessed', 'setInventoryProcessed', 'getAllItems', 'getStore', '__wakeup'], - [], - '', - false - ); - $quote->expects($this->atLeastOnce()) - ->method('getInventoryProcessed', 'setInventoryProcessed', 'getStore') - ->will($this->returnValue($inventoryProcessed)); - $store = $this->getMock( - 'Magento\Store\Model\Store', - ['getWebsiteId', '__wakeup'], - [], - '', - false - ); - $store->expects($this->once())->method('getWebsiteId')->will($this->returnValue($websiteId)); - $quote->expects($this->once())->method('getStore')->will($this->returnValue($store)); - $quote->expects($this->any())->method('getAllItems')->will($this->returnValue($itemsToRegister)); - - $this->stockManagement->expects($this->once())->method('registerProductsSale')->will( - $this->returnValue($itemsToReindex) - ); - - $this->event->expects($this->atLeastOnce()) - ->method('getQuote') - ->will($this->returnValue($quote)); - - $this->eventObserver->expects($this->atLeastOnce()) - ->method('getEvent') - ->will($this->returnValue($this->event)); - $this->assertEquals($this->observer, $this->observer->checkoutAllSubmitAfter($this->eventObserver)); - } - - public function testRefundOrderInventory() - { - $websiteId = 0; - $ids = ['1', '14']; - $items = []; - $isAutoReturnEnabled = true; - - $itemsToUpdate = []; - foreach ($ids as $id) { - $item = $this->getCreditMemoItem($id); - $items[] = $item; - $itemsToUpdate[$item->getProductId()] = $item->getQty(); - } - $creditMemo = $this->getMock('Magento\Sales\Model\Order\Creditmemo', [], [], '', false); - $creditMemo->expects($this->once()) - ->method('getAllItems') - ->will($this->returnValue($items)); - $store = $this->getMock( - 'Magento\Store\Model\Store', - ['getWebsiteId', '__wakeup'], - [], - '', - false - ); - $store->expects($this->once())->method('getWebsiteId')->will($this->returnValue($websiteId)); - $creditMemo->expects($this->once())->method('getStore')->will($this->returnValue($store)); - - $this->stockConfiguration->expects($this->any()) - ->method('isAutoReturnEnabled') - ->will($this->returnValue($isAutoReturnEnabled)); - - $this->stockManagement->expects($this->once()) - ->method('revertProductsSale') - ->with($itemsToUpdate, $websiteId); - $this->stockIndexerProcessor->expects($this->once()) - ->method('reindexList') - ->with($ids); - $this->priceIndexer->expects($this->once()) - ->method('reindexList') - ->with($ids); - - $this->event->expects($this->once()) - ->method('getCreditmemo') - ->will($this->returnValue($creditMemo)); - $this->eventObserver->expects($this->atLeastOnce()) - ->method('getEvent') - ->will($this->returnValue($this->event)); - $this->observer->refundOrderInventory($this->eventObserver); - } - - public function testUpdateItemsStockUponConfigChange() - { - $websiteId = 1; - $this->resourceStock->expects($this->once())->method('updateSetOutOfStock')->willReturn(null); - $this->resourceStock->expects($this->once())->method('updateSetInStock')->willReturn(null); - $this->resourceStock->expects($this->once())->method('updateLowStockDate')->willReturn(null); - - $this->event->expects($this->once()) - ->method('getWebsite') - ->will($this->returnValue($websiteId)); - $this->eventObserver->expects($this->atLeastOnce()) - ->method('getEvent') - ->will($this->returnValue($this->event)); - $this->observer->updateItemsStockUponConfigChange($this->eventObserver); - } - - private function getCreditMemoItem($productId) - { - $parentItemId = false; - $backToStock = true; - $qty = 1; - $item = $this->getMock( - 'Magento\Sales\Model\Order\Creditmemo\Item', - ['getProductId', 'getOrderItem', 'getBackToStock', 'getQty', '__wakeup'], - [], - '', - false - ); - $orderItem = $this->getMock('Magento\Sales\Model\Order\Item', ['getParentItemId', '__wakeup'], [], '', false); - $orderItem->expects($this->any())->method('getParentItemId')->willReturn($parentItemId); - $item->expects($this->any())->method('getOrderItem')->willReturn($orderItem); - $item->expects($this->any())->method('getProductId')->will($this->returnValue($productId)); - $item->expects($this->any())->method('getBackToStock')->willReturn($backToStock); - $item->expects($this->any())->method('getQty')->willReturn($qty); - return $item; - } -} diff --git a/app/code/Magento/CatalogInventory/Test/Unit/Observer/AddInventoryDataObserverTest.php b/app/code/Magento/CatalogInventory/Test/Unit/Observer/AddInventoryDataObserverTest.php new file mode 100644 index 0000000000000..1ff7d7c11d620 --- /dev/null +++ b/app/code/Magento/CatalogInventory/Test/Unit/Observer/AddInventoryDataObserverTest.php @@ -0,0 +1,82 @@ +stockHelper = $this->getMock('Magento\CatalogInventory\Helper\Stock', [], [], '', false); + + $this->event = $this->getMockBuilder('Magento\Framework\Event') + ->disableOriginalConstructor() + ->setMethods(['getProduct']) + ->getMock(); + + $this->eventObserver = $this->getMockBuilder('Magento\Framework\Event\Observer') + ->disableOriginalConstructor() + ->setMethods(['getEvent']) + ->getMock(); + + $this->eventObserver->expects($this->atLeastOnce()) + ->method('getEvent') + ->will($this->returnValue($this->event)); + + $this->observer = (new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this))->getObject( + 'Magento\CatalogInventory\Observer\AddInventoryDataObserver', + [ + 'stockHelper' => $this->stockHelper, + ] + ); + } + + public function testAddInventoryData() + { + $stockStatus = true; + + $product = $this->getMockBuilder('Magento\Catalog\Model\Product') + ->disableOriginalConstructor() + ->setMethods(['getStockStatus']) + ->getMock(); + + $product->expects($this->once()) + ->method('getStockStatus') + ->will($this->returnValue($stockStatus)); + + $this->event->expects($this->once()) + ->method('getProduct') + ->will($this->returnValue($product)); + + $this->stockHelper->expects($this->once()) + ->method('assignStatusToProduct') + ->with($product, $stockStatus) + ->will($this->returnSelf()); + + $this->observer->invoke($this->eventObserver); + } +} diff --git a/app/code/Magento/CatalogInventory/Test/Unit/Observer/AddStockStatusToCollectionObserverTest.php b/app/code/Magento/CatalogInventory/Test/Unit/Observer/AddStockStatusToCollectionObserverTest.php new file mode 100644 index 0000000000000..cdd4762c799a4 --- /dev/null +++ b/app/code/Magento/CatalogInventory/Test/Unit/Observer/AddStockStatusToCollectionObserverTest.php @@ -0,0 +1,75 @@ +stockHelper = $this->getMock('Magento\CatalogInventory\Helper\Stock', [], [], '', false); + + $this->event = $this->getMockBuilder('Magento\Framework\Event') + ->disableOriginalConstructor() + ->setMethods(['getCollection']) + ->getMock(); + + $this->eventObserver = $this->getMockBuilder('Magento\Framework\Event\Observer') + ->disableOriginalConstructor() + ->setMethods(['getEvent']) + ->getMock(); + + $this->eventObserver->expects($this->atLeastOnce()) + ->method('getEvent') + ->will($this->returnValue($this->event)); + + $this->observer = (new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this))->getObject( + 'Magento\CatalogInventory\Observer\AddStockStatusToCollectionObserver', + [ + 'stockHelper' => $this->stockHelper, + ] + ); + } + + public function testAddStockStatusToCollection() + { + $productCollection = $this->getMockBuilder('Magento\Catalog\Model\Resource\Product\Collection') + ->disableOriginalConstructor() + ->getMock(); + + $this->event->expects($this->once()) + ->method('getCollection') + ->will($this->returnValue($productCollection)); + + $this->stockHelper->expects($this->once()) + ->method('addStockStatusToProducts') + ->with($productCollection) + ->will($this->returnSelf()); + + $this->observer->invoke($this->eventObserver); + } +} diff --git a/app/code/Magento/CatalogInventory/Test/Unit/Observer/CheckoutAllSubmitAfterObserverTest.php b/app/code/Magento/CatalogInventory/Test/Unit/Observer/CheckoutAllSubmitAfterObserverTest.php new file mode 100644 index 0000000000000..cafe4d9f12797 --- /dev/null +++ b/app/code/Magento/CatalogInventory/Test/Unit/Observer/CheckoutAllSubmitAfterObserverTest.php @@ -0,0 +1,99 @@ +subtractQuoteInventoryObserver = $this->getMock( + 'Magento\CatalogInventory\Observer\SubtractQuoteInventoryObserver', + [], + [], + '', + false + ); + + $this->reindexQuoteInventoryObserver = $this->getMock( + 'Magento\CatalogInventory\Observer\ReindexQuoteInventoryObserver', + [], + [], + '', + false + ); + + $this->event = $this->getMockBuilder('Magento\Framework\Event') + ->disableOriginalConstructor() + ->setMethods(['getProduct', 'getCollection', 'getCreditmemo', 'getQuote', 'getWebsite']) + ->getMock(); + + $this->eventObserver = $this->getMockBuilder('Magento\Framework\Event\Observer') + ->disableOriginalConstructor() + ->setMethods(['getEvent']) + ->getMock(); + + $this->eventObserver->expects($this->atLeastOnce()) + ->method('getEvent') + ->will($this->returnValue($this->event)); + + $this->observer = (new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this))->getObject( + 'Magento\CatalogInventory\Observer\CheckoutAllSubmitAfterObserver', + [ + 'subtractQuoteInventoryObserver' => $this->subtractQuoteInventoryObserver, + 'reindexQuoteInventoryObserver' => $this->reindexQuoteInventoryObserver, + ] + ); + } + + public function testCheckoutAllSubmitAfter() + { + $quote = $this->getMock('Magento\Quote\Model\Quote', ['getInventoryProcessed'], [], '', false); + $quote->expects($this->once()) + ->method('getInventoryProcessed') + ->will($this->returnValue(false)); + + $this->event->expects($this->once()) + ->method('getQuote') + ->will($this->returnValue($quote)); + + $this->subtractQuoteInventoryObserver->expects($this->once()) + ->method('invoke') + ->with($this->eventObserver); + + $this->reindexQuoteInventoryObserver->expects($this->once()) + ->method('invoke') + ->with($this->eventObserver); + + $this->observer->invoke($this->eventObserver); + } +} diff --git a/app/code/Magento/CatalogInventory/Test/Unit/Observer/RefundOrderInventoryObserverTest.php b/app/code/Magento/CatalogInventory/Test/Unit/Observer/RefundOrderInventoryObserverTest.php new file mode 100644 index 0000000000000..0930285cb4822 --- /dev/null +++ b/app/code/Magento/CatalogInventory/Test/Unit/Observer/RefundOrderInventoryObserverTest.php @@ -0,0 +1,175 @@ +stockIndexerProcessor = $this->getMock( + 'Magento\CatalogInventory\Model\Indexer\Stock\Processor', + ['reindexList'], + [], + '', + false + ); + + $this->stockManagement = $this->getMock( + 'Magento\CatalogInventory\Model\StockManagement', + [], + [], + '', + false + ); + + $this->stockConfiguration = $this->getMockForAbstractClass( + 'Magento\CatalogInventory\Api\StockConfigurationInterface', + [ + 'isAutoReturnEnabled', + 'isDisplayProductStockStatus' + ], + '', + false + ); + + $this->priceIndexer = $this->getMockBuilder('Magento\Catalog\Model\Indexer\Product\Price\Processor') + ->disableOriginalConstructor() + ->getMock(); + + $this->event = $this->getMockBuilder('Magento\Framework\Event') + ->disableOriginalConstructor() + ->setMethods(['getProduct', 'getCollection', 'getCreditmemo', 'getQuote', 'getWebsite']) + ->getMock(); + + $this->eventObserver = $this->getMockBuilder('Magento\Framework\Event\Observer') + ->disableOriginalConstructor() + ->setMethods(['getEvent']) + ->getMock(); + + $this->eventObserver->expects($this->atLeastOnce()) + ->method('getEvent') + ->will($this->returnValue($this->event)); + + $this->observer = (new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this))->getObject( + 'Magento\CatalogInventory\Observer\RefundOrderInventoryObserver', + [ + 'stockConfiguration' => $this->stockConfiguration, + 'stockManagement' => $this->stockManagement, + 'stockIndexerProcessor' => $this->stockIndexerProcessor, + 'priceIndexer' => $this->priceIndexer, + ] + ); + } + + public function testRefundOrderInventory() + { + $websiteId = 0; + $ids = ['1', '14']; + $items = []; + $isAutoReturnEnabled = true; + + $store = $this->getMock( + 'Magento\Store\Model\Store', + ['getWebsiteId'], + [], + '', + false + ); + $store->expects($this->once())->method('getWebsiteId')->will($this->returnValue($websiteId)); + + $itemsToUpdate = []; + foreach ($ids as $id) { + $item = $this->getCreditMemoItem($id); + $items[] = $item; + $itemsToUpdate[$item->getProductId()] = $item->getQty(); + } + $creditMemo = $this->getMock('Magento\Sales\Model\Order\Creditmemo', [], [], '', false); + $creditMemo->expects($this->once()) + ->method('getAllItems') + ->will($this->returnValue($items)); + $creditMemo->expects($this->once())->method('getStore')->will($this->returnValue($store)); + + $this->stockConfiguration->expects($this->any()) + ->method('isAutoReturnEnabled') + ->will($this->returnValue($isAutoReturnEnabled)); + + $this->stockManagement->expects($this->once()) + ->method('revertProductsSale') + ->with($itemsToUpdate, $websiteId); + + $this->stockIndexerProcessor->expects($this->once()) + ->method('reindexList') + ->with($ids); + + $this->priceIndexer->expects($this->once()) + ->method('reindexList') + ->with($ids); + + $this->event->expects($this->once()) + ->method('getCreditmemo') + ->will($this->returnValue($creditMemo)); + + $this->observer->invoke($this->eventObserver); + } + + private function getCreditMemoItem($productId) + { + $parentItemId = false; + $backToStock = true; + $qty = 1; + $item = $this->getMock( + 'Magento\Sales\Model\Order\Creditmemo\Item', + ['getProductId', 'getOrderItem', 'getBackToStock', 'getQty', '__wakeup'], + [], + '', + false + ); + $orderItem = $this->getMock('Magento\Sales\Model\Order\Item', ['getParentItemId', '__wakeup'], [], '', false); + $orderItem->expects($this->any())->method('getParentItemId')->willReturn($parentItemId); + $item->expects($this->any())->method('getOrderItem')->willReturn($orderItem); + $item->expects($this->any())->method('getProductId')->will($this->returnValue($productId)); + $item->expects($this->any())->method('getBackToStock')->willReturn($backToStock); + $item->expects($this->any())->method('getQty')->willReturn($qty); + return $item; + } +} diff --git a/app/code/Magento/CatalogInventory/Test/Unit/Observer/SaveInventoryDataObserverTest.php b/app/code/Magento/CatalogInventory/Test/Unit/Observer/SaveInventoryDataObserverTest.php new file mode 100644 index 0000000000000..35648b6b84840 --- /dev/null +++ b/app/code/Magento/CatalogInventory/Test/Unit/Observer/SaveInventoryDataObserverTest.php @@ -0,0 +1,95 @@ +stockIndex = $this->getMockForAbstractClass( + 'Magento\CatalogInventory\Api\StockIndexInterface', + ['rebuild'], + '', + false + ); + + $this->event = $this->getMockBuilder('Magento\Framework\Event') + ->disableOriginalConstructor() + ->setMethods(['getProduct']) + ->getMock(); + + $this->eventObserver = $this->getMockBuilder('Magento\Framework\Event\Observer') + ->disableOriginalConstructor() + ->setMethods(['getEvent']) + ->getMock(); + + $this->eventObserver->expects($this->atLeastOnce()) + ->method('getEvent') + ->will($this->returnValue($this->event)); + + $this->observer = (new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this))->getObject( + 'Magento\CatalogInventory\Observer\SaveInventoryDataObserver', + [ + 'stockIndex' => $this->stockIndex, + ] + ); + } + + public function testSaveInventoryData() + { + $productId = 4; + $websiteId = 5; + $stockData = null; + $websitesChanged = true; + $statusChanged = true; + + $store = $this->getMock('Magento\Store\Model\Store', ['getWebsiteId'], [], '', false); + $store->expects($this->once())->method('getWebsiteId')->will($this->returnValue($websiteId)); + + $product = $this->getMock( + 'Magento\Catalog\Model\Product', + ['getStockData', 'getIsChangedWebsites', 'dataHasChangedFor', 'getId', 'getStore'], + [], + '', + false + ); + $product->expects($this->once())->method('getStockData')->will($this->returnValue($stockData)); + $product->expects($this->any())->method('getIsChangedWebsites')->will($this->returnValue($websitesChanged)); + $product->expects($this->any())->method('dataHasChangedFor')->will($this->returnValue($statusChanged)); + $product->expects($this->once())->method('getId')->will($this->returnValue($productId)); + $product->expects($this->once())->method('getStore')->will($this->returnValue($store)); + + $this->stockIndex->expects($this->once())->method('rebuild')->will($this->returnValue(true)); + + $this->event->expects($this->once()) + ->method('getProduct') + ->will($this->returnValue($product)); + + $this->observer->invoke($this->eventObserver); + } +} diff --git a/app/code/Magento/CatalogInventory/Test/Unit/Observer/UpdateItemsStockUponConfigChangeObserverTest.php b/app/code/Magento/CatalogInventory/Test/Unit/Observer/UpdateItemsStockUponConfigChangeObserverTest.php new file mode 100644 index 0000000000000..dc4e86e4f9e61 --- /dev/null +++ b/app/code/Magento/CatalogInventory/Test/Unit/Observer/UpdateItemsStockUponConfigChangeObserverTest.php @@ -0,0 +1,71 @@ +resourceStock = $this->getMock('Magento\CatalogInventory\Model\Resource\Stock', [], [], '', false); + + $this->event = $this->getMockBuilder('Magento\Framework\Event') + ->disableOriginalConstructor() + ->setMethods(['getWebsite']) + ->getMock(); + + $this->eventObserver = $this->getMockBuilder('Magento\Framework\Event\Observer') + ->disableOriginalConstructor() + ->setMethods(['getEvent']) + ->getMock(); + + $this->eventObserver->expects($this->atLeastOnce()) + ->method('getEvent') + ->will($this->returnValue($this->event)); + + $this->observer = (new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this))->getObject( + 'Magento\CatalogInventory\Observer\UpdateItemsStockUponConfigChangeObserver', + [ + 'resourceStock' => $this->resourceStock, + ] + ); + } + + public function testUpdateItemsStockUponConfigChange() + { + $websiteId = 1; + $this->resourceStock->expects($this->once())->method('updateSetOutOfStock'); + $this->resourceStock->expects($this->once())->method('updateSetInStock'); + $this->resourceStock->expects($this->once())->method('updateLowStockDate'); + + $this->event->expects($this->once()) + ->method('getWebsite') + ->will($this->returnValue($websiteId)); + + $this->observer->invoke($this->eventObserver); + } +} diff --git a/app/code/Magento/CatalogInventory/etc/adminhtml/events.xml b/app/code/Magento/CatalogInventory/etc/adminhtml/events.xml deleted file mode 100644 index 633a27bf135d7..0000000000000 --- a/app/code/Magento/CatalogInventory/etc/adminhtml/events.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - diff --git a/app/code/Magento/CatalogInventory/etc/di.xml b/app/code/Magento/CatalogInventory/etc/di.xml index b1ad4a03847bb..a57b542a0b12c 100644 --- a/app/code/Magento/CatalogInventory/etc/di.xml +++ b/app/code/Magento/CatalogInventory/etc/di.xml @@ -31,7 +31,7 @@ - + Magento\CatalogInventory\Model\Resource\Stock\Proxy diff --git a/app/code/Magento/CatalogInventory/etc/events.xml b/app/code/Magento/CatalogInventory/etc/events.xml index 434a76a1b7556..c24a4ef390a17 100644 --- a/app/code/Magento/CatalogInventory/etc/events.xml +++ b/app/code/Magento/CatalogInventory/etc/events.xml @@ -7,45 +7,45 @@ --> - + - + - + - + - + - + - + - + - + - + - + - + - + - + diff --git a/app/code/Magento/Quote/Model/Resource/Quote/Item/Collection.php b/app/code/Magento/Quote/Model/Resource/Quote/Item/Collection.php index 56bbda864bc2c..372c2a40314dc 100644 --- a/app/code/Magento/Quote/Model/Resource/Quote/Item/Collection.php +++ b/app/code/Magento/Quote/Model/Resource/Quote/Item/Collection.php @@ -219,7 +219,7 @@ protected function _assignProducts() ); $this->_eventManager->dispatch( 'sales_quote_item_collection_products_after_load', - ['product_collection' => $productCollection] + ['collection' => $productCollection] ); $recollectQuote = false; diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php index 7f7e7428dcb19..d76ff0e774d72 100644 --- a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php +++ b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php @@ -3814,4 +3814,5 @@ ['Magento\Tax\Model\Observer', 'corresponding classes in Magento\Tax\Observer\*'], ['Magento\CacheInvalidate\Model\Observer', 'corresponding classes in Magento\CacheInvalidate\Observer\*'], ['Magento\Catalog\Model\Observer', 'corresponding classes in Magento\Catalog\Observer\*'], + ['Magento\CatalogInventory\Model\Observer'], ]; diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php index 5a51d6d4593f0..92054fcf40ea4 100644 --- a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php +++ b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php @@ -102,7 +102,6 @@ ['_getPathInScope', 'Magento\Core\Model\Config'], ['_getPriceFilter', 'Magento\LayeredNavigation\Block\Navigation'], ['_getProcessor', 'Magento\Framework\App\Cache'], - ['_getProductQtyForCheck', 'Magento\CatalogInventory\Model\Observer'], ['getPublicFileUrl', 'Magento\Framework\View\Url', 'Magento\Framework\Url::getBaseUrl'], ['_getRangeByType', 'Magento\Log\Model\Resource\Visitor\Collection'], ['_getRecentProductsCollection'], @@ -319,7 +318,6 @@ ['countChildren', 'Magento\Core\Block\AbstractBlock'], ['crear'], ['createDirIfNotExists', '', 'mkdir()'], - ['createOrderItem', 'Magento\CatalogInventory\Model\Observer'], ['currency', 'Magento\Core\Helper\Data', 'Magento\Framework\Pricing\Helper\Data::currency'], ['currencyByStore', 'Magento\Core\Helper\Data', 'Magento\Framework\Pricing\Helper\Data::currencyByStore'], ['debugRequest', 'Magento\Paypal\Model\Api\Standard'], @@ -738,7 +736,6 @@ ['loadParentProductIds', 'Magento\Catalog\Model\Product'], ['loadPrices', 'Magento\Catalog\Model\Resource\Product\Type\Configurable\Attribute'], ['loadProductPrices', 'Magento\Catalog\Model\Resource\Product\Attribute\Backend\Tierprice'], - ['lockOrderInventoryData', 'Magento\CatalogInventory\Model\Observer'], ['logEncryptionKeySave'], ['logI' . 'nvitationSave'], [ @@ -786,7 +783,6 @@ ['productEventAggregate'], ['publishRelatedViewFile', 'Magento\Framework\View\Publisher', '_publishRelatedViewFile'], ['push', 'Magento\Catalog\Model\Product\Image'], - ['refundOrderItem', 'Magento\CatalogInventory\Model\Observer'], ['regenerateSessionId', 'Magento\Core\Model\Session\AbstractSession'], ['reinitialize', 'Magento\TestFramework\Bootstrap', 'Magento_TestFramework_Helper_Bootstrap::reinitialize'], ['removeAuthLink', 'Magento\Customer\Block\Account\Link'], @@ -1395,11 +1391,6 @@ '\Magento\Catalog\Helper\Product\Configuration', '\Magento\GroupedProduct\Helper\Product\Configuration\Plugin\Grouped::aroundGetOptions', ], - [ - 'copyInventoryData', - 'Magento\CatalogInventory\Model\Observer', - '\Magento\CatalogInventory\Model\Product\CopyConstructor\CatalogInventory::build', - ], ['getTrackingAjaxUrl', 'Magento\Shipping\Helper\Data'], ['isFreeMethod', 'Magento\Shipping\Helper\Data'], ['_initOrder', 'Magento\Shipping\Controller\Tracking'], @@ -1755,7 +1746,6 @@ ['getRatesForAllProductTaxClasses', 'Magento\Tax\Model\Calculation'], ['getRatesForAllCustomerTaxClasses', 'Magento\Tax\Model\Calculation'], ['getMaxRecipients', 'Magento\Catalog\Block\Product\Send'], - ['prepareCatalogProductIndexSelect', 'Magento\CatalogInventory\Model\Observer'], ['prepareCatalogProductIndexSelect', 'Magento\CatalogInventory\Model\Resource\Stock\Status'], ['prepareCatalogProductIndexSelect', 'Magento\CatalogInventory\Model\Stock\Status'], [ diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_properties.php b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_properties.php index 10bc4fee0abb7..c1d48ebc8af72 100644 --- a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_properties.php +++ b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_properties.php @@ -20,7 +20,6 @@ ['_cacheConf'], ['_cachedItemPriceBlocks'], ['_canUseLocalModules'], - ['_checkedProductsQty', 'Magento\CatalogInventory\Model\Observer'], ['_children', 'Magento\Core\Block\AbstractBlock'], ['_childrenHtmlCache', 'Magento\Core\Block\AbstractBlock'], ['_childGroups', 'Magento\Core\Block\AbstractBlock'], From 12d9dd416e306aed6369789f1a0dd470248d1086 Mon Sep 17 00:00:00 2001 From: Valeriy Nayda Date: Fri, 31 Jul 2015 17:01:21 +0300 Subject: [PATCH 08/13] MAGETWO-31442: Splitting all observers with automated tool -- MAGETWO-40899: Manual split of \Magento\Paypal\Model\Observer --- .../Observer/ItemsForReindex.php | 2 - app/code/Magento/Paypal/Model/Observer.php | 268 --------- .../AddBillingAgreementToSessionObserver.php | 67 +++ .../Observer/AddPaypalShortcutsObserver.php | 87 +++ .../Paypal/Observer/FetchReportsObserver.php | 62 +++ .../Observer/HtmlTransactionIdObserver.php | 46 ++ .../Observer/SaveOrderAfterSubmitObserver.php | 47 ++ .../SetResponseAfterSaveOrderObserver.php | 82 +++ .../Paypal/Test/Unit/Model/ObserverTest.php | 513 ------------------ ...dBillingAgreementToSessionObserverTest.php | 175 ++++++ .../AddPaypalShortcutsObserverTest.php | 152 ++++++ .../HtmlTransactionIdObserverTest.php | 106 ++++ .../SetResponseAfterSaveOrderObserverTest.php | 197 +++++++ app/code/Magento/Paypal/etc/crontab.xml | 2 +- app/code/Magento/Paypal/etc/events.xml | 4 +- .../Magento/Paypal/etc/frontend/events.xml | 6 +- .../Test/Legacy/_files/obsolete_classes.php | 1 + .../Test/Legacy/_files/obsolete_methods.php | 1 - 18 files changed, 1028 insertions(+), 790 deletions(-) delete mode 100644 app/code/Magento/Paypal/Model/Observer.php create mode 100644 app/code/Magento/Paypal/Observer/AddBillingAgreementToSessionObserver.php create mode 100644 app/code/Magento/Paypal/Observer/AddPaypalShortcutsObserver.php create mode 100644 app/code/Magento/Paypal/Observer/FetchReportsObserver.php create mode 100644 app/code/Magento/Paypal/Observer/HtmlTransactionIdObserver.php create mode 100644 app/code/Magento/Paypal/Observer/SaveOrderAfterSubmitObserver.php create mode 100644 app/code/Magento/Paypal/Observer/SetResponseAfterSaveOrderObserver.php delete mode 100644 app/code/Magento/Paypal/Test/Unit/Model/ObserverTest.php create mode 100644 app/code/Magento/Paypal/Test/Unit/Observer/AddBillingAgreementToSessionObserverTest.php create mode 100644 app/code/Magento/Paypal/Test/Unit/Observer/AddPaypalShortcutsObserverTest.php create mode 100644 app/code/Magento/Paypal/Test/Unit/Observer/HtmlTransactionIdObserverTest.php create mode 100644 app/code/Magento/Paypal/Test/Unit/Observer/SetResponseAfterSaveOrderObserverTest.php diff --git a/app/code/Magento/CatalogInventory/Observer/ItemsForReindex.php b/app/code/Magento/CatalogInventory/Observer/ItemsForReindex.php index 00b5c0a53360a..52ad8e4a44432 100644 --- a/app/code/Magento/CatalogInventory/Observer/ItemsForReindex.php +++ b/app/code/Magento/CatalogInventory/Observer/ItemsForReindex.php @@ -6,8 +6,6 @@ namespace Magento\CatalogInventory\Observer; -use Magento\Framework\Event\Observer as EventObserver; - /** * Catalog observer share data */ diff --git a/app/code/Magento/Paypal/Model/Observer.php b/app/code/Magento/Paypal/Model/Observer.php deleted file mode 100644 index 65c0b33f0a8cc..0000000000000 --- a/app/code/Magento/Paypal/Model/Observer.php +++ /dev/null @@ -1,268 +0,0 @@ -_paypalHss = $paypalHss; - $this->_coreRegistry = $coreRegistry; - $this->_logger = $logger; - $this->_settlementFactory = $settlementFactory; - $this->_view = $view; - $this->_agreementFactory = $agreementFactory; - $this->_checkoutSession = $checkoutSession; - $this->_shortcutFactory = $shortcutFactory; - $this->_paypalConfig = $paypalConfig; - $this->paypalData = $paypalData; - } - - /** - * Goes to reports.paypal.com and fetches Settlement reports. - * - * @return void - */ - public function fetchReports() - { - try { - /** @var \Magento\Paypal\Model\Report\Settlement $reports */ - $reports = $this->_settlementFactory->create(); - /* @var $reports \Magento\Paypal\Model\Report\Settlement */ - $credentials = $reports->getSftpCredentials(true); - foreach ($credentials as $config) { - try { - $reports->fetchAndSave(\Magento\Paypal\Model\Report\Settlement::createConnection($config)); - } catch (\Exception $e) { - $this->_logger->critical($e); - } - } - } catch (\Exception $e) { - $this->_logger->critical($e); - } - } - - /** - * Save order into registry to use it in the overloaded controller. - * - * @param EventObserver $observer - * @return $this - */ - public function saveOrderAfterSubmit(EventObserver $observer) - { - /* @var $order \Magento\Sales\Model\Order */ - $order = $observer->getEvent()->getData('order'); - $this->_coreRegistry->register('hss_order', $order, true); - - return $this; - } - - /** - * Set data for response of frontend saveOrder action - * - * @param EventObserver $observer - * @return $this - */ - public function setResponseAfterSaveOrder(EventObserver $observer) - { - /* @var $order \Magento\Sales\Model\Order */ - $order = $this->_coreRegistry->registry('hss_order'); - - if ($order && $order->getId()) { - $payment = $order->getPayment(); - if ($payment && in_array($payment->getMethod(), $this->_paypalHss->getHssMethods())) { - $result = $observer->getData('result')->getData(); - if (empty($result['error'])) { - $this->_view->loadLayout('checkout_onepage_review', true, true, false); - $html = $this->_view->getLayout()->getBlock('paypal.iframe')->toHtml(); - $result['update_section'] = ['name' => 'paypaliframe', 'html' => $html]; - $result['redirect'] = false; - $result['success'] = false; - $observer->getData('result')->setData($result); - } - } - } - - return $this; - } - - /** - * @param EventObserver $observer - * @return void - */ - public function addBillingAgreementToSession(EventObserver $observer) - { - /** @var \Magento\Sales\Model\Order\Payment $orderPayment */ - $orderPayment = $observer->getEvent()->getPayment(); - $agreementCreated = false; - if ($orderPayment->getBillingAgreementData()) { - $order = $orderPayment->getOrder(); - /** @var \Magento\Paypal\Model\Billing\Agreement $agreement */ - $agreement = $this->_agreementFactory->create()->importOrderPayment($orderPayment); - if ($agreement->isValid()) { - $message = __('Created billing agreement #%1.', $agreement->getReferenceId()); - $order->addRelatedObject($agreement); - $this->_checkoutSession->setLastBillingAgreementReferenceId($agreement->getReferenceId()); - $agreementCreated = true; - } else { - $message = __('We can\'t create a billing agreement for this order.'); - } - $comment = $order->addStatusHistoryComment($message); - $order->addRelatedObject($comment); - } - if (!$agreementCreated) { - $this->_checkoutSession->unsLastBillingAgreementReferenceId(); - } - } - - /** - * Add PayPal shortcut buttons - * - * @param EventObserver $observer - * @return void - */ - public function addPaypalShortcuts(EventObserver $observer) - { - /** @var \Magento\Catalog\Block\ShortcutButtons $shortcutButtons */ - $shortcutButtons = $observer->getEvent()->getContainer(); - $blocks = [ - 'Magento\Paypal\Block\Express\ShortcutContainer' => PaypalConfig::METHOD_WPP_EXPRESS, - 'Magento\Paypal\Block\WpsExpress\ShortcutContainer' => PaypalConfig::METHOD_WPS_EXPRESS, - 'Magento\Paypal\Block\Express\Shortcut' => PaypalConfig::METHOD_WPP_EXPRESS, - 'Magento\Paypal\Block\WpsExpress\Shortcut' => PaypalConfig::METHOD_WPS_EXPRESS, - 'Magento\Paypal\Block\PayflowExpress\Shortcut' => PaypalConfig::METHOD_WPP_PE_EXPRESS, - 'Magento\Paypal\Block\PayflowExpress\ShortcutContainer' => PaypalConfig::METHOD_WPP_PE_EXPRESS, - 'Magento\Paypal\Block\Bml\Shortcut' => PaypalConfig::METHOD_WPP_EXPRESS, - 'Magento\Paypal\Block\WpsBml\Shortcut' => PaypalConfig::METHOD_WPS_EXPRESS, - 'Magento\Paypal\Block\Payflow\Bml\Shortcut' => PaypalConfig::METHOD_WPP_PE_EXPRESS - ]; - foreach ($blocks as $blockInstanceName => $paymentMethodCode) { - if (!$this->_paypalConfig->isMethodAvailable($paymentMethodCode)) { - continue; - } - - $params = [ - 'shortcutValidator' => $this->_shortcutFactory->create($observer->getEvent()->getCheckoutSession()), - ]; - if (!in_array('Bml', explode('\\', $blockInstanceName))) { - $params['checkoutSession'] = $observer->getEvent()->getCheckoutSession(); - } - - // we believe it's \Magento\Framework\View\Element\Template - $shortcut = $shortcutButtons->getLayout()->createBlock( - $blockInstanceName, - '', - $params - ); - $shortcut->setIsInCatalogProduct( - $observer->getEvent()->getIsCatalogProduct() - )->setShowOrPosition( - $observer->getEvent()->getOrPosition() - ); - $shortcutButtons->addShortcut($shortcut); - } - } - - /** - * Update transaction with HTML representation of txn_id - * - * @param EventObserver $observer - * @return void - */ - public function observeHtmlTransactionId(EventObserver $observer) - { - /** @var \Magento\Sales\Model\Order\Payment\Transaction $transaction */ - $transaction = $observer->getDataObject(); - $order = $transaction->getOrder(); - $payment = $order->getPayment(); - $methodInstance = $payment->getMethodInstance(); - $paymentCode = $methodInstance->getCode(); - $transactionLink = $this->paypalData->getHtmlTransactionId($paymentCode, $transaction->getTxnId()); - $transaction->setData('html_txn_id', $transactionLink); - } -} diff --git a/app/code/Magento/Paypal/Observer/AddBillingAgreementToSessionObserver.php b/app/code/Magento/Paypal/Observer/AddBillingAgreementToSessionObserver.php new file mode 100644 index 0000000000000..d3a129442298f --- /dev/null +++ b/app/code/Magento/Paypal/Observer/AddBillingAgreementToSessionObserver.php @@ -0,0 +1,67 @@ +agreementFactory = $agreementFactory; + $this->checkoutSession = $checkoutSession; + } + + /** + * @param EventObserver $observer + * @return void + */ + public function invoke(EventObserver $observer) + { + /** @var \Magento\Sales\Model\Order\Payment $orderPayment */ + $orderPayment = $observer->getEvent()->getPayment(); + $agreementCreated = false; + if ($orderPayment->getBillingAgreementData()) { + $order = $orderPayment->getOrder(); + /** @var \Magento\Paypal\Model\Billing\Agreement $agreement */ + $agreement = $this->agreementFactory->create()->importOrderPayment($orderPayment); + if ($agreement->isValid()) { + $message = __('Created billing agreement #%1.', $agreement->getReferenceId()); + $order->addRelatedObject($agreement); + $this->checkoutSession->setLastBillingAgreementReferenceId($agreement->getReferenceId()); + $agreementCreated = true; + } else { + $message = __('We can\'t create a billing agreement for this order.'); + } + $comment = $order->addStatusHistoryComment($message); + $order->addRelatedObject($comment); + } + if (!$agreementCreated) { + $this->checkoutSession->unsLastBillingAgreementReferenceId(); + } + } +} diff --git a/app/code/Magento/Paypal/Observer/AddPaypalShortcutsObserver.php b/app/code/Magento/Paypal/Observer/AddPaypalShortcutsObserver.php new file mode 100644 index 0000000000000..d3011c28dbc39 --- /dev/null +++ b/app/code/Magento/Paypal/Observer/AddPaypalShortcutsObserver.php @@ -0,0 +1,87 @@ +shortcutFactory = $shortcutFactory; + $this->paypalConfig = $paypalConfig; + } + + /** + * Add PayPal shortcut buttons + * + * @param EventObserver $observer + * @return void + */ + public function invoke(EventObserver $observer) + { + /** @var \Magento\Catalog\Block\ShortcutButtons $shortcutButtons */ + $shortcutButtons = $observer->getEvent()->getContainer(); + $blocks = [ + 'Magento\Paypal\Block\Express\ShortcutContainer' => PaypalConfig::METHOD_WPP_EXPRESS, + 'Magento\Paypal\Block\WpsExpress\ShortcutContainer' => PaypalConfig::METHOD_WPS_EXPRESS, + 'Magento\Paypal\Block\Express\Shortcut' => PaypalConfig::METHOD_WPP_EXPRESS, + 'Magento\Paypal\Block\WpsExpress\Shortcut' => PaypalConfig::METHOD_WPS_EXPRESS, + 'Magento\Paypal\Block\PayflowExpress\Shortcut' => PaypalConfig::METHOD_WPP_PE_EXPRESS, + 'Magento\Paypal\Block\PayflowExpress\ShortcutContainer' => PaypalConfig::METHOD_WPP_PE_EXPRESS, + 'Magento\Paypal\Block\Bml\Shortcut' => PaypalConfig::METHOD_WPP_EXPRESS, + 'Magento\Paypal\Block\WpsBml\Shortcut' => PaypalConfig::METHOD_WPS_EXPRESS, + 'Magento\Paypal\Block\Payflow\Bml\Shortcut' => PaypalConfig::METHOD_WPP_PE_EXPRESS + ]; + foreach ($blocks as $blockInstanceName => $paymentMethodCode) { + if (!$this->paypalConfig->isMethodAvailable($paymentMethodCode)) { + continue; + } + + $params = [ + 'shortcutValidator' => $this->shortcutFactory->create($observer->getEvent()->getCheckoutSession()), + ]; + if (!in_array('Bml', explode('\\', $blockInstanceName))) { + $params['checkoutSession'] = $observer->getEvent()->getCheckoutSession(); + } + + // we believe it's \Magento\Framework\View\Element\Template + $shortcut = $shortcutButtons->getLayout()->createBlock( + $blockInstanceName, + '', + $params + ); + $shortcut->setIsInCatalogProduct( + $observer->getEvent()->getIsCatalogProduct() + )->setShowOrPosition( + $observer->getEvent()->getOrPosition() + ); + $shortcutButtons->addShortcut($shortcut); + } + } +} diff --git a/app/code/Magento/Paypal/Observer/FetchReportsObserver.php b/app/code/Magento/Paypal/Observer/FetchReportsObserver.php new file mode 100644 index 0000000000000..2bc3508ce9b0f --- /dev/null +++ b/app/code/Magento/Paypal/Observer/FetchReportsObserver.php @@ -0,0 +1,62 @@ +_logger = $logger; + $this->_settlementFactory = $settlementFactory; + } + + /** + * Goes to reports.paypal.com and fetches Settlement reports. + * + * @return void + */ + public function invoke() + { + try { + /** @var \Magento\Paypal\Model\Report\Settlement $reports */ + $reports = $this->_settlementFactory->create(); + /* @var $reports \Magento\Paypal\Model\Report\Settlement */ + $credentials = $reports->getSftpCredentials(true); + foreach ($credentials as $config) { + try { + $reports->fetchAndSave(\Magento\Paypal\Model\Report\Settlement::createConnection($config)); + } catch (\Exception $e) { + $this->_logger->critical($e); + } + } + } catch (\Exception $e) { + $this->_logger->critical($e); + } + } +} diff --git a/app/code/Magento/Paypal/Observer/HtmlTransactionIdObserver.php b/app/code/Magento/Paypal/Observer/HtmlTransactionIdObserver.php new file mode 100644 index 0000000000000..90c61bc65db6e --- /dev/null +++ b/app/code/Magento/Paypal/Observer/HtmlTransactionIdObserver.php @@ -0,0 +1,46 @@ +paypalData = $paypalData; + } + + /** + * Update transaction with HTML representation of txn_id + * + * @param EventObserver $observer + * @return void + */ + public function invoke(EventObserver $observer) + { + /** @var \Magento\Sales\Model\Order\Payment\Transaction $transaction */ + $transaction = $observer->getDataObject(); + $order = $transaction->getOrder(); + $payment = $order->getPayment(); + $methodInstance = $payment->getMethodInstance(); + $paymentCode = $methodInstance->getCode(); + $transactionLink = $this->paypalData->getHtmlTransactionId($paymentCode, $transaction->getTxnId()); + $transaction->setData('html_txn_id', $transactionLink); + } +} diff --git a/app/code/Magento/Paypal/Observer/SaveOrderAfterSubmitObserver.php b/app/code/Magento/Paypal/Observer/SaveOrderAfterSubmitObserver.php new file mode 100644 index 0000000000000..e633a1f070bce --- /dev/null +++ b/app/code/Magento/Paypal/Observer/SaveOrderAfterSubmitObserver.php @@ -0,0 +1,47 @@ +_coreRegistry = $coreRegistry; + } + + /** + * Save order into registry to use it in the overloaded controller. + * + * @param EventObserver $observer + * @return $this + */ + public function invoke(EventObserver $observer) + { + /* @var $order \Magento\Sales\Model\Order */ + $order = $observer->getEvent()->getData('order'); + $this->_coreRegistry->register('hss_order', $order, true); + + return $this; + } +} diff --git a/app/code/Magento/Paypal/Observer/SetResponseAfterSaveOrderObserver.php b/app/code/Magento/Paypal/Observer/SetResponseAfterSaveOrderObserver.php new file mode 100644 index 0000000000000..c0b05c334730e --- /dev/null +++ b/app/code/Magento/Paypal/Observer/SetResponseAfterSaveOrderObserver.php @@ -0,0 +1,82 @@ +_paypalHss = $paypalHss; + $this->_coreRegistry = $coreRegistry; + $this->_view = $view; + } + + /** + * Set data for response of frontend saveOrder action + * + * @param EventObserver $observer + * @return void + */ + public function invoke(EventObserver $observer) + { + /* @var $order \Magento\Sales\Model\Order */ + $order = $this->_coreRegistry->registry('hss_order'); + + if ($order && $order->getId()) { + $payment = $order->getPayment(); + if ($payment && in_array($payment->getMethod(), $this->_paypalHss->getHssMethods())) { + $result = $observer->getData('result')->getData(); + if (empty($result['error'])) { + $this->_view->loadLayout('checkout_onepage_review', true, true, false); + $html = $this->_view->getLayout()->getBlock('paypal.iframe')->toHtml(); + $result['update_section'] = ['name' => 'paypaliframe', 'html' => $html]; + $result['redirect'] = false; + $result['success'] = false; + $observer->getData('result')->setData($result); + } + } + } + } +} diff --git a/app/code/Magento/Paypal/Test/Unit/Model/ObserverTest.php b/app/code/Magento/Paypal/Test/Unit/Model/ObserverTest.php deleted file mode 100644 index 9702381ded835..0000000000000 --- a/app/code/Magento/Paypal/Test/Unit/Model/ObserverTest.php +++ /dev/null @@ -1,513 +0,0 @@ -_event = new \Magento\Framework\Object(); - - $this->_observer = new \Magento\Framework\Event\Observer(); - $this->_observer->setEvent($this->_event); - - $this->_authorization = $this->getMockForAbstractClass('Magento\Framework\AuthorizationInterface'); - $this->_agreementFactory = $this->getMock( - 'Magento\Paypal\Model\Billing\AgreementFactory', - ['create'], - [], - '', - false - ); - $this->_checkoutSession = $this->getMock('Magento\Checkout\Model\Session', [], [], '', false); - $this->coreRegistryMock = $this->getMock( - 'Magento\Framework\Registry', - [], - [], - '', - false - ); - $this->paypalHssMock = $this->getMock( - 'Magento\Paypal\Helper\Hss', - ['getHssMethods'], - [], - '', - false - ); - $this->paypalDataMock = $this->getMock( - '\Magento\Paypal\Helper\Data', - ['getHtmlTransactionId'], - [], - '', - false - ); - $this->viewMock = $this->getMockForAbstractClass( - 'Magento\Framework\App\ViewInterface', - [], - '', - false, - true, - true, - [] - ); - $this->paypalConfigMock = $this->getMock( - 'Magento\Paypal\Model\Config', - [], - [], - '', - false - ); - $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); - $this->_model = $objectManagerHelper->getObject( - 'Magento\Paypal\Model\Observer', - [ - 'authorization' => $this->_authorization, - 'agreementFactory' => $this->_agreementFactory, - 'checkoutSession' => $this->_checkoutSession, - 'coreRegistry' => $this->coreRegistryMock, - 'paypalHss' => $this->paypalHssMock, - 'view' => $this->viewMock, - 'paypalConfig' => $this->paypalConfigMock, - 'paypalData' => $this->paypalDataMock - ] - ); - } - - /** - * Get data for test testSetResponseAfterSaveOrderSuccess - * - * @return array - */ - protected function getSetResponseAfterSaveOrderTestData() - { - $iFrameHtml = 'iframe-html'; - $paymentMethod = 'method-2'; - - return [ - 'order.getId' => 10, - 'payment.getMethod' => $paymentMethod, - 'paypalHss.getHssMethods' => [ - 'method-1', - $paymentMethod, - 'method-3' - ], - 'result.getData' => [ - 'error' => false - ], - 'block.toHtml' => $iFrameHtml, - 'result.setData' => [ - 'error' => false, - 'update_section' => [ - 'name' => 'paypaliframe', - 'html' => $iFrameHtml - ], - 'redirect' => false, - 'success' => false, - ] - ]; - } - - /** - * Run setResponseAfterSaveOrder method test - * - * @return void - */ - public function testSetResponseAfterSaveOrderSuccess() - { - $testData = $this->getSetResponseAfterSaveOrderTestData(); - - $observerMock = $this->getMockBuilder('Magento\Framework\Event\Observer') - ->disableOriginalConstructor() - ->getMock(); - $orderMock = $this->getMockBuilder('Magento\Sales\Model\Order') - ->disableOriginalConstructor() - ->getMock(); - $paymentMock = $this->getMockBuilder('Magento\Sales\Model\Order\Payment') - ->disableOriginalConstructor() - ->getMock(); - $resultMock = $this->getMockBuilder('Magento\Framework\Object') - ->disableOriginalConstructor() - ->getMock(); - $layoutMock = $this->getMockBuilder('Magento\Framework\View\LayoutInterface') - ->disableOriginalConstructor() - ->getMockForAbstractClass(); - $blockMock = $this->getMockBuilder('Magento\Framework\View\Element\BlockInterface') - ->disableOriginalConstructor() - ->getMockForAbstractClass(); - - $this->coreRegistryMock->expects($this->once()) - ->method('registry') - ->with('hss_order') - ->willReturn($orderMock); - - $orderMock->expects($this->once()) - ->method('getId') - ->willReturn($testData['order.getId']); - $orderMock->expects($this->once()) - ->method('getPayment') - ->willReturn($paymentMock); - - $paymentMock->expects($this->once()) - ->method('getMethod') - ->willReturn($testData['payment.getMethod']); - - $this->paypalHssMock->expects($this->once()) - ->method('getHssMethods') - ->willReturn($testData['paypalHss.getHssMethods']); - - $observerMock->expects($this->atLeastOnce()) - ->method('getData') - ->with('result') - ->willReturn($resultMock); - - $resultMock->expects($this->once()) - ->method('getData') - ->willReturn($testData['result.getData']); - - $this->viewMock->expects($this->once()) - ->method('loadLayout') - ->with('checkout_onepage_review', true, true, false); - $this->viewMock->expects($this->once()) - ->method('getLayout') - ->willReturn($layoutMock); - - $layoutMock->expects($this->once()) - ->method('getBlock') - ->with('paypal.iframe') - ->willReturn($blockMock); - - $blockMock->expects($this->once()) - ->method('toHtml') - ->willReturn($testData['block.toHtml']); - - $resultMock->expects($this->once()) - ->method('setData') - ->with($testData['result.setData']); - - $this->_model->setResponseAfterSaveOrder($observerMock); - } - - /** - * @param array $paymentMethodsAvailability - * @param array $blocks - * @dataProvider addAvailabilityOfMethodsDataProvider - */ - public function testAddPaypalShortcuts($paymentMethodsAvailability, $blocks) - { - $this->paypalConfigMock->expects($this->any()) - ->method('isMethodAvailable') - ->will($this->returnValueMap($paymentMethodsAvailability)); - - $layoutMock = $this->getMockBuilder( - 'Magento\Framework\View\Layout' - )->setMethods( - ['createBlock'] - )->disableOriginalConstructor()->getMock(); - - $shortcutButtonsMock = $this->getMockBuilder( - 'Magento\Catalog\Block\ShortcutButtons' - )->setMethods( - ['getLayout', 'addShortcut'] - )->disableOriginalConstructor()->getMock(); - - $blockInstances = []; - $atPosition = 0; - foreach ($blocks as $blockName => $blockInstance) { - if ($this->paypalConfigMock->isMethodAvailable($blockInstance[1])) { - $block = $this->getMockBuilder($blockInstance[0]) - ->setMethods(null) - ->disableOriginalConstructor() - ->getMock(); - $blockInstances[$blockName] = $block; - $layoutMock->expects(new MethodInvokedAtIndex($atPosition))->method('createBlock')->with($blockName) - ->will($this->returnValue($block)); - $atPosition++; - } - } - $shortcutButtonsMock->expects($this->any())->method('getLayout')->will($this->returnValue($layoutMock)); - $atPosition = 0; - foreach ($blocks as $blockName => $blockInstance) { - if ($this->paypalConfigMock->isMethodAvailable($blockInstance[1])) { - $shortcutButtonsMock->expects(new MethodInvokedAtIndex($atPosition))->method('addShortcut') - ->with($this->identicalTo($blockInstances[$blockName])); - $atPosition++; - } - } - $this->_event->setContainer($shortcutButtonsMock); - $this->_model->addPaypalShortcuts($this->_observer); - } - - public function testAddBillingAgreementToSessionNoData() - { - $payment = $this->getMock('Magento\Sales\Model\Order\Payment', [], [], '', false); - $payment->expects( - $this->once() - )->method( - '__call' - )->with( - 'getBillingAgreementData' - )->will( - $this->returnValue(null) - ); - $this->_event->setPayment($payment); - $this->_agreementFactory->expects($this->never())->method('create'); - $this->_checkoutSession->expects($this->once())->method('__call')->with('unsLastBillingAgreementReferenceId'); - $this->_model->addBillingAgreementToSession($this->_observer); - } - - /** - * @param bool $isValid - * @dataProvider addBillingAgreementToSessionDataProvider - */ - public function testAddBillingAgreementToSession($isValid) - { - $agreement = $this->getMock('Magento\Paypal\Model\Billing\Agreement', [], [], '', false); - $agreement->expects($this->once())->method('isValid')->will($this->returnValue($isValid)); - $comment = $this->getMockForAbstractClass( - 'Magento\Framework\Model\AbstractModel', - [], - '', - false, - true, - true, - ['__wakeup'] - ); - $order = $this->getMock('Magento\Sales\Model\Order', [], [], '', false); - $order->expects( - $this->once() - )->method( - 'addStatusHistoryComment' - )->with( - $isValid ? __( - 'Created billing agreement #%1.', - 'agreement reference id' - ) : __( - 'We can\'t create a billing agreement for this order.' - ) - )->will( - $this->returnValue($comment) - ); - if ($isValid) { - $agreement->expects( - $this->any() - )->method( - '__call' - )->with( - 'getReferenceId' - )->will( - $this->returnValue('agreement reference id') - ); - $order->expects(new MethodInvokedAtIndex(0))->method('addRelatedObject')->with($agreement); - $this->_checkoutSession->expects( - $this->once() - )->method( - '__call' - )->with( - 'setLastBillingAgreementReferenceId', - ['agreement reference id'] - ); - } else { - $this->_checkoutSession->expects( - $this->once() - )->method( - '__call' - )->with( - 'unsLastBillingAgreementReferenceId' - ); - $agreement->expects($this->never())->method('__call'); - } - $order->expects(new MethodInvokedAtIndex($isValid ? 1 : 0))->method('addRelatedObject')->with($comment); - - $payment = $this->getMock('Magento\Sales\Model\Order\Payment', [], [], '', false); - $payment->expects( - $this->once() - )->method( - '__call' - )->with( - 'getBillingAgreementData' - )->will( - $this->returnValue('not empty') - ); - $payment->expects($this->once())->method('getOrder')->will($this->returnValue($order)); - $agreement->expects( - $this->once() - )->method( - 'importOrderPayment' - )->with( - $payment - )->will( - $this->returnValue($agreement) - ); - $this->_event->setPayment($payment); - $this->_agreementFactory->expects($this->once())->method('create')->will($this->returnValue($agreement)); - $this->_model->addBillingAgreementToSession($this->_observer); - } - - public function addBillingAgreementToSessionDataProvider() - { - return [[true], [false]]; - } - - public function testObserveHtmlTransactionId() - { - $observerMock = $this->getMockBuilder('Magento\Framework\Event\Observer') - ->setMethods(['getDataObject']) - ->disableOriginalConstructor() - ->getMock(); - $transactionMock = $this->getMockBuilder('\Magento\Sales\Model\Order\Payment\Transaction') - ->setMethods(['getOrder', 'getTxnId', 'setData']) - ->disableOriginalConstructor() - ->getMock(); - $orderMock = $this->getMockBuilder('\Magento\Sales\Model\Order') - ->setMethods(['getPayment']) - ->disableOriginalConstructor() - ->getMock(); - $paymentMock = $this->getMockBuilder('\Magento\Sales\Model\Order\Payment') - ->setMethods(['getMethodInstance']) - ->disableOriginalConstructor() - ->getMock(); - $methodInstanceMock = $this->getMockBuilder('\Magento\Payment\Model\MethodInterface') - ->setMethods(['getCode']) - ->getMockForAbstractClass(); - - - $observerMock->expects($this->once()) - ->method('getDataObject') - ->willReturn($transactionMock); - $transactionMock->expects($this->once()) - ->method('getOrder') - ->willReturn($orderMock); - $orderMock->expects($this->once()) - ->method('getPayment') - ->willReturn($paymentMock); - $paymentMock->expects($this->once()) - ->method('getMethodInstance') - ->willReturn($methodInstanceMock); - $methodInstanceMock->expects($this->once()) - ->method('getCode') - ->willReturn("'test'"); - $transactionMock->expects($this->once()) - ->method('getTxnId') - ->willReturn("'test'"); - - $this->paypalDataMock->expects($this->once()) - ->method('getHtmlTransactionId') - ->willReturn('test'); - - $transactionMock->expects($this->once()) - ->method('setData')->with('html_txn_id', 'test'); - - - $this->_model->observeHtmlTransactionId($observerMock); - } - - public function addAvailabilityOfMethodsDataProvider() - { - $blocks = [ - 'Magento\Paypal\Block\Express\ShortcutContainer' => - ['Magento\Paypal\Block\Express\Shortcut', \Magento\Paypal\Model\Config::METHOD_WPP_EXPRESS], - 'Magento\Paypal\Block\Express\Shortcut' => - ['Magento\Paypal\Block\Express\Shortcut', \Magento\Paypal\Model\Config::METHOD_WPP_EXPRESS], - 'Magento\Paypal\Block\PayflowExpress\Shortcut' => - ['Magento\Paypal\Block\Express\Shortcut', \Magento\Paypal\Model\Config::METHOD_WPP_PE_EXPRESS], - 'Magento\Paypal\Block\PayflowExpress\ShortcutContainer' => - ['Magento\Paypal\Block\Express\Shortcut', \Magento\Paypal\Model\Config::METHOD_WPP_PE_EXPRESS], - 'Magento\Paypal\Block\Bml\Shortcut' => - ['Magento\Paypal\Block\Bml\Shortcut', \Magento\Paypal\Model\Config::METHOD_WPP_EXPRESS], - 'Magento\Paypal\Block\Payflow\Bml\Shortcut' => - ['Magento\Paypal\Block\Bml\Shortcut', \Magento\Paypal\Model\Config::METHOD_WPP_PE_EXPRESS], - ]; - - $allMethodsAvailable = [ - [\Magento\Paypal\Model\Config::METHOD_WPP_EXPRESS, true], - [\Magento\Paypal\Model\Config::METHOD_WPP_PE_EXPRESS, true] - ]; - - $allMethodsNotAvailable = [ - [\Magento\Paypal\Model\Config::METHOD_WPP_EXPRESS, false], - [\Magento\Paypal\Model\Config::METHOD_WPP_PE_EXPRESS, false] - ]; - - $firstMethodAvailable = [ - [\Magento\Paypal\Model\Config::METHOD_WPP_EXPRESS, true], - [\Magento\Paypal\Model\Config::METHOD_WPP_PE_EXPRESS, false] - ]; - - $secondMethodAvailable = [ - [\Magento\Paypal\Model\Config::METHOD_WPP_EXPRESS, false], - [\Magento\Paypal\Model\Config::METHOD_WPP_PE_EXPRESS, true] - ]; - - return [ - [$allMethodsAvailable, $blocks], - [$allMethodsNotAvailable, $blocks], - [$firstMethodAvailable, $blocks], - [$secondMethodAvailable, $blocks] - ]; - } -} diff --git a/app/code/Magento/Paypal/Test/Unit/Observer/AddBillingAgreementToSessionObserverTest.php b/app/code/Magento/Paypal/Test/Unit/Observer/AddBillingAgreementToSessionObserverTest.php new file mode 100644 index 0000000000000..9d2346fdf1f89 --- /dev/null +++ b/app/code/Magento/Paypal/Test/Unit/Observer/AddBillingAgreementToSessionObserverTest.php @@ -0,0 +1,175 @@ +_event = new \Magento\Framework\Object(); + + $this->_observer = new \Magento\Framework\Event\Observer(); + $this->_observer->setEvent($this->_event); + + $this->_agreementFactory = $this->getMock( + 'Magento\Paypal\Model\Billing\AgreementFactory', + ['create'], + [], + '', + false + ); + $this->_checkoutSession = $this->getMock('Magento\Checkout\Model\Session', [], [], '', false); + $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + $this->_model = $objectManagerHelper->getObject( + 'Magento\Paypal\Observer\AddBillingAgreementToSessionObserver', + [ + 'agreementFactory' => $this->_agreementFactory, + 'checkoutSession' => $this->_checkoutSession, + ] + ); + } + + public function testAddBillingAgreementToSessionNoData() + { + $payment = $this->getMock('Magento\Sales\Model\Order\Payment', [], [], '', false); + $payment->expects( + $this->once() + )->method( + '__call' + )->with( + 'getBillingAgreementData' + )->will( + $this->returnValue(null) + ); + $this->_event->setPayment($payment); + $this->_agreementFactory->expects($this->never())->method('create'); + $this->_checkoutSession->expects($this->once())->method('__call')->with('unsLastBillingAgreementReferenceId'); + $this->_model->invoke($this->_observer); + } + + /** + * @param bool $isValid + * @dataProvider addBillingAgreementToSessionDataProvider + */ + public function testAddBillingAgreementToSession($isValid) + { + $agreement = $this->getMock('Magento\Paypal\Model\Billing\Agreement', [], [], '', false); + $agreement->expects($this->once())->method('isValid')->will($this->returnValue($isValid)); + $comment = $this->getMockForAbstractClass( + 'Magento\Framework\Model\AbstractModel', + [], + '', + false, + true, + true, + ['__wakeup'] + ); + $order = $this->getMock('Magento\Sales\Model\Order', [], [], '', false); + $order->expects( + $this->once() + )->method( + 'addStatusHistoryComment' + )->with( + $isValid ? __( + 'Created billing agreement #%1.', + 'agreement reference id' + ) : __( + 'We can\'t create a billing agreement for this order.' + ) + )->will( + $this->returnValue($comment) + ); + if ($isValid) { + $agreement->expects( + $this->any() + )->method( + '__call' + )->with( + 'getReferenceId' + )->will( + $this->returnValue('agreement reference id') + ); + $order->expects(new MethodInvokedAtIndex(0))->method('addRelatedObject')->with($agreement); + $this->_checkoutSession->expects( + $this->once() + )->method( + '__call' + )->with( + 'setLastBillingAgreementReferenceId', + ['agreement reference id'] + ); + } else { + $this->_checkoutSession->expects( + $this->once() + )->method( + '__call' + )->with( + 'unsLastBillingAgreementReferenceId' + ); + $agreement->expects($this->never())->method('__call'); + } + $order->expects(new MethodInvokedAtIndex($isValid ? 1 : 0))->method('addRelatedObject')->with($comment); + + $payment = $this->getMock('Magento\Sales\Model\Order\Payment', [], [], '', false); + $payment->expects( + $this->once() + )->method( + '__call' + )->with( + 'getBillingAgreementData' + )->will( + $this->returnValue('not empty') + ); + $payment->expects($this->once())->method('getOrder')->will($this->returnValue($order)); + $agreement->expects( + $this->once() + )->method( + 'importOrderPayment' + )->with( + $payment + )->will( + $this->returnValue($agreement) + ); + $this->_event->setPayment($payment); + $this->_agreementFactory->expects($this->once())->method('create')->will($this->returnValue($agreement)); + $this->_model->invoke($this->_observer); + } + + public function addBillingAgreementToSessionDataProvider() + { + return [[true], [false]]; + } +} diff --git a/app/code/Magento/Paypal/Test/Unit/Observer/AddPaypalShortcutsObserverTest.php b/app/code/Magento/Paypal/Test/Unit/Observer/AddPaypalShortcutsObserverTest.php new file mode 100644 index 0000000000000..0b7dbe369a835 --- /dev/null +++ b/app/code/Magento/Paypal/Test/Unit/Observer/AddPaypalShortcutsObserverTest.php @@ -0,0 +1,152 @@ +_event = new \Magento\Framework\Object(); + + $this->_observer = new \Magento\Framework\Event\Observer(); + $this->_observer->setEvent($this->_event); + + $this->paypalConfigMock = $this->getMock( + 'Magento\Paypal\Model\Config', + [], + [], + '', + false + ); + $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + $this->_model = $objectManagerHelper->getObject( + 'Magento\Paypal\Observer\AddPaypalShortcutsObserver', + [ + 'paypalConfig' => $this->paypalConfigMock, + ] + ); + } + + /** + * @param array $paymentMethodsAvailability + * @param array $blocks + * @dataProvider addAvailabilityOfMethodsDataProvider + */ + public function testAddPaypalShortcuts($paymentMethodsAvailability, $blocks) + { + $this->paypalConfigMock->expects($this->any()) + ->method('isMethodAvailable') + ->will($this->returnValueMap($paymentMethodsAvailability)); + + $layoutMock = $this->getMockBuilder( + 'Magento\Framework\View\Layout' + )->setMethods( + ['createBlock'] + )->disableOriginalConstructor()->getMock(); + + $shortcutButtonsMock = $this->getMockBuilder( + 'Magento\Catalog\Block\ShortcutButtons' + )->setMethods( + ['getLayout', 'addShortcut'] + )->disableOriginalConstructor()->getMock(); + + $blockInstances = []; + $atPosition = 0; + foreach ($blocks as $blockName => $blockInstance) { + if ($this->paypalConfigMock->isMethodAvailable($blockInstance[1])) { + $block = $this->getMockBuilder($blockInstance[0]) + ->setMethods(null) + ->disableOriginalConstructor() + ->getMock(); + $blockInstances[$blockName] = $block; + $layoutMock->expects(new MethodInvokedAtIndex($atPosition))->method('createBlock')->with($blockName) + ->will($this->returnValue($block)); + $atPosition++; + } + } + $shortcutButtonsMock->expects($this->any())->method('getLayout')->will($this->returnValue($layoutMock)); + $atPosition = 0; + foreach ($blocks as $blockName => $blockInstance) { + if ($this->paypalConfigMock->isMethodAvailable($blockInstance[1])) { + $shortcutButtonsMock->expects(new MethodInvokedAtIndex($atPosition))->method('addShortcut') + ->with($this->identicalTo($blockInstances[$blockName])); + $atPosition++; + } + } + $this->_event->setContainer($shortcutButtonsMock); + $this->_model->invoke($this->_observer); + } + + public function addAvailabilityOfMethodsDataProvider() + { + $blocks = [ + 'Magento\Paypal\Block\Express\ShortcutContainer' => + ['Magento\Paypal\Block\Express\Shortcut', \Magento\Paypal\Model\Config::METHOD_WPP_EXPRESS], + 'Magento\Paypal\Block\Express\Shortcut' => + ['Magento\Paypal\Block\Express\Shortcut', \Magento\Paypal\Model\Config::METHOD_WPP_EXPRESS], + 'Magento\Paypal\Block\PayflowExpress\Shortcut' => + ['Magento\Paypal\Block\Express\Shortcut', \Magento\Paypal\Model\Config::METHOD_WPP_PE_EXPRESS], + 'Magento\Paypal\Block\PayflowExpress\ShortcutContainer' => + ['Magento\Paypal\Block\Express\Shortcut', \Magento\Paypal\Model\Config::METHOD_WPP_PE_EXPRESS], + 'Magento\Paypal\Block\Bml\Shortcut' => + ['Magento\Paypal\Block\Bml\Shortcut', \Magento\Paypal\Model\Config::METHOD_WPP_EXPRESS], + 'Magento\Paypal\Block\Payflow\Bml\Shortcut' => + ['Magento\Paypal\Block\Bml\Shortcut', \Magento\Paypal\Model\Config::METHOD_WPP_PE_EXPRESS], + ]; + + $allMethodsAvailable = [ + [\Magento\Paypal\Model\Config::METHOD_WPP_EXPRESS, true], + [\Magento\Paypal\Model\Config::METHOD_WPP_PE_EXPRESS, true] + ]; + + $allMethodsNotAvailable = [ + [\Magento\Paypal\Model\Config::METHOD_WPP_EXPRESS, false], + [\Magento\Paypal\Model\Config::METHOD_WPP_PE_EXPRESS, false] + ]; + + $firstMethodAvailable = [ + [\Magento\Paypal\Model\Config::METHOD_WPP_EXPRESS, true], + [\Magento\Paypal\Model\Config::METHOD_WPP_PE_EXPRESS, false] + ]; + + $secondMethodAvailable = [ + [\Magento\Paypal\Model\Config::METHOD_WPP_EXPRESS, false], + [\Magento\Paypal\Model\Config::METHOD_WPP_PE_EXPRESS, true] + ]; + + return [ + [$allMethodsAvailable, $blocks], + [$allMethodsNotAvailable, $blocks], + [$firstMethodAvailable, $blocks], + [$secondMethodAvailable, $blocks] + ]; + } +} diff --git a/app/code/Magento/Paypal/Test/Unit/Observer/HtmlTransactionIdObserverTest.php b/app/code/Magento/Paypal/Test/Unit/Observer/HtmlTransactionIdObserverTest.php new file mode 100644 index 0000000000000..4f60635c42bb6 --- /dev/null +++ b/app/code/Magento/Paypal/Test/Unit/Observer/HtmlTransactionIdObserverTest.php @@ -0,0 +1,106 @@ +_event = new \Magento\Framework\Object(); + + $this->_observer = new \Magento\Framework\Event\Observer(); + $this->_observer->setEvent($this->_event); + + $this->paypalDataMock = $this->getMock( + '\Magento\Paypal\Helper\Data', + ['getHtmlTransactionId'], + [], + '', + false + ); + $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + $this->_model = $objectManagerHelper->getObject( + 'Magento\Paypal\Observer\HtmlTransactionIdObserver', + [ + 'paypalData' => $this->paypalDataMock, + ] + ); + } + + public function testObserveHtmlTransactionId() + { + $observerMock = $this->getMockBuilder('Magento\Framework\Event\Observer') + ->setMethods(['getDataObject']) + ->disableOriginalConstructor() + ->getMock(); + $transactionMock = $this->getMockBuilder('\Magento\Sales\Model\Order\Payment\Transaction') + ->setMethods(['getOrder', 'getTxnId', 'setData']) + ->disableOriginalConstructor() + ->getMock(); + $orderMock = $this->getMockBuilder('\Magento\Sales\Model\Order') + ->setMethods(['getPayment']) + ->disableOriginalConstructor() + ->getMock(); + $paymentMock = $this->getMockBuilder('\Magento\Sales\Model\Order\Payment') + ->setMethods(['getMethodInstance']) + ->disableOriginalConstructor() + ->getMock(); + $methodInstanceMock = $this->getMockBuilder('\Magento\Payment\Model\MethodInterface') + ->setMethods(['getCode']) + ->getMockForAbstractClass(); + + $observerMock->expects($this->once()) + ->method('getDataObject') + ->willReturn($transactionMock); + $transactionMock->expects($this->once()) + ->method('getOrder') + ->willReturn($orderMock); + $orderMock->expects($this->once()) + ->method('getPayment') + ->willReturn($paymentMock); + $paymentMock->expects($this->once()) + ->method('getMethodInstance') + ->willReturn($methodInstanceMock); + $methodInstanceMock->expects($this->once()) + ->method('getCode') + ->willReturn("'test'"); + $transactionMock->expects($this->once()) + ->method('getTxnId') + ->willReturn("'test'"); + + $this->paypalDataMock->expects($this->once()) + ->method('getHtmlTransactionId') + ->willReturn('test'); + + $transactionMock->expects($this->once()) + ->method('setData')->with('html_txn_id', 'test'); + + $this->_model->invoke($observerMock); + } +} diff --git a/app/code/Magento/Paypal/Test/Unit/Observer/SetResponseAfterSaveOrderObserverTest.php b/app/code/Magento/Paypal/Test/Unit/Observer/SetResponseAfterSaveOrderObserverTest.php new file mode 100644 index 0000000000000..400216120f747 --- /dev/null +++ b/app/code/Magento/Paypal/Test/Unit/Observer/SetResponseAfterSaveOrderObserverTest.php @@ -0,0 +1,197 @@ +_event = new \Magento\Framework\Object(); + + $this->_observer = new \Magento\Framework\Event\Observer(); + $this->_observer->setEvent($this->_event); + + $this->coreRegistryMock = $this->getMock( + 'Magento\Framework\Registry', + [], + [], + '', + false + ); + $this->paypalHssMock = $this->getMock( + 'Magento\Paypal\Helper\Hss', + ['getHssMethods'], + [], + '', + false + ); + $this->viewMock = $this->getMockForAbstractClass( + 'Magento\Framework\App\ViewInterface', + [], + '', + false, + true, + true, + [] + ); + $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + $this->_model = $objectManagerHelper->getObject( + 'Magento\Paypal\Observer\SetResponseAfterSaveOrderObserver', + [ + 'coreRegistry' => $this->coreRegistryMock, + 'paypalHss' => $this->paypalHssMock, + 'view' => $this->viewMock, + ] + ); + } + + /** + * Get data for test testSetResponseAfterSaveOrderSuccess + * + * @return array + */ + protected function getSetResponseAfterSaveOrderTestData() + { + $iFrameHtml = 'iframe-html'; + $paymentMethod = 'method-2'; + + return [ + 'order.getId' => 10, + 'payment.getMethod' => $paymentMethod, + 'paypalHss.getHssMethods' => [ + 'method-1', + $paymentMethod, + 'method-3' + ], + 'result.getData' => [ + 'error' => false + ], + 'block.toHtml' => $iFrameHtml, + 'result.setData' => [ + 'error' => false, + 'update_section' => [ + 'name' => 'paypaliframe', + 'html' => $iFrameHtml + ], + 'redirect' => false, + 'success' => false, + ] + ]; + } + + /** + * Run setResponseAfterSaveOrder method test + * + * @return void + */ + public function testSetResponseAfterSaveOrderSuccess() + { + $testData = $this->getSetResponseAfterSaveOrderTestData(); + + $observerMock = $this->getMockBuilder('Magento\Framework\Event\Observer') + ->disableOriginalConstructor() + ->getMock(); + $orderMock = $this->getMockBuilder('Magento\Sales\Model\Order') + ->disableOriginalConstructor() + ->getMock(); + $paymentMock = $this->getMockBuilder('Magento\Sales\Model\Order\Payment') + ->disableOriginalConstructor() + ->getMock(); + $resultMock = $this->getMockBuilder('Magento\Framework\Object') + ->disableOriginalConstructor() + ->getMock(); + $layoutMock = $this->getMockBuilder('Magento\Framework\View\LayoutInterface') + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + $blockMock = $this->getMockBuilder('Magento\Framework\View\Element\BlockInterface') + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + + $this->coreRegistryMock->expects($this->once()) + ->method('registry') + ->with('hss_order') + ->willReturn($orderMock); + + $orderMock->expects($this->once()) + ->method('getId') + ->willReturn($testData['order.getId']); + $orderMock->expects($this->once()) + ->method('getPayment') + ->willReturn($paymentMock); + + $paymentMock->expects($this->once()) + ->method('getMethod') + ->willReturn($testData['payment.getMethod']); + + $this->paypalHssMock->expects($this->once()) + ->method('getHssMethods') + ->willReturn($testData['paypalHss.getHssMethods']); + + $observerMock->expects($this->atLeastOnce()) + ->method('getData') + ->with('result') + ->willReturn($resultMock); + + $resultMock->expects($this->once()) + ->method('getData') + ->willReturn($testData['result.getData']); + + $this->viewMock->expects($this->once()) + ->method('loadLayout') + ->with('checkout_onepage_review', true, true, false); + $this->viewMock->expects($this->once()) + ->method('getLayout') + ->willReturn($layoutMock); + + $layoutMock->expects($this->once()) + ->method('getBlock') + ->with('paypal.iframe') + ->willReturn($blockMock); + + $blockMock->expects($this->once()) + ->method('toHtml') + ->willReturn($testData['block.toHtml']); + + $resultMock->expects($this->once()) + ->method('setData') + ->with($testData['result.setData']); + + $this->_model->invoke($observerMock); + } +} diff --git a/app/code/Magento/Paypal/etc/crontab.xml b/app/code/Magento/Paypal/etc/crontab.xml index 2d5c0f36e4054..76307a2eaeaf3 100644 --- a/app/code/Magento/Paypal/etc/crontab.xml +++ b/app/code/Magento/Paypal/etc/crontab.xml @@ -7,6 +7,6 @@ --> - + diff --git a/app/code/Magento/Paypal/etc/events.xml b/app/code/Magento/Paypal/etc/events.xml index 6d7e9066aa8da..00d25fac2a48f 100644 --- a/app/code/Magento/Paypal/etc/events.xml +++ b/app/code/Magento/Paypal/etc/events.xml @@ -7,9 +7,9 @@ --> - + - + diff --git a/app/code/Magento/Paypal/etc/frontend/events.xml b/app/code/Magento/Paypal/etc/frontend/events.xml index 68eaf0a750924..2e0e660ee02c2 100644 --- a/app/code/Magento/Paypal/etc/frontend/events.xml +++ b/app/code/Magento/Paypal/etc/frontend/events.xml @@ -7,12 +7,12 @@ --> - + - + - + diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php index d76ff0e774d72..cca8d55164123 100644 --- a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php +++ b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php @@ -3815,4 +3815,5 @@ ['Magento\CacheInvalidate\Model\Observer', 'corresponding classes in Magento\CacheInvalidate\Observer\*'], ['Magento\Catalog\Model\Observer', 'corresponding classes in Magento\Catalog\Observer\*'], ['Magento\CatalogInventory\Model\Observer'], + ['Magento\Paypal\Model\Observer'], ]; diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php index 92054fcf40ea4..0f225a67ac021 100644 --- a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php +++ b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php @@ -2013,7 +2013,6 @@ ], ['getLinksConfig', 'Magento\Downloadable\Block\Catalog\Product\Links'], ['getAuthorizationAmounts', 'Magento\Paypal\Model\Config'], - ['cleanTransactions', 'Magento\Paypal\Model\Observer'], ['getSkinImagePlaceholderUrl', 'Magento\Cms\Model\Wysiwyg\Config'], ['compareIndexColumnProperties', 'Magento\Catalog\Model\Resource\Helper'], ['getIsNullNotNullCondition', 'Magento\Catalog\Model\Resource\Helper'], From cd494fcdf6030dc024d4ea9443e7c2c4a4bbf806 Mon Sep 17 00:00:00 2001 From: Michail Slabko Date: Fri, 31 Jul 2015 19:54:22 +0300 Subject: [PATCH 09/13] MAGETWO-31442: Splitting all observers with automated tool - MAGETWO-40882: Manual split of Magento\Catalog\Model\Observer - MAGETWO-40860: Manual split of Magento\CatalogRule\Model\Observer --- .../Observer/AddCatalogToTopmenuItems.php | 91 +------------- .../Catalog/Observer/MenuCategoryData.php | 112 ++++++++++++++++++ .../Observer/AddCatalogToTopmenuItemsTest.php | 45 +++---- .../Unit/Observer/MenuCategoryDataTest.php | 80 +++++++++++++ .../PrepareCatalogProductCollectionPrices.php | 3 - .../Observer/ProcessAdminFinalPrice.php | 3 - .../Observer/ProcessFrontFinalPrice.php | 3 - .../Test/Legacy/_files/obsolete_methods.php | 2 +- 8 files changed, 215 insertions(+), 124 deletions(-) create mode 100644 app/code/Magento/Catalog/Observer/MenuCategoryData.php create mode 100644 app/code/Magento/Catalog/Test/Unit/Observer/MenuCategoryDataTest.php diff --git a/app/code/Magento/Catalog/Observer/AddCatalogToTopmenuItems.php b/app/code/Magento/Catalog/Observer/AddCatalogToTopmenuItems.php index acf0980c1d4b1..0897444dc801e 100644 --- a/app/code/Magento/Catalog/Observer/AddCatalogToTopmenuItems.php +++ b/app/code/Magento/Catalog/Observer/AddCatalogToTopmenuItems.php @@ -20,40 +20,23 @@ class AddCatalogToTopmenuItems protected $categoryFlatState; /** - * Catalog layer - * - * @var \Magento\Catalog\Model\Layer - */ - private $catalogLayer = null; - - /** - * Catalog layer resolver - * - * @var \Magento\Catalog\Model\Layer\Resolver + * @var MenuCategoryData */ - protected $layerResolver; - - /** - * @var \Magento\Framework\Registry - */ - protected $registry; + protected $menuCategoryData; /** * @param \Magento\Catalog\Helper\Category $catalogCategory * @param \Magento\Catalog\Model\Indexer\Category\Flat\State $categoryFlatState - * @param \Magento\Catalog\Model\Layer\Resolver $layerResolver - * @param \Magento\Framework\Registry $registry + * @param \Magento\Catalog\Observer\MenuCategoryData $menuCategoryData */ public function __construct( \Magento\Catalog\Helper\Category $catalogCategory, \Magento\Catalog\Model\Indexer\Category\Flat\State $categoryFlatState, - \Magento\Catalog\Model\Layer\Resolver $layerResolver, - \Magento\Framework\Registry $registry + \Magento\Catalog\Observer\MenuCategoryData $menuCategoryData ) { $this->catalogCategory = $catalogCategory; $this->categoryFlatState = $categoryFlatState; - $this->layerResolver = $layerResolver; - $this->registry = $registry; + $this->menuCategoryData = $menuCategoryData; } /** @@ -86,7 +69,7 @@ protected function _addCategoriesToMenu($categories, $parentCategoryNode, $block $block->addIdentity(\Magento\Catalog\Model\Category::CACHE_TAG . '_' . $category->getId()); $tree = $parentCategoryNode->getTree(); - $categoryData = $this->getMenuCategoryData($category); + $categoryData = $this->menuCategoryData->getMenuCategoryData($category); $categoryNode = new \Magento\Framework\Data\Tree\Node($categoryData, 'id', $tree, $parentCategoryNode); $parentCategoryNode->addChild($categoryNode); @@ -99,66 +82,4 @@ protected function _addCategoriesToMenu($categories, $parentCategoryNode, $block $this->_addCategoriesToMenu($subcategories, $categoryNode, $block); } } - - /** - * Get category data to be added to the Menu - * - * @param \Magento\Framework\Data\Tree\Node $category - * @return array - */ - public function getMenuCategoryData($category) - { - $nodeId = 'category-node-' . $category->getId(); - - $isActiveCategory = false; - /** @var \Magento\Catalog\Model\Category $currentCategory */ - $currentCategory = $this->registry->registry('current_category'); - if ($currentCategory && $currentCategory->getId() == $category->getId()) { - $isActiveCategory = true; - } - - $categoryData = [ - 'name' => $category->getName(), - 'id' => $nodeId, - 'url' => $this->catalogCategory->getCategoryUrl($category), - 'has_active' => $this->hasActive($category), - 'is_active' => $isActiveCategory, - ]; - - return $categoryData; - } - - /** - * Checks whether category belongs to active category's path - * - * @param \Magento\Framework\Data\Tree\Node $category - * @return bool - */ - protected function hasActive($category) - { - $catalogLayer = $this->getCatalogLayer(); - if (!$catalogLayer) { - return false; - } - - $currentCategory = $catalogLayer->getCurrentCategory(); - if (!$currentCategory) { - return false; - } - - $categoryPathIds = explode(',', $currentCategory->getPathInStore()); - return in_array($category->getId(), $categoryPathIds); - } - - /** - * Get catalog layer - * @return \Magento\Catalog\Model\Layer - */ - private function getCatalogLayer() - { - if ($this->catalogLayer === null) { - $this->catalogLayer = $this->layerResolver->get(); - } - return $this->catalogLayer; - } } diff --git a/app/code/Magento/Catalog/Observer/MenuCategoryData.php b/app/code/Magento/Catalog/Observer/MenuCategoryData.php new file mode 100644 index 0000000000000..75da7c25e0df7 --- /dev/null +++ b/app/code/Magento/Catalog/Observer/MenuCategoryData.php @@ -0,0 +1,112 @@ +catalogCategory = $catalogCategory; + $this->layerResolver = $layerResolver; + $this->registry = $registry; + } + + /** + * Get category data to be added to the Menu + * + * @param \Magento\Framework\Data\Tree\Node $category + * @return array + */ + public function getMenuCategoryData($category) + { + $nodeId = 'category-node-' . $category->getId(); + + $isActiveCategory = false; + /** @var \Magento\Catalog\Model\Category $currentCategory */ + $currentCategory = $this->registry->registry('current_category'); + if ($currentCategory && $currentCategory->getId() == $category->getId()) { + $isActiveCategory = true; + } + + $categoryData = [ + 'name' => $category->getName(), + 'id' => $nodeId, + 'url' => $this->catalogCategory->getCategoryUrl($category), + 'has_active' => $this->hasActive($category), + 'is_active' => $isActiveCategory, + ]; + + return $categoryData; + } + + /** + * Checks whether category belongs to active category's path + * + * @param \Magento\Framework\Data\Tree\Node $category + * @return bool + */ + protected function hasActive($category) + { + $catalogLayer = $this->getCatalogLayer(); + if (!$catalogLayer) { + return false; + } + + $currentCategory = $catalogLayer->getCurrentCategory(); + if (!$currentCategory) { + return false; + } + + $categoryPathIds = explode(',', $currentCategory->getPathInStore()); + return in_array($category->getId(), $categoryPathIds); + } + + /** + * Get catalog layer + * @return \Magento\Catalog\Model\Layer + */ + private function getCatalogLayer() + { + if ($this->catalogLayer === null) { + $this->catalogLayer = $this->layerResolver->get(); + } + return $this->catalogLayer; + } +} diff --git a/app/code/Magento/Catalog/Test/Unit/Observer/AddCatalogToTopmenuItemsTest.php b/app/code/Magento/Catalog/Test/Unit/Observer/AddCatalogToTopmenuItemsTest.php index a02917018847c..74bdda75f2fac 100644 --- a/app/code/Magento/Catalog/Test/Unit/Observer/AddCatalogToTopmenuItemsTest.php +++ b/app/code/Magento/Catalog/Test/Unit/Observer/AddCatalogToTopmenuItemsTest.php @@ -32,6 +32,11 @@ class AddCatalogToTopmenuItemsTest extends \PHPUnit_Framework_TestCase */ protected $_category; + /** + * @var \PHPUnit_Framework_MockObject_MockObject + */ + protected $menuCategoryData; + /** * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Catalog\Model\Indexer\Category\Flat\State */ @@ -55,14 +60,18 @@ public function setUp() false ); - $layerResolver = $this->_getCleanMock('Magento\Catalog\Model\Layer\Resolver'); - $layerResolver->expects($this->once())->method('get')->willReturn(null); + $this->menuCategoryData = $this->getMock( + 'Magento\Catalog\Observer\MenuCategoryData', + ['getMenuCategoryData'], + [], + '', + false + ); $this->_observer = (new ObjectManager($this))->getObject( 'Magento\Catalog\Observer\AddCatalogToTopmenuItems', [ - 'layerResolver' => $layerResolver, 'catalogCategory' => $this->_catalogCategory, - 'catalogData' => $this->_getCleanMock('\Magento\Catalog\Helper\Data'), + 'menuCategoryData' => $this->menuCategoryData, 'categoryFlatState' => $this->_categoryFlatState, ] ); @@ -102,16 +111,13 @@ protected function _preparationData() $this->_category->expects($this->once()) ->method('getIsActive') ->will($this->returnValue(true)); - $this->_category->expects($this->once()) - ->method('getName') - ->will($this->returnValue('Name')); $this->_catalogCategory->expects($this->once()) ->method('getStoreCategories') ->will($this->returnValue([$this->_category])); - $this->_catalogCategory->expects($this->once()) - ->method('getCategoryUrl') - ->will($this->returnValue('url')); + $this->menuCategoryData->expects($this->once()) + ->method('getMenuCategoryData') + ->with($this->_category); $blockMock = $this->_getCleanMock('\Magento\Theme\Block\Html\Topmenu'); @@ -167,23 +173,4 @@ public function testAddCatalogToTopMenuItemsWithFlat() $this->_observer->invoke($observer); } - - public function testGetMenuCategoryData() - { - $category = $this->getMock('Magento\Catalog\Model\Category', ['getId', 'getName'], [], '', false); - $category->expects($this->once())->method('getId')->willReturn('id'); - $category->expects($this->once())->method('getName')->willReturn('name'); - $this->_catalogCategory->expects($this->once())->method('getCategoryUrl')->willReturn('url'); - - $this->assertEquals( - [ - 'name' => 'name', - 'id' => 'category-node-id', - 'url' => 'url', - 'is_active' => false, - 'has_active' => false, - ], - $this->_observer->getMenuCategoryData($category) - ); - } } diff --git a/app/code/Magento/Catalog/Test/Unit/Observer/MenuCategoryDataTest.php b/app/code/Magento/Catalog/Test/Unit/Observer/MenuCategoryDataTest.php new file mode 100644 index 0000000000000..39ebeee21194a --- /dev/null +++ b/app/code/Magento/Catalog/Test/Unit/Observer/MenuCategoryDataTest.php @@ -0,0 +1,80 @@ +_catalogCategory = $this->getMock( + '\Magento\Catalog\Helper\Category', + ['getStoreCategories', 'getCategoryUrl'], + [], + '', + false + ); + + $layerResolver = $this->getMock('Magento\Catalog\Model\Layer\Resolver', [], [], '', false); + $layerResolver->expects($this->once())->method('get')->willReturn(null); + $this->_observer = (new ObjectManager($this))->getObject( + 'Magento\Catalog\Observer\MenuCategoryData', + [ + 'layerResolver' => $layerResolver, + 'catalogCategory' => $this->_catalogCategory, + 'catalogData' => $this->getMock('\Magento\Catalog\Helper\Data', [], [], '', false), + ] + ); + } + + public function testGetMenuCategoryData() + { + $category = $this->getMock('Magento\Catalog\Model\Category', ['getId', 'getName'], [], '', false); + $category->expects($this->once())->method('getId')->willReturn('id'); + $category->expects($this->once())->method('getName')->willReturn('name'); + $this->_catalogCategory->expects($this->once())->method('getCategoryUrl')->willReturn('url'); + + $this->assertEquals( + [ + 'name' => 'name', + 'id' => 'category-node-id', + 'url' => 'url', + 'is_active' => false, + 'has_active' => false, + ], + $this->_observer->getMenuCategoryData($category) + ); + } +} diff --git a/app/code/Magento/CatalogRule/Observer/PrepareCatalogProductCollectionPrices.php b/app/code/Magento/CatalogRule/Observer/PrepareCatalogProductCollectionPrices.php index 927a6c1c79d74..6fbd925915daf 100644 --- a/app/code/Magento/CatalogRule/Observer/PrepareCatalogProductCollectionPrices.php +++ b/app/code/Magento/CatalogRule/Observer/PrepareCatalogProductCollectionPrices.php @@ -17,9 +17,6 @@ use Magento\Framework\Event\Observer as EventObserver; use Magento\Customer\Api\GroupManagementInterface; -/** - * @SuppressWarnings(PHPMD.CouplingBetweenObjects) - */ class PrepareCatalogProductCollectionPrices { /** diff --git a/app/code/Magento/CatalogRule/Observer/ProcessAdminFinalPrice.php b/app/code/Magento/CatalogRule/Observer/ProcessAdminFinalPrice.php index cd602af2e178e..ef7eff589fe17 100644 --- a/app/code/Magento/CatalogRule/Observer/ProcessAdminFinalPrice.php +++ b/app/code/Magento/CatalogRule/Observer/ProcessAdminFinalPrice.php @@ -16,9 +16,6 @@ use Magento\Framework\Event\Observer as EventObserver; use Magento\Framework\Registry; -/** - * @SuppressWarnings(PHPMD.CouplingBetweenObjects) - */ class ProcessAdminFinalPrice { /** diff --git a/app/code/Magento/CatalogRule/Observer/ProcessFrontFinalPrice.php b/app/code/Magento/CatalogRule/Observer/ProcessFrontFinalPrice.php index ea577344fba32..25b3bf36944ad 100644 --- a/app/code/Magento/CatalogRule/Observer/ProcessFrontFinalPrice.php +++ b/app/code/Magento/CatalogRule/Observer/ProcessFrontFinalPrice.php @@ -16,9 +16,6 @@ use Magento\Customer\Model\Session as CustomerModelSession; use Magento\Framework\Event\Observer as EventObserver; -/** - * @SuppressWarnings(PHPMD.CouplingBetweenObjects) - */ class ProcessFrontFinalPrice { /** diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php index 0f225a67ac021..dd2efd2c689b0 100644 --- a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php +++ b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php @@ -2353,7 +2353,7 @@ ['addCatalogToTopmenuItems', 'Magento\Catalog\Model\Observer', 'Magento\Catalog\Observer\AddCatalogToTopmenuItems::invoke'], ['catalogCheckIsUsingStaticUrlsAllowed', 'Magento\Catalog\Model\Observer', 'Magento\Catalog\Observer\CatalogCheckIsUsingStaticUrlsAllowed::invoke'], ['_addCategoriesToMenu', 'Magento\Catalog\Model\Observer', 'Magento\Catalog\Observer\AddCatalogToTopmenuItems::_addCategoriesToMenu'], - ['getMenuCategoryData', 'Magento\Catalog\Model\Observer', 'Magento\Catalog\Observer\AddCatalogToTopmenuItems::getMenuCategoryData'], ['hasActive', 'Magento\Catalog\Model\Observer', 'Magento\Catalog\Observer\AddCatalogToTopmenuItems::hasActive'], ['getCatalogLayer', 'Magento\Catalog\Model\Observer', 'Magento\Catalog\Observer\AddCatalogToTopmenuItems::getCatalogLayer'], + ['getMenuCategoryData', 'Magento\Catalog\Model\Observer', 'Magento\Catalog\Observer\MenuCategoryData::getMenuCategoryData'], ]; From e8b4f5a9d066f30add305edd540506ad60422e2b Mon Sep 17 00:00:00 2001 From: Michail Slabko Date: Mon, 3 Aug 2015 11:38:29 +0300 Subject: [PATCH 10/13] MAGETWO-31442: Splitting all observers with automated tool - MAGETWO-40986: Manual split of Magento\Checkout\Model\Observer --- app/code/Magento/Checkout/Model/Observer.php | 70 ------------------- .../Checkout/Observer/LoadCustomerQuote.php | 46 ++++++++++++ .../Checkout/Observer/SalesQuoteSaveAfter.php | 36 ++++++++++ .../Magento/Checkout/Observer/UnsetAll.php | 31 ++++++++ .../LoadCustomerQuoteTest.php} | 36 ++-------- .../Unit/Observer/SalesQuoteSaveAfterTest.php | 42 +++++++++++ .../Test/Unit/Observer/UnsetAllTest.php | 37 ++++++++++ app/code/Magento/Checkout/etc/events.xml | 2 +- .../Magento/Checkout/etc/frontend/events.xml | 4 +- .../Test/Legacy/_files/obsolete_classes.php | 5 +- .../Test/Legacy/_files/obsolete_methods.php | 3 + 11 files changed, 208 insertions(+), 104 deletions(-) delete mode 100644 app/code/Magento/Checkout/Model/Observer.php create mode 100644 app/code/Magento/Checkout/Observer/LoadCustomerQuote.php create mode 100644 app/code/Magento/Checkout/Observer/SalesQuoteSaveAfter.php create mode 100644 app/code/Magento/Checkout/Observer/UnsetAll.php rename app/code/Magento/Checkout/Test/Unit/{Model/ObserverTest.php => Observer/LoadCustomerQuoteTest.php} (59%) create mode 100644 app/code/Magento/Checkout/Test/Unit/Observer/SalesQuoteSaveAfterTest.php create mode 100644 app/code/Magento/Checkout/Test/Unit/Observer/UnsetAllTest.php diff --git a/app/code/Magento/Checkout/Model/Observer.php b/app/code/Magento/Checkout/Model/Observer.php deleted file mode 100644 index afa3960a3ec1a..0000000000000 --- a/app/code/Magento/Checkout/Model/Observer.php +++ /dev/null @@ -1,70 +0,0 @@ - - */ -namespace Magento\Checkout\Model; - -class Observer -{ - /** - * @var Session - */ - protected $_checkoutSession; - - /** - * @var \Magento\Framework\Message\ManagerInterface - */ - protected $messageManager; - - /** - * @param Session $checkoutSession - * @param \Magento\Framework\Message\ManagerInterface $messageManager - */ - public function __construct(Session $checkoutSession, \Magento\Framework\Message\ManagerInterface $messageManager) - { - $this->_checkoutSession = $checkoutSession; - $this->messageManager = $messageManager; - } - - /** - * @return void - */ - public function unsetAll() - { - $this->_checkoutSession->clearQuote()->clearStorage(); - } - - /** - * @return void - */ - public function loadCustomerQuote() - { - try { - $this->_checkoutSession->loadCustomerQuote(); - } catch (\Magento\Framework\Exception\LocalizedException $e) { - $this->messageManager->addError($e->getMessage()); - } catch (\Exception $e) { - $this->messageManager->addException($e, __('Load customer quote error')); - } - } - - /** - * @param \Magento\Framework\Event\Observer $observer - * @return void - */ - public function salesQuoteSaveAfter($observer) - { - $quote = $observer->getEvent()->getQuote(); - /* @var $quote \Magento\Quote\Model\Quote */ - if ($quote->getIsCheckoutCart()) { - $this->_checkoutSession->getQuoteId($quote->getId()); - } - } -} diff --git a/app/code/Magento/Checkout/Observer/LoadCustomerQuote.php b/app/code/Magento/Checkout/Observer/LoadCustomerQuote.php new file mode 100644 index 0000000000000..8d46ee533e9f6 --- /dev/null +++ b/app/code/Magento/Checkout/Observer/LoadCustomerQuote.php @@ -0,0 +1,46 @@ +checkoutSession = $checkoutSession; + $this->messageManager = $messageManager; + } + + /** + * @return void + */ + public function invoke() + { + try { + $this->checkoutSession->loadCustomerQuote(); + } catch (\Magento\Framework\Exception\LocalizedException $e) { + $this->messageManager->addError($e->getMessage()); + } catch (\Exception $e) { + $this->messageManager->addException($e, __('Load customer quote error')); + } + } +} diff --git a/app/code/Magento/Checkout/Observer/SalesQuoteSaveAfter.php b/app/code/Magento/Checkout/Observer/SalesQuoteSaveAfter.php new file mode 100644 index 0000000000000..72a2c7ef00add --- /dev/null +++ b/app/code/Magento/Checkout/Observer/SalesQuoteSaveAfter.php @@ -0,0 +1,36 @@ +checkoutSession = $checkoutSession; + } + + /** + * @param \Magento\Framework\Event\Observer $observer + * @return void + */ + public function invoke($observer) + { + $quote = $observer->getEvent()->getQuote(); + /* @var $quote \Magento\Quote\Model\Quote */ + if ($quote->getIsCheckoutCart()) { + $this->checkoutSession->getQuoteId($quote->getId()); + } + } +} diff --git a/app/code/Magento/Checkout/Observer/UnsetAll.php b/app/code/Magento/Checkout/Observer/UnsetAll.php new file mode 100644 index 0000000000000..b46685bc70dc9 --- /dev/null +++ b/app/code/Magento/Checkout/Observer/UnsetAll.php @@ -0,0 +1,31 @@ +checkoutSession = $checkoutSession; + } + + /** + * @return void + */ + public function invoke() + { + $this->checkoutSession->clearQuote()->clearStorage(); + } +} diff --git a/app/code/Magento/Checkout/Test/Unit/Model/ObserverTest.php b/app/code/Magento/Checkout/Test/Unit/Observer/LoadCustomerQuoteTest.php similarity index 59% rename from app/code/Magento/Checkout/Test/Unit/Model/ObserverTest.php rename to app/code/Magento/Checkout/Test/Unit/Observer/LoadCustomerQuoteTest.php index 2c3e094631823..9fb8d1698805a 100644 --- a/app/code/Magento/Checkout/Test/Unit/Model/ObserverTest.php +++ b/app/code/Magento/Checkout/Test/Unit/Observer/LoadCustomerQuoteTest.php @@ -3,21 +3,19 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ -namespace Magento\Checkout\Test\Unit\Model; - -use \Magento\Checkout\Model\Observer; +namespace Magento\Checkout\Test\Unit\Observer; use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; -class ObserverTest extends \PHPUnit_Framework_TestCase +class LoadCustomerQuoteTest extends \PHPUnit_Framework_TestCase { - /** @var Observer */ + /** @var \Magento\Checkout\Observer\LoadCustomerQuote */ protected $object; /** @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager */ protected $objectManager; - /** @var Session|\PHPUnit_Framework_MockObject_MockObject */ + /** @var \PHPUnit_Framework_MockObject_MockObject */ protected $checkoutSession; /** @var \Magento\Framework\Message\ManagerInterface|\PHPUnit_Framework_MockObject_MockObject */ @@ -28,20 +26,12 @@ protected function setUp() $this->objectManager = new ObjectManager($this); $this->checkoutSession = $this->getMock('Magento\Checkout\Model\Session', [], [], '', false); $this->messageManager = $this->getMock('Magento\Framework\Message\ManagerInterface', [], [], '', false); - $this->object = $this->objectManager->getObject('Magento\Checkout\Model\Observer', [ + $this->object = $this->objectManager->getObject('Magento\Checkout\Observer\LoadCustomerQuote', [ 'checkoutSession' => $this->checkoutSession, 'messageManager' => $this->messageManager, ]); } - public function testUnsetAll() - { - $this->checkoutSession->expects($this->once())->method('clearQuote')->will($this->returnSelf()); - $this->checkoutSession->expects($this->once())->method('clearStorage')->will($this->returnSelf()); - - $this->object->unsetAll(); - } - public function testLoadCustomerQuoteThrowingCoreException() { $this->checkoutSession->expects($this->once())->method('loadCustomerQuote')->willThrowException( @@ -49,7 +39,7 @@ public function testLoadCustomerQuoteThrowingCoreException() ); $this->messageManager->expects($this->once())->method('addError')->with('Message'); - $this->object->loadCustomerQuote(); + $this->object->invoke(); } public function testLoadCustomerQuoteThrowingException() @@ -61,19 +51,7 @@ public function testLoadCustomerQuoteThrowingException() $this->messageManager->expects($this->once())->method('addException') ->with($exception, 'Load customer quote error'); - $this->object->loadCustomerQuote(); + $this->object->invoke(); } - public function testSalesQuoteSaveAfter() - { - $observer = $this->getMock('Magento\Framework\Event\Observer', [], [], '', false); - $observer->expects($this->once())->method('getEvent')->will( - $this->returnValue(new \Magento\Framework\Object( - ['quote' => new \Magento\Framework\Object(['is_checkout_cart' => 1, 'id' => 7])] - )) - ); - $this->checkoutSession->expects($this->once())->method('getQuoteId')->with(7); - - $this->object->salesQuoteSaveAfter($observer); - } } diff --git a/app/code/Magento/Checkout/Test/Unit/Observer/SalesQuoteSaveAfterTest.php b/app/code/Magento/Checkout/Test/Unit/Observer/SalesQuoteSaveAfterTest.php new file mode 100644 index 0000000000000..7f3f2962e6309 --- /dev/null +++ b/app/code/Magento/Checkout/Test/Unit/Observer/SalesQuoteSaveAfterTest.php @@ -0,0 +1,42 @@ +objectManager = new ObjectManager($this); + $this->checkoutSession = $this->getMock('Magento\Checkout\Model\Session', [], [], '', false); + $this->object = $this->objectManager->getObject('Magento\Checkout\Observer\SalesQuoteSaveAfter', [ + 'checkoutSession' => $this->checkoutSession, + ]); + } + + public function testSalesQuoteSaveAfter() + { + $observer = $this->getMock('Magento\Framework\Event\Observer', [], [], '', false); + $observer->expects($this->once())->method('getEvent')->will( + $this->returnValue(new \Magento\Framework\Object( + ['quote' => new \Magento\Framework\Object(['is_checkout_cart' => 1, 'id' => 7])] + )) + ); + $this->checkoutSession->expects($this->once())->method('getQuoteId')->with(7); + + $this->object->invoke($observer); + } +} diff --git a/app/code/Magento/Checkout/Test/Unit/Observer/UnsetAllTest.php b/app/code/Magento/Checkout/Test/Unit/Observer/UnsetAllTest.php new file mode 100644 index 0000000000000..3bc11bef7e75f --- /dev/null +++ b/app/code/Magento/Checkout/Test/Unit/Observer/UnsetAllTest.php @@ -0,0 +1,37 @@ +objectManager = new ObjectManager($this); + $this->checkoutSession = $this->getMock('Magento\Checkout\Model\Session', [], [], '', false); + $this->object = $this->objectManager->getObject('Magento\Checkout\Observer\UnsetAll', [ + 'checkoutSession' => $this->checkoutSession, + ]); + } + + public function testUnsetAll() + { + $this->checkoutSession->expects($this->once())->method('clearQuote')->will($this->returnSelf()); + $this->checkoutSession->expects($this->once())->method('clearStorage')->will($this->returnSelf()); + + $this->object->invoke(); + } +} diff --git a/app/code/Magento/Checkout/etc/events.xml b/app/code/Magento/Checkout/etc/events.xml index a182bdcf9dc10..0981542e0f6fc 100644 --- a/app/code/Magento/Checkout/etc/events.xml +++ b/app/code/Magento/Checkout/etc/events.xml @@ -7,6 +7,6 @@ --> - + diff --git a/app/code/Magento/Checkout/etc/frontend/events.xml b/app/code/Magento/Checkout/etc/frontend/events.xml index 3d80d500ac04d..e1f8d6a9188dc 100644 --- a/app/code/Magento/Checkout/etc/frontend/events.xml +++ b/app/code/Magento/Checkout/etc/frontend/events.xml @@ -7,9 +7,9 @@ --> - + - + diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php index cca8d55164123..6547cb2c5e93b 100644 --- a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php +++ b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php @@ -3814,6 +3814,7 @@ ['Magento\Tax\Model\Observer', 'corresponding classes in Magento\Tax\Observer\*'], ['Magento\CacheInvalidate\Model\Observer', 'corresponding classes in Magento\CacheInvalidate\Observer\*'], ['Magento\Catalog\Model\Observer', 'corresponding classes in Magento\Catalog\Observer\*'], - ['Magento\CatalogInventory\Model\Observer'], - ['Magento\Paypal\Model\Observer'], + ['Magento\CatalogInventory\Model\Observer', 'corresponding classes in Magento\CatalogInventory\Observer\*'], + ['Magento\Paypal\Model\Observer', 'corresponding classes in Magento\Paypal\Observer\*'], + ['Magento\Checkout\Model\Observer', 'corresponding classes in Magento\Checkout\Observer\*'], ]; diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php index dd2efd2c689b0..c74df80c154c2 100644 --- a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php +++ b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php @@ -2356,4 +2356,7 @@ ['hasActive', 'Magento\Catalog\Model\Observer', 'Magento\Catalog\Observer\AddCatalogToTopmenuItems::hasActive'], ['getCatalogLayer', 'Magento\Catalog\Model\Observer', 'Magento\Catalog\Observer\AddCatalogToTopmenuItems::getCatalogLayer'], ['getMenuCategoryData', 'Magento\Catalog\Model\Observer', 'Magento\Catalog\Observer\MenuCategoryData::getMenuCategoryData'], + ['loadCustomerQuote', 'Magento\Checkout\Model\Observer', 'Magento\Checkout\Observer\LoadCustomerQuote::invoke'], + ['salesQuoteSaveAfter', 'Magento\Checkout\Model\Observer', 'Magento\Checkout\Observer\SalesQuoteSaveAfter::invoke'], + ['unsetAll', 'Magento\Checkout\Model\Observer', 'Magento\Checkout\Observer\UnsetAll::invoke'], ]; From 777021a26bdbc8c2f894d00c180a672b94265ef4 Mon Sep 17 00:00:00 2001 From: Michail Slabko Date: Mon, 3 Aug 2015 11:44:59 +0300 Subject: [PATCH 11/13] MAGETWO-31442: Splitting all observers with automated tool - MAGETWO-40987: Manual split of Magento\CurrencySymbol\Model\Observer --- .../CurrencyDisplayOptions.php} | 6 +++--- .../CurrencyDisplayOptionsTest.php} | 14 +++++++------- app/code/Magento/CurrencySymbol/etc/events.xml | 2 +- .../Test/Legacy/_files/obsolete_classes.php | 1 + .../Test/Legacy/_files/obsolete_methods.php | 1 + 5 files changed, 13 insertions(+), 11 deletions(-) rename app/code/Magento/CurrencySymbol/{Model/Observer.php => Observer/CurrencyDisplayOptions.php} (91%) rename app/code/Magento/CurrencySymbol/Test/Unit/{Model/ObserverTest.php => Observer/CurrencyDisplayOptionsTest.php} (87%) diff --git a/app/code/Magento/CurrencySymbol/Model/Observer.php b/app/code/Magento/CurrencySymbol/Observer/CurrencyDisplayOptions.php similarity index 91% rename from app/code/Magento/CurrencySymbol/Model/Observer.php rename to app/code/Magento/CurrencySymbol/Observer/CurrencyDisplayOptions.php index 558983912e340..b4bcf0f70b73a 100644 --- a/app/code/Magento/CurrencySymbol/Model/Observer.php +++ b/app/code/Magento/CurrencySymbol/Observer/CurrencyDisplayOptions.php @@ -3,14 +3,14 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ -namespace Magento\CurrencySymbol\Model; +namespace Magento\CurrencySymbol\Observer; use Magento\Framework\Locale\Currency; /** * Currency Symbol Observer */ -class Observer +class CurrencyDisplayOptions { /** * @var \Magento\CurrencySymbol\Model\System\CurrencysymbolFactory @@ -31,7 +31,7 @@ public function __construct(\Magento\CurrencySymbol\Model\System\CurrencysymbolF * @param \Magento\Framework\Event\Observer $observer * @return $this */ - public function currencyDisplayOptions(\Magento\Framework\Event\Observer $observer) + public function invoke(\Magento\Framework\Event\Observer $observer) { $baseCode = $observer->getEvent()->getBaseCode(); $currencyOptions = $observer->getEvent()->getCurrencyOptions(); diff --git a/app/code/Magento/CurrencySymbol/Test/Unit/Model/ObserverTest.php b/app/code/Magento/CurrencySymbol/Test/Unit/Observer/CurrencyDisplayOptionsTest.php similarity index 87% rename from app/code/Magento/CurrencySymbol/Test/Unit/Model/ObserverTest.php rename to app/code/Magento/CurrencySymbol/Test/Unit/Observer/CurrencyDisplayOptionsTest.php index 71fcf4aad4774..707f0ffb4f0c0 100644 --- a/app/code/Magento/CurrencySymbol/Test/Unit/Model/ObserverTest.php +++ b/app/code/Magento/CurrencySymbol/Test/Unit/Observer/CurrencyDisplayOptionsTest.php @@ -3,17 +3,17 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ -namespace Magento\CurrencySymbol\Test\Unit\Model; +namespace Magento\CurrencySymbol\Test\Unit\Observer; use \Magento\CurrencySymbol\Model\System\CurrencysymbolFactory; /** - * Test for \Magento\CurrencySymbol\Model\Observer + * Test for \Magento\CurrencySymbol\Observer\CurrencyDisplayOptions */ -class ObserverTest extends \PHPUnit_Framework_TestCase +class CurrencyDisplayOptionsTest extends \PHPUnit_Framework_TestCase { /** - * @var \Magento\CurrencySymbol\Model\Observer + * @var \Magento\CurrencySymbol\Observer\CurrencyDisplayOptions */ private $observer; @@ -74,7 +74,7 @@ public function setUp() $this->mockEventObserver->expects($this->any())->method('getEvent')->willReturn($this->mockEvent); $this->mockSymbolFactory->expects($this->any())->method('create')->willReturn($this->mockSymbol); - $this->observer = new \Magento\CurrencySymbol\Model\Observer($this->mockSymbolFactory); + $this->observer = new \Magento\CurrencySymbol\Observer\CurrencyDisplayOptions($this->mockSymbolFactory); } public function testCurrencyDisplayOptionsEmpty() @@ -85,7 +85,7 @@ public function testCurrencyDisplayOptionsEmpty() $this->mockEvent->expects($this->once())->method('getCurrencyOptions')->willReturn($sampleCurrencyOptionObject); $this->mockSymbol->expects($this->never())->method('getCurrencySymbol')->with(null)->willReturn(null); - $this->observer->currencyDisplayOptions($this->mockEventObserver); + $this->observer->invoke($this->mockEventObserver); // Check if option set is empty $this->assertEquals([], $sampleCurrencyOptionObject->getData()); @@ -110,7 +110,7 @@ public function testCurrencyDisplayOptions() ->with($sampleCurrency) ->willReturn($sampleCurrencySymbol); - $this->observer->currencyDisplayOptions($this->mockEventObserver); + $this->observer->invoke($this->mockEventObserver); // Check if option set is empty $this->assertEquals($expectedCurrencyOptions, $sampleCurrencyOptionObject->getData()); diff --git a/app/code/Magento/CurrencySymbol/etc/events.xml b/app/code/Magento/CurrencySymbol/etc/events.xml index a8d77cbaede43..701675e8b277e 100644 --- a/app/code/Magento/CurrencySymbol/etc/events.xml +++ b/app/code/Magento/CurrencySymbol/etc/events.xml @@ -7,6 +7,6 @@ --> - + diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php index 6547cb2c5e93b..5de52392b0d57 100644 --- a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php +++ b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php @@ -3817,4 +3817,5 @@ ['Magento\CatalogInventory\Model\Observer', 'corresponding classes in Magento\CatalogInventory\Observer\*'], ['Magento\Paypal\Model\Observer', 'corresponding classes in Magento\Paypal\Observer\*'], ['Magento\Checkout\Model\Observer', 'corresponding classes in Magento\Checkout\Observer\*'], + ['Magento\CurrencySymbol\Model\Observer', 'corresponding classes in Magento\CurrencySymbol\Observer\*'], ]; diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php index c74df80c154c2..2210bb7691ce5 100644 --- a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php +++ b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php @@ -2359,4 +2359,5 @@ ['loadCustomerQuote', 'Magento\Checkout\Model\Observer', 'Magento\Checkout\Observer\LoadCustomerQuote::invoke'], ['salesQuoteSaveAfter', 'Magento\Checkout\Model\Observer', 'Magento\Checkout\Observer\SalesQuoteSaveAfter::invoke'], ['unsetAll', 'Magento\Checkout\Model\Observer', 'Magento\Checkout\Observer\UnsetAll::invoke'], + ['currencyDisplayOptions', 'Magento\CurrencySymbol\Model\Observer', 'Magento\CurrencySymbol\Observer\CurrencyDisplayOptions::invoke'], ]; From d42842d45dc8813fbe50e37b18ac9ec94a56b595 Mon Sep 17 00:00:00 2001 From: Michail Slabko Date: Tue, 4 Aug 2015 14:41:38 +0300 Subject: [PATCH 12/13] MAGETWO-41085: Delivery MAGETWO-31442 - Adaptation of code to PHP7 --- app/code/Magento/Bundle/Observer/SetAttributeTabBlock.php | 2 +- .../Magento/CacheInvalidate/Observer/InvalidateVarnish.php | 2 +- .../Test/Unit/Observer/InvalidateVarnishTest.php | 2 +- .../Observer/AddBillingAgreementToSessionObserverTest.php | 4 ++-- .../Test/Unit/Observer/AddPaypalShortcutsObserverTest.php | 4 ++-- .../Test/Unit/Observer/HtmlTransactionIdObserverTest.php | 4 ++-- .../Unit/Observer/SetResponseAfterSaveOrderObserverTest.php | 6 +++--- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/app/code/Magento/Bundle/Observer/SetAttributeTabBlock.php b/app/code/Magento/Bundle/Observer/SetAttributeTabBlock.php index 24c2ace6212e6..45ece78f12a8f 100644 --- a/app/code/Magento/Bundle/Observer/SetAttributeTabBlock.php +++ b/app/code/Magento/Bundle/Observer/SetAttributeTabBlock.php @@ -25,7 +25,7 @@ public function __construct(\Magento\Catalog\Helper\Catalog $helperCatalog) /** * Setting attribute tab block for bundle * - * @param \Magento\Framework\Object $observer + * @param \Magento\Framework\Event\Observer $observer * @return $this */ public function invoke($observer) diff --git a/app/code/Magento/CacheInvalidate/Observer/InvalidateVarnish.php b/app/code/Magento/CacheInvalidate/Observer/InvalidateVarnish.php index 3823a53848fcf..640d81da1a0d5 100644 --- a/app/code/Magento/CacheInvalidate/Observer/InvalidateVarnish.php +++ b/app/code/Magento/CacheInvalidate/Observer/InvalidateVarnish.php @@ -42,7 +42,7 @@ public function invoke(\Magento\Framework\Event\Observer $observer) { if ($this->config->getType() == \Magento\PageCache\Model\Config::VARNISH && $this->config->isEnabled()) { $object = $observer->getEvent()->getObject(); - if ($object instanceof \Magento\Framework\Object\IdentityInterface) { + if ($object instanceof \Magento\Framework\DataObject\IdentityInterface) { $tags = []; $pattern = "((^|,)%s(,|$))"; foreach ($object->getIdentities() as $tag) { diff --git a/app/code/Magento/CacheInvalidate/Test/Unit/Observer/InvalidateVarnishTest.php b/app/code/Magento/CacheInvalidate/Test/Unit/Observer/InvalidateVarnishTest.php index 8a2cdb29b29a8..6e5f1f94cf20d 100644 --- a/app/code/Magento/CacheInvalidate/Test/Unit/Observer/InvalidateVarnishTest.php +++ b/app/code/Magento/CacheInvalidate/Test/Unit/Observer/InvalidateVarnishTest.php @@ -21,7 +21,7 @@ class InvalidateVarnishTest extends \PHPUnit_Framework_TestCase protected $purgeCache; - /** @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Framework\Object\ */ + /** @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Framework\DataObject\ */ protected $observerObject; /** diff --git a/app/code/Magento/Paypal/Test/Unit/Observer/AddBillingAgreementToSessionObserverTest.php b/app/code/Magento/Paypal/Test/Unit/Observer/AddBillingAgreementToSessionObserverTest.php index 9d2346fdf1f89..6cadbf8cc0055 100644 --- a/app/code/Magento/Paypal/Test/Unit/Observer/AddBillingAgreementToSessionObserverTest.php +++ b/app/code/Magento/Paypal/Test/Unit/Observer/AddBillingAgreementToSessionObserverTest.php @@ -23,7 +23,7 @@ class AddBillingAgreementToSessionObserverTest extends \PHPUnit_Framework_TestCa protected $_observer; /** - * @var \Magento\Framework\Object + * @var \Magento\Framework\DataObject */ protected $_event; @@ -39,7 +39,7 @@ class AddBillingAgreementToSessionObserverTest extends \PHPUnit_Framework_TestCa protected function setUp() { - $this->_event = new \Magento\Framework\Object(); + $this->_event = new \Magento\Framework\DataObject(); $this->_observer = new \Magento\Framework\Event\Observer(); $this->_observer->setEvent($this->_event); diff --git a/app/code/Magento/Paypal/Test/Unit/Observer/AddPaypalShortcutsObserverTest.php b/app/code/Magento/Paypal/Test/Unit/Observer/AddPaypalShortcutsObserverTest.php index 0b7dbe369a835..cd24897c96111 100644 --- a/app/code/Magento/Paypal/Test/Unit/Observer/AddPaypalShortcutsObserverTest.php +++ b/app/code/Magento/Paypal/Test/Unit/Observer/AddPaypalShortcutsObserverTest.php @@ -23,7 +23,7 @@ class AddPaypalShortcutsObserverTest extends \PHPUnit_Framework_TestCase protected $_observer; /** - * @var \Magento\Framework\Object + * @var \Magento\Framework\DataObject */ protected $_event; @@ -34,7 +34,7 @@ class AddPaypalShortcutsObserverTest extends \PHPUnit_Framework_TestCase protected function setUp() { - $this->_event = new \Magento\Framework\Object(); + $this->_event = new \Magento\Framework\DataObject(); $this->_observer = new \Magento\Framework\Event\Observer(); $this->_observer->setEvent($this->_event); diff --git a/app/code/Magento/Paypal/Test/Unit/Observer/HtmlTransactionIdObserverTest.php b/app/code/Magento/Paypal/Test/Unit/Observer/HtmlTransactionIdObserverTest.php index 4f60635c42bb6..79d941a794c67 100644 --- a/app/code/Magento/Paypal/Test/Unit/Observer/HtmlTransactionIdObserverTest.php +++ b/app/code/Magento/Paypal/Test/Unit/Observer/HtmlTransactionIdObserverTest.php @@ -21,7 +21,7 @@ class HtmlTransactionIdObserverTest extends \PHPUnit_Framework_TestCase protected $_observer; /** - * @var \Magento\Framework\Object + * @var \Magento\Framework\DataObject */ protected $_event; @@ -32,7 +32,7 @@ class HtmlTransactionIdObserverTest extends \PHPUnit_Framework_TestCase protected function setUp() { - $this->_event = new \Magento\Framework\Object(); + $this->_event = new \Magento\Framework\DataObject(); $this->_observer = new \Magento\Framework\Event\Observer(); $this->_observer->setEvent($this->_event); diff --git a/app/code/Magento/Paypal/Test/Unit/Observer/SetResponseAfterSaveOrderObserverTest.php b/app/code/Magento/Paypal/Test/Unit/Observer/SetResponseAfterSaveOrderObserverTest.php index 400216120f747..f0e08b53b4cd5 100644 --- a/app/code/Magento/Paypal/Test/Unit/Observer/SetResponseAfterSaveOrderObserverTest.php +++ b/app/code/Magento/Paypal/Test/Unit/Observer/SetResponseAfterSaveOrderObserverTest.php @@ -21,7 +21,7 @@ class SetResponseAfterSaveOrderObserverTest extends \PHPUnit_Framework_TestCase protected $_observer; /** - * @var \Magento\Framework\Object + * @var \Magento\Framework\DataObject */ protected $_event; @@ -42,7 +42,7 @@ class SetResponseAfterSaveOrderObserverTest extends \PHPUnit_Framework_TestCase protected function setUp() { - $this->_event = new \Magento\Framework\Object(); + $this->_event = new \Magento\Framework\DataObject(); $this->_observer = new \Magento\Framework\Event\Observer(); $this->_observer->setEvent($this->_event); @@ -133,7 +133,7 @@ public function testSetResponseAfterSaveOrderSuccess() $paymentMock = $this->getMockBuilder('Magento\Sales\Model\Order\Payment') ->disableOriginalConstructor() ->getMock(); - $resultMock = $this->getMockBuilder('Magento\Framework\Object') + $resultMock = $this->getMockBuilder('Magento\Framework\DataObject') ->disableOriginalConstructor() ->getMock(); $layoutMock = $this->getMockBuilder('Magento\Framework\View\LayoutInterface') From 551cf5e2310151a1eb1560f08115db052d6d6136 Mon Sep 17 00:00:00 2001 From: Michail Slabko Date: Tue, 4 Aug 2015 17:37:14 +0300 Subject: [PATCH 13/13] MAGETWO-41085: Delivery MAGETWO-31442 - Adaptation of code to PHP7 --- .../Checkout/Test/Unit/Observer/SalesQuoteSaveAfterTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/code/Magento/Checkout/Test/Unit/Observer/SalesQuoteSaveAfterTest.php b/app/code/Magento/Checkout/Test/Unit/Observer/SalesQuoteSaveAfterTest.php index 7f3f2962e6309..234b16e5eda44 100644 --- a/app/code/Magento/Checkout/Test/Unit/Observer/SalesQuoteSaveAfterTest.php +++ b/app/code/Magento/Checkout/Test/Unit/Observer/SalesQuoteSaveAfterTest.php @@ -31,8 +31,8 @@ public function testSalesQuoteSaveAfter() { $observer = $this->getMock('Magento\Framework\Event\Observer', [], [], '', false); $observer->expects($this->once())->method('getEvent')->will( - $this->returnValue(new \Magento\Framework\Object( - ['quote' => new \Magento\Framework\Object(['is_checkout_cart' => 1, 'id' => 7])] + $this->returnValue(new \Magento\Framework\DataObject( + ['quote' => new \Magento\Framework\DataObject(['is_checkout_cart' => 1, 'id' => 7])] )) ); $this->checkoutSession->expects($this->once())->method('getQuoteId')->with(7);