Skip to content

Commit 6dec229

Browse files
committed
MC-37086: Create automated test for "Check that CSV can be exported"
1 parent 57c527e commit 6dec229

File tree

5 files changed

+296
-0
lines changed

5 files changed

+296
-0
lines changed
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
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\TestFramework\MysqlMq;
9+
10+
use Magento\MysqlMq\Model\QueueManagement;
11+
use Magento\MysqlMq\Model\ResourceModel\Message;
12+
13+
/**
14+
* Delete messages from queue by topic
15+
*/
16+
class DeleteTopicRelatedMessages
17+
{
18+
/** @var Message */
19+
private $queueMessageResource;
20+
21+
/**
22+
* @param Message $queueMessageResource
23+
*/
24+
public function __construct(
25+
Message $queueMessageResource
26+
) {
27+
$this->queueMessageResource = $queueMessageResource;
28+
}
29+
30+
/**
31+
* Delete messages from queue
32+
*
33+
* @param string $topic
34+
* @return void
35+
*/
36+
public function execute(string $topic): void
37+
{
38+
$connection = $this->queueMessageResource->getConnection();
39+
$condition = $connection->quoteInto(QueueManagement::MESSAGE_TOPIC . '= ?', $topic);
40+
$connection->delete($this->queueMessageResource->getMainTable(), $condition);
41+
}
42+
}
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
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\ImportExport\Controller\Adminhtml\Export;
9+
10+
use Magento\Catalog\Api\Data\ProductAttributeInterface;
11+
use Magento\Framework\App\Request\Http;
12+
use Magento\Framework\Serialize\SerializerInterface;
13+
use Magento\MysqlMq\Model\QueueManagement;
14+
use Magento\MysqlMq\Model\ResourceModel\Message;
15+
use Magento\TestFramework\MysqlMq\DeleteTopicRelatedMessages;
16+
use Magento\TestFramework\TestCase\AbstractBackendController;
17+
18+
/**
19+
* Test for export controller
20+
*
21+
* @see \Magento\ImportExport\Controller\Adminhtml\Export\Export
22+
*
23+
* @magentoAppArea adminhtml
24+
* @magentoDbIsolation enabled
25+
*/
26+
class ExportTest extends AbstractBackendController
27+
{
28+
private const TOPIC_NAME = 'import_export.export';
29+
30+
/** @var QueueManagement */
31+
private $queueManagement;
32+
33+
/** @var Message */
34+
private $queueMessageResource;
35+
36+
/** @var SerializerInterface */
37+
private $json;
38+
39+
/** @var DeleteTopicRelatedMessages */
40+
private $deleteTopicRelatedMessages;
41+
42+
/**
43+
* @inheridoc
44+
*/
45+
protected function setUp(): void
46+
{
47+
parent::setUp();
48+
49+
$this->queueManagement = $this->_objectManager->get(QueueManagement::class);
50+
$this->queueMessageResource = $this->_objectManager->get(Message::class);
51+
$this->json = $this->_objectManager->get(SerializerInterface::class);
52+
$this->deleteTopicRelatedMessages = $this->_objectManager->get(DeleteTopicRelatedMessages::class);
53+
$this->deleteTopicRelatedMessages->execute(self::TOPIC_NAME);
54+
}
55+
56+
/**
57+
* @inheritdoc
58+
*/
59+
protected function tearDown(): void
60+
{
61+
$this->deleteTopicRelatedMessages->execute(self::TOPIC_NAME);
62+
63+
parent::tearDown();
64+
}
65+
66+
/**
67+
* @magentoConfigFixture default_store admin/security/use_form_key 1
68+
*
69+
* @return void
70+
*/
71+
public function testExecute(): void
72+
{
73+
$expectedSessionMessage = (string)__('Message is added to queue, wait to get your file soon.'
74+
. ' Make sure your cron job is running to export the file');
75+
$fileFormat = 'csv';
76+
$filter = ['price' => [0,1000]];
77+
$this->getRequest()->setParams(
78+
[
79+
'entity' => ProductAttributeInterface::ENTITY_TYPE_CODE,
80+
'file_format' => $fileFormat,
81+
]
82+
);
83+
$this->getRequest()->setMethod(Http::METHOD_POST)
84+
->setPostValue([
85+
'export_filter' => [
86+
$filter,
87+
],
88+
]);
89+
$this->dispatch('backend/admin/export/export');
90+
$this->assertSessionMessages($this->containsEqual($expectedSessionMessage));
91+
$this->assertRedirect($this->stringContains('/export/index/key/'));
92+
$messages = $this->queueManagement->readMessages('export');
93+
$this->assertCount(1, $messages);
94+
$message = reset($messages);
95+
$this->assertEquals(self::TOPIC_NAME, $message[QueueManagement::MESSAGE_TOPIC]);
96+
$body = $this->json->unserialize($message[QueueManagement::MESSAGE_BODY]);
97+
$this->assertStringContainsString(ProductAttributeInterface::ENTITY_TYPE_CODE, $body['file_name']);
98+
$this->assertEquals($fileFormat, $body['file_format']);
99+
$actualFilter = $this->json->unserialize($body['export_filter']);
100+
$this->assertCount(1, $actualFilter);
101+
$this->assertEquals($filter, reset($actualFilter));
102+
}
103+
}
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
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\ImportExport\Model\Export;
9+
10+
use Magento\Catalog\Api\Data\ProductInterface;
11+
use Magento\Framework\App\Filesystem\DirectoryList;
12+
use Magento\Framework\File\Csv;
13+
use Magento\Framework\Filesystem;
14+
use Magento\Framework\Filesystem\Directory\Write;
15+
use Magento\Framework\MessageQueue\MessageEncoder;
16+
use Magento\Framework\ObjectManagerInterface;
17+
use Magento\MysqlMq\Model\Driver\Queue;
18+
use Magento\TestFramework\Helper\Bootstrap;
19+
use PHPUnit\Framework\TestCase;
20+
21+
/**
22+
* Test for export consumer
23+
*
24+
* @see \Magento\ImportExport\Model\Export\Consumer
25+
*
26+
* @magentoDbIsolation enabled
27+
* @magentoAppArea adminhtml
28+
*/
29+
class ConsumerTest extends TestCase
30+
{
31+
/** @var ObjectManagerInterface */
32+
private $objectManager;
33+
34+
/** @var MessageEncoder */
35+
private $messageEncoder;
36+
37+
/** @var Consumer */
38+
private $consumer;
39+
40+
/** @var Queue */
41+
private $queue;
42+
43+
/** @var Csv */
44+
private $csv;
45+
46+
/** @var Write */
47+
private $directory;
48+
49+
/** @var string */
50+
private $filePath;
51+
52+
/**
53+
* @inheritdoc
54+
*/
55+
protected function setUp(): void
56+
{
57+
parent::setUp();
58+
59+
$this->objectManager = Bootstrap::getObjectManager();
60+
$this->queue = $this->objectManager->create(Queue::class, ['queueName' => 'export']);
61+
$this->messageEncoder = $this->objectManager->get(MessageEncoder::class);
62+
$this->consumer = $this->objectManager->get(Consumer::class);
63+
$this->directory = $this->objectManager->get(Filesystem::class)->getDirectoryWrite(DirectoryList::VAR_DIR);
64+
$this->csv = $this->objectManager->get(Csv::class);
65+
}
66+
67+
/**
68+
* @inheritdoc
69+
*/
70+
protected function tearDown(): void
71+
{
72+
if ($this->filePath && $this->directory->isExist($this->filePath)) {
73+
$this->directory->delete($this->filePath);
74+
}
75+
76+
parent::tearDown();
77+
}
78+
79+
/**
80+
* @magentoConfigFixture default_store admin/security/use_form_key 1
81+
*
82+
* @magentoDataFixture Magento/ImportExport/_files/export_queue_data.php
83+
* @magentoDataFixture Magento/Catalog/_files/product_virtual.php
84+
*
85+
* @return void
86+
*/
87+
public function testProcess(): void
88+
{
89+
$envelope = $this->queue->dequeue();
90+
$decodedMessage = $this->messageEncoder->decode('import_export.export', $envelope->getBody());
91+
$this->consumer->process($decodedMessage);
92+
$this->filePath = 'export/' . $decodedMessage->getFileName();
93+
$this->assertTrue($this->directory->isExist($this->filePath));
94+
$data = $this->csv->getData($this->directory->getAbsolutePath($this->filePath));
95+
$this->assertCount(2, $data);
96+
$skuPosition = array_search(ProductInterface::SKU, array_keys($data));
97+
$this->assertNotFalse($skuPosition);
98+
$this->assertEquals('simple2', $data[1][$skuPosition]);
99+
}
100+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
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+
use Magento\Catalog\Api\Data\ProductAttributeInterface;
9+
use Magento\Catalog\Api\Data\ProductInterface;
10+
use Magento\Framework\MessageQueue\PublisherInterface;
11+
use Magento\ImportExport\Model\Export\Entity\ExportInfoFactory;
12+
use Magento\TestFramework\Helper\Bootstrap;
13+
use Magento\TestFramework\Workaround\Override\Fixture\Resolver;
14+
15+
Resolver::getInstance()->requireDataFixture('Magento/Catalog/_files/second_product_simple.php');
16+
17+
$objectManager = Bootstrap::getObjectManager();
18+
/** @var ExportInfoFactory $exportInfoFactory */
19+
$exportInfoFactory = $objectManager->get(ExportInfoFactory::class);
20+
/** @var PublisherInterface $messagePublisher */
21+
$messagePublisher = $objectManager->get(PublisherInterface::class);
22+
$params = [
23+
'file_format' => 'csv',
24+
'entity' => ProductAttributeInterface::ENTITY_TYPE_CODE,
25+
'export_filter' => [ProductInterface::SKU => 'simple2'],
26+
'skip_attr' => [],
27+
];
28+
$dataObject = $exportInfoFactory->create(
29+
$params['file_format'],
30+
$params['entity'],
31+
$params['export_filter'],
32+
$params['skip_attr']
33+
);
34+
$messagePublisher->publish('import_export.export', $dataObject);
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
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+
use Magento\TestFramework\MysqlMq\DeleteTopicRelatedMessages;
9+
use Magento\TestFramework\Helper\Bootstrap;
10+
use Magento\TestFramework\Workaround\Override\Fixture\Resolver;
11+
12+
$objectManager = Bootstrap::getObjectManager();
13+
/** @var DeleteTopicRelatedMessages $deleteTopicRelatedMessages */
14+
$deleteTopicRelatedMessages = $objectManager->get(DeleteTopicRelatedMessages::class);
15+
$deleteTopicRelatedMessages->execute('import_export.export');
16+
17+
Resolver::getInstance()->requireDataFixture('Magento/Catalog/_files/second_product_simple_rollback.php');

0 commit comments

Comments
 (0)