From f233e853b1db02a3d1b9ccfec896ce7cca537be7 Mon Sep 17 00:00:00 2001
From: Iryna Lagno <ilagno@magento.com>
Date: Thu, 15 Sep 2016 14:46:03 +0300
Subject: [PATCH] MAGETWO-58039: Table rate shipping not applying correctly -
 for mainline

---
 .../Model/Quote/Address/Total/Shipping.php    |   7 +-
 .../Quote/Api/GuestShipmentEstimationTest.php | 109 ++++++++++++++++++
 .../_files/cart_rule_free_shipping.php        |  74 ++++++++++++
 .../cart_rule_free_shipping_rollback.php      |  14 +++
 4 files changed, 200 insertions(+), 4 deletions(-)
 create mode 100644 dev/tests/api-functional/testsuite/Magento/Quote/Api/GuestShipmentEstimationTest.php
 create mode 100644 dev/tests/integration/testsuite/Magento/SalesRule/_files/cart_rule_free_shipping.php
 create mode 100644 dev/tests/integration/testsuite/Magento/SalesRule/_files/cart_rule_free_shipping_rollback.php

diff --git a/app/code/Magento/Quote/Model/Quote/Address/Total/Shipping.php b/app/code/Magento/Quote/Model/Quote/Address/Total/Shipping.php
index 88edeb5b99d..f1660c9f9d6 100644
--- a/app/code/Magento/Quote/Model/Quote/Address/Total/Shipping.php
+++ b/app/code/Magento/Quote/Model/Quote/Address/Total/Shipping.php
@@ -60,10 +60,9 @@ class Shipping extends \Magento\Quote\Model\Quote\Address\Total\AbstractTotal
         $addressWeight = $address->getWeight();
         $freeMethodWeight = $address->getFreeMethodWeight();
 
-        $isAllFree = $this->freeShipping->isFreeShipping($quote, $shippingAssignment->getItems());
-        if ($isAllFree && !$address->getFreeShipping()) {
-            $address->setFreeShipping(true);
-        }
+        $address->setFreeShipping(
+            $this->freeShipping->isFreeShipping($quote, $shippingAssignment->getItems())
+        );
         $total->setTotalAmount($this->getCode(), 0);
         $total->setBaseTotalAmount($this->getCode(), 0);
 
