Skip to content

Commit 660f1fc

Browse files
committed
MAGETWO-98603: [2.3] Fixed Tier Pricing for Bundle items doesn't work
1 parent 69fe7a0 commit 660f1fc

File tree

4 files changed

+128
-94
lines changed

4 files changed

+128
-94
lines changed

app/code/Magento/Bundle/Test/Mftf/ActionGroup/AdminCreateApiBundleProductActionGroup.xml

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,4 +106,62 @@
106106
<requiredEntity createDataKey="simpleProduct4"/>
107107
</createData>
108108
</actionGroup>
109+
<actionGroup name="AdminCreateApiDynamicBundleProductAllOptionTypesActionGroup">
110+
<arguments>
111+
<argument name="productName" defaultValue="Api Dynamic Bundle Product" type="string"/>
112+
</arguments>
113+
<!-- Create simple products -->
114+
<createData entity="SimpleProduct2" stepKey="simpleProduct1">
115+
<field key="price">10</field>
116+
</createData>
117+
<createData entity="SimpleProduct2" stepKey="simpleProduct2">
118+
<field key="price">20</field>
119+
</createData>
120+
<!-- Create Bundle product -->
121+
<createData entity="ApiBundleProduct" stepKey="createBundleProduct">
122+
<field key="name">{{productName}}</field>
123+
</createData>
124+
<createData entity="DropDownBundleOption" stepKey="createDropDownBundleOption">
125+
<requiredEntity createDataKey="createBundleProduct"/>
126+
<field key="title">Drop-down Option</field>
127+
</createData>
128+
<createData entity="RadioButtonsOption" stepKey="createBundleRadioButtonsOption">
129+
<requiredEntity createDataKey="createBundleProduct"/>
130+
<field key="title">Radio Buttons Option</field>
131+
</createData>
132+
<createData entity="CheckboxOption" stepKey="createBundleCheckboxOption">
133+
<requiredEntity createDataKey="createBundleProduct"/>
134+
<field key="title">Checkbox Option</field>
135+
</createData>
136+
<createData entity="ApiBundleLink" stepKey="linkCheckboxOptionToProduct1">
137+
<requiredEntity createDataKey="createBundleProduct"/>
138+
<requiredEntity createDataKey="createBundleCheckboxOption"/>
139+
<requiredEntity createDataKey="simpleProduct1"/>
140+
</createData>
141+
<createData entity="ApiBundleLink" stepKey="linkCheckboxOptionToProduct2">
142+
<requiredEntity createDataKey="createBundleProduct"/>
143+
<requiredEntity createDataKey="createBundleCheckboxOption"/>
144+
<requiredEntity createDataKey="simpleProduct2"/>
145+
</createData>
146+
<createData entity="ApiBundleLink" stepKey="linkDropDownOptionToProduct1">
147+
<requiredEntity createDataKey="createBundleProduct"/>
148+
<requiredEntity createDataKey="createDropDownBundleOption"/>
149+
<requiredEntity createDataKey="simpleProduct1"/>
150+
</createData>
151+
<createData entity="ApiBundleLink" stepKey="linkDropDownOptionToProduct2">
152+
<requiredEntity createDataKey="createBundleProduct"/>
153+
<requiredEntity createDataKey="createDropDownBundleOption"/>
154+
<requiredEntity createDataKey="simpleProduct2"/>
155+
</createData>
156+
<createData entity="ApiBundleLink" stepKey="linkRadioButtonsOptionToProduct1">
157+
<requiredEntity createDataKey="createBundleProduct"/>
158+
<requiredEntity createDataKey="createBundleRadioButtonsOption"/>
159+
<requiredEntity createDataKey="simpleProduct1"/>
160+
</createData>
161+
<createData entity="ApiBundleLink" stepKey="linkRadioButtonsOptionToProduct2">
162+
<requiredEntity createDataKey="createBundleProduct"/>
163+
<requiredEntity createDataKey="createBundleRadioButtonsOption"/>
164+
<requiredEntity createDataKey="simpleProduct2"/>
165+
</createData>
166+
</actionGroup>
109167
</actionGroups>

