Skip to content

Commit 4a6c3e0

Browse files
committed
MAGETWO-59074: Creditmemo return to stock only one unit of configurable product
1 parent 3d54998 commit 4a6c3e0

File tree

6 files changed

+281
-27
lines changed

6 files changed

+281
-27
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
<?php
2+
/**
3+
* Copyright © 2016 Magento. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\ConfigurableProduct\Test\Constraint;
7+
8+
use Magento\Catalog\Test\Page\Adminhtml\CatalogProductEdit;
9+
use Magento\Catalog\Test\Page\Adminhtml\CatalogProductIndex;
10+
use Magento\Mtf\Constraint\AbstractConstraint;
11+
use Magento\Mtf\Fixture\FixtureFactory;
12+
use Magento\Mtf\Fixture\FixtureInterface;
13+
use Magento\Mtf\ObjectManager;
14+
use Magento\Mtf\System\Event\EventManagerInterface;
15+
use Magento\Sales\Test\Fixture\OrderInjectable;
16+
17+
/**
18+
* Class AssertProductQtyDecreasedAfterCreditmemo
19+
*/
20+
class AssertProductQtyDecreasedAfterCreditmemo extends AbstractConstraint
21+
{
22+
/**
23+
* @var FixtureFactory
24+
*/
25+
protected $fixtureFactory;
26+
27+
/**
28+
* Skip fields for create product fixture.
29+
*
30+
* @var array
31+
*/
32+
protected $skipFields = [
33+
'attribute_set_id',
34+
'website_ids',
35+
'checkout_data',
36+
'type_id',
37+
'price',
38+
];
39+
40+
/**
41+
* AssertFirstProductForm constructor.
42+
* @param ObjectManager $objectManager
43+
*/
44+
public function __construct(ObjectManager $objectManager, EventManagerInterface $eventManager, FixtureFactory $fixtureFactory)
45+
{
46+
$this->fixtureFactory = $fixtureFactory;
47+
parent::__construct($objectManager, $eventManager);
48+
}
49+
50+
51+
/**
52+
* Assert form data equals fixture data
53+
*
54+
* @param OrderInjectable $order
55+
* @param array $data
56+
* @param CatalogProductIndex $productGrid
57+
* @param CatalogProductEdit $productPage
58+
* @return void
59+
*/
60+
public function processAssert(
61+
OrderInjectable $order,
62+
array $data,
63+
CatalogProductIndex $productGrid,
64+
CatalogProductEdit $productPage
65+
) {
66+
$product = $this->getProduct($order, $data);
67+
$this->objectManager->get(\Magento\Catalog\Test\Constraint\AssertProductForm::class)->processAssert(
68+
$product,
69+
$productGrid,
70+
$productPage
71+
);
72+
}
73+
74+
/**
75+
* Get product's fixture.
76+
*
77+
* @param OrderInjectable $order
78+
* @param array $data
79+
* @param int $index [optional]
80+
* @return FixtureInterface
81+
*/
82+
protected function getProduct(OrderInjectable $order, array $data, $index = 0)
83+
{
84+
if (!isset($data['items_data'][$index]['back_to_stock'])
85+
|| $data['items_data'][$index]['back_to_stock'] != 'Yes'
86+
) {
87+
return $order->getEntityId()['products'][$index];
88+
}
89+
$product = $order->getEntityId()['products'][$index];
90+
$productData = $product->getData();
91+
$checkoutDataQty = $productData['checkout_data']['qty'];
92+
93+
$productKey = '';
94+
foreach ($productData['checkout_data']['options']['configurable_options'] as $option) {
95+
$productKey .= ' ' . $option['title'] . ':' . $option['value'];
96+
}
97+
$productKey = trim($productKey);
98+
$optionProduct = $productData['configurable_attributes_data']['matrix'][$productKey];
99+
$optionProduct['qty'] -= ($checkoutDataQty - $data['items_data'][$index]['qty']);
100+
$productData = $optionProduct;
101+
102+
103+
$productData = array_diff_key($productData, array_flip($this->skipFields));
104+
105+
return $this->fixtureFactory->create(get_class($product), ['data' => $productData]);
106+
}
107+
108+
/**
109+
* Returns a string representation of the object.
110+
*
111+
* @return string
112+
*/
113+
public function toString()
114+
{
115+
return 'Product qty was decreased after creditmemo creation.';
116+
}
117+
}

dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Repository/ConfigurableProduct.xml

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,40 @@
4242
</dataset>
4343

