Skip to content

Commit d0e6327

Browse files
merge magento/2.3.6-develop into magento-borg/MC-32796
2 parents 14eebc1 + f20fb6d commit d0e6327

File tree

1,272 files changed

+31325
-18176
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

1,272 files changed

+31325
-18176
lines changed

CHANGELOG.md

Lines changed: 136 additions & 0 deletions
Large diffs are not rendered by default.

app/code/Magento/Analytics/Controller/Adminhtml/Reports/Show.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class Show extends Action implements HttpGetActionInterface
2727
/**
2828
* @inheritdoc
2929
*/
30-
const ADMIN_RESOURCE = 'Magento_Analytics::analytics_settings';
30+
const ADMIN_RESOURCE = 'Magento_Analytics::advanced_reporting';
3131

3232
/**
3333
* @param Context $context

app/code/Magento/Analytics/Model/ReportWriter.php

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010

1111
/**
1212
* Writes reports in files in csv format
13-
* @inheritdoc
1413
*/
1514
class ReportWriter implements ReportWriterInterface
1615
{
@@ -54,7 +53,7 @@ public function __construct(
5453
}
5554

5655
/**
57-
* {@inheritdoc}
56+
* @inheritdoc
5857
*/
5958
public function write(WriteInterface $directory, $path)
6059
{
@@ -81,7 +80,7 @@ public function write(WriteInterface $directory, $path)
8180
$headers = array_keys($row);
8281
$stream->writeCsv($headers);
8382
}
84-
$stream->writeCsv($row);
83+
$stream->writeCsv($this->prepareRow($row));
8584
}
8685
$stream->unlock();
8786
$stream->close();
@@ -98,4 +97,18 @@ public function write(WriteInterface $directory, $path)
9897

9998
return true;
10099
}
100+
101+
/**
102+
* Replace wrong symbols in row
103+
*
104+
* @param array $row
105+
* @return array
106+
*/
107+
private function prepareRow(array $row): array
108+
{
109+
$row = preg_replace('/(?<!\\\\)"/', '\\"', $row);
110+
$row = preg_replace('/[\\\\]+/', '\\', $row);
111+
112+
return $row;
113+
}
101114
}

app/code/Magento/Analytics/Test/Unit/Model/ReportWriterTest.php

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,38 +3,43 @@
33
* Copyright © Magento, Inc. All rights reserved.
44
* See COPYING.txt for license details.
55
*/
6+
declare(strict_types=1);
7+
68
namespace Magento\Analytics\Test\Unit\Model;
79

810
use Magento\Analytics\Model\ConfigInterface;
911
use Magento\Analytics\Model\ProviderFactory;
1012
use Magento\Analytics\Model\ReportWriter;
1113
use Magento\Analytics\ReportXml\DB\ReportValidator;
1214
use Magento\Analytics\ReportXml\ReportProvider;
13-
use Magento\Framework\Filesystem\Directory\WriteInterface;
15+
use Magento\Framework\Filesystem\Directory\WriteInterface as DirectoryWriteInterface;
16+
use Magento\Framework\Filesystem\File\WriteInterface as FileWriteInterface;
1417
use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper;
18+
use PHPUnit\Framework\MockObject\MockObject;
19+
use PHPUnit\Framework\TestCase;
1520