app/code/Magento/Bundle/Test/Mftf/Test/StorefrontCheckBundleProductOptionTierPrices.xml

Lines changed: 28 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -14,137 +14,91 @@
1414
<stories value="View bundle products"/>
1515
<title value="Check tier prices for bundle options"/>
1616
<testCaseId value="MAGETWO-98968"/>
17+
<useCaseId value="MAGETWO-98603"/>
18+
<group value="catalog"/>
1719
<group value="bundle"/>
1820
</annotations>
1921
<before>
20-
<!-- Create simple products -->
21-
<createData entity="SimpleProduct2" stepKey="simpleProduct1">
22-
<field key="price">10</field>
23-
</createData>
24-
<createData entity="SimpleProduct2" stepKey="simpleProduct2">
25-
<field key="price">20</field>
26-
</createData>
22+
<!-- Create Dynamic Bundle product -->
23+
<actionGroup ref="AdminCreateApiDynamicBundleProductAllOptionTypesActionGroup" stepKey="createBundleProduct"/>
2724

2825
<!-- Add tier prices to simple products -->
26+
<!-- Simple product 1 -->
2927
<actionGroup ref="LoginAsAdmin" stepKey="loginAsAdmin"/>
30-
<amOnPage url="{{AdminProductEditPage.url($$simpleProduct1.id$$)}}" stepKey="openAdminEditPageProduct1"/>
28+
<amOnPage url="{{AdminProductEditPage.url($$simpleProduct1CreateBundleProduct.id$$)}}" stepKey="openAdminEditPageProduct1"/>
3129
<actionGroup ref="ProductSetAdvancedPricing" stepKey="addTierPriceProduct1">
3230
<argument name="group" value="ALL GROUPS"/>
3331
<argument name="quantity" value="5"/>
3432
<argument name="price" value="Discount"/>
3533
<argument name="amount" value="50"/>
3634
</actionGroup>
37-
38-
<amOnPage url="{{AdminProductEditPage.url($$simpleProduct2.id$$)}}" stepKey="openAdminEditPageProduct2"/>
35+
<!-- Simple product 2 -->
36+
<amOnPage url="{{AdminProductEditPage.url($$simpleProduct2CreateBundleProduct.id$$)}}" stepKey="openAdminEditPageProduct2"/>
3937
<actionGroup ref="ProductSetAdvancedPricing" stepKey="addTierPriceProduct2">
4038
<argument name="group" value="ALL GROUPS"/>
4139
<argument name="quantity" value="7"/>
4240
<argument name="price" value="Discount"/>
4341
<argument name="amount" value="25"/>
4442
</actionGroup>
43+
<actionGroup ref="logout" stepKey="logoutAsAdmin"/>
4544

