Skip to content

Commit 71bf565

Browse files
committed
Merge remote-tracking branch 'mainline/2.3-develop' into MC-20255
2 parents 1f2d46e + 3490d3b commit 71bf565

File tree

21 files changed

+418
-44
lines changed

21 files changed

+418
-44
lines changed

app/code/Magento/CatalogRule/Test/Mftf/ActionGroup/CatalogPriceRuleActionGroup.xml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,10 @@
5757
<scrollToTopOfPage stepKey="scrollToTop"/>
5858
<waitForPageLoad stepKey="waitForApplied"/>
5959
</actionGroup>
60-
60+
<actionGroup name="AdminCreateMultipleWebsiteCatalogPriceRule" extends="createCatalogPriceRule">
61+
<remove keyForRemoval="selectSite"/>
62+
<selectOption selector="{{AdminNewCatalogPriceRule.websites}}" parameterArray="['FirstWebsite', 'SecondWebsite']" stepKey="selectWebsite"/>
63+
</actionGroup>
6164
<actionGroup name="CreateCatalogPriceRuleViaTheUi">
6265
<arguments>
6366
<argument name="catalogRule" defaultValue="_defaultCatalogRule"/>

app/code/Magento/Checkout/Test/Mftf/ActionGroup/GuestCheckoutFillNewBillingAddressActionGroup.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@
2828
<fillField selector="{{CheckoutPaymentSection.guestPostcode}}" userInput="{{customerAddressVar.postcode}}" stepKey="enterPostcode"/>
2929
<fillField selector="{{CheckoutPaymentSection.guestTelephone}}" userInput="{{customerAddressVar.telephone}}" stepKey="enterTelephone"/>
3030
</actionGroup>
31+
<actionGroup name="StorefrontCheckoutFillNewBillingAddressActionGroup" extends="GuestCheckoutFillNewBillingAddressActionGroup">
32+
<remove keyForRemoval="enterEmail"/>
33+
<remove keyForRemoval="waitForLoading3"/>
34+
</actionGroup>
3135

3236
<actionGroup name="LoggedInCheckoutFillNewBillingAddressActionGroup">
3337
<annotations>

app/code/Magento/Checkout/Test/Mftf/Page/CheckoutPage.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,6 @@
1414
<section name="CheckoutOrderSummarySection"/>
1515
<section name="CheckoutSuccessMainSection"/>
1616
<section name="CheckoutPaymentSection"/>
17+
<section name="SelectShippingBillingPopupSection"/>
1718
</page>
1819
</pages>

app/code/Magento/Checkout/Test/Mftf/Section/CheckoutPaymentSection.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
<element name="ProductOptionLinkActiveByProductItemName" type="text" selector="//div[@class='product-item-details']//strong[@class='product-item-name'][text()='{{var1}}']//ancestor::div[@class='product-item-details']//div[@class='product options active']//a[text() = '{{var2}}']" parameterized="true" />
4343
<element name="shipToInformation" type="text" selector="//div[@class='ship-to']//div[@class='shipping-information-content']" />
4444
<element name="shippingMethodInformation" type="text" selector="//div[@class='ship-via']//div[@class='shipping-information-content']" />
45+
<element name="shippingInformationSection" type="text" selector=".ship-to .shipping-information-content" />
4546
<element name="paymentMethodTitle" type="text" selector=".payment-method-title span" />
4647
<element name="productOptionsByProductItemPrice" type="text" selector="//div[@class='product-item-inner']//div[@class='subtotal']//span[@class='price'][contains(.,'{{price}}')]//ancestor::div[@class='product-item-details']//div[@class='product options']" parameterized="true"/>
4748
<element name="productOptionsActiveByProductItemPrice" type="text" selector="//div[@class='subtotal']//span[@class='price'][contains(.,'{{price}}')]//ancestor::div[@class='product-item-details']//div[@class='product options active']" parameterized="true"/>

