Skip to content

Commit f233e85

Browse files
committed
MAGETWO-58039: Table rate shipping not applying correctly - for mainline
1 parent 7597a52 commit f233e85

File tree

4 files changed

+200
-4
lines changed

4 files changed

+200
-4
lines changed

app/code/Magento/Quote/Model/Quote/Address/Total/Shipping.php

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,9 @@ public function collect(
6060
$addressWeight = $address->getWeight();
6161
$freeMethodWeight = $address->getFreeMethodWeight();
6262

63-
$isAllFree = $this->freeShipping->isFreeShipping($quote, $shippingAssignment->getItems());
64-
if ($isAllFree && !$address->getFreeShipping()) {
65-
$address->setFreeShipping(true);
66-
}
63+
$address->setFreeShipping(
64+
$this->freeShipping->isFreeShipping($quote, $shippingAssignment->getItems())
65+
);
6766
$total->setTotalAmount($this->getCode(), 0);
6867
$total->setBaseTotalAmount($this->getCode(), 0);
6968

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
<?php
2+
/**
3+
* Copyright © 2016 Magento. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\Quote\Api;
7+
8+
use Magento\TestFramework\ObjectManager;
9+
use Magento\TestFramework\TestCase\WebapiAbstract;
10+
use Magento\Quote\Api\Data\AddressInterface;
11+
12+
class GuestShipmentEstimationTest extends WebapiAbstract
13+
{
14+
const SERVICE_VERSION = 'V1';
15+
const SERVICE_NAME = 'quoteGuestShipmentEstimationV1';
16+
const RESOURCE_PATH = '/V1/guest-carts/';
17+
18+
/**
19+
* @var ObjectManager
20+
*/
21+
private $objectManager;
22+
23+
protected function setUp()
24+
{
25+
$this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
26+
}
27+
28+
/**
29+
* @magentoApiDataFixture Magento/SalesRule/_files/cart_rule_free_shipping.php
30+
* @magentoApiDataFixture Magento/Sales/_files/quote.php
31+
*/
32+
public function testEstimateByExtendedAddress()
33+
{
34+
/** @var \Magento\Quote\Model\Quote $quote */
35+
$quote = $this->objectManager->create(\Magento\Quote\Model\Quote::class);
36+
$quote->load('test01', 'reserved_order_id');
37+
$cartId = $quote->getId();
38+
if (!$cartId) {
39+
$this->fail('quote fixture failed');
40+
}
41+
42+
/** @var \Magento\Quote\Model\QuoteIdMask $quoteIdMask */
43+
$quoteIdMask = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
44+
->create(\Magento\Quote\Model\QuoteIdMaskFactory::class)
45+
->create();
46+
$quoteIdMask->load($cartId, 'quote_id');
47+
//Use masked cart Id
48+
$cartId = $quoteIdMask->getMaskedId();
49+
$serviceInfo = [
50+
'rest' => [
51+
'resourcePath' => '/V1/guest-carts/' . $cartId . '/estimate-shipping-methods',
52+
'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_POST,
53+
],
54+
'soap' => [
55+
'service' => self::SERVICE_NAME,
56+
'serviceVersion' => 'V1',
57+
'operation' => self::SERVICE_NAME . 'EstimateByExtendedAddress',
58+
],
59+
];
60+
if (TESTS_WEB_API_ADAPTER == self::ADAPTER_SOAP) {
61+
/** @var \Magento\Quote\Model\Quote\Address $address */
62+
$address = $quote->getBillingAddress();
63+
64+
$data = [
65+
AddressInterface::KEY_ID => (int)$address->getId(),
66+
AddressInterface::KEY_REGION => $address->getRegion(),
67+
AddressInterface::KEY_REGION_ID => $address->getRegionId(),
68+
AddressInterface::KEY_REGION_CODE => $address->getRegionCode(),
69+
AddressInterface::KEY_COUNTRY_ID => $address->getCountryId(),
70+
AddressInterface::KEY_STREET => $address->getStreet(),
71+
AddressInterface::KEY_COMPANY => $address->getCompany(),
72+
AddressInterface::KEY_TELEPHONE => $address->getTelephone(),
73+
AddressInterface::KEY_POSTCODE => $address->getPostcode(),
74+
AddressInterface::KEY_CITY => $address->getCity(),
75+
AddressInterface::KEY_FIRSTNAME => $address->getFirstname(),
76+
AddressInterface::KEY_LASTNAME => $address->getLastname(),
77+
AddressInterface::KEY_CUSTOMER_ID => $address->getCustomerId(),
78+
AddressInterface::KEY_EMAIL => $address->getEmail(),
79+
AddressInterface::SAME_AS_BILLING => $address->getSameAsBilling(),
80+
AddressInterface::CUSTOMER_ADDRESS_ID => $address->getCustomerAddressId(),
81+
AddressInterface::SAVE_IN_ADDRESS_BOOK => $address->getSaveInAddressBook(),
82+
];
83+
84+
$requestData = [
85+
'cartId' => $cartId,
86+
'address' => $data
87+
];
88+
} else {
89+
$requestData = [
90+
'address' => [
91+
'country_id' => "US",
92+
'postcode' => null,
93+
'region' => null,
94+
'region_id' => null
95+
],
96+
];
97+
}
98+
// Cart must be anonymous (see fixture)
99+
$this->assertEmpty($quote->getCustomerId());
100+
101+
$result = $this->_webApiCall($serviceInfo, $requestData);
102+
$this->assertNotEmpty($result);
103+
$this->assertEquals(1, count($result));
104+
foreach ($result as $rate) {
105+
$this->assertEquals("flatrate", $rate['carrier_code']);
106+
$this->assertEquals(0, $rate['amount']);
107+
}
108+
}
109+
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
<?php
2+
/**
3+
* Copyright © 2016 Magento. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
8+
9+
$salesRuleFactory = $objectManager->create(\Magento\SalesRule\Model\RuleFactory::class);
10+
/** @var \Magento\SalesRule\Model\Rule $salesRule */
11+
$salesRule = $salesRuleFactory->create();
12+
$row =
13+
[
14+
'name' => 'Free shipping if item price >10',
15+
'is_active' => 1,
16+
'customer_group_ids' => [\Magento\Customer\Model\GroupManagement::NOT_LOGGED_IN_ID],
17+
'coupon_type' => \Magento\SalesRule\Model\Rule::COUPON_TYPE_NO_COUPON,
18+
'conditions' => [
19+
1 =>
20+
[
21+
'type' => \Magento\SalesRule\Model\Rule\Condition\Combine::class,
22+
'attribute' => null,
23+
'operator' => null,
24+
'value' => '1',
25+
'is_value_processed' => null,
26+
'aggregator' => 'all',
27+
]
28+
29+
],
30+
'actions' => [
31+
1 => [
32+
'type' => Magento\SalesRule\Model\Rule\Condition\Product\Combine::class,
33+
'attribute' => null,
34+
'operator' => null,
35+
'value' => '1',
36+
'is_value_processed' => null,
37+
'aggregator' => 'all',
38+
'conditions' => [
39+
[
40+
'type' => Magento\SalesRule\Model\Rule\Condition\Product::class,
41+
'attribute' => 'quote_item_price',
42+
'operator' => '==',
43+
'value' => '7',
44+
'is_value_processed' => false,
45+
]
46+
]
47+
]
48+
],
49+
'is_advanced' => 1,
50+
'simple_action' => 'by_percent',
51+
'discount_amount' => 0,
52+
'stop_rules_processing' => 0,
53+
'discount_qty' => 0,
54+
'discount_step' => 0,
55+
'apply_to_shipping' => 1,
56+
'times_used' => 0,
57+
'is_rss' => 1,
58+
'use_auto_generation' => 0,
59+
'uses_per_coupon' => 0,
60+
'simple_free_shipping' => 1,
61+
62+
'website_ids' => [
63+
\Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
64+
\Magento\Store\Model\StoreManagerInterface::class
65+
)->getWebsite()->getId()
66+
]
67+
];
68+
$salesRule->loadPost($row);
69+
$salesRule->save();
70+
/** @var Magento\Framework\Registry $registry */
71+
$registry = $objectManager->get(\Magento\Framework\Registry::class);
72+
73+
$registry->unregister('cart_rule_free_shipping');
74+
$registry->register('cart_rule_free_shipping', $salesRule);
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
/**
3+
* Copyright © 2016 Magento. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
/** @var Magento\Framework\Registry $registry */
8+
$registry = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(\Magento\Framework\Registry::class);
9+
10+
/** @var Magento\SalesRule\Model\Rule $rule */
11+
$rule = $registry->registry('cart_rule_free_shipping');
12+
if ($rule) {
13+
$rule->delete();
14+
}

0 commit comments

Comments
 (0)