46-
<!-- Create Bundle product -->
47-
<createData entity="ApiBundleProduct" stepKey="createBundleProduct"/>
48-
<createData entity="DropDownBundleOption" stepKey="createDropDownBundleOption">
49-
<requiredEntity createDataKey="createBundleProduct"/>
50-
<field key="title">Drop-down Option</field>
51-
</createData>
52-
<createData entity="RadioButtonsOption" stepKey="createBundleRadioButtonsOption">
53-
<requiredEntity createDataKey="createBundleProduct"/>
54-
<field key="title">Radio Buttons Option</field>
55-
</createData>
56-
<createData entity="CheckboxOption" stepKey="createBundleCheckboxOption">
57-
<requiredEntity createDataKey="createBundleProduct"/>
58-
<field key="title">Checkbox Option</field>
59-
</createData>
60-
<createData entity="ApiBundleLink" stepKey="linkCheckboxOptionToProduct1">
61-
<requiredEntity createDataKey="createBundleProduct"/>
62-
<requiredEntity createDataKey="createBundleCheckboxOption"/>
63-
<requiredEntity createDataKey="simpleProduct1"/>
64-
</createData>
65-
<createData entity="ApiBundleLink" stepKey="linkCheckboxOptionToProduct2">
66-
<requiredEntity createDataKey="createBundleProduct"/>
67-
<requiredEntity createDataKey="createBundleCheckboxOption"/>
68-
<requiredEntity createDataKey="simpleProduct2"/>
69-
</createData>
70-
<createData entity="ApiBundleLink" stepKey="linkDropDownOptionToProduct1">
71-
<requiredEntity createDataKey="createBundleProduct"/>
72-
<requiredEntity createDataKey="createDropDownBundleOption"/>
73-
<requiredEntity createDataKey="simpleProduct1"/>
74-
</createData>
75-
<createData entity="ApiBundleLink" stepKey="linkDropDownOptionToProduct2">
76-
<requiredEntity createDataKey="createBundleProduct"/>
77-
<requiredEntity createDataKey="createDropDownBundleOption"/>
78-
<requiredEntity createDataKey="simpleProduct2"/>
79-
</createData>
80-
<createData entity="ApiBundleLink" stepKey="linkRadioButtonsOptionToProduct1">
81-
<requiredEntity createDataKey="createBundleProduct"/>
82-
<requiredEntity createDataKey="createBundleRadioButtonsOption"/>
83-
<requiredEntity createDataKey="simpleProduct1"/>
84-
</createData>
85-
<createData entity="ApiBundleLink" stepKey="linkRadioButtonsOptionToProduct2">
86-
<requiredEntity createDataKey="createBundleProduct"/>
87-
<requiredEntity createDataKey="createBundleRadioButtonsOption"/>
88-
<requiredEntity createDataKey="simpleProduct2"/>
89-
</createData>
90-
45+
<!-- Run reindex -->
9146
<magentoCLI command="indexer:reindex" stepKey="reindex"/>
9247
</before>
9348
<after>
94-
<deleteData createDataKey="simpleProduct1" stepKey="deleteSimpleProduct1"/>
95-
<deleteData createDataKey="simpleProduct2" stepKey="deleteSimpleProduct2"/>
96-
<deleteData createDataKey="createBundleProduct" stepKey="deleteBundleProduct"/>
49+
<deleteData createDataKey="createBundleProductCreateBundleProduct" stepKey="deleteDynamicBundleProduct"/>
50+
<deleteData createDataKey="simpleProduct1CreateBundleProduct" stepKey="deleteSimpleProduct1"/>
51+
<deleteData createDataKey="simpleProduct2CreateBundleProduct" stepKey="deleteSimpleProduct2"/>
9752
</after>
9853

9954
<!-- Go to storefront product page -->
100-
<amOnPage url="{{StorefrontProductPage.url($$createBundleProduct.custom_attributes[url_key]$$)}}" stepKey="onPage"/>
101-
<waitForPageLoad stepKey="waitForPageLoad"/>
55+
<amOnPage url="{{StorefrontProductPage.url($$createBundleProductCreateBundleProduct.custom_attributes[url_key]$$)}}" stepKey="navigateToBundleProductPage"/>
10256
<click selector="{{StorefrontBundledSection.addToCart}}" stepKey="clickCustomize"/>
10357