app/code/Magento/Checkout/view/frontend/web/js/view/shipping.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,16 @@ define([
249249
if (this.validateShippingInformation()) {
250250
quote.billingAddress(null);
251251
checkoutDataResolver.resolveBillingAddress();
252+
registry.async('checkoutProvider')(function (checkoutProvider) {
253+
var shippingAddressData = checkoutData.getShippingAddressFromData();
254+
255+
if (shippingAddressData) {
256+
checkoutProvider.set(
257+
'shippingAddress',
258+
$.extend(true, {}, checkoutProvider.get('shippingAddress'), shippingAddressData)
259+
);
260+
}
261+
});
252262
setShippingInformationAction().done(
253263
function () {
254264
stepNavigator.next();
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Magento\Config\Model\Config\Backend\File;
8+
9+
/**
10+
* System config PDF field backend model.
11+
*/
12+
class Pdf extends \Magento\Config\Model\Config\Backend\File
13+
{
14+
/**
15+
* @inheritdoc
16+
*/
17+
protected function _getAllowedExtensions()
18+
{
19+
return ['pdf'];
20+
}
21+
}

app/code/Magento/Config/Model/Config/Backend/Image/Pdf.php

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

7-
/**
8-
* System config image field backend model for Zend PDF generator
9-
*
10-
* @author Magento Core Team <[email protected]>
11-
*/
127
namespace Magento\Config\Model\Config\Backend\Image;
138

149
/**
10+
* System config PDF field backend model.
11+
*
1512
* @api
1613
* @since 100.0.2
14+
* @see \Magento\Config\Model\Config\Backend\File\Pdf
1715
*/
1816
class Pdf extends \Magento\Config\Model\Config\Backend\Image
1917
{
2018
/**
19+
* Returns the list of allowed file extensions.
20+
*
2121
* @return string[]
2222
*/
2323
protected function _getAllowedExtensions()
2424
{
25-
return ['tif', 'tiff', 'png', 'jpg', 'jpe', 'jpeg'];
25+
return ['tif', 'tiff', 'png', 'jpg', 'jpe', 'jpeg', 'pdf'];
2626
}
2727
}

app/code/Magento/Customer/Test/Mftf/Data/AddressData.xml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,21 @@
5151
<data key="default_shipping">Yes</data>
5252
<requiredEntity type="region">RegionTX</requiredEntity>
5353
</entity>
54+
<entity name="US_Address_TX_Without_Default" type="address">
55+
<data key="firstname">John</data>
56+
<data key="lastname">Doe</data>
57+
<data key="company">Magento</data>
58+
<array key="street">
59+
<item>7700 West Parmer Lane</item>
60+
</array>
61+
<data key="city">Austin</data>
62+
<data key="state">Texas</data>
63+
<data key="country_id">US</data>
64+
<data key="country">United States</data>
65+
<data key="postcode">78729</data>
66+
<data key="telephone">512-345-6789</data>
67+
<requiredEntity type="region">RegionTX</requiredEntity>
68+
</entity>
5469
<entity name="US_Address_TX_Default_Billing" type="address">
5570
<data key="firstname">John</data>
5671
<data key="lastname">Doe</data>

app/code/Magento/Customer/Test/Mftf/Data/CustomerData.xml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,20 @@
4747
<data key="group">General</data>
4848
<requiredEntity type="address">US_Address_TX</requiredEntity>
4949
</entity>
50+
<entity name="Simple_US_Customer_Without_Default_Address" type="customer">
51+
<data key="group_id">1</data>
52+
<data key="default_billing">true</data>
53+
<data key="default_shipping">true</data>
54+
<data key="email" unique="prefix">[email protected]</data>
55+
<data key="firstname">John</data>
56+
<data key="lastname">Doe</data>
57+
<data key="fullname">John Doe</data>
58+
<data key="password">pwdTest123!</data>
59+
<data key="store_id">0</data>
60+
<data key="website_id">0</data>
61+
<data key="group">General</data>
62+
<requiredEntity type="address">US_Address_TX_Without_Default</requiredEntity>
63+
</entity>
5064
<entity name="SimpleUsCustomerWithNewCustomerGroup" type="customer">
5165
<data key="default_billing">true</data>
5266
<data key="default_shipping">true</data>

app/code/Magento/Downloadable/Test/Mftf/Section/StorefrontDownloadableProductSection.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,6 @@
1414
<element name="downloadableLinkByTitle" type="input" selector="//*[@id='downloadable-links-list']/*[contains(.,'{{title}}')]//input" parameterized="true" timeout="30"/>
1515
<element name="downloadableLinkSampleByTitle" type="text" selector="//label[contains(., '{{title}}')]/a[contains(@class, 'sample link')]" parameterized="true"/>
1616
<element name="downloadableSampleLabel" type="text" selector="//a[contains(.,normalize-space('{{title}}'))]" parameterized="true" timeout="30"/>
17+
<element name="downloadableLinkSelectAllCheckbox" type="checkbox" selector="#links_all" />
1718
</section>
1819
</sections>
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
9+
<tests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
10+
xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd">
11+
<test name="SelectAllDownloadableLinksDownloadableProductTest">
12+
<annotations>
13+
<features value="Catalog"/>
14+
<stories value="Create Downloadable Product"/>
15+
<title value="Select all downloadable links downloadable product test"/>
16+
<description value="All the downloadable links must be selected or unselected when anyone click on select all or unselect all checkbox respectively."/>
17+
<severity value="MAJOR"/>
18+
<group value="Downloadable"/>
19+
</annotations>
20+
<before>
21+
<!-- Create category -->
22+
<createData entity="SimpleSubCategory" stepKey="createCategory"/>
23+
24+
<!-- Login as admin -->
25+
<actionGroup ref="LoginAsAdmin" stepKey="LoginAsAdmin"/>
26+
27+
<!-- Create downloadable product -->
28+
<amOnPage url="{{AdminProductIndexPage.url}}" stepKey="amOnProductGridPage"/>
29+
<waitForPageLoad stepKey="waitForProductGridPageLoad"/>
30+
<actionGroup ref="GoToSpecifiedCreateProductPage" stepKey="createProduct">
31+
<argument name="productType" value="downloadable"/>
32+
</actionGroup>
33+
34+
<!-- Fill downloadable product values -->
35+
<actionGroup ref="fillMainProductFormNoWeight" stepKey="fillDownloadableProductForm">
36+
<argument name="product" value="DownloadableProduct"/>
37+
</actionGroup>
38+
39+
<!-- Add downloadable product to category -->
40+
<searchAndMultiSelectOption selector="{{AdminProductFormSection.categoriesDropdown}}"
41+
parameterArray="[$$createCategory.name$$]" stepKey="fillCategory"/>
42+
43+
<!-- Fill downloadable link information before the creation link -->
44+
<actionGroup ref="AdminAddDownloadableLinkInformationActionGroup" stepKey="addDownloadableLinkInformation"/>
45+
46+
<!-- Links can be purchased separately -->
47+
<checkOption selector="{{AdminProductDownloadableSection.isLinksPurchasedSeparately}}"
48+
stepKey="checkOptionPurchaseSeparately"/>
49+
50+
<!-- Add first downloadable link -->
51+
<actionGroup ref="addDownloadableProductLinkWithMaxDownloads" stepKey="addFirstDownloadableProductLink">
52+
<argument name="link" value="downloadableLinkWithMaxDownloads"/>
53+
</actionGroup>
54+
55+
<!-- Add second downloadable link -->
56+
<actionGroup ref="addDownloadableProductLink" stepKey="addSecondDownloadableProductLink">
57+
<argument name="link" value="downloadableLink"/>
58+
</actionGroup>
59+
60+
<!-- Save product -->
61+
<actionGroup ref="saveProductForm" stepKey="saveProduct"/>
62+
</before>
63+
<after>
64+
<!-- Delete category -->
65+
<deleteData createDataKey="createCategory" stepKey="deleteCategory"/>
66+
67+
<!-- Delete created downloadable product -->
68+
<actionGroup ref="deleteProductUsingProductGrid" stepKey="deleteProduct">
69+
<argument name="product" value="DownloadableProduct"/>
70+
</actionGroup>
71+
72+
<!-- Log out -->
73+
<actionGroup ref="logout" stepKey="logout"/>
74+
</after>
75+
76+
<!-- Step 1: Navigate to store front Product page as guest -->
77+
<amOnPage url="/{{DownloadableProduct.sku}}.html"
78+
stepKey="amOnStorefrontProductPage"/>
79+
80+
<!-- Step 2: click on select all checkbox -->
81+
<click
82+
selector="{{StorefrontDownloadableProductSection.downloadableLinkSelectAllCheckbox}}"
83+
stepKey="selectAllProductLink"/>
84+
85+
<!-- Step 3: Make sure that all product links are checked -->
86+
<seeCheckboxIsChecked selector="{{StorefrontDownloadableProductSection.downloadableLinkByTitle(downloadableLinkWithMaxDownloads.title)}}" stepKey="seeFirstCheckboxChecked"/>
87+
88+
<seeCheckboxIsChecked selector="{{StorefrontDownloadableProductSection.downloadableLinkByTitle(downloadableLink.title)}}" stepKey="seeSecondCheckboxChecked"/>
89+
90+
<!-- Step 4: click again on select all checkbox -->
91+
<click
92+
selector="{{StorefrontDownloadableProductSection.downloadableLinkSelectAllCheckbox}}"
93+
stepKey="unselectAllProductLink"/>
94+
95+
<!-- Step 5: Make sure that all product links are unchecked -->
96+
<dontSeeCheckboxIsChecked selector="{{StorefrontDownloadableProductSection.downloadableLinkByTitle(downloadableLinkWithMaxDownloads.title)}}" stepKey="seeFirstCheckboxUnChecked"/>
97+
98+
<dontSeeCheckboxIsChecked selector="{{StorefrontDownloadableProductSection.downloadableLinkByTitle(downloadableLink.title)}}" stepKey="seeSecondCheckboxUnChecked"/>
99+
100+
</test>
101+
</tests>
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
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\SalesRule\Model\Rule\Action;
9+
10+
use Magento\Framework\Data\OptionSourceInterface;
11+
use Magento\SalesRule\Model\Rule;
12+
13+
/**
14+
* Class SimpleActionOptionsProvider
15+
*/
16+
class SimpleActionOptionsProvider implements OptionSourceInterface
17+
{
18+
/**
19+
* @inheritdoc
20+
*/
21+
public function toOptionArray()
22+
{
23+
return [
24+
['label' => __('Percent of product price discount'), 'value' => Rule::BY_PERCENT_ACTION],
25+
['label' => __('Fixed amount discount'), 'value' => Rule::BY_FIXED_ACTION],
26+
['label' => __('Fixed amount discount for whole cart'), 'value' => Rule::CART_FIXED_ACTION],
27+
['label' => __('Buy X get Y free (discount amount is Y)'), 'value' => Rule::BUY_X_GET_Y_ACTION]
28+
];
29+
}
30+
}

app/code/Magento/SalesRule/Model/Rule/Metadata/ValueProvider.php

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,14 @@
55
*/
66
namespace Magento\SalesRule\Model\Rule\Metadata;
77

8-
use Magento\SalesRule\Model\Rule;
9-
use Magento\Store\Model\System\Store;
108
use Magento\Customer\Api\GroupRepositoryInterface;
119
use Magento\Framework\Api\SearchCriteriaBuilder;
10+
use Magento\Framework\App\ObjectManager;
1211
use Magento\Framework\Convert\DataObject;
12+
use Magento\SalesRule\Model\Rule;
13+
use Magento\SalesRule\Model\Rule\Action\SimpleActionOptionsProvider;
14+
use Magento\SalesRule\Model\RuleFactory;
15+
use Magento\Store\Model\System\Store;
1316

1417
/**
1518
* Metadata provider for sales rule edit form.
@@ -37,31 +40,40 @@ class ValueProvider
3740
protected $objectConverter;
3841

3942
/**
40-
* @var \Magento\SalesRule\Model\RuleFactory
43+
* @var RuleFactory
4144
*/
4245
protected $salesRuleFactory;
4346

47+
/**
48+
* @var SimpleActionOptionsProvider
49+
*/
50+
private $simpleActionOptionsProvider;
51+
4452
/**
4553
* Initialize dependencies.
4654
*
4755
* @param Store $store
4856
* @param GroupRepositoryInterface $groupRepository
4957
* @param SearchCriteriaBuilder $searchCriteriaBuilder
5058
* @param DataObject $objectConverter
51-
* @param \Magento\SalesRule\Model\RuleFactory $salesRuleFactory
59+
* @param RuleFactory $salesRuleFactory
60+
* @param SimpleActionOptionsProvider|null $simpleActionOptionsProvider
5261
*/
5362
public function __construct(
5463
Store $store,
5564
GroupRepositoryInterface $groupRepository,
5665
SearchCriteriaBuilder $searchCriteriaBuilder,
5766
DataObject $objectConverter,
58-
\Magento\SalesRule\Model\RuleFactory $salesRuleFactory
67+
RuleFactory $salesRuleFactory,
68+
SimpleActionOptionsProvider $simpleActionOptionsProvider = null
5969
) {
6070
$this->store = $store;
6171
$this->groupRepository = $groupRepository;
6272
$this->searchCriteriaBuilder = $searchCriteriaBuilder;
6373
$this->objectConverter = $objectConverter;
6474
$this->salesRuleFactory = $salesRuleFactory;
75+
$this->simpleActionOptionsProvider = $simpleActionOptionsProvider ?:
76+
ObjectManager::getInstance()->get(SimpleActionOptionsProvider::class);
6577
}
6678

6779
/**
@@ -71,15 +83,10 @@ public function __construct(
7183
* @return array
7284
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
7385
*/
74-
public function getMetadataValues(\Magento\SalesRule\Model\Rule $rule)
86+
public function getMetadataValues(Rule $rule)
7587
{
7688
$customerGroups = $this->groupRepository->getList($this->searchCriteriaBuilder->create())->getItems();
77-
$applyOptions = [
78-
['label' => __('Percent of product price discount'), 'value' => Rule::BY_PERCENT_ACTION],
79-
['label' => __('Fixed amount discount'), 'value' => Rule::BY_FIXED_ACTION],
80-
['label' => __('Fixed amount discount for whole cart'), 'value' => Rule::CART_FIXED_ACTION],
81-
['label' => __('Buy X get Y free (discount amount is Y)'), 'value' => Rule::BUY_X_GET_Y_ACTION]
82-
];
89+
$applyOptions = $this->simpleActionOptionsProvider->toOptionArray();
8390

8491
$couponTypesOptions = [];
8592
$couponTypes = $this->salesRuleFactory->create()->getCouponTypes();

app/code/Magento/SalesRule/Test/Mftf/ActionGroup/AdminCreateCartPriceRuleActionGroup.xml

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,18 @@
105105
<waitForElementVisible selector="{{AdminCartPriceRulesFormSection.categoryCheckbox(categoryName)}}" stepKey="waitForCategoryVisible" after="openChooser"/>
106106
<checkOption selector="{{AdminCartPriceRulesFormSection.categoryCheckbox(categoryName)}}" stepKey="checkCategoryName" after="waitForCategoryVisible"/>
107107
</actionGroup>
108-
108+
<actionGroup name="AdminCreateMultiWebsiteCartPriceRuleActionGroup" extends="AdminCreateCartPriceRuleActionGroup">
109+
<annotations>
110+
<description>EXTENDS: AdminCreateCartPriceRuleActionGroup. Removes 'clickSaveButton' for the next data changing. Assign cart price rule to 2 websites instead of 1.</description>
111+
</annotations>
112+
<arguments>
113+
<argument name="ruleName"/>
114+
</arguments>
115+
<remove keyForRemoval="clickSaveButton"/>
116+
<remove keyForRemoval="seeSuccessMessage"/>
117+
<remove keyForRemoval="selectWebsites"/>
118+
<selectOption selector="{{AdminCartPriceRulesFormSection.websites}}" parameterArray="['FirstWebsite', 'SecondWebsite']" stepKey="selectWebsites" after="fillRuleName"/>
119+
</actionGroup>
109120
<actionGroup name="CreateCartPriceRuleSecondWebsiteActionGroup">
110121
<annotations>
111122
<description>Goes to the Admin Cart Price Rule grid page. Clicks on Add New Rule. Fills the provided Rule (Name). Selects 'Second Website' from the 'Websites' menu.</description>

app/code/Magento/SalesRule/Test/Mftf/Section/AdminCartPriceRulesFormSection.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
<element name="description" type="textarea" selector="//div[@class='admin__field-control']/textarea[@name='description']"/>
2020
<element name="active" type="checkbox" selector="//div[@class='admin__actions-switch']/input[@name='is_active']/../label"/>
2121
<element name="websites" type="multiselect" selector="select[name='website_ids']"/>
22+
<element name="websitesOptions" type="select" selector="[name='website_ids'] option"/>
2223
<element name="customerGroups" type="multiselect" selector="select[name='customer_group_ids']"/>
2324
<element name="customerGroupsOptions" type="multiselect" selector="select[name='customer_group_ids'] option"/>
2425
<element name="coupon" type="select" selector="select[name='coupon_type']"/>

0 commit comments

Comments
 (0)