Skip to content

Commit c870c37

Browse files
committed
MAGETWO-62627: [Backport] - Gift message appearing at product level when gift message is disable - for 2.0
1 parent 8ce538f commit c870c37

File tree

9 files changed

+370
-41
lines changed

9 files changed

+370
-41
lines changed

app/code/Magento/GiftMessage/Model/GiftMessageConfigProvider.php

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -105,11 +105,11 @@ public function getConfig()
105105
$configuration['isOrderLevelGiftOptionsEnabled'] = (bool)$this->isQuoteVirtual() ? false : true;
106106
$configuration['giftMessage']['orderLevel'] = $orderMessages === null ? true : $orderMessages->getData();
107107
}
108-
if ($itemLevelGiftMessageConfiguration) {
109-
$itemMessages = $this->getItemLevelGiftMessages();
110-
$configuration['isItemLevelGiftOptionsEnabled'] = true;
111-
$configuration['giftMessage']['itemLevel'] = $itemMessages === null ? true : $itemMessages;
112-
}
108+
109+
$itemMessages = $this->getItemLevelGiftMessages();
110+
$configuration['isItemLevelGiftOptionsEnabled'] = $itemLevelGiftMessageConfiguration;
111+
$configuration['giftMessage']['itemLevel'] = $itemMessages === null ? true : $itemMessages;
112+
113113
$configuration['priceFormat'] = $this->localeFormat->getPriceFormat(
114114
null,
115115
$this->checkoutSession->getQuote()->getQuoteCurrencyCode()
@@ -178,8 +178,12 @@ protected function getItemLevelGiftMessages()
178178
foreach ($items as $item) {
179179
$itemId = $item->getId();
180180
$message = $this->itemRepository->get($cartId, $itemId);
181+
$isAvailable = $item->getProduct()->getGiftMessageAvailable();
181182
if ($message) {
182-
$itemMessages[$itemId] = $message->getData();
183+
$itemMessages[$itemId]['message'] = $message->getData();
184+
}
185+
if ($isAvailable !== null) {
186+
$itemMessages[$itemId]['is_available'] = (bool)$isAvailable;
183187
}
184188
}
185189
return count($itemMessages) === 0 ? null : $itemMessages;

app/code/Magento/GiftMessage/Test/Unit/Model/GiftMessageConfigProviderTest.php

Lines changed: 68 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -59,22 +59,22 @@ class GiftMessageConfigProviderTest extends \PHPUnit_Framework_TestCase
5959

6060
protected function setUp()
6161
{
62-
$this->checkoutSessionMock = $this->getMock('Magento\Checkout\Model\Session', [], [], '', false);
63-
$this->httpContextMock = $this->getMock('Magento\Framework\App\Http\Context', [], [], '', false);
64-
$this->storeManagerMock = $this->getMock('Magento\Store\Model\StoreManagerInterface', [], [], '', false);
65-
$this->localeFormatMock = $this->getMock('Magento\Framework\Locale\FormatInterface', [], [], '', false);
66-
$this->formKeyMock = $this->getMock('Magento\Framework\Data\Form\FormKey', [], [], '', false);
67-
$this->scopeConfigMock = $this->getMock('Magento\Framework\App\Config\ScopeConfigInterface', [], [], '', false);
68-
$contextMock = $this->getMock('Magento\Framework\App\Helper\Context', [], [], '', false);
62+
$this->checkoutSessionMock = $this->getMock(\Magento\Checkout\Model\Session::class, [], [], '', false);
63+
$this->httpContextMock = $this->getMock(\Magento\Framework\App\Http\Context::class, [], [], '', false);
64+
$this->storeManagerMock = $this->getMock(\Magento\Store\Model\StoreManagerInterface::class, [], [], '', false);
65+
$this->localeFormatMock = $this->getMock(\Magento\Framework\Locale\FormatInterface::class, [], [], '', false);
66+
$this->formKeyMock = $this->getMock(\Magento\Framework\Data\Form\FormKey::class, [], [], '', false);
67+
$this->scopeConfigMock = $this->getMock(\Magento\Framework\App\Config\ScopeConfigInterface::class, [], [], '', false);
68+
$contextMock = $this->getMock(\Magento\Framework\App\Helper\Context::class, [], [], '', false);
6969
$this->cartRepositoryMock = $this->getMock(
70-
'Magento\GiftMessage\Api\CartRepositoryInterface',
70+
\Magento\GiftMessage\Api\CartRepositoryInterface::class,
7171
[],
7272
[],
7373
'',
7474
false
7575
);
7676
$this->itemRepositoryMock = $this->getMock(
77-
'Magento\GiftMessage\Api\ItemRepositoryInterface',
77+
\Magento\GiftMessage\Api\ItemRepositoryInterface::class,
7878
[],
7979
[],
8080
'',
@@ -94,8 +94,17 @@ protected function setUp()
9494
);
9595
}
9696

97-
public function testGetConfig()
98-
{
97+
/**
98+
* @param $productMessageAvailable
99+
* @param $messageData
100+
* @param $expectedItemLevel
101+
* @dataProvider getConfigDataProvider
102+
*/
103+
public function testGetConfig(
104+
$productMessageAvailable,
105+
$messageData,
106+
$expectedItemLevel
107+
) {
99108
$orderLevel = true;
100109
$itemLevel = true;
101110
$isCustomerLoggedIn = true;
@@ -104,34 +113,28 @@ public function testGetConfig()
104113
$currencyCode = 'EUR';
105114
$priceFormat = [$currencyCode];
106115
$storeCode = 4;
107-
$messageDataMock = ['from' => 'John Doe', 'to' => 'Jane Doe'];
108116
$formKey = 'ABCDEFGHIJKLMNOP';
109117
$isFrontUrlSecure = true;
110118
$baseUrl = 'https://magento.com/';
111-
$quoteItemMock = $this->getMock('Magento\Quote\Model\Quote\Item', [], [], '', false);
119+
$quoteItemMock = $this->getMock(\Magento\Quote\Model\Quote\Item::class, [], [], '', false);
112120
$storeMock = $this->getMock(
113-
'Magento\Store\Model\Store',
121+
\Magento\Store\Model\Store::class,
114122
['isFrontUrlSecure', 'getBaseUrl', 'getCode'],
115123
[],
116124
'',
117125
false
118126
);
127+
$productMock = $this->getMock(\Magento\Catalog\Model\Product::class, [], [], '', false);
119128
$quoteMock = $this->getMock(
120-
'Magento\Quote\Model\Quote',
121-
['getQuoteCurrencyCode', 'getStore', 'getIsVirtual', 'getAllVisibleItems'],
129+
\Magento\Quote\Model\Quote::class,
130+
['getQuoteCurrencyCode', 'getStore', 'getIsVirtual', 'getAllVisibleItems', 'getId'],
122131
[],
123132
'',
124133
false
125134
);
126-
$messageMock = $this->getMockForAbstractClass(
127-
'Magento\GiftMessage\Api\Data\MessageInterface',
128-
[],
129-
'',
130-
false,
131-
false,
132-
false,
133-
['getData']
134-
);
135+
$messageMock = $this->getMockBuilder(\Magento\GiftMessage\Api\Data\MessageInterface::class)
136+
->setMethods(['getData'])
137+
->getMockForAbstractClass();
135138

136139
$this->scopeConfigMock->expects($this->atLeastOnce())->method('getValue')->willReturnMap(
137140
[
@@ -140,17 +143,20 @@ public function testGetConfig()
140143
]
141144
);
142145

146+
$quoteMock->expects($this->any())->method('getId')->willReturn($quoteId);
147+
143148
$this->checkoutSessionMock->expects($this->atLeastOnce())->method('getQuoteId')->willReturn($quoteId);
144149
$this->cartRepositoryMock->expects($this->once())->method('get')->with($quoteId)->willReturn($messageMock);
145150

146151
$this->checkoutSessionMock->expects($this->once())->method('loadCustomerQuote')->willReturnSelf();
147152
$this->checkoutSessionMock->expects($this->atLeastOnce())->method('getQuote')->willReturn($quoteMock);
148153
$quoteMock->expects($this->once())->method('getIsVirtual')->willReturn(false);
149154

150-
$messageMock->expects($this->atLeastOnce())->method('getData')->willReturn($messageDataMock);
155+
$messageMock->expects($this->atLeastOnce())->method('getData')->willReturn($messageData);
151156

152157
$quoteMock->expects($this->once())->method('getAllVisibleItems')->willReturn([$quoteItemMock]);
153158
$quoteItemMock->expects($this->once())->method('getId')->willReturn($itemId);
159+
$quoteItemMock->expects($this->any())->method('getProduct')->willReturn($productMock);
154160
$this->itemRepositoryMock->expects($this->once())->method('get')->with($quoteId, $itemId)
155161
->willReturn($messageMock);
156162

@@ -168,11 +174,12 @@ public function testGetConfig()
168174
$storeMock->expects($this->once())->method('isFrontUrlSecure')->willReturn($isFrontUrlSecure);
169175
$storeMock->expects($this->once())->method('getBaseUrl')->with(UrlInterface::URL_TYPE_LINK, $isFrontUrlSecure)
170176
->willReturn($baseUrl);
177+
$productMock->expects($this->once())->method('getGiftMessageAvailable')->willReturn($productMessageAvailable);
171178

172179
$expectedResult = [
173180
'giftMessage' => [
174-
'orderLevel' => $messageDataMock,
175-
'itemLevel' => [$itemId => $messageDataMock]
181+
'orderLevel' => $messageData,
182+
'itemLevel' => [$itemId => $expectedItemLevel]
176183
],
177184
'isOrderLevelGiftOptionsEnabled' => $orderLevel,
178185
'isItemLevelGiftOptionsEnabled' => $itemLevel,
@@ -185,4 +192,37 @@ public function testGetConfig()
185192

186193
$this->assertSame($expectedResult, $this->model->getConfig());
187194
}
195+
196+
/**
197+
* @return array
198+
*/
199+
public function getConfigDataProvider()
200+
{
201+
$messageData = ['from' => 'John Doe', 'to' => 'Jane Doe'];
202+
return [
203+
[
204+
'productMessageAvailable' => null,
205+
'messageData' => $messageData,
206+
'expectedItemLevel' => [
207+
'message' => $messageData
208+
]
209+
],
210+
[
211+
'productMessageAvailable' => '0',
212+
'messageData' => $messageData,
213+
'expectedItemLevel' => [
214+
'message' => $messageData,
215+
'is_available' => false
216+
]
217+
],
218+
[
219+
'productMessageAvailable' => '1',
220+
'messageData' => $messageData,
221+
'expectedItemLevel' => [
222+
'message' => $messageData,
223+
'is_available' => true
224+
]
225+
]
226+
];
227+
}
188228
}

app/code/Magento/GiftMessage/view/frontend/web/js/model/gift-message.js

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ define(['uiElement', 'underscore', 'mage/url'],
3232
message =
3333
window.giftOptionsConfig.giftMessage.hasOwnProperty('itemLevel')
3434
&& window.giftOptionsConfig.giftMessage['itemLevel'].hasOwnProperty(this.itemId)
35-
? window.giftOptionsConfig.giftMessage['itemLevel'][this.itemId]
35+
&& window.giftOptionsConfig.giftMessage['itemLevel'][this.itemId].hasOwnProperty('message')
36+
? window.giftOptionsConfig.giftMessage['itemLevel'][this.itemId]['message']
3637
: null;
3738
}
3839
if (_.isObject(message)) {
@@ -103,6 +104,31 @@ define(['uiElement', 'underscore', 'mage/url'],
103104
}
104105
});
105106
return params;
107+
},
108+
/**
109+
* Check if gift message can be displayed.
110+
*
111+
* @returns {Boolean}
112+
*/
113+
isGiftMessageAvailable: function () {
114+
var isGloballyAvailable,
115+
giftMessageConfig,
116+
itemConfig;
117+
118+
// itemId represent gift message level: 'orderLevel' constant or cart item ID
119+
if (this.itemId === 'orderLevel') {
120+
return this.getConfigValue('isOrderLevelGiftOptionsEnabled');
121+
}
122+
123+
// gift message product configuration must override system configuration
124+
isGloballyAvailable = this.getConfigValue('isItemLevelGiftOptionsEnabled');
125+
giftMessageConfig = window.giftOptionsConfig.giftMessage;
126+
itemConfig = giftMessageConfig.hasOwnProperty('itemLevel') &&
127+
giftMessageConfig.itemLevel.hasOwnProperty(this.itemId) ?
128+
giftMessageConfig.itemLevel[this.itemId] :
129+
{};
130+
131+
return itemConfig.hasOwnProperty('is_available') ? itemConfig['is_available'] : isGloballyAvailable;
106132
}
107133
};
108134
model.initialize();

app/code/Magento/GiftMessage/view/frontend/web/js/view/gift-message.js

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -78,12 +78,7 @@ define([
7878
return false;
7979
},
8080
isActive: function() {
81-
switch (this.itemId) {
82-
case 'orderLevel':
83-
return this.model.getConfigValue('isOrderLevelGiftOptionsEnabled') == true;
84-
default:
85-
return this.model.getConfigValue('isItemLevelGiftOptionsEnabled') == true;
86-
}
81+
return this.model.isGiftMessageAvailable();
8782
},
8883
submitOptions: function() {
8984
giftOptionsService(this.model);
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
<?php
2+
/**
3+
* Copyright © 2013-2017 Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\GiftMessage\Helper\Message;
7+
8+
/**
9+
* Class QuoteItemTest
10+
*/
11+
class QuoteItemTest extends \PHPUnit_Framework_TestCase
12+
{
13+
/** @var \Magento\Framework\ObjectManagerInterface */
14+
protected $objectManager;
15+
16+
/** @var \Magento\Quote\Model\Quote\Item\ToOrderItem */
17+
protected $toOrderItem;
18+
19+
protected function setUp()
20+
{
21+
$this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
22+
23+
$this->toOrderItem = $this->objectManager->create(
24+
\Magento\Quote\Model\Quote\Item\ToOrderItem::class
25+
);
26+
}
27+
28+
/**
29+
* @magentoDataFixture Magento/Bundle/_files/product.php
30+
* @magentoDataFixture Magento/GiftMessage/_files/simple_quote_using_product.php
31+
* @magentoConfigFixture default_store sales/gift_options/allow_items 0
32+
*/
33+
public function testMessageAvailableMatchesDefaultFalse()
34+
{
35+
/** @var $quoteFixture \Magento\Quote\Model\Quote */
36+
$quoteFixture = $this->objectManager->create(\Magento\Quote\Model\Quote::class);
37+
$quoteFixture->load('test01', 'reserved_order_id');
38+
39+
$quoteItem = current($quoteFixture->getAllItems());
40+
41+
/** @var \Magento\Sales\Model\Order\Item $orderItem */
42+
$orderItem = $this->toOrderItem->convert($quoteItem);
43+
44+
$this->assertEquals(0, $orderItem->getGiftMessageAvailable());
45+
}
46+
47+
/**
48+
* @magentoDataFixture Magento/Bundle/_files/product.php
49+
* @magentoDataFixture Magento/GiftMessage/_files/simple_quote_using_product.php
50+
* @magentoConfigFixture default_store sales/gift_options/allow_items 1
51+
*/
52+
public function testMessageAvailableMatchesDefaultTrue()
53+
{
54+
/** @var $quoteFixture \Magento\Quote\Model\Quote */
55+
$quoteFixture = $this->objectManager->create(\Magento\Quote\Model\Quote::class);
56+
$quoteFixture->load('test01', 'reserved_order_id');
57+
58+
$quoteItem = current($quoteFixture->getAllItems());
59+
60+
/** @var \Magento\Sales\Model\Order\Item $orderItem */
61+
$orderItem = $this->toOrderItem->convert($quoteItem);
62+
63+
$this->assertEquals(1, $orderItem->getGiftMessageAvailable());
64+
}
65+
66+
/**
67+
* @magentoDataFixture Magento/GiftMessage/_files/product_with_message_available.php
68+
* @magentoDataFixture Magento/GiftMessage/_files/simple_quote_using_product.php
69+
* @magentoConfigFixture default_store sales/gift_options/allow_items 0
70+
*/
71+
public function testMessageAvailable()
72+
{
73+
/** @var $quoteFixture \Magento\Quote\Model\Quote */
74+
$quoteFixture = $this->objectManager->create(\Magento\Quote\Model\Quote::class);
75+
$quoteFixture->load('test01', 'reserved_order_id');
76+
77+
$quoteItem = current($quoteFixture->getAllItems());
78+
79+
/** @var \Magento\Sales\Model\Order\Item $orderItem */
80+
$orderItem = $this->toOrderItem->convert($quoteItem);
81+
82+
$this->assertEquals(1, $orderItem->getGiftMessageAvailable());
83+
}
84+
85+
/**
86+
* @magentoDataFixture Magento/GiftMessage/_files/product_with_message_not_available.php
87+
* @magentoDataFixture Magento/GiftMessage/_files/simple_quote_using_product.php
88+
* @magentoConfigFixture default_store sales/gift_options/allow_items 1
89+
*/
90+
public function testMessageNotAvailable()
91+
{
92+
/** @var $quoteFixture \Magento\Quote\Model\Quote */
93+
$quoteFixture = $this->objectManager->create(\Magento\Quote\Model\Quote::class);
94+
$quoteFixture->load('test01', 'reserved_order_id');
95+
96+
$quoteItem = current($quoteFixture->getAllItems());
97+
98+
/** @var \Magento\Sales\Model\Order\Item $orderItem */
99+
$orderItem = $this->toOrderItem->convert($quoteItem);
100+
101+
$this->assertEquals(0, $orderItem->getGiftMessageAvailable());
102+
}
103+
104+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?php
2+
/**
3+
* Copyright © 2013-2017 Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
/** @var $product \Magento\Catalog\Model\Product */
8+
$product = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
9+
\Magento\Catalog\Model\Product::class
10+
);
11+
12+
$product->setTypeId(
13+
'virtual'
14+
)->setId(
15+
1
16+
)->setAttributeSetId(
17+
4
18+
)->setName(
19+
'Simple Product'
20+
)->setSku(
21+
'simple'
22+
)->setPrice(
23+
10
24+
)->setStoreId(
25+
1
26+
)->setStockData(
27+
['use_config_manage_stock' => 1, 'qty' => 100, 'is_qty_decimal' => 0, 'is_in_stock' => 100]
28+
)->setVisibility(
29+
\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH
30+
)->setStatus(
31+
\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED
32+
)->setData(
33+
'gift_message_available',
34+
'1'
35+
)->save();

0 commit comments

Comments
 (0)