10458
<!--"Drop-down" type option-->
10559
<!-- Check Tier Prices for product 1 -->
106-
<selectOption selector="{{StorefrontBundledSection.dropDownOptionOneProducts('Drop-down Option')}}" userInput="$$simpleProduct1.sku$$ +$$$simpleProduct1.price$$.00" stepKey="selectDropDownOptionProduct1"/>
107-
<seeOptionIsSelected selector="{{StorefrontBundledSection.dropDownOptionOneProducts('Drop-down Option')}}" userInput="$$simpleProduct1.sku$$ +$$$simpleProduct1.price$$.00" stepKey="checkDropDownOptionProduct1"/>
60+
<selectOption selector="{{StorefrontBundledSection.dropDownOptionOneProducts('Drop-down Option')}}" userInput="$$simpleProduct1CreateBundleProduct.sku$$ +$$$simpleProduct1CreateBundleProduct.price$$.00" stepKey="selectDropDownOptionProduct1"/>
61+
<seeOptionIsSelected selector="{{StorefrontBundledSection.dropDownOptionOneProducts('Drop-down Option')}}" userInput="$$simpleProduct1CreateBundleProduct.sku$$ +$$$simpleProduct1CreateBundleProduct.price$$.00" stepKey="checkDropDownOptionProduct1"/>
10862
<grabTextFrom selector="{{StorefrontBundledSection.dropDownOptionTierPrices('Drop-down Option')}}" stepKey="DropDownTierPriceTextProduct1"/>
10963
<assertContains stepKey="assertDropDownTierPriceTextProduct1">
11064
<expectedResult type="string">Buy 5 for $5.00 each and save 50%</expectedResult>
11165
<actualResult type="variable">DropDownTierPriceTextProduct1</actualResult>
11266
</assertContains>
11367
<!-- Check Tier Prices for product 2 -->
114-
<selectOption selector="{{StorefrontBundledSection.dropDownOptionOneProducts('Drop-down Option')}}" userInput="$$simpleProduct2.sku$$ +$$$simpleProduct2.price$$.00" stepKey="selectDropDownOptionProduct2"/>
115-
<seeOptionIsSelected selector="{{StorefrontBundledSection.dropDownOptionOneProducts('Drop-down Option')}}" userInput="$$simpleProduct2.sku$$ +$$$simpleProduct2.price$$.00" stepKey="checkDropDownOptionProduct2"/>
116-
<grabTextFrom selector="{{StorefrontBundledSection.dropDownOptionTierPrices('Drop-down Option')}}" stepKey="DropDownTierPriceTextProduct2"/>
68+
<selectOption selector="{{StorefrontBundledSection.dropDownOptionOneProducts('Drop-down Option')}}" userInput="$$simpleProduct2CreateBundleProduct.sku$$ +$$$simpleProduct2CreateBundleProduct.price$$.00" stepKey="selectDropDownOptionProduct2"/>
69+
<seeOptionIsSelected selector="{{StorefrontBundledSection.dropDownOptionOneProducts('Drop-down Option')}}" userInput="$$simpleProduct2CreateBundleProduct.sku$$ +$$$simpleProduct2CreateBundleProduct.price$$.00" stepKey="checkDropDownOptionProduct2"/>
70+
<grabTextFrom selector="{{StorefrontBundledSection.dropDownOptionTierPrices('Drop-down Option')}}" stepKey="dropDownTierPriceTextProduct2"/>
11771
<assertContains stepKey="assertDropDownTierPriceTextProduct2">
11872
<expectedResult type="string">Buy 7 for $15.00 each and save 25%</expectedResult>
119-
<actualResult type="variable">DropDownTierPriceTextProduct2</actualResult>
73+
<actualResult type="variable">dropDownTierPriceTextProduct2</actualResult>
12074
</assertContains>
12175