diff --git a/dev/tests/api-functional/testsuite/Magento/Quote/Api/GuestShipmentEstimationTest.php b/dev/tests/api-functional/testsuite/Magento/Quote/Api/GuestShipmentEstimationTest.php
new file mode 100644
index 00000000000..9dea7ab0511
--- /dev/null
+++ b/dev/tests/api-functional/testsuite/Magento/Quote/Api/GuestShipmentEstimationTest.php
@@ -0,0 +1,109 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Quote\Api;
+
+use Magento\TestFramework\ObjectManager;
+use Magento\TestFramework\TestCase\WebapiAbstract;
+use Magento\Quote\Api\Data\AddressInterface;
+
+class GuestShipmentEstimationTest extends WebapiAbstract
+{
+    const SERVICE_VERSION = 'V1';
+    const SERVICE_NAME = 'quoteGuestShipmentEstimationV1';
+    const RESOURCE_PATH = '/V1/guest-carts/';
+
+    /**
+     * @var ObjectManager
+     */
+    private $objectManager;
+
+    protected function setUp()
+    {
+        $this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+    }
+
+    /**
+     * @magentoApiDataFixture Magento/SalesRule/_files/cart_rule_free_shipping.php
+     * @magentoApiDataFixture Magento/Sales/_files/quote.php
+     */
+    public function testEstimateByExtendedAddress()
+    {
+        /** @var \Magento\Quote\Model\Quote $quote */
+        $quote = $this->objectManager->create(\Magento\Quote\Model\Quote::class);
+        $quote->load('test01', 'reserved_order_id');
+        $cartId = $quote->getId();
+        if (!$cartId) {
+            $this->fail('quote fixture failed');
+        }
+
+        /** @var \Magento\Quote\Model\QuoteIdMask $quoteIdMask */
+        $quoteIdMask = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+            ->create(\Magento\Quote\Model\QuoteIdMaskFactory::class)
+            ->create();
+        $quoteIdMask->load($cartId, 'quote_id');
+        //Use masked cart Id
+        $cartId = $quoteIdMask->getMaskedId();
+        $serviceInfo = [
+            'rest' => [
+                'resourcePath' => '/V1/guest-carts/' . $cartId . '/estimate-shipping-methods',
+                'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
+            ],
+            'soap' => [
+                'service' => self::SERVICE_NAME,
+                'serviceVersion' => 'V1',
+                'operation' => self::SERVICE_NAME . 'EstimateByExtendedAddress',
+            ],
+        ];
+        if (TESTS_WEB_API_ADAPTER == self::ADAPTER_SOAP) {
+            /** @var \Magento\Quote\Model\Quote\Address $address */
+            $address = $quote->getBillingAddress();
+
+            $data = [
+                AddressInterface::KEY_ID => (int)$address->getId(),
+                AddressInterface::KEY_REGION => $address->getRegion(),
+                AddressInterface::KEY_REGION_ID => $address->getRegionId(),
+                AddressInterface::KEY_REGION_CODE => $address->getRegionCode(),
+                AddressInterface::KEY_COUNTRY_ID => $address->getCountryId(),
+                AddressInterface::KEY_STREET => $address->getStreet(),
+                AddressInterface::KEY_COMPANY => $address->getCompany(),
+                AddressInterface::KEY_TELEPHONE => $address->getTelephone(),
+                AddressInterface::KEY_POSTCODE => $address->getPostcode(),
+                AddressInterface::KEY_CITY => $address->getCity(),
+                AddressInterface::KEY_FIRSTNAME => $address->getFirstname(),
+                AddressInterface::KEY_LASTNAME => $address->getLastname(),
+                AddressInterface::KEY_CUSTOMER_ID => $address->getCustomerId(),
+                AddressInterface::KEY_EMAIL => $address->getEmail(),
+                AddressInterface::SAME_AS_BILLING => $address->getSameAsBilling(),
+                AddressInterface::CUSTOMER_ADDRESS_ID => $address->getCustomerAddressId(),
+                AddressInterface::SAVE_IN_ADDRESS_BOOK => $address->getSaveInAddressBook(),
+            ];
+
+            $requestData = [
+                'cartId' => $cartId,
+                'address' => $data
+            ];
+        } else {
+            $requestData = [
+                'address' => [
+                    'country_id' => "US",
+                    'postcode' => null,
+                    'region' => null,
+                    'region_id' => null
+                ],
+            ];
+        }
+        // Cart must be anonymous (see fixture)
+        $this->assertEmpty($quote->getCustomerId());
+
+        $result = $this->_webApiCall($serviceInfo, $requestData);
+        $this->assertNotEmpty($result);
+        $this->assertEquals(1, count($result));
+        foreach ($result as $rate) {
+            $this->assertEquals("flatrate", $rate['carrier_code']);
+            $this->assertEquals(0, $rate['amount']);
+        }
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/SalesRule/_files/cart_rule_free_shipping.php b/dev/tests/integration/testsuite/Magento/SalesRule/_files/cart_rule_free_shipping.php
new file mode 100644
index 00000000000..3d5dd9d6f49
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/SalesRule/_files/cart_rule_free_shipping.php
@@ -0,0 +1,74 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+
+$salesRuleFactory = $objectManager->create(\Magento\SalesRule\Model\RuleFactory::class);
+/** @var \Magento\SalesRule\Model\Rule $salesRule */
+$salesRule = $salesRuleFactory->create();
+$row =
+    [
+        'name' => 'Free shipping if item price >10',
+        'is_active' => 1,
+        'customer_group_ids' => [\Magento\Customer\Model\GroupManagement::NOT_LOGGED_IN_ID],
+        'coupon_type' => \Magento\SalesRule\Model\Rule::COUPON_TYPE_NO_COUPON,
+        'conditions' => [
+            1 =>
+                [
+                    'type' => \Magento\SalesRule\Model\Rule\Condition\Combine::class,
+                    'attribute' => null,
+                    'operator' => null,
+                    'value' => '1',
+                    'is_value_processed' => null,
+                    'aggregator' => 'all',
+                ]
+
+        ],
+        'actions' => [
+            1 => [
+                'type' => Magento\SalesRule\Model\Rule\Condition\Product\Combine::class,
+                'attribute' => null,
+                'operator' => null,
+                'value' => '1',
+                'is_value_processed' => null,
+                'aggregator' => 'all',
+                'conditions' => [
+                    [
+                        'type' => Magento\SalesRule\Model\Rule\Condition\Product::class,
+                        'attribute' => 'quote_item_price',
+                        'operator' => '==',
+                        'value' => '7',
+                        'is_value_processed' => false,
+                    ]
+                ]
+            ]
+        ],
+        'is_advanced' => 1,
+        'simple_action' => 'by_percent',
+        'discount_amount' => 0,
+        'stop_rules_processing' => 0,
+        'discount_qty' => 0,
+        'discount_step' => 0,
+        'apply_to_shipping' => 1,
+        'times_used' => 0,
+        'is_rss' => 1,
+        'use_auto_generation' => 0,
+        'uses_per_coupon' => 0,
+        'simple_free_shipping' => 1,
+
+        'website_ids' => [
+            \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
+                \Magento\Store\Model\StoreManagerInterface::class
+            )->getWebsite()->getId()
+        ]
+    ];
+$salesRule->loadPost($row);
+$salesRule->save();
+/** @var Magento\Framework\Registry $registry */
+$registry = $objectManager->get(\Magento\Framework\Registry::class);
+
+$registry->unregister('cart_rule_free_shipping');
+$registry->register('cart_rule_free_shipping', $salesRule);
\ No newline at end of file
diff --git a/dev/tests/integration/testsuite/Magento/SalesRule/_files/cart_rule_free_shipping_rollback.php b/dev/tests/integration/testsuite/Magento/SalesRule/_files/cart_rule_free_shipping_rollback.php
new file mode 100644
index 00000000000..4669d6a5169
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/SalesRule/_files/cart_rule_free_shipping_rollback.php
@@ -0,0 +1,14 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+/** @var Magento\Framework\Registry $registry */
+$registry = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(\Magento\Framework\Registry::class);
+
+/** @var Magento\SalesRule\Model\Rule $rule */
+$rule = $registry->registry('cart_rule_free_shipping');
+if ($rule) {
+    $rule->delete();
+}
-- 
GitLab