Skip to content

Commit 48ffa60

Browse files
committed
MAGETWO-63456: [Backport] Wrong address template used for order e-mails - for 2.0
1 parent 54d4e70 commit 48ffa60

File tree

5 files changed

+315
-37
lines changed

5 files changed

+315
-37
lines changed

app/code/Magento/Sales/Model/Order/Address/Renderer.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ public function __construct(
4848
*/
4949
public function format(Address $address, $type)
5050
{
51+
$this->addressConfig->setStore($address->getOrder()->getStoreId());
5152
$formatType = $this->addressConfig->getFormatByCode($type);
5253
if (!$formatType || !$formatType->getRenderer()) {
5354
return null;
Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
<?php
2+
/**
3+
* Copyright © 2016 Magento. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\Sales\Test\Unit\Model\Order\Address;
7+
8+
use Magento\Customer\Block\Address\Renderer\RendererInterface as CustomerAddressBlockRenderer;
9+
use Magento\Customer\Model\Address\Config as CustomerAddressConfig;
10+
use Magento\Framework\DataObject;
11+
use Magento\Framework\Event\ManagerInterface as EventManager;
12+
use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper;
13+
use Magento\Sales\Model\Order;
14+
use Magento\Sales\Model\Order\Address as OrderAddress;
15+
use Magento\Sales\Model\Order\Address\Renderer as OrderAddressRenderer;
16+
17+
/**
18+
* Class RendererTest covers Magento\Sales\Model\Order\Address\Renderer::format.
19+
*/
20+
class RendererTest extends \PHPUnit_Framework_TestCase
21+
{
22+
/**
23+
* @var OrderAddressRenderer
24+
*/
25+
private $orderAddressRenderer;
26+
27+
/**
28+
* @var ObjectManagerHelper
29+
*/
30+
private $objectManagerHelper;
31+
32+
/**
33+
* @var CustomerAddressConfig|\PHPUnit_Framework_MockObject_MockObject
34+
*/
35+
private $customerAddressConfigMock;
36+
37+
/**
38+
* @var EventManager|\PHPUnit_Framework_MockObject_MockObject
39+
*/
40+
private $eventManagerMock;
41+
42+
/**
43+
* @var OrderAddress|\PHPUnit_Framework_MockObject_MockObject
44+
*/
45+
private $orderAddressMock;
46+
47+
/**
48+
* @var Order|\PHPUnit_Framework_MockObject_MockObject
49+
*/
50+
private $orderMock;
51+
52+
/**
53+
* @var CustomerAddressBlockRenderer|\PHPUnit_Framework_MockObject_MockObject
54+
*/
55+
private $customerAddressBlockRendererMock;
56+
57+
/**
58+
* Prepare mocks for tests.
59+
*/
60+
protected function setUp()
61+
{
62+
$this->customerAddressConfigMock = $this->getMockBuilder(CustomerAddressConfig::class)
63+
->disableOriginalConstructor()
64+
->getMock();
65+
$this->eventManagerMock = $this->getMockBuilder(EventManager::class)
66+
->getMockForAbstractClass();
67+
$this->orderAddressMock = $this->getMockBuilder(OrderAddress::class)
68+
->disableOriginalConstructor()
69+
->getMock();
70+
$this->orderMock = $this->getMockBuilder(Order::class)
71+
->disableOriginalConstructor()
72+
->getMock();
73+
$this->customerAddressBlockRendererMock = $this->getMockBuilder(CustomerAddressBlockRenderer::class)
74+
->getMockForAbstractClass();
75+
76+
$this->orderAddressMock->expects(static::any())
77+
->method('getOrder')
78+
->willReturn($this->orderMock);
79+
80+
$this->objectManagerHelper = new ObjectManagerHelper($this);
81+
$this->orderAddressRenderer = $this->objectManagerHelper->getObject(
82+
OrderAddressRenderer::class,
83+
[
84+
'addressConfig' => $this->customerAddressConfigMock,
85+
'eventManager' => $this->eventManagerMock
86+
]
87+
);
88+
}
89+
90+
/**
91+
* Run test fromat.
92+
*/
93+
public function testFormat()
94+
{
95+
$type = 'html';
96+
$formatType = new DataObject(['renderer' => $this->customerAddressBlockRendererMock]);
97+
$addressData = ['address', 'data'];
98+
$result = 'result string';
99+
100+
$this->setStoreExpectations(1);
101+
$this->customerAddressConfigMock->expects(static::atLeastOnce())
102+
->method('getFormatByCode')
103+
->with($type)
104+
->willReturn($formatType);
105+
$this->eventManagerMock->expects(static::once())
106+
->method('dispatch')
107+
->with('customer_address_format', ['type' => $formatType, 'address' => $this->orderAddressMock]);
108+
$this->orderAddressMock->expects(static::atLeastOnce())
109+
->method('getData')
110+
->willReturn($addressData);
111+
$this->customerAddressBlockRendererMock->expects(static::once())
112+
->method('renderArray')
113+
->with($addressData, null)
114+
->willReturn($result);
115+
116+
$this->assertEquals($result, $this->orderAddressRenderer->format($this->orderAddressMock, $type));
117+
}
118+
119+
/**
120+
* Run test format without renderer.
121+
*/
122+
public function testFormatNoRenderer()
123+
{
124+
$type = 'html';
125+
126+
$this->setStoreExpectations(1);
127+
$this->customerAddressConfigMock->expects(static::atLeastOnce())
128+
->method('getFormatByCode')
129+
->with($type)
130+
->willReturn(null);
131+
$this->eventManagerMock->expects(static::never())
132+
->method('dispatch');
133+
134+
$this->assertEquals(null, $this->orderAddressRenderer->format($this->orderAddressMock, $type));
135+
}
136+
137+
/**
138+
* Set expectations for store.
139+
*
140+
* @param string|int $storeId
141+
* @return void
142+
*/
143+
private function setStoreExpectations($storeId)
144+
{
145+
$this->orderMock->expects(static::atLeastOnce())
146+
->method('getStoreId')
147+
->willReturn($storeId);
148+
$this->customerAddressConfigMock->expects(static::atLeastOnce())
149+
->method('setStore')
150+
->with($storeId)
151+
->willReturnSelf();
152+
}
153+
}
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\Sales\Model\Order\Address;
7+
8+
use Magento\Config\Model\ResourceModel\Config as ConfigResourceModel;
9+
use Magento\Framework\App\ReinitableConfig;
10+
use Magento\Framework\ObjectManagerInterface;
11+
use Magento\Sales\Model\Order;
12+
use Magento\Sales\Model\Order\Address as OrderAddress;
13+
use Magento\Sales\Model\Order\Address\Renderer as OrderAddressRenderer;
14+
use Magento\Store\Model\Store;
15+
use Magento\TestFramework\Helper\Bootstrap;
16+
17+
/**
18+
* Class RendererTest test address templates render in store scope.
19+
*/
20+
class RendererTest extends \PHPUnit_Framework_TestCase
21+
{
22+
/**
23+
* @var ObjectManagerInterface
24+
*/
25+
private $objectManager;
26+
27+
/**
28+
* @var OrderAddressRenderer
29+
*/
30+
private $orderAddressRenderer;
31+
32+
/**
33+
* @var ConfigResourceModel
34+
*/
35+
private $configResourceModel;
36+
37+
/**
38+
* @var ReinitableConfig
39+
*/
40+
private $reinitableConfig;
41+
42+
/**
43+
* Prepare objects for test.
44+
*/
45+
protected function setUp()
46+
{
47+
$this->objectManager = Bootstrap::getObjectManager();
48+
$this->orderAddressRenderer = $this->objectManager->get(OrderAddressRenderer::class);
49+
$this->configResourceModel = $this->objectManager->get(ConfigResourceModel::class);
50+
$this->reinitableConfig = $this->objectManager->get(ReinitableConfig::class);
51+
}
52+
53+
/**
54+
* @magentoDataFixture Magento/Sales/_files/order_fixture_store.php
55+
* @magentoDbIsolation enabled
56+
* @magentoAppIsolation enabled
57+
*/
58+
public function testFormat()
59+
{
60+
$addressTemplates = [
61+
'text' => 'text_customized',
62+
'oneline' => 'oneline_customized',
63+
'html' => 'html_customized',
64+
'pdf' => 'pdf_customized'
65+
];
66+
67+
/** @var Store $store */
68+
$store = $this->objectManager->create(Store::class);
69+
$storeId = $store->load('fixturestore')->getStoreId();
70+
71+
$this->configResourceModel->saveConfig(
72+
'customer/address_templates/text',
73+
$addressTemplates['text'],
74+
'stores',
75+
$storeId
76+
);
77+
$this->configResourceModel->saveConfig(
78+
'customer/address_templates/oneline',
79+
$addressTemplates['oneline'],
80+
'stores',
81+
$storeId
82+
);
83+
$this->configResourceModel->saveConfig(
84+
'customer/address_templates/html',
85+
$addressTemplates['html'],
86+
'stores',
87+
$storeId
88+
);
89+
$this->configResourceModel->saveConfig(
90+
'customer/address_templates/pdf',
91+
$addressTemplates['pdf'],
92+
'stores',
93+
$storeId
94+
);
95+
$this->reinitableConfig->reinit();
96+
97+
/** @var Order $order */
98+
$order = $this->objectManager->create(Order::class)
99+
->loadByIncrementId('100000004');
100+
101+
/** @var OrderAddress $address */
102+
$address = $order->getBillingAddress();
103+
104+
$this->assertEquals($addressTemplates['text'], $this->orderAddressRenderer->format($address, 'text'));
105+
$this->assertEquals($addressTemplates['oneline'], $this->orderAddressRenderer->format($address, 'oneline'));
106+
$this->assertEquals($addressTemplates['html'], $this->orderAddressRenderer->format($address, 'html'));
107+
$this->assertEquals($addressTemplates['pdf'], $this->orderAddressRenderer->format($address, 'pdf'));
108+
}
109+
}

dev/tests/integration/testsuite/Magento/Sales/_files/order_fixture_store.php

Lines changed: 35 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -4,55 +4,53 @@
44
* See COPYING.txt for license details.
55
*/
66

7-
// @codingStandardsIgnoreFile
7+
use Magento\TestFramework\Helper\Bootstrap as BootstrapHelper;
8+
use Magento\Framework\Indexer\IndexerRegistry;
9+
use Magento\CatalogSearch\Model\Indexer\Fulltext as FulltextIndexer;
10+
use Magento\Catalog\Model\Product;
11+
use Magento\Sales\Model\Order\Address as OrderAddress;
12+
use Magento\Sales\Model\Order\Payment as OrderPayment;
13+
use Magento\Sales\Model\Order\Item as OrderItem;
14+
use Magento\Sales\Model\Order;
15+
use Magento\Store\Model\StoreManagerInterface;
816

9-
require __DIR__ . '/../../../Magento/Store/_files/core_fixturestore.php';
17+
require __DIR__ . '/../../Store/_files/core_fixturestore.php';
1018

11-
require __DIR__ . '/../../../Magento/Catalog/_files/product_simple_duplicated.php';
12-
/** @var \Magento\Catalog\Model\Product $product */
19+
$objectManager = BootstrapHelper::getObjectManager();
20+
$objectManager->get(IndexerRegistry::class)
21+
->get(FulltextIndexer::INDEXER_ID)
22+
->reindexAll();
1323

14-
$addressData = include __DIR__ . '/address_data.php';
24+
require __DIR__ . '/../../Catalog/_files/product_simple_duplicated.php';
1525

16-
$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
26+
$addressData = include __DIR__ . '/address_data.php';
1727

18-
$billingAddress = $objectManager->create('Magento\Sales\Model\Order\Address', ['data' => $addressData]);
28+
$billingAddress = $objectManager->create(OrderAddress::class, ['data' => $addressData]);
1929
$billingAddress->setAddressType('billing');
2030

2131
$shippingAddress = clone $billingAddress;
2232
$shippingAddress->setId(null)->setAddressType('shipping');
2333

24-
$payment = $objectManager->create('Magento\Sales\Model\Order\Payment');
34+
$payment = $objectManager->create(OrderPayment::class);
2535
$payment->setMethod('checkmo');
2636

27-
/** @var \Magento\Sales\Model\Order\Item $orderItem */
28-
$orderItem = $objectManager->create('Magento\Sales\Model\Order\Item');
37+
/** @var OrderItem $orderItem */
38+
$orderItem = $objectManager->create(OrderItem::class);
39+
/** @var Product $product */
2940
$orderItem->setProductId($product->getId())->setQtyOrdered(2);
3041

31-
/** @var \Magento\Sales\Model\Order $order */
32-
$order = $objectManager->create('Magento\Sales\Model\Order');
33-
$order->setIncrementId(
34-
'100000004'
35-
)->setState(
36-
\Magento\Sales\Model\Order::STATE_PROCESSING
37-
)->setStatus(
38-
$order->getConfig()->getStateDefaultStatus(\Magento\Sales\Model\Order::STATE_PROCESSING)
39-
)->setSubtotal(
40-
100
41-
)->setBaseSubtotal(
42-
100
43-
)->setCustomerIsGuest(
44-
true
45-
)->setCustomerEmail(
46-
'customer@null.com'
47-
)->setBillingAddress(
48-
$billingAddress
49-
)->setShippingAddress(
50-
$shippingAddress
51-
)->setStoreId(
52-
$objectManager->get('Magento\Store\Model\StoreManagerInterface')->getStore('fixturestore')->getId()
53-
)->addItem(
54-
$orderItem
55-
)->setPayment(
56-
$payment
57-
);
42+
/** @var Order $order */
43+
$order = $objectManager->create(Order::class);
44+
$order->setIncrementId('100000004')
45+
->setState(Order::STATE_PROCESSING)
46+
->setStatus($order->getConfig()->getStateDefaultStatus(Order::STATE_PROCESSING))
47+
->setSubtotal(100)
48+
->setBaseSubtotal(100)
49+
->setCustomerIsGuest(true)
50+
->setCustomerEmail('customer@null.com')
51+
->setBillingAddress($billingAddress)
52+
->setShippingAddress($shippingAddress)
53+
->setStoreId($objectManager->get(StoreManagerInterface::class)->getStore('fixturestore')->getId())
54+
->addItem($orderItem)
55+
->setPayment($payment);
5856
$order->save();
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
/**
3+
* Copyright © 2016 Magento. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
use Magento\TestFramework\Helper\Bootstrap;
8+
use Magento\Framework\Indexer\IndexerRegistry;
9+
use Magento\CatalogSearch\Model\Indexer\Fulltext as FulltextIndexer;
10+
11+
require __DIR__ . '/default_rollback.php';
12+
require __DIR__ . '/../../Catalog/_files/product_simple_duplicated_rollback.php';
13+
require __DIR__ . '/../../Store/_files/core_fixturestore_rollback.php';
14+
15+
Bootstrap::getObjectManager()->get(IndexerRegistry::class)
16+
->get(FulltextIndexer::INDEXER_ID)
17+
->reindexAll();

0 commit comments

Comments
 (0)