12276
<!--"Radio Buttons" type option-->
12377
<!-- Check Tier Prices for product 1 -->
124-
<grabTextFrom selector="{{StorefrontBundledSection.radioButtonOptionLabel('Radio Buttons Option', '$$simpleProduct1.sku$$')}}" stepKey="RadioButtonsOptionTierPriceTextProduct1"/>
78+
<grabTextFrom selector="{{StorefrontBundledSection.radioButtonOptionLabel('Radio Buttons Option', '$$simpleProduct1CreateBundleProduct.sku$$')}}" stepKey="radioButtonsOptionTierPriceTextProduct1"/>
12579
<assertContains stepKey="assertRadioButtonsOptionTierPriceTextProduct1">
12680
<expectedResult type="string">Buy 5 for $5.00 each and save 50%</expectedResult>
127-
<actualResult type="variable">RadioButtonsOptionTierPriceTextProduct1</actualResult>
81+
<actualResult type="variable">radioButtonsOptionTierPriceTextProduct1</actualResult>
12882
</assertContains>
12983
<!-- Check Tier Prices for product 2 -->
130-
<grabTextFrom selector="{{StorefrontBundledSection.radioButtonOptionLabel('Radio Buttons Option', '$$simpleProduct2.sku$$')}}" stepKey="RadioButtonsOptionTierPriceTextProduct2"/>
84+
<grabTextFrom selector="{{StorefrontBundledSection.radioButtonOptionLabel('Radio Buttons Option', '$$simpleProduct2CreateBundleProduct.sku$$')}}" stepKey="radioButtonsOptionTierPriceTextProduct2"/>
13185
<assertContains stepKey="assertRadioButtonsOptionTierPriceTextProduct2">
13286
<expectedResult type="string">Buy 7 for $15.00 each and save 25%</expectedResult>
133-
<actualResult type="variable">RadioButtonsOptionTierPriceTextProduct2</actualResult>
87+
<actualResult type="variable">radioButtonsOptionTierPriceTextProduct2</actualResult>
13488
</assertContains>
13589

13690
<!--"Checkbox" type option-->
13791
<!-- Check Tier Prices for product 1 -->
138-
<grabTextFrom selector="{{StorefrontBundledSection.checkboxOptionLabel('Checkbox Option', '$$simpleProduct1.sku$$')}}" stepKey="CheckBoxOptionTierPriceTextProduct1"/>
92+
<grabTextFrom selector="{{StorefrontBundledSection.checkboxOptionLabel('Checkbox Option', '$$simpleProduct1CreateBundleProduct.sku$$')}}" stepKey="checkBoxOptionTierPriceTextProduct1"/>
13993
<assertContains stepKey="assertCheckBoxOptionTierPriceTextProduct1">
14094
<expectedResult type="string">Buy 5 for $5.00 each and save 50%</expectedResult>
141-
<actualResult type="variable">CheckBoxOptionTierPriceTextProduct1</actualResult>
95+
<actualResult type="variable">checkBoxOptionTierPriceTextProduct1</actualResult>
14296
</assertContains>
14397
<!-- Check Tier Prices for product 2 -->
144-
<grabTextFrom selector="{{StorefrontBundledSection.checkboxOptionLabel('Checkbox Option', '$$simpleProduct2.sku$$')}}" stepKey="CheckBoxOptionTierPriceTextProduct2"/>
98+
<grabTextFrom selector="{{StorefrontBundledSection.checkboxOptionLabel('Checkbox Option', '$$simpleProduct2CreateBundleProduct.sku$$')}}" stepKey="checkBoxOptionTierPriceTextProduct2"/>
14599
<assertContains stepKey="assertCheckBoxOptionTierPriceTextProduct2">
146100
<expectedResult type="string">Buy 7 for $15.00 each and save 25%</expectedResult>
147-
<actualResult type="variable">CheckBoxOptionTierPriceTextProduct2</actualResult>
101+
<actualResult type="variable">checkBoxOptionTierPriceTextProduct2</actualResult>
148102
</assertContains>
149103
</test>
150104
</tests>

app/code/Magento/Bundle/Test/Unit/Block/DataProviders/OptionPriceRendererTest.php

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -48,26 +48,45 @@ protected function setUp()
4848
);
4949
}
5050

51-
public function testRenderTierPrice()
51+
/**
52+
* Test to render Tier price html
53+
*
54+
* @param bool $priceRenderExist
55+
* @param string $expectedHtml
56+
* @dataProvider renderTierPriceDataProvider
57+
*/
58+
public function testRenderTierPrice(bool $priceRenderExist, string $expectedHtml): void
5259
{
53-
$tierPriceHtml = 'tier price html';
60+
$priceRenderer = false;
5461
$expectedArguments = ['zone' => Render::ZONE_ITEM_OPTION];
55-
5662
$productMock = $this->createMock(Product::class);
57-
$blockMock = $this->createPartialMock(BlockInterface::class, ['toHtml', 'render']);
58-
$blockMock->expects($this->once())
59-
->method('render')
60-
->with('tier_price', $productMock, $expectedArguments)
61-
->willReturn($tierPriceHtml);
63+
64+
if ($priceRenderExist) {
65+
$priceRenderer = $this->createPartialMock(BlockInterface::class, ['toHtml', 'render']);
66+
$priceRenderer->expects($this->once())
67+
->method('render')
68+
->with('tier_price', $productMock, $expectedArguments)
69+
->willReturn($expectedHtml);
70+
}
6271

6372
$this->layoutMock->method('getBlock')
6473
->with('product.price.render.default')
65-
->willReturn($blockMock);
74+
->willReturn($priceRenderer);
6675

6776
$this->assertEquals(
68-
$tierPriceHtml,
77+
$expectedHtml,
6978
$this->renderer->renderTierPrice($productMock),
7079
'Render Tier price is wrong'
7180
);
7281
}
82+
83+
/**
84+
* Data provider for test to render Tier price
85+
*
86+
* @return array
87+
*/
88+
public function renderTierPriceDataProvider(): array
89+
{
90+
return [[true, 'tier price html'], [false, '']];
91+
}
7392
}

dev/tests/integration/testsuite/Magento/Bundle/_files/product_with_simple_tier_pricing.php

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,11 @@
77

88
require __DIR__ . '/../../../Magento/Catalog/_files/product_simple.php';
99

10-
/** @var \Magento\Catalog\Api\ProductRepositoryInterface $productRepository */
11-
$productRepository = $objectManager->create(\Magento\Catalog\Api\ProductRepositoryInterface::class);
12-
$simpleProduct = $productRepository->get('simple');
13-
14-
/** @var $product \Magento\Catalog\Model\Product */
15-
$product = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(\Magento\Catalog\Model\Product::class);
16-
$product->setTypeId('bundle')
10+
/** @var $productFactory Magento\Catalog\Model\ProductFactory */
11+
$productFactory = $objectManager->create(\Magento\Catalog\Model\ProductFactory::class);
12+
/** @var $bundleProduct \Magento\Catalog\Model\Product */
13+
$bundleProduct = $productFactory->create();
14+
$bundleProduct->setTypeId('bundle')
1715
->setAttributeSetId($product->getDefaultAttributeSetId())
1816
->setWebsiteIds([1])
1917
->setPriceType(\Magento\Bundle\Model\Product\Price::PRICE_TYPE_DYNAMIC)
@@ -22,7 +20,12 @@
2220
->setSku('bundle-product')
2321
->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
2422
->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
25-
->setStockData(['use_config_manage_stock' => 1, 'qty' => 100, 'is_qty_decimal' => 0, 'is_in_stock' => 1])
23+
->setStockData([
24+
'use_config_manage_stock' => 1,
25+
'qty' => 100,
26+
'is_qty_decimal' => 0,
27+
'is_in_stock' => 1,
28+
])
2629
->setBundleOptionsData(
2730
[
2831
[
@@ -35,6 +38,6 @@
3538
]
3639
)
3740
->setBundleSelectionsData(
38-
[[['product_id' => $simpleProduct->getId(), 'selection_qty' => 1, 'delete' => '']]]
41+
[[['product_id' => $product->getId(), 'selection_qty' => 1, 'delete' => '']]]
3942
);
40-
$productRepository->save($product);
43+
$productRepository->save($bundleProduct);

0 commit comments

Comments
 (0)