Skip to content

Commit 2f11cf4

Browse files
MC-37083: Create automated test for "[Timezone] Sales Exported Dates"
1 parent 7ddd47e commit 2f11cf4

File tree

7 files changed

+734
-0
lines changed

7 files changed

+734
-0
lines changed
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\Sales\Controller\Adminhtml\Order\Creditmemo;
9+
10+
use Magento\Sales\Api\Data\CreditmemoInterface;
11+
use Magento\Sales\Model\ResourceModel\Order\Creditmemo\CollectionFactory;
12+
use Magento\Sales\Controller\Adminhtml\Order\ExportBase;
13+
14+
/**
15+
* Tests for creditmemo export via admin grids.
16+
*/
17+
class ExportTest extends ExportBase
18+
{
19+
/**
20+
* @var CollectionFactory
21+
*/
22+
private $creditmemoCollectionFactory;
23+
24+
/**
25+
* @inheritdoc
26+
*/
27+
protected function setUp(): void
28+
{
29+
parent::setUp();
30+
$this->creditmemoCollectionFactory = $this->_objectManager->get(CollectionFactory::class);
31+
}
32+
33+
/**
34+
* @magentoDbIsolation disabled
35+
* @magentoAppArea adminhtml
36+
* @magentoConfigFixture general/locale/timezone America/Chicago
37+
* @magentoConfigFixture test_website general/locale/timezone America/Adak
38+
* @magentoDataFixture Magento/Sales/_files/order_with_invoice_shipment_creditmemo_on_second_website.php
39+
* @dataProvider exportCreditmemoDataProvider
40+
* @param string $format
41+
* @param bool $addIdToUrl
42+
* @param string $namespace
43+
* @return void
44+
*/
45+
public function testExportCreditmemo(
46+
string $format,
47+
bool $addIdToUrl,
48+
string $namespace
49+
): void {
50+
$order = $this->getOrder('200000001');
51+
$url = $this->getExportUrl($format, $addIdToUrl ? (int)$order->getId() : null);
52+
$response = $this->dispatchExport(
53+
$url,
54+
['namespace' => $namespace, 'filters' => ['order_increment_id' => '200000001']]
55+
);
56+
$creditmemos = [];
57+
if ($format === ExportBase::CSV_FORMAT) {
58+
$creditmemos = $this->parseCsvResponse($response);
59+
} elseif ($format === ExportBase::XML_FORMAT) {
60+
$creditmemos = $this->parseXmlResponse($response);
61+
}
62+
$creditmemo = $this->getCreditmemo('200000001');
63+
$exportedCreditmemo = reset($creditmemos);
64+
$this->assertNotFalse($exportedCreditmemo);
65+
$this->assertEquals(
66+
$this->prepareDate($creditmemo->getCreatedAt(), 'America/Chicago'),
67+
$exportedCreditmemo['Created']
68+
);
69+
$this->assertEquals(
70+
$this->prepareDate($order->getCreatedAt(), 'America/Chicago'),
71+
$exportedCreditmemo['Order Date']
72+
);
73+
}
74+
75+
/**
76+
* @return array
77+
*/
78+
public function exportCreditmemoDataProvider(): array
79+
{
80+
return [
81+
'creditmemo_grid_in_csv' => [
82+
'format' => ExportBase::CSV_FORMAT,
83+
'add_id_to_url' => false,
84+
'namespace' => 'sales_order_creditmemo_grid',
85+
],
86+
'creditmemo_grid_in_csv_from_order_view' => [
87+
'format' => ExportBase::CSV_FORMAT,
88+
'add_id_to_url' => true,
89+
'namespace' => 'sales_order_view_creditmemo_grid',
90+
],
91+
'creditmemo_grid_in_xml' => [
92+
'format' => ExportBase::XML_FORMAT,
93+
'add_id_to_url' => false,
94+
'namespace' => 'sales_order_creditmemo_grid',
95+
],
96+
'creditmemo_grid_in_xml_from_order_view' => [
97+
'format' => ExportBase::XML_FORMAT,
98+
'add_id_to_url' => true,
99+
'namespace' => 'sales_order_view_creditmemo_grid',
100+
],
101+
];
102+
}
103+
104+
/**
105+
* Returns creditmemo by increment id.
106+
*
107+
* @param string $incrementId
108+
* @return CreditmemoInterface
109+
*/
110+
private function getCreditmemo(string $incrementId): CreditmemoInterface
111+
{
112+
/** @var CreditmemoInterface $creditmemo */
113+
$creditmemo = $this->creditmemoCollectionFactory->create()
114+
->addAttributeToFilter(CreditmemoInterface::INCREMENT_ID, $incrementId)
115+
->getFirstItem();
116+
117+
return $creditmemo;
118+
}
119+
}
Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\Sales\Controller\Adminhtml\Order;
9+
10+
use Magento\Framework\App\Request\Http;
11+
use Magento\Sales\Api\Data\OrderInterface;
12+
use Magento\Sales\Api\Data\OrderInterfaceFactory;
13+
use Magento\TestFramework\TestCase\AbstractBackendController;
14+
15+
/**
16+
* Tests for order/invoice/shipment/credit memo export via admin grids.
17+
*
18+
* @magentoDbIsolation disabled
19+
*/
20+
class ExportBase extends AbstractBackendController
21+
{
22+
const CSV_FORMAT = 'csv';
23+
const XML_FORMAT = 'xml';
24+
25+
/**
26+
* @var OrderInterfaceFactory
27+
*/
28+
private $orderFactory;
29+
30+
/**
31+
* @inheritdoc
32+
*/
33+
protected function setUp(): void
34+
{
35+
parent::setUp();
36+
$this->orderFactory = $this->_objectManager->get(OrderInterfaceFactory::class);
37+
}
38+
39+
/**
40+
* Dispatches export request.
41+
*
42+
* @param string $url
43+
* @param array $params
44+
* @return string
45+
*/
46+
protected function dispatchExport(string $url, array $params): string
47+
{
48+
$this->_auth->getAuthStorage()->setIsFirstPageAfterLogin(false);
49+
$this->getRequest()->setParams($params);
50+
$this->getRequest()->setMethod(Http::METHOD_POST);
51+
ob_start();
52+
$this->dispatch($url);
53+
54+
return ob_get_clean();
55+
}
56+
57+
/**
58+
* Converts string in scv format to assoc array.
59+
*
60+
* @param string $data
61+
* @return array
62+
*/
63+
protected function parseCsvResponse(string $data): array
64+
{
65+
$result = [];
66+
$data = str_getcsv($data, PHP_EOL);
67+
$headers = str_getcsv(array_shift($data), ',', '"');
68+
foreach ($data as $row) {
69+
$result[] = array_combine($headers, str_getcsv($row, ',', '"'));
70+
}
71+
72+
return $result;
73+
}
74+
75+
/**
76+
* Converts string in xml format to assoc array.
77+
*
78+
* @param string $data
79+
* @return array
80+
*/
81+
protected function parseXmlResponse(string $data): array
82+
{
83+
$xml = simplexml_load_string($data);
84+
$xmlAsArray = [];
85+
foreach ($xml->Worksheet->Table->Row as $item) {
86+
$row = [];
87+
foreach ($item->Cell as $cell) {
88+
$data = (array)$cell->Data;
89+
$row[] = reset($data);
90+
}
91+
$xmlAsArray[] = $row;
92+
}
93+
$result = [];
94+
$headers = array_shift($xmlAsArray);
95+
foreach ($xmlAsArray as $row) {
96+
$result[] = array_combine($headers, $row);
97+
}
98+
99+
return $result;
100+
}
101+
102+
/**
103+
* Returns order purchase date in timezone.
104+
*
105+
* @param string $date
106+
* @param string $timezone
107+
* @return string
108+
*/
109+
protected function prepareDate(string $date, string $timezone): string
110+
{
111+
$date = new \DateTime($date, new \DateTimeZone('UTC'));
112+
$date->setTimezone(new \DateTimeZone($timezone));
113+
114+
return $date->format('M j, Y h:i:s A');
115+
}
116+
117+
/**
118+
* Returns order by increment id.
119+
*
120+
* @param string $incrementId
121+
* @return OrderInterface
122+
*/
123+
protected function getOrder(string $incrementId): OrderInterface
124+
{
125+
return $this->orderFactory->create()->loadByIncrementId($incrementId);
126+
}
127+
128+
/**
129+
* Returns export url.
130+
*
131+
* @param string $format
132+
* @param int|null $orderId
133+
* @return string
134+
*/
135+
protected function getExportUrl(string $format, ?int $orderId = null): string
136+
{
137+
$url = $format === self::CSV_FORMAT
138+
? 'backend/mui/export/gridToCsv/'
139+
: 'backend/mui/export/gridToXml/';
140+
141+
return $orderId ? $url . 'order_id/' . $orderId : $url;
142+
}
143+
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\Sales\Controller\Adminhtml\Order;
9+
10+
/**
11+
* Tests for order export via admin grid.
12+
*/
13+
class ExportTest extends ExportBase
14+
{
15+
/**
16+
* @magentoDbIsolation disabled
17+
* @magentoAppArea adminhtml
18+
* @magentoConfigFixture general/locale/timezone America/Chicago
19+
* @magentoConfigFixture test_website general/locale/timezone America/Adak
20+
* @magentoDataFixture Magento/Sales/_files/order_with_invoice_shipment_creditmemo_on_second_website.php
21+
* @dataProvider exportOrderDataProvider
22+
* @param string $format
23+
* @param string $namespace
24+
* @return void
25+
*/
26+
public function testExportOrder(string $format, string $namespace): void
27+
{
28+
$order = $this->getOrder('200000001');
29+
$url = $this->getExportUrl($format, null);
30+
$response = $this->dispatchExport(
31+
$url,
32+
['namespace' => $namespace, 'filters' => ['increment_id' => '200000001']]
33+
);
34+
$orders = [];
35+
if ($format === ExportBase::CSV_FORMAT) {
36+
$orders = $this->parseCsvResponse($response);
37+
} elseif ($format === ExportBase::XML_FORMAT) {
38+
$orders = $this->parseXmlResponse($response);
39+
}
40+
$exportedOrder = reset($orders);
41+
$this->assertNotFalse($exportedOrder);
42+
$this->assertEquals(
43+
$this->prepareDate($order->getCreatedAt(), 'America/Chicago'),
44+
$exportedOrder['Purchase Date']
45+
);
46+
}
47+
48+
/**
49+
* @return array
50+
*/
51+
public function exportOrderDataProvider(): array
52+
{
53+
return [
54+
'order_grid_in_csv' => [
55+
'format' => ExportBase::CSV_FORMAT,
56+
'namespace' => 'sales_order_grid',
57+
],
58+
'order_grid_in_xml' => [
59+
'format' => ExportBase::XML_FORMAT,
60+
'namespace' => 'sales_order_grid',
61+
],
62+
];
63+
}
64+
}

0 commit comments

Comments
 (0)