4444
<dataset name="configurable_with_qty_1">
45-
<field name="name" xsi:type="string">Test configurable product %isolation%</field>
45+
<field name="name" xsi:type="string">sku_test_configurable_product_%isolation%</field>
46+
<field name="sku" xsi:type="string">sku_test_configurable_product_%isolation%</field>
47+
<field name="price" xsi:type="array">
48+
<item name="dataset" xsi:type="string">price_40</item>
49+
</field>
50+
<field name="product_has_weight" xsi:type="string">This item has weight</field>
51+
<field name="weight" xsi:type="string">30</field>
52+
<field name="status" xsi:type="string">Yes</field>
53+
<field name="visibility" xsi:type="string">Catalog, Search</field>
54+
<field name="tax_class_id" xsi:type="array">
55+
<item name="dataset" xsi:type="string">taxable_goods</item>
56+
</field>
57+
<field name="url_key" xsi:type="string">configurable-product-%isolation%</field>
58+
<field name="configurable_attributes_data" xsi:type="array">
59+
<item name="dataset" xsi:type="string">default</item>
60+
</field>
61+
<field name="quantity_and_stock_status" xsi:type="array">
62+
<item name="is_in_stock" xsi:type="string">In Stock</item>
63+
</field>
64+
<field name="website_ids" xsi:type="array">
65+
<item name="0" xsi:type="array">
66+
<item name="dataset" xsi:type="string">default</item>
67+
</item>
68+
</field>
69+
<field name="attribute_set_id" xsi:type="array">
70+
<item name="dataset" xsi:type="string">default</item>
71+
</field>
72+
<field name="checkout_data" xsi:type="array">
73+
<item name="dataset" xsi:type="string">configurable_options_with_qty_1</item>
74+
</field>
75+
</dataset>
76+
77+
<dataset name="configurable_with_qty_2">
78+
<field name="name" xsi:type="string">sku_test_configurable_product_%isolation%</field>
4679
<field name="sku" xsi:type="string">sku_test_configurable_product_%isolation%</field>
4780
<field name="price" xsi:type="array">
4881
<item name="dataset" xsi:type="string">price_40</item>
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<!--
3+
/**
4+
* Copyright © 2016 Magento. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd">
9+
<testCase name="Magento\Sales\Test\TestCase\CreateCreditMemoEntityTest" summary="Create Credit Memo for Offline Payment Methods" ticketId="MAGETWO-59074">
10+
<variation name="CreateCreditMemoEntityWithConfigurableTestVariation1" ticketId="MAGETWO-12447">
11+
<data name="description" xsi:type="string">Assert items return to stock (partial refund)</data>
12+
<data name="data/items_data/0/back_to_stock" xsi:type="string">Yes</data>
13+
<data name="data/items_data/0/qty" xsi:type="string">1</data>
14+
<data name="order/dataset" xsi:type="string">default</data>
15+
<data name="order/data/entity_id/products" xsi:type="string">configurableProduct::configurable_with_qty_1</data>
16+
<data name="order/data/price/dataset" xsi:type="string">full_refund</data>
17+
<constraint name="Magento\Sales\Test\Constraint\AssertRefundSuccessCreateMessage" />
18+
<constraint name="Magento\ConfigurableProduct\Test\Constraint\AssertProductQtyDecreasedAfterCreditmemo" />
19+
</variation>
20+
</testCase>
21+
</config>
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
<?php
2+
/**
3+
* Copyright © 2016 Magento. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\Sales\Test\Constraint;
7+
8+
use Magento\Catalog\Test\Page\Adminhtml\CatalogProductEdit;
9+
use Magento\Catalog\Test\Page\Adminhtml\CatalogProductIndex;
10+
use Magento\Mtf\Constraint\AbstractConstraint;
11+
use Magento\Mtf\Fixture\FixtureFactory;
12+
use Magento\Mtf\Fixture\FixtureInterface;
13+
use Magento\Mtf\ObjectManager;
14+
use Magento\Mtf\System\Event\EventManagerInterface;
15+
use Magento\Sales\Test\Fixture\OrderInjectable;
16+
17+
/**
18+
* Class AssertProductQtyDecreasedAfterCreditmemo
19+
*/
20+
class AssertProductQtyDecreasedAfterCreditmemo extends AbstractConstraint
21+
{
22+
/**
23+
* @var FixtureFactory
24+
*/
25+
protected $fixtureFactory;
26+
27+
/**
28+
* Skip fields for create product fixture.
29+
*
30+
* @var array
31+
*/
32+
protected $skipFields = [
33+
'attribute_set_id',
34+
'website_ids',
35+
'checkout_data',
36+
'type_id',
37+
'price',
38+
];
39+
40+
/**
41+
* AssertFirstProductForm constructor.
42+
* @param ObjectManager $objectManager
43+
*/
44+
public function __construct(ObjectManager $objectManager, EventManagerInterface $eventManager, FixtureFactory $fixtureFactory)
45+
{
46+
$this->fixtureFactory = $fixtureFactory;
47+
parent::__construct($objectManager, $eventManager);
48+
}
49+
50+
51+
/**
52+
* Assert form data equals fixture data
53+
*
54+
* @param OrderInjectable $order
55+
* @param array $data
56+
* @param CatalogProductIndex $productGrid
57+
* @param CatalogProductEdit $productPage
58+
* @return void
59+
*/
60+
public function processAssert(
61+
OrderInjectable $order,
62+
array $data,
63+
CatalogProductIndex $productGrid,
64+
CatalogProductEdit $productPage
65+
) {
66+
$product = $this->getProduct($order, $data);
67+
$this->objectManager->get(\Magento\Catalog\Test\Constraint\AssertProductForm::class)->processAssert(
68+
$product,
69+
$productGrid,
70+
$productPage
71+
);
72+
}
73+
74+
/**
75+
* Get product's fixture.
76+
*
77+
* @param OrderInjectable $order
78+
* @param array $data
79+
* @param int $index [optional]
80+
* @return FixtureInterface
81+
*/
82+
protected function getProduct(OrderInjectable $order, array $data, $index = 0)
83+
{
84+
if (!isset($data['items_data'][$index]['back_to_stock'])
85+
|| $data['items_data'][$index]['back_to_stock'] != 'Yes'
86+
) {
87+
return $order->getEntityId()['products'][$index];
88+
}
89+
$product = $order->getEntityId()['products'][$index];
90+
$productData = $product->getData();
91+
$checkoutDataQty = $productData['checkout_data']['qty'];
92+
$productData['quantity_and_stock_status']['qty'] -= ($checkoutDataQty - $data['items_data'][$index]['qty']);
93+
94+
$productData = array_diff_key($productData, array_flip($this->skipFields));
95+
96+
return $this->fixtureFactory->create(get_class($product), ['data' => $productData]);
97+
}
98+
99+
/**
100+
* Returns a string representation of the object.
101+
*
102+
* @return string
103+
*/
104+
public function toString()
105+
{
106+
return 'Product qty was decreased after creditmemo creation.';
107+
}
108+
}

dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/CreateCreditMemoEntityTest.php

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -93,32 +93,7 @@ public function test(OrderInjectable $order, array $data)
9393

9494
return [
9595
'ids' => ['creditMemoIds' => $result['creditMemoIds']],
96-
'product' => $this->getProduct($order, $data),
9796
'customer' => $order->getDataFieldConfig('customer_id')['source']->getCustomer()
9897
];
9998
}
100-
101-
/**
102-
* Get product's fixture.
103-
*
104-
* @param OrderInjectable $order
105-
* @param array $data
106-
* @param int $index [optional]
107-
* @return FixtureInterface
108-
*/
109-
protected function getProduct(OrderInjectable $order, array $data, $index = 0)
110-
{
111-
if (!isset($data['items_data'][$index]['back_to_stock'])
112-
|| $data['items_data'][$index]['back_to_stock'] != 'Yes'
113-
) {
114-
return $order->getEntityId()['products'][$index];
115-
}
116-
$product = $order->getEntityId()['products'][$index];
117-
$productData = $product->getData();
118-
$checkoutDataQty = $productData['checkout_data']['qty'];
119-
$productData['quantity_and_stock_status']['qty'] -= ($checkoutDataQty - $data['items_data'][$index]['qty']);
120-
$productData = array_diff_key($productData, array_flip($this->skipFields));
121-
122-
return $this->fixtureFactory->create(get_class($product), ['data' => $productData]);
123-
}
12499
}

dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/CreateCreditMemoEntityTest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
<constraint name="Magento\Sales\Test\Constraint\AssertRefundInCreditMemoTab" />
2020
<constraint name="Magento\Sales\Test\Constraint\AssertRefundInRefundsGrid" />
2121
<constraint name="Magento\Sales\Test\Constraint\AssertRefundedGrandTotalOnFrontend" />
22-
<constraint name="Magento\Catalog\Test\Constraint\AssertProductForm" />
22+
<constraint name="Magento\Sales\Test\Constraint\AssertProductQtyDecreasedAfterCreditmemo" />
2323
<constraint name="Magento\Sales\Test\Constraint\AssertCreditMemoItems" />
2424
</variation>
2525
<variation name="CreateCreditMemoEntityTestVariation2">

0 commit comments

Comments
 (0)