From e7a90e5e8c8e71e475f9da4dc4d400a1a5dd47d0 Mon Sep 17 00:00:00 2001
From: Oleksandr Ivashchenko <oivashchenko@ebay.com>
Date: Thu, 18 Dec 2014 12:51:36 +0200
Subject: [PATCH] MAGETWO-17177: mass price update doesn't affect discount
 price

 - Created plugin instead of old indexer functionality
---
 .../Plugin/Model/Product/Action.php           | 42 ++++++++++
 .../Magento/CatalogRule/etc/adminhtml/di.xml  |  3 +
 .../Plugin/Model/Product/ActionTest.php       | 79 +++++++++++++++++++
 3 files changed, 124 insertions(+)
 create mode 100644 app/code/Magento/CatalogRule/Plugin/Model/Product/Action.php
 create mode 100644 dev/tests/unit/testsuite/Magento/CatalogRule/Plugin/Model/Product/ActionTest.php

diff --git a/app/code/Magento/CatalogRule/Plugin/Model/Product/Action.php b/app/code/Magento/CatalogRule/Plugin/Model/Product/Action.php
new file mode 100644
index 00000000000..c9dbc6742ab
--- /dev/null
+++ b/app/code/Magento/CatalogRule/Plugin/Model/Product/Action.php
@@ -0,0 +1,42 @@
+<?php
+/**
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ */
+
+namespace Magento\CatalogRule\Plugin\Model\Product;
+
+use Magento\Catalog\Model\Product\Action as ProductAction;
+use Magento\CatalogRule\Model\Indexer\Product\ProductRuleProcessor;
+
+class Action
+{
+    /**
+     * @var ProductRuleProcessor
+     */
+    protected $productRuleProcessor;
+
+    /**
+     * @param ProductRuleProcessor $productRuleProcessor
+     */
+    public function __construct(ProductRuleProcessor $productRuleProcessor)
+    {
+        $this->productRuleProcessor = $productRuleProcessor;
+    }
+
+    /**
+     * @param ProductAction $object
+     * @param ProductAction $result
+     * @return ProductAction
+     *
+     * @SuppressWarnings(PHPMD.UnusedFormatParameter)
+     */
+    public function afterUpdateAttributes(ProductAction $object, ProductAction $result)
+    {
+        $data = $result->getAttributesData();
+        if (!empty($data['price'])) {
+            $this->productRuleProcessor->reindexList($result->getProductIds());
+        }
+
+        return $result;
+    }
+}
diff --git a/app/code/Magento/CatalogRule/etc/adminhtml/di.xml b/app/code/Magento/CatalogRule/etc/adminhtml/di.xml
index 55eca2f1b83..7268cb0de6e 100644
--- a/app/code/Magento/CatalogRule/etc/adminhtml/di.xml
+++ b/app/code/Magento/CatalogRule/etc/adminhtml/di.xml
@@ -31,4 +31,7 @@
     <type name="Magento\Catalog\Model\Resource\Eav\Attribute">
         <plugin name="change_product_attribute" type="Magento\CatalogRule\Plugin\Indexer\Product\Attribute"/>
     </type>
+    <type name="Magento\Catalog\Model\Product\Action">
+        <plugin name="price_plugin" type="Magento\CatalogRule\Plugin\Model\Product\Action"/>
+    </type>
 </config>
diff --git a/dev/tests/unit/testsuite/Magento/CatalogRule/Plugin/Model/Product/ActionTest.php b/dev/tests/unit/testsuite/Magento/CatalogRule/Plugin/Model/Product/ActionTest.php
new file mode 100644
index 00000000000..189e4b63018
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/CatalogRule/Plugin/Model/Product/ActionTest.php
@@ -0,0 +1,79 @@
+<?php
+/**
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ */
+
+namespace Magento\CatalogRule\Plugin\Model\Product;
+
+class ActionTest extends \PHPUnit_Framework_TestCase
+{
+    /** @var \Magento\CatalogRule\Plugin\Model\Product\Action */
+    protected $action;
+
+    /** @var \Magento\CatalogRule\Model\Indexer\Product\ProductRuleProcessor|\PHPUnit_Framework_MockObject_MockObject */
+    protected $productRuleProcessor;
+
+    protected function setUp()
+    {
+        $this->productRuleProcessor = $this->getMockBuilder(
+            'Magento\CatalogRule\Model\Indexer\Product\ProductRuleProcessor'
+        )->disableOriginalConstructor()
+        ->setMethods(['reindexList'])
+        ->getMock();
+
+        $this->action = new Action($this->productRuleProcessor);
+    }
+
+    public function testAfterUpdateAttributes()
+    {
+        $subject = $this->getMockBuilder('Magento\Catalog\Model\Product\Action')
+            ->disableOriginalConstructor()
+            ->setMethods([])
+            ->getMock();
+
+        $result = $this->getMockBuilder('Magento\Catalog\Model\Product\Action')
+            ->disableOriginalConstructor()
+            ->setMethods(['getAttributesData', 'getProductIds'])
+            ->getMock();
+
+        $result->expects($this->once())
+            ->method('getAttributesData')
+            ->willReturn([]);
+
+        $result->expects($this->never())
+            ->method('getProductIds');
+
+        $this->productRuleProcessor->expects($this->never())
+            ->method('reindexList');
+
+        $this->action->afterUpdateAttributes($subject, $result);
+    }
+
+    public function testAfterUpdateAttributesWithPrice()
+    {
+        $productIds = [1, 2, 3];
+        $subject = $this->getMockBuilder('Magento\Catalog\Model\Product\Action')
+            ->disableOriginalConstructor()
+            ->setMethods([])
+            ->getMock();
+
+        $result = $this->getMockBuilder('Magento\Catalog\Model\Product\Action')
+            ->disableOriginalConstructor()
+            ->setMethods(['getAttributesData', 'getProductIds'])
+            ->getMock();
+
+        $result->expects($this->once())
+            ->method('getAttributesData')
+            ->willReturn(['price' => 100]);
+
+        $result->expects($this->once())
+            ->method('getProductIds')
+            ->willReturn($productIds);
+
+        $this->productRuleProcessor->expects($this->once())
+            ->method('reindexList')
+            ->with($productIds);
+
+        $this->action->afterUpdateAttributes($subject, $result);
+    }
+}
-- 
GitLab