Skip to content

Commit d7c1305

Browse files
committed
MTA-3519: Update Products Using Mass Actions change Stock Availability
2 parents 96c551f + 19e49d1 commit d7c1305

File tree

15 files changed

+317
-49
lines changed

15 files changed

+317
-49
lines changed

dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Product/Edit/Action/Attribute.xml

Lines changed: 0 additions & 17 deletions
This file was deleted.

dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Product/Edit/Action/Attribute.php renamed to dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Product/Edit/Action/Tab/Attributes.php

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

7-
namespace Magento\Catalog\Test\Block\Adminhtml\Product\Edit\Action;
7+
namespace Magento\Catalog\Test\Block\Adminhtml\Product\Edit\Action\Tab;
88

99
use Magento\Mtf\Fixture\FixtureInterface;
10-
use Magento\Mtf\Block\Form;
10+
use Magento\Backend\Test\Block\Widget\Tab;
1111
use Magento\Mtf\Client\Element\SimpleElement;
1212

1313
/**
14-
* Product attribute massaction edit page.
14+
* Attributes tab on Product update attributes Form.
1515
*/
16-
class Attribute extends Form
16+
class Attributes extends Tab
1717
{
1818
/**
1919
* Fill the root form.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
<?php
2+
/**
3+
* Copyright © 2016 Magento. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Magento\Catalog\Test\Block\Adminhtml\Product\Edit\Action;
8+
9+
use Magento\Backend\Test\Block\Widget\FormTabs;
10+
use Magento\Mtf\Fixture\InjectableFixture;
11+
12+
/**
13+
* Product update Attributes Form.
14+
*/
15+
class UpdateAttributeForm extends FormTabs
16+
{
17+
/**
18+
* Checkbox array mapping.
19+
*
20+
* @var array
21+
*/
22+
private $checkboxMapping = [
23+
'attributes' => [
24+
'price' => 'toggle_price'
25+
],
26+
'advanced_inventory' => [
27+
'stock_data' => 'stock_data_checkbox'
28+
]
29+
];
30+
31+
/**
32+
* Create data array for filling containers.
33+
*
34+
* Returns data in format
35+
* [[abstract_container_name => [field_name => [attribute_name => attribute_value, ..], ..], ..]
36+
* where container name should be set to 'null' if a field is not present on the form.
37+
*
38+
* @param InjectableFixture $fixture
39+
* @return array
40+
*/
41+
protected function getFixtureFieldsByContainers(InjectableFixture $fixture)
42+
{
43+
$dataByContainer = [];
44+
$data = $fixture->getData();
45+
46+
foreach ($this->containers as $key => $container) {
47+
foreach ($container['fields'] as $fieldKey => $field) {
48+
if (isset($data[$fieldKey])) {
49+
$dataByContainer[$key][$fieldKey]['value'] = $data[$fieldKey];
50+
if (isset($this->checkboxMapping[$key][$fieldKey])) {
51+
$dataByContainer[$key][$this->checkboxMapping[$key][$fieldKey]]['value'] = 'Yes';
52+
}
53+
}
54+
}
55+
if (isset($dataByContainer[$key])) {
56+
$dataByContainer[$key] = array_reverse($dataByContainer[$key]);
57+
}
58+
}
59+
60+
return $dataByContainer;
61+
}
62+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?xml version="1.0" ?>
2+
<!--
3+
/**
4+
* Copyright © 2016 Magento. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
<tabs>
9+
<attributes>
10+
<class>Magento\Catalog\Test\Block\Adminhtml\Product\Edit\Action\Tab\Attributes</class>
11+
<selector>#attributes_update_tabs_attributes</selector>
12+
<fields>
13+
<toggle_price>
14+
<selector>[name='toggle_price']</selector>
15+
<input>checkbox</input>
16+
</toggle_price>
17+
<price>
18+
<selector>#price</selector>
19+
</price>
20+
</fields>
21+
</attributes>
22+
<advanced_inventory>
23+
<class>\Magento\Backend\Test\Block\Widget\Tab</class>
24+
<selector>#attributes_update_tabs_inventory</selector>
25+
<fields>
26+
<stock_data_checkbox>
27+
<selector>#inventory_stock_availability_checkbox</selector>
28+
<input>checkbox</input>
29+
</stock_data_checkbox>
30+
<stock_data>
31+
<selector>#inventory_stock_availability</selector>
32+
<input>select</input>
33+
</stock_data>
34+
</fields>
35+
</advanced_inventory>
36+
</tabs>

dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Product/Grid.php

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
namespace Magento\Catalog\Test\Block\Adminhtml\Product;
88

99
use Magento\Ui\Test\Block\Adminhtml\DataGrid;
10+
use Magento\Mtf\Fixture\FixtureInterface;
1011

1112
/**
1213
* Backend catalog product grid.
@@ -72,12 +73,26 @@ class Grid extends DataGrid
7273
/**
7374
* Update attributes for selected items.
7475
*
75-
* @param array $items [optional]
76+
* @param array $items
7677
* @return void
7778
*/
7879
public function updateAttributes(array $items = [])
7980
{
80-
$this->massaction($items, 'Update attributes');
81+
$products = [];
82+
/** @var FixtureInterface $product */
83+
foreach ($items as $product) {
84+
$dataConfig = $product->getDataConfig();
85+
$typeId = isset($dataConfig['type_id']) ? $dataConfig['type_id'] : null;
86+
if ($this->hasRender($typeId)) {
87+
$renderArguments = [
88+
'product' => $product,
89+
];
90+
$products = $this->callRender($typeId, 'prepareData', $renderArguments);
91+
} else {
92+
$products[] = ["sku" => $product->getSku()];
93+
}
94+
}
95+
$this->massaction($products, 'Update attributes');
8196
}
8297

8398
/**

dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertMassProductUpdateSuccessMessage.php

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,12 @@ class AssertMassProductUpdateSuccessMessage extends AbstractConstraint
2323
* Assert that after mass update successful message appears.
2424
*
2525
* @param CatalogProductIndex $productGrid
26-
* @param array $products
26+
* @param integer $productsCount
2727
* @return void
2828
*/
29-
public function processAssert(CatalogProductIndex $productGrid, $products = [])
29+
public function processAssert(CatalogProductIndex $productGrid, $productsCount)
3030
{
31-
$countProducts = count($products) ? count($products) : 1;
32-
$expectedMessage = sprintf(self::SUCCESS_MESSAGE, $countProducts);
31+
$expectedMessage = sprintf(self::SUCCESS_MESSAGE, $productsCount);
3332
$actualMessage = $productGrid->getMessagesBlock()->getSuccessMessage();
3433
\PHPUnit_Framework_Assert::assertEquals(
3534
$expectedMessage,
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<?php
2+
/**
3+
* Copyright © 2016 Magento. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Magento\Catalog\Test\Constraint;
8+
9+
use Magento\Catalog\Test\Page\Product\CatalogProductView;
10+
use Magento\Mtf\Client\BrowserInterface;
11+
use Magento\Mtf\Constraint\AbstractConstraint;
12+
13+
/**
14+
* Assert that all products are in stock.
15+
*/
16+
class AssertProductsInStock extends AbstractConstraint
17+
{
18+
/**
19+
* Assert that In Stock status is displayed for products.
20+
*
21+
* @param CatalogProductView $catalogProductView
22+
* @param BrowserInterface $browser
23+
* @param AssertProductInStock $assertProductInStock
24+
* @param array $products
25+
* @return void
26+
*/
27+
public function processAssert(
28+
CatalogProductView $catalogProductView,
29+
BrowserInterface $browser,
30+
AssertProductInStock $assertProductInStock,
31+
array $products
32+
) {
33+
foreach ($products as $product) {
34+
$assertProductInStock->processAssert($catalogProductView, $browser, $product);
35+
}
36+
}
37+
38+
/**
39+
* Returns a string representation of the object.
40+
*
41+
* @return string
42+
*/
43+
public function toString()
44+
{
45+
return 'In stock control is visible for each product.';
46+
}
47+
}

dev/tests/functional/tests/app/Magento/Catalog/Test/Page/Adminhtml/CatalogProductActionAttributeEdit.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
-->
88
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/mtf/etc/pages.xsd">
99
<page name="CatalogProductActionAttributeEdit" area="Adminhtml" mca="catalog/product_action_attribute/edit" module="Magento_Catalog">
10-
<block name="attributesBlockForm" class="Magento\Catalog\Test\Block\Adminhtml\Product\Edit\Action\Attribute" locator="body" strategy="css selector" />
10+
<block name="attributesBlockForm" class="Magento\Catalog\Test\Block\Adminhtml\Product\Edit\Action\UpdateAttributeForm" locator="body" strategy="css selector" />
1111
<block name="formPageActions" class="Magento\Catalog\Test\Block\Adminhtml\Product\Edit\Action\FormPageActions" locator=".page-main-actions" strategy="css selector" />
1212
</page>
1313
</config>

dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/MassProductUpdateTest.php

Lines changed: 51 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,13 @@
66

77
namespace Magento\Catalog\Test\TestCase\Product;
88

9+
use Magento\Mtf\Fixture\FixtureFactory;
10+
use Magento\Mtf\Fixture\FixtureInterface;
911
use Magento\Mtf\TestCase\Injectable;
1012
use Magento\Catalog\Test\Fixture\CatalogProductSimple;
1113
use Magento\Catalog\Test\Page\Adminhtml\CatalogProductIndex;
1214
use Magento\Catalog\Test\Page\Adminhtml\CatalogProductActionAttributeEdit;
15+
use Magento\Mtf\TestStep\TestStepFactory;
1316

1417
/**
1518
* Precondition:
@@ -58,35 +61,53 @@ class MassProductUpdateTest extends Injectable
5861
*/
5962
protected $configData;
6063

64+
/**
65+
* @var TestStepFactory
66+
*/
67+
private $testStepFactory;
68+
69+
/**
70+
* @var FixtureFactory
71+
*/
72+
private $fixtureFactory;
73+
6174
/**
6275
* Injection data.
6376
*
6477
* @param CatalogProductIndex $productGrid
6578
* @param CatalogProductActionAttributeEdit $attributeMassActionPage
66-
* @return void
79+
* @param TestStepFactory $testStepFactory
80+
* @param FixtureFactory $fixtureFactory
6781
*/
6882
public function __inject(
6983
CatalogProductIndex $productGrid,
70-
CatalogProductActionAttributeEdit $attributeMassActionPage
84+
CatalogProductActionAttributeEdit $attributeMassActionPage,
85+
TestStepFactory $testStepFactory,
86+
FixtureFactory $fixtureFactory
7187
) {
7288
$this->productGrid = $productGrid;
7389
$this->attributeMassActionPage = $attributeMassActionPage;
90+
$this->testStepFactory = $testStepFactory;
91+
$this->fixtureFactory = $fixtureFactory;
7492
}
7593

7694
/**
7795
* Run mass update product simple entity test.
7896
*
79-
* @param CatalogProductSimple $initialProduct
8097
* @param CatalogProductSimple $product
8198
* @param string $configData
99+
* @param array $initialProducts
82100
* @return array
83101
*/
84-
public function test(CatalogProductSimple $initialProduct, CatalogProductSimple $product, $configData)
102+
public function test(CatalogProductSimple $product, $configData, array $initialProducts)
85103
{
86104
$this->configData = $configData;
87105

88106
// Preconditions
89-
$initialProduct->persist();
107+
$products = $this->testStepFactory->create(
108+
\Magento\Catalog\Test\TestStep\CreateProductsStep::class,
109+
['products' => $initialProducts]
110+
)->run()['products'];
90111

91112
$this->objectManager->create(
92113
\Magento\Config\Test\TestStep\SetupConfigurationStep::class,
@@ -95,19 +116,33 @@ public function test(CatalogProductSimple $initialProduct, CatalogProductSimple
95116

96117
// Steps
97118
$this->productGrid->open();
98-
$this->productGrid->getProductGrid()->updateAttributes([['sku' => $initialProduct->getSku()]]);
119+
$this->productGrid->getProductGrid()->updateAttributes($products);
99120
$this->attributeMassActionPage->getAttributesBlockForm()->fill($product);
100121
$this->attributeMassActionPage->getFormPageActions()->save();
101-
$data = array_merge($initialProduct->getData(), $product->getData());
102-
$product = $this->objectManager->create(
103-
\Magento\Catalog\Test\Fixture\CatalogProductSimple::class,
104-
['data' => $data]
105-
);
106-
107-
return [
108-
'category' => $initialProduct->getDataFieldConfig('category_ids')['source']->getCategories()[0],
109-
'product' => $product,
110-
];
122+
$updatedProducts = $this->prepareUpdatedProducts($products, $product);
123+
124+
return ['products' => $updatedProducts];
125+
}
126+
127+
/**
128+
* Prepare updated products.
129+
*
130+
* @param array $products
131+
* @param CatalogProductSimple $product
132+
* @return array
133+
*/
134+
private function prepareUpdatedProducts(array $products, CatalogProductSimple $product)
135+
{
136+
$productsReturn = [];
137+
/** @var FixtureInterface $item */
138+
foreach ($products as $item) {
139+
$productsReturn[] = $this->fixtureFactory->create(
140+
get_class($item),
141+
['data' => array_merge($item->getData(), $product->getData())]
142+
);
143+
}
144+
145+
return $productsReturn;
111146
}
112147

113148
/**

dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/MassProductUpdateTest.xml

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,22 @@
99
<testCase name="Magento\Catalog\Test\TestCase\Product\MassProductUpdateTest" summary="Edit Products Using Mass Actions" ticketId="MAGETWO-21128">
1010
<variation name="MassProductPriceUpdateTestVariation1">
1111
<data name="configData" xsi:type="string">product_flat</data>
12-
<data name="initialProduct/dataset" xsi:type="string">simple_10_dollar</data>
12+
<data name="initialProducts/0" xsi:type="string">catalogProductSimple::simple_10_dollar</data>
13+
<data name="initialProducts/1" xsi:type="string">catalogProductSimple::simple_10_dollar</data>
14+
<data name="productsCount" xsi:type="number">2</data>
1315
<data name="product/data/price/value" xsi:type="string">1.99</data>
1416
<constraint name="Magento\Catalog\Test\Constraint\AssertMassProductUpdateSuccessMessage" />
1517
<constraint name="Magento\Catalog\Test\Constraint\AssertProductInGrid" />
16-
<constraint name="Magento\Catalog\Test\Constraint\AssertProductInCategory" />
18+
</variation>
19+
<variation name="MassProductUpdateTestVariation2" summary="Update stock data for simple and configurable">
20+
<data name="configData" xsi:type="string">product_flat</data>
21+
<data name="initialProducts/1" xsi:type="string">configurableProduct::out_of_stock</data>
22+
<data name="initialProducts/0" xsi:type="string">catalogProductSimple::out_of_stock</data>
23+
<data name="productsCount" xsi:type="number">3</data>
24+
<data name="product/data/stock_data" xsi:type="string">In Stock</data>
25+
<constraint name="Magento\Catalog\Test\Constraint\AssertMassProductUpdateSuccessMessage" />
26+
<constraint name="Magento\Catalog\Test\Constraint\AssertProductInGrid" />
27+
<constraint name="Magento\Catalog\Test\Constraint\AssertProductsInStock" />
1728
</variation>
1829
</testCase>
1930
</config>

0 commit comments

Comments
 (0)