1621
/**
1722
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
1823
*/
19-
class ReportWriterTest extends \PHPUnit\Framework\TestCase
24+
class ReportWriterTest extends TestCase
2025
{
2126
/**
22-
* @var ConfigInterface|\PHPUnit_Framework_MockObject_MockObject
27+
* @var ConfigInterface|MockObject
2328
*/
2429
private $configInterfaceMock;
2530

2631
/**
27-
* @var ReportValidator|\PHPUnit_Framework_MockObject_MockObject
32+
* @var ReportValidator|MockObject
2833
*/
2934
private $reportValidatorMock;
3035

3136
/**
32-
* @var ProviderFactory|\PHPUnit_Framework_MockObject_MockObject
37+
* @var ProviderFactory|MockObject
3338
*/
3439
private $providerFactoryMock;
3540

3641
/**
37-
* @var ReportProvider|\PHPUnit_Framework_MockObject_MockObject
42+
* @var ReportProvider|MockObject
3843
*/
3944
private $reportProviderMock;
4045

@@ -44,7 +49,7 @@ class ReportWriterTest extends \PHPUnit\Framework\TestCase
4449
private $objectManagerHelper;
4550

4651
/**
47-
* @var WriteInterface|\PHPUnit_Framework_MockObject_MockObject
52+
* @var DirectoryWriteInterface|MockObject
4853
*/
4954
private $directoryMock;
5055

@@ -80,7 +85,7 @@ protected function setUp()
8085
->disableOriginalConstructor()->getMock();
8186
$this->reportProviderMock = $this->getMockBuilder(ReportProvider::class)
8287
->disableOriginalConstructor()->getMock();
83-
$this->directoryMock = $this->getMockBuilder(WriteInterface::class)->getMockForAbstractClass();
88+
$this->directoryMock = $this->getMockBuilder(DirectoryWriteInterface::class)->getMockForAbstractClass();
8489
$this->objectManagerHelper = new ObjectManagerHelper($this);
8590

8691
$this->reportWriter = $this->objectManagerHelper->getObject(
@@ -95,16 +100,15 @@ protected function setUp()
95100

96101
/**
97102
* @param array $configData
103+
* @param array $fileData
104+
* @param array $expectedFileData
98105
* @return void
99106
*
100107
* @dataProvider configDataProvider
101108
*/
102-
public function testWrite(array $configData)
109+
public function testWrite(array $configData, array $fileData, array $expectedFileData)
103110
{
104111
$errors = [];
105-
$fileData = [
106-
['number' => 1, 'type' => 'Shoes Usual']
107-
];
108112
$this->configInterfaceMock
109113
->expects($this->once())
110114
->method('get')
@@ -123,7 +127,7 @@ public function testWrite(array $configData)
123127
->with($parameterName ?: null)
124128
->willReturn($fileData);
125129
$errorStreamMock = $this->getMockBuilder(
126-
\Magento\Framework\Filesystem\File\WriteInterface::class
130+
FileWriteInterface::class
127131
)->getMockForAbstractClass();
128132
$errorStreamMock
129133
->expects($this->once())
@@ -133,8 +137,8 @@ public function testWrite(array $configData)
133137
->expects($this->exactly(2))
134138
->method('writeCsv')
135139
->withConsecutive(
136-
[array_keys($fileData[0])],
137-
[$fileData[0]]
140+
[array_keys($expectedFileData[0])],
141+
[$expectedFileData[0]]
138142
);
139143
$errorStreamMock->expects($this->once())->method('unlock');
140144
$errorStreamMock->expects($this->once())->method('close');
@@ -166,7 +170,7 @@ public function testWriteErrorFile($configData)
166170
$errors = ['orders', 'SQL Error: test'];
167171
$this->configInterfaceMock->expects($this->once())->method('get')->willReturn([$configData]);
168172
$errorStreamMock = $this->getMockBuilder(
169-
\Magento\Framework\Filesystem\File\WriteInterface::class
173+
FileWriteInterface::class
170174
)->getMockForAbstractClass();
171175
$errorStreamMock->expects($this->once())->method('lock');
172176
$errorStreamMock->expects($this->once())->method('writeCsv')->with($errors);
@@ -196,7 +200,7 @@ public function configDataProvider()
196200
{
197201
return [
198202
'reportProvider' => [
199-
[
203+
'configData' => [
200204
'providers' => [
201205
[
202206
'name' => $this->providerName,
@@ -206,6 +210,12 @@ public function configDataProvider()
206210
],
207211
]
208212
]
213+
],
214+
'fileData' => [
215+
['number' => 1, 'type' => 'Shoes\"" Usual\\\\"']
216+
],
217+
'expectedFileData' => [
218+
['number' => 1, 'type' => 'Shoes\"\" Usual\\"']
209219
]
210220
],
211221
];

app/code/Magento/AsynchronousOperations/Model/BulkOperationsStatus.php

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,17 @@
88

99
namespace Magento\AsynchronousOperations\Model;
1010

11-
use Magento\Framework\Exception\NoSuchEntityException;
12-
use Magento\Framework\EntityManager\EntityManager;
11+
use Magento\AsynchronousOperations\Api\BulkStatusInterface;
12+
use Magento\AsynchronousOperations\Api\Data\BulkOperationsStatusInterface;
1313
use Magento\AsynchronousOperations\Api\Data\BulkOperationsStatusInterfaceFactory as BulkStatusShortFactory;
14+
use Magento\AsynchronousOperations\Api\Data\DetailedBulkOperationsStatusInterface;
1415
use Magento\AsynchronousOperations\Api\Data\DetailedBulkOperationsStatusInterfaceFactory as BulkStatusDetailedFactory;
15-
use Magento\AsynchronousOperations\Api\Data\OperationDetailsInterfaceFactory;
16-
use Magento\AsynchronousOperations\Api\BulkStatusInterface;
17-
use Magento\AsynchronousOperations\Model\ResourceModel\Operation\CollectionFactory;
16+
use Magento\AsynchronousOperations\Model\ResourceModel\Operation\CollectionFactory as OperationCollectionFactory;
17+
use Magento\Framework\EntityManager\EntityManager;
18+
use Magento\Framework\Exception\NoSuchEntityException;
1819

1920
/**
20-
* Class BulkStatus
21+
* Process bulk operations status.
2122
*/
2223
class BulkOperationsStatus implements BulkStatusInterface
2324
{
@@ -42,28 +43,26 @@ class BulkOperationsStatus implements BulkStatusInterface
4243
private $bulkStatus;
4344

4445
/**
45-
* @var CollectionFactory
46+
* @var OperationCollectionFactory
4647
*/
4748
private $operationCollectionFactory;
4849

4950
/**
50-
* Init dependencies.
51-
*
5251
* @param BulkStatus $bulkStatus
53-
* @param CollectionFactory $operationCollection
52+
* @param OperationCollectionFactory $operationCollection
5453
* @param BulkStatusDetailedFactory $bulkDetailedFactory
5554
* @param BulkStatusShortFactory $bulkShortFactory
56-
* @param \Magento\Framework\EntityManager\EntityManager $entityManager
55+
* @param EntityManager $entityManager
5756
*/
5857
public function __construct(
5958
BulkStatus $bulkStatus,
60-
CollectionFactory $operationCollection,
59+
OperationCollectionFactory $operationCollection,
6160
BulkStatusDetailedFactory $bulkDetailedFactory,
6261
BulkStatusShortFactory $bulkShortFactory,
6362
EntityManager $entityManager
6463
) {
65-
$this->operationCollectionFactory = $operationCollection;
6664
$this->bulkStatus = $bulkStatus;
65+
$this->operationCollectionFactory = $operationCollection;
6766
$this->bulkDetailedFactory = $bulkDetailedFactory;
6867
$this->bulkShortFactory = $bulkShortFactory;
6968
$this->entityManager = $entityManager;
@@ -82,7 +81,10 @@ public function getFailedOperationsByBulkId($bulkUuid, $failureType = null)
8281
*/
8382
public function getOperationsCountByBulkIdAndStatus($bulkUuid, $status)
8483
{
85-
return $this->bulkStatus->getOperationsCountByBulkIdAndStatus($bulkUuid, $status);
84+
return $this->operationCollectionFactory->create()
85+
->addFieldToFilter('bulk_uuid', $bulkUuid)
86+
->addFieldToFilter('status', $status)
87+
->getSize();
8688
}
8789

8890
/**
@@ -108,7 +110,7 @@ public function getBulkDetailedStatus($bulkUuid)
108110
{
109111
$bulkSummary = $this->bulkDetailedFactory->create();
110112

111-
/** @var \Magento\AsynchronousOperations\Api\Data\DetailedBulkOperationsStatusInterface $bulk */
113+
/** @var DetailedBulkOperationsStatusInterface $bulk */
112114
$bulk = $this->entityManager->load($bulkSummary, $bulkUuid);
113115

114116
if ($bulk->getBulkId() === null) {
@@ -119,7 +121,9 @@ public function getBulkDetailedStatus($bulkUuid)
119121
)
120122
);
121123
}
122-
$operations = $this->operationCollectionFactory->create()->addFieldToFilter('bulk_uuid', $bulkUuid)->getItems();
124+
$operations = $this->operationCollectionFactory->create()
125+
->addFieldToFilter('bulk_uuid', $bulkUuid)
126+
->getItems();
123127
$bulk->setOperationsList($operations);
124128

125129
return $bulk;
@@ -132,7 +136,7 @@ public function getBulkShortStatus($bulkUuid)
132136
{
133137
$bulkSummary = $this->bulkShortFactory->create();
134138

135-
/** @var \Magento\AsynchronousOperations\Api\Data\BulkOperationsStatusInterface $bulk */
139+
/** @var BulkOperationsStatusInterface $bulk */
136140
$bulk = $this->entityManager->load($bulkSummary, $bulkUuid);
137141
if ($bulk->getBulkId() === null) {
138142
throw new NoSuchEntityException(
@@ -142,7 +146,9 @@ public function getBulkShortStatus($bulkUuid)
142146
)
143147
);
144148
}
145-
$operations = $this->operationCollectionFactory->create()->addFieldToFilter('bulk_uuid', $bulkUuid)->getItems();
149+
$operations = $this->operationCollectionFactory->create()
150+
->addFieldToFilter('bulk_uuid', $bulkUuid)
151+
->getItems();
146152
$bulk->setOperationsList($operations);
147153

148154
return $bulk;

app/code/Magento/AsynchronousOperations/Model/BulkStatus.php

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,24 +6,28 @@
66

77
namespace Magento\AsynchronousOperations\Model;
88

9-
use Magento\AsynchronousOperations\Api\Data\OperationInterface;
109
use Magento\AsynchronousOperations\Api\Data\BulkSummaryInterface;
11-
use Magento\Framework\App\ResourceConnection;
10+
use Magento\AsynchronousOperations\Api\Data\BulkSummaryInterfaceFactory;
11+
use Magento\AsynchronousOperations\Api\Data\OperationInterface;
12+
use Magento\AsynchronousOperations\Api\Data\OperationInterfaceFactory;
1213
use Magento\AsynchronousOperations\Model\BulkStatus\CalculatedStatusSql;
14+
use Magento\AsynchronousOperations\Model\ResourceModel\Operation\Collection as OperationCollection;
15+
use Magento\Framework\App\ResourceConnection;
16+
use Magento\Framework\Bulk\BulkStatusInterface;
1317
use Magento\Framework\EntityManager\MetadataPool;
1418

1519
/**
16-
* Class BulkStatus
20+
* Process bulk operations status.
1721
*/
18-
class BulkStatus implements \Magento\Framework\Bulk\BulkStatusInterface
22+
class BulkStatus implements BulkStatusInterface
1923
{
2024
/**
21-
* @var \Magento\AsynchronousOperations\Api\Data\BulkSummaryInterfaceFactory
25+
* @var BulkSummaryInterfaceFactory
2226
*/
2327
private $bulkCollectionFactory;
2428

2529
/**
26-
* @var \Magento\AsynchronousOperations\Api\Data\OperationInterfaceFactory
30+
* @var OperationInterfaceFactory
2731
*/
2832
private $operationCollectionFactory;
2933

@@ -43,22 +47,21 @@ class BulkStatus implements \Magento\Framework\Bulk\BulkStatusInterface
4347
private $metadataPool;
4448

4549
/**
46-
* BulkStatus constructor.
4750
* @param ResourceModel\Bulk\CollectionFactory $bulkCollection
4851
* @param ResourceModel\Operation\CollectionFactory $operationCollection
4952
* @param ResourceConnection $resourceConnection
5053
* @param CalculatedStatusSql $calculatedStatusSql
5154
* @param MetadataPool $metadataPool
5255
*/
5356
public function __construct(
54-
\Magento\AsynchronousOperations\Model\ResourceModel\Bulk\CollectionFactory $bulkCollection,
55-
\Magento\AsynchronousOperations\Model\ResourceModel\Operation\CollectionFactory $operationCollection,
57+
ResourceModel\Bulk\CollectionFactory $bulkCollection,
58+
ResourceModel\Operation\CollectionFactory $operationCollection,
5659
ResourceConnection $resourceConnection,
5760
CalculatedStatusSql $calculatedStatusSql,
5861
MetadataPool $metadataPool
5962
) {
60-
$this->operationCollectionFactory = $operationCollection;
6163
$this->bulkCollectionFactory = $bulkCollection;
64+
$this->operationCollectionFactory = $operationCollection;
6265
$this->resourceConnection = $resourceConnection;
6366
$this->calculatedStatusSql = $calculatedStatusSql;
6467
$this->metadataPool = $metadataPool;
@@ -87,9 +90,22 @@ public function getFailedOperationsByBulkId($bulkUuid, $failureType = null)
8790
*/
8891
public function getOperationsCountByBulkIdAndStatus($bulkUuid, $status)
8992
{
90-
/** @var \Magento\AsynchronousOperations\Model\ResourceModel\Operation\Collection $collection */
91-
$collection = $this->operationCollectionFactory->create();
92-
return $collection->addFieldToFilter('bulk_uuid', $bulkUuid)
93+
/** @var OperationCollection $operationCollection */
94+
$operationCollection = $this->operationCollectionFactory->create();
95+
if ($status === OperationInterface::STATUS_TYPE_OPEN) {
96+
$allProcessedOperationsQty = $operationCollection
97+
->addFieldToFilter('bulk_uuid', $bulkUuid)
98+
->getSize();
99+
100+
if (empty($allProcessedOperationsQty)) {
101+
return $this->getOperationCount($bulkUuid);
102+
}
103+
104+
$operationCollection->clear();
105+
}
106+
107+
return $operationCollection
108+
->addFieldToFilter('bulk_uuid', $bulkUuid)
93109
->addFieldToFilter('status', $status)
94110
->getSize();
95111
}

0 commit comments

Comments
 (0)