Skip to content

Commit 2e30d81

Browse files
committed
Merge remote-tracking branch 'origin/MAGETWO-62627' into 2.0.16-develop-pr16
2 parents 3e090ef + e1407c3 commit 2e30d81

File tree

9 files changed

+342
-46
lines changed

9 files changed

+342
-46
lines changed

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

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -100,16 +100,15 @@ public function getConfig()
100100
GiftMessageHelper::XPATH_CONFIG_GIFT_MESSAGE_ALLOW_ITEMS,
101101
\Magento\Store\Model\ScopeInterface::SCOPE_STORE
102102
);
103-
if ($orderLevelGiftMessageConfiguration) {
104-
$orderMessages = $this->getOrderLevelGiftMessages();
105-
$configuration['isOrderLevelGiftOptionsEnabled'] = (bool)$this->isQuoteVirtual() ? false : true;
106-
$configuration['giftMessage']['orderLevel'] = $orderMessages === null ? true : $orderMessages->getData();
107-
}
108-
if ($itemLevelGiftMessageConfiguration) {
109-
$itemMessages = $this->getItemLevelGiftMessages();
110-
$configuration['isItemLevelGiftOptionsEnabled'] = true;
111-
$configuration['giftMessage']['itemLevel'] = $itemMessages === null ? true : $itemMessages;
112-
}
103+
104+
$orderMessages = $this->getOrderLevelGiftMessages();
105+
$configuration['isOrderLevelGiftOptionsEnabled'] = $orderLevelGiftMessageConfiguration && ((bool)$this->isQuoteVirtual() ? false : true);
106+
$configuration['giftMessage']['orderLevel'] = $orderMessages === null ? true : $orderMessages->getData();
107+
108+
$itemMessages = $this->getItemLevelGiftMessages();
109+
$configuration['isItemLevelGiftOptionsEnabled'] = $itemLevelGiftMessageConfiguration;
110+
$configuration['giftMessage']['itemLevel'] = $itemMessages === null ? true : $itemMessages;
111+
113112
$configuration['priceFormat'] = $this->localeFormat->getPriceFormat(
114113
null,
115114
$this->checkoutSession->getQuote()->getQuoteCurrencyCode()
@@ -121,6 +120,7 @@ public function getConfig()
121120
$configuration['baseUrl'] = $store->isFrontUrlSecure()
122121
? $store->getBaseUrl(UrlInterface::URL_TYPE_LINK, true)
123122
: $store->getBaseUrl(UrlInterface::URL_TYPE_LINK, false);
123+
124124
return $configuration;
125125
}
126126

@@ -162,6 +162,7 @@ protected function isQuoteVirtual()
162162
protected function getOrderLevelGiftMessages()
163163
{
164164
$cartId = $this->checkoutSession->getQuoteId();
165+
165166
return $this->cartRepository->get($cartId);
166167
}
167168

@@ -178,10 +179,15 @@ protected function getItemLevelGiftMessages()
178179
foreach ($items as $item) {
179180
$itemId = $item->getId();
180181
$message = $this->itemRepository->get($cartId, $itemId);
182+
$isAvailable = $item->getProduct()->getGiftMessageAvailable();
181183
if ($message) {
182-
$itemMessages[$itemId] = $message->getData();
184+
$itemMessages[$itemId]['message'] = $message->getData();
185+
}
186+
if ($isAvailable !== null) {
187+
$itemMessages[$itemId]['is_available'] = (bool)$isAvailable;
183188
}
184189
}
190+
185191
return count($itemMessages) === 0 ? null : $itemMessages;
186192
}
187193
}

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

Lines changed: 69 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,18 @@ protected function setUp()
9494
);
9595
}
9696

97-
public function testGetConfig()
98-
{
97+
/**
98+
* @param null|string $productMessageAvailable
99+
* @param array $messageData
100+
* @param array $expectedItemLevel
101+
* @dataProvider getConfigDataProvider
102+
* @return void
103+
*/
104+
public function testGetConfig(
105+
$productMessageAvailable,
106+
$messageData,
107+
$expectedItemLevel
108+
) {
99109
$orderLevel = true;
100110
$itemLevel = true;
101111
$isCustomerLoggedIn = true;
@@ -104,34 +114,28 @@ public function testGetConfig()
104114
$currencyCode = 'EUR';
105115
$priceFormat = [$currencyCode];
106116
$storeCode = 4;
107-
$messageDataMock = ['from' => 'John Doe', 'to' => 'Jane Doe'];
108117
$formKey = 'ABCDEFGHIJKLMNOP';
109118
$isFrontUrlSecure = true;
110119
$baseUrl = 'https://magento.com/';
111-
$quoteItemMock = $this->getMock('Magento\Quote\Model\Quote\Item', [], [], '', false);
120+
$quoteItemMock = $this->getMock(\Magento\Quote\Model\Quote\Item::class, [], [], '', false);
112121
$storeMock = $this->getMock(
113-
'Magento\Store\Model\Store',
122+
\Magento\Store\Model\Store::class,
114123
['isFrontUrlSecure', 'getBaseUrl', 'getCode'],
115124
[],
116125
'',
117126
false
118127
);
128+
$productMock = $this->getMock(\Magento\Catalog\Model\Product::class, [], [], '', false);
119129
$quoteMock = $this->getMock(
120-
'Magento\Quote\Model\Quote',
121-
['getQuoteCurrencyCode', 'getStore', 'getIsVirtual', 'getAllVisibleItems'],
130+
\Magento\Quote\Model\Quote::class,
131+
['getQuoteCurrencyCode', 'getStore', 'getIsVirtual', 'getAllVisibleItems', 'getId'],
122132
[],
123133
'',
124134
false
125135
);
126-
$messageMock = $this->getMockForAbstractClass(
127-
'Magento\GiftMessage\Api\Data\MessageInterface',
128-
[],
129-
'',
130-
false,
131-
false,
132-
false,
133-
['getData']
134-
);
136+
$messageMock = $this->getMockBuilder(\Magento\GiftMessage\Api\Data\MessageInterface::class)
137+
->setMethods(['getData'])
138+
->getMockForAbstractClass();
135139

136140
$this->scopeConfigMock->expects($this->atLeastOnce())->method('getValue')->willReturnMap(
137141
[
@@ -140,17 +144,20 @@ public function testGetConfig()
140144
]
141145
);
142146

147+
$quoteMock->expects($this->any())->method('getId')->willReturn($quoteId);
148+
143149
$this->checkoutSessionMock->expects($this->atLeastOnce())->method('getQuoteId')->willReturn($quoteId);
144150
$this->cartRepositoryMock->expects($this->once())->method('get')->with($quoteId)->willReturn($messageMock);
145151

146152
$this->checkoutSessionMock->expects($this->once())->method('loadCustomerQuote')->willReturnSelf();
147153
$this->checkoutSessionMock->expects($this->atLeastOnce())->method('getQuote')->willReturn($quoteMock);
148154
$quoteMock->expects($this->once())->method('getIsVirtual')->willReturn(false);
149155

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

152158
$quoteMock->expects($this->once())->method('getAllVisibleItems')->willReturn([$quoteItemMock]);
153159
$quoteItemMock->expects($this->once())->method('getId')->willReturn($itemId);
160+
$quoteItemMock->expects($this->any())->method('getProduct')->willReturn($productMock);
154161
$this->itemRepositoryMock->expects($this->once())->method('get')->with($quoteId, $itemId)
155162
->willReturn($messageMock);
156163

@@ -168,11 +175,12 @@ public function testGetConfig()
168175
$storeMock->expects($this->once())->method('isFrontUrlSecure')->willReturn($isFrontUrlSecure);
169176
$storeMock->expects($this->once())->method('getBaseUrl')->with(UrlInterface::URL_TYPE_LINK, $isFrontUrlSecure)
170177
->willReturn($baseUrl);
178+
$productMock->expects($this->once())->method('getGiftMessageAvailable')->willReturn($productMessageAvailable);
171179

172180
$expectedResult = [
173181
'giftMessage' => [
174-
'orderLevel' => $messageDataMock,
175-
'itemLevel' => [$itemId => $messageDataMock]
182+
'orderLevel' => $messageData,
183+
'itemLevel' => [$itemId => $expectedItemLevel]
176184
],
177185
'isOrderLevelGiftOptionsEnabled' => $orderLevel,
178186
'isItemLevelGiftOptionsEnabled' => $itemLevel,
@@ -185,4 +193,37 @@ public function testGetConfig()
185193

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

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: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
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+
/**
14+
* @var \Magento\Framework\ObjectManagerInterface
15+
*/
16+
private $objectManager;
17+
18+
/**
19+
* @var \Magento\Quote\Model\Quote\Item\ToOrderItem
20+
*/
21+
private $toOrderItem;
22+
23+
protected function setUp()
24+
{
25+
$this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
26+
27+
$this->toOrderItem = $this->objectManager->create(
28+
\Magento\Quote\Model\Quote\Item\ToOrderItem::class
29+
);
30+
}
31+
32+
/**
33+
* @magentoDataFixture Magento/Bundle/_files/product.php
34+
* @magentoDataFixture Magento/GiftMessage/_files/simple_quote_using_product.php
35+
* @magentoConfigFixture default_store sales/gift_options/allow_items 0
36+
* @return void
37+
*/
38+
public function testMessageAvailableMatchesDefaultFalse()
39+
{
40+
/** @var $quoteFixture \Magento\Quote\Model\Quote */
41+
$quoteFixture = $this->objectManager->create(\Magento\Quote\Model\Quote::class);
42+
$quoteFixture->load('test01', 'reserved_order_id');
43+
44+
$quoteItem = current($quoteFixture->getAllItems());
45+
46+
/** @var \Magento\Sales\Model\Order\Item $orderItem */
47+
$orderItem = $this->toOrderItem->convert($quoteItem);
48+
49+
$this->assertEquals(0, $orderItem->getGiftMessageAvailable());
50+
}
51+
52+
/**
53+
* @magentoDataFixture Magento/Bundle/_files/product.php
54+
* @magentoDataFixture Magento/GiftMessage/_files/simple_quote_using_product.php
55+
* @magentoConfigFixture default_store sales/gift_options/allow_items 1
56+
* @return void
57+
*/
58+
public function testMessageAvailableMatchesDefaultTrue()
59+
{
60+
/** @var $quoteFixture \Magento\Quote\Model\Quote */
61+
$quoteFixture = $this->objectManager->create(\Magento\Quote\Model\Quote::class);
62+
$quoteFixture->load('test01', 'reserved_order_id');
63+
64+
$quoteItem = current($quoteFixture->getAllItems());
65+
66+
/** @var \Magento\Sales\Model\Order\Item $orderItem */
67+
$orderItem = $this->toOrderItem->convert($quoteItem);
68+
69+
$this->assertEquals(1, $orderItem->getGiftMessageAvailable());
70+
}
71+
72+
/**
73+
* @magentoDataFixture Magento/GiftMessage/_files/product_with_message_available.php
74+
* @magentoDataFixture Magento/GiftMessage/_files/simple_quote_using_product.php
75+
* @magentoConfigFixture default_store sales/gift_options/allow_items 0
76+
* @return void
77+
*/
78+
public function testMessageAvailable()
79+
{
80+
/** @var $quoteFixture \Magento\Quote\Model\Quote */
81+
$quoteFixture = $this->objectManager->create(\Magento\Quote\Model\Quote::class);
82+
$quoteFixture->load('test01', 'reserved_order_id');
83+
84+
$quoteItem = current($quoteFixture->getAllItems());
85+
86+
/** @var \Magento\Sales\Model\Order\Item $orderItem */
87+
$orderItem = $this->toOrderItem->convert($quoteItem);
88+
89+
$this->assertEquals(1, $orderItem->getGiftMessageAvailable());
90+
}
91+
92+
/**
93+
* @magentoDataFixture Magento/GiftMessage/_files/product_with_message_not_available.php
94+
* @magentoDataFixture Magento/GiftMessage/_files/simple_quote_using_product.php
95+
* @magentoConfigFixture default_store sales/gift_options/allow_items 1
96+
* @return void
97+
*/
98+
public function testMessageNotAvailable()
99+
{
100+
/** @var $quoteFixture \Magento\Quote\Model\Quote */
101+
$quoteFixture = $this->objectManager->create(\Magento\Quote\Model\Quote::class);
102+
$quoteFixture->load('test01', 'reserved_order_id');
103+
104+
$quoteItem = current($quoteFixture->getAllItems());
105+
106+
/** @var \Magento\Sales\Model\Order\Item $orderItem */
107+
$orderItem = $this->toOrderItem->convert($quoteItem);
108+
109+
$this->assertEquals(0, $orderItem->getGiftMessageAvailable());
110+
}
111+
112+
}

0 commit comments

Comments
 (0)