From 9a385aeb419beffdda1c1728943d9fa43d54f5b9 Mon Sep 17 00:00:00 2001 From: Maria Kovdrysh Date: Tue, 14 May 2019 08:33:11 -0700 Subject: [PATCH 01/36] MC-13210: Register customer with image upload --- .../SignUpNewUserFromStorefrontActionGroup.xml | 12 ++++++++++++ .../AdminCustomerAccountInformationSection.xml | 1 + 2 files changed, 13 insertions(+) diff --git a/app/code/Magento/Customer/Test/Mftf/ActionGroup/SignUpNewUserFromStorefrontActionGroup.xml b/app/code/Magento/Customer/Test/Mftf/ActionGroup/SignUpNewUserFromStorefrontActionGroup.xml index ef956293d367b..8cb01ac2b0522 100644 --- a/app/code/Magento/Customer/Test/Mftf/ActionGroup/SignUpNewUserFromStorefrontActionGroup.xml +++ b/app/code/Magento/Customer/Test/Mftf/ActionGroup/SignUpNewUserFromStorefrontActionGroup.xml @@ -41,6 +41,18 @@ + + + + + + + + + + + + diff --git a/app/code/Magento/Customer/Test/Mftf/Section/AdminCustomerAccountInformationSection.xml b/app/code/Magento/Customer/Test/Mftf/Section/AdminCustomerAccountInformationSection.xml index 06d4fef36585d..f302f70bc36b9 100644 --- a/app/code/Magento/Customer/Test/Mftf/Section/AdminCustomerAccountInformationSection.xml +++ b/app/code/Magento/Customer/Test/Mftf/Section/AdminCustomerAccountInformationSection.xml @@ -33,5 +33,6 @@ + From 9ebf4c6f5b962e4e7a21f8da0dbeea571e6f989f Mon Sep 17 00:00:00 2001 From: Maria Kovdrysh Date: Tue, 14 May 2019 11:33:13 -0700 Subject: [PATCH 02/36] MC-13097: Logging during checkout for Customer without addresses in address book --- ...refrontCustomerLoginDuringCheckoutTest.xml | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 app/code/Magento/Checkout/Test/Mftf/Test/StorefrontCustomerLoginDuringCheckoutTest.xml diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontCustomerLoginDuringCheckoutTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontCustomerLoginDuringCheckoutTest.xml new file mode 100644 index 0000000000000..d5149a5592bff --- /dev/null +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontCustomerLoginDuringCheckoutTest.xml @@ -0,0 +1,72 @@ + + + + + + + + + + <description value="Logging during checkout for customer without addresses in address book"/> + <severity value="CRITICAL"/> + <testCaseId value="MC-13097"/> + <group value="OnePageCheckout"/> + <group value="mtf_migrated"/> + </annotations> + <before> + <!-- Create simple product --> + <createData entity="SimpleProduct2" stepKey="createProduct"/> + + <!-- Login as admin --> + <actionGroup ref="LoginAsAdmin" stepKey="loginAsAdmin"/> + </before> + <after> + <!-- Delete simple product --> + <deleteData createDataKey="createProduct" stepKey="deleteProduct"/> + + <!-- Customer log out --> + <actionGroup ref="StorefrontCustomerLogoutActionGroup" stepKey="customerLogout"/> + + <!-- Delete customer --> + <actionGroup ref="AdminDeleteCustomerActionGroup" stepKey="deleteCustomer"> + <argument name="customerEmail" value="CustomerEntityOne.email"/> + </actionGroup> + + <!-- Logout admin --> + <actionGroup ref="logout" stepKey="logout"/> + </after> + <!-- Go to Storefront as Guest and create new account --> + <actionGroup ref="SignUpNewUserFromStorefrontActionGroup" stepKey="createNewCustomerAccount"/> + + <!-- Sign Out --> + <actionGroup ref="StorefrontCustomerLogoutActionGroup" stepKey="customerLogout"/> + + <!-- Add simple product to cart as Guest --> + <amOnPage url="{{StorefrontProductPage.url($$createProduct.custom_attributes[url_key]$$)}}" stepKey="goToProductPage"/> + <waitForPageLoad stepKey="waitForPageLoad"/> + <actionGroup ref="StorefrontAddProductToCartActionGroup" stepKey="cartAddSimpleProductToCart"> + <argument name="product" value="$$createProduct$$"/> + <argument name="productCount" value="1"/> + </actionGroup> + + <!-- Go to Checkout page --> + <actionGroup ref="clickViewAndEditCartFromMiniCart" stepKey="goToShoppingCartFromMinicart"/> + <click selector="{{CheckoutCartSummarySection.proceedToCheckout}}" stepKey="clickProceedToCheckout"/> + <waitForPageLoad stepKey="waitForProceedToCheckout"/> + + <!-- Input in field email and password for newly created customer; click Login button --> + <actionGroup ref="LoginAsCustomerOnCheckoutPageActionGroup" stepKey="customerLogin"> + <argument name="customer" value="CustomerEntityOne"/> + </actionGroup> + + <!-- Shipping form is pre-filed with first name and last name --> + <seeInField selector="{{CheckoutShippingSection.firstName}}" userInput="{{CustomerEntityOne.firstname}}" stepKey="seeCustomerFirstNameInField"/> + <seeInField selector="{{CheckoutShippingSection.lastName}}" userInput="{{CustomerEntityOne.lastname}}" stepKey="seeCustomerLastNameInField"/> + </test> +</tests> From d96cfe7eb88552079bd6721932dace2200d17624 Mon Sep 17 00:00:00 2001 From: Maria Kovdrysh <kovdrysh@adobe.com> Date: Wed, 15 May 2019 13:45:15 -0700 Subject: [PATCH 03/36] MC-13097: Logging during checkout for Customer without addresses in address book --- .../Test/Mftf/Test/StorefrontCustomerLoginDuringCheckoutTest.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontCustomerLoginDuringCheckoutTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontCustomerLoginDuringCheckoutTest.xml index d5149a5592bff..dc47b9abde545 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontCustomerLoginDuringCheckoutTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontCustomerLoginDuringCheckoutTest.xml @@ -17,7 +17,6 @@ <severity value="CRITICAL"/> <testCaseId value="MC-13097"/> <group value="OnePageCheckout"/> - <group value="mtf_migrated"/> </annotations> <before> <!-- Create simple product --> From 8edc163267ceacc319214b572aee2a0291c6f06a Mon Sep 17 00:00:00 2001 From: Maria Kovdrysh <kovdrysh@adobe.com> Date: Mon, 20 May 2019 09:48:19 -0500 Subject: [PATCH 04/36] MC-13212: Apply Promo Code during Checkout for physical product --- .../OpenStoreFrontProductPageActionGroup.xml | 18 +++++ ...efrontApplyPromoCodeDuringCheckoutTest.xml | 81 +++++++++++++++++++ ...StorefrontApplyDiscountCodeActionGroup.xml | 21 +++++ .../Test/Mftf/Section/DiscountSection.xml | 1 + 4 files changed, 121 insertions(+) create mode 100644 app/code/Magento/Catalog/Test/Mftf/ActionGroup/OpenStoreFrontProductPageActionGroup.xml create mode 100644 app/code/Magento/Checkout/Test/Mftf/Test/StorefrontApplyPromoCodeDuringCheckoutTest.xml create mode 100644 app/code/Magento/SalesRule/Test/Mftf/ActionGroup/StorefrontApplyDiscountCodeActionGroup.xml diff --git a/app/code/Magento/Catalog/Test/Mftf/ActionGroup/OpenStoreFrontProductPageActionGroup.xml b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/OpenStoreFrontProductPageActionGroup.xml new file mode 100644 index 0000000000000..728c92474c255 --- /dev/null +++ b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/OpenStoreFrontProductPageActionGroup.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd"> + <!-- Open product page by product url on Storefront --> + <actionGroup name="OpenStoreFrontProductPageActionGroup"> + <arguments> + <argument name="productUrlKey" type="string"/> + </arguments> + <amOnPage url="{{StorefrontProductPage.url(productUrlKey)}}" stepKey="amOnProductPage"/> + <waitForPageLoad stepKey="waitForProductPageLoad"/> + </actionGroup> +</actionGroups> diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontApplyPromoCodeDuringCheckoutTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontApplyPromoCodeDuringCheckoutTest.xml new file mode 100644 index 0000000000000..5e625f5c8d309 --- /dev/null +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontApplyPromoCodeDuringCheckoutTest.xml @@ -0,0 +1,81 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> + +<tests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd"> + <test name="StorefrontApplyPromoCodeDuringCheckoutTest"> + <annotations> + <features value="OnePageCheckout"/> + <stories value="OnePageCheckout with Promo Code"/> + <title value="Storefront apply promo code during checkout test"/> + <description value="Apply promo code during checkout for physical product"/> + <severity value="CRITICAl"/> + <testCaseId value="MC-13212"/> + <group value="checkout"/> + </annotations> + <before> + <!-- Create simple product --> + <createData entity="SimpleProduct2" stepKey="createProduct"> + <field key="price">10.00</field> + </createData> + + <!-- Create cart price rule --> + <createData entity="ActiveSalesRuleForNotLoggedIn" stepKey="createCartPriceRule"/> + <createData entity="SimpleSalesRuleCoupon" stepKey="createCouponForCartPriceRule"> + <requiredEntity createDataKey="createCartPriceRule"/> + </createData> + </before> + <after> + <!-- Delete simple product --> + <deleteData createDataKey="createProduct" stepKey="deleteProduct"/> + + <!-- Delete sales rule --> + <deleteData createDataKey="createCartPriceRule" stepKey="deleteCartPriceRule"/> + + <!-- Admin log out --> + <actionGroup ref="logout" stepKey="logout"/> + </after> + + <!-- Add simple product to cart --> + <actionGroup ref="AddSimpleProductToCart" stepKey="addProductToCart"> + <argument name="product" value="$$createProduct$$"/> + </actionGroup> + + <!-- Navigate to checkout --> + <actionGroup ref="GoToCheckoutFromMinicartActionGroup" stepKey="goToCheckoutFromMinicart"/> + + <!-- Fill shipping address --> + <actionGroup ref="GuestCheckoutFillingShippingSectionActionGroup" stepKey="guestCheckoutFillingShipping"> + <argument name="shippingMethod" value="Flat Rate"/> + </actionGroup> + + <!-- Apply discount to order --> + <actionGroup ref="StorefrontApplyDiscountCodeActionGroup" stepKey="applyCoupon"> + <argument name="discountCode" value="$$createCouponForCartPriceRule.code$$"/> + </actionGroup> + + <!-- Select payment solution --> + <actionGroup ref="CheckoutSelectCheckMoneyOrderPaymentActionGroup" stepKey="clickCheckMoneyOrderPayment"/> + + <!-- Place Order --> + <actionGroup ref="ClickPlaceOrderActionGroup" stepKey="clickPlaceOrder"/> + <grabTextFrom selector="{{CheckoutSuccessMainSection.orderNumber}}" stepKey="grabOrderNumber"/> + + <!-- Login as admin --> + <actionGroup ref="LoginAsAdmin" stepKey="loginAsAdmin"/> + + <!-- Check total in created order --> + <actionGroup ref="filterOrderGridById" stepKey="filterOrderById"> + <argument name="orderId" value="$grabOrderNumber"/> + </actionGroup> + <click selector="{{AdminOrdersGridSection.firstRow}}" stepKey="clickOrderRow"/> + <waitForPageLoad stepKey="waitForAdminOrderPageLoad"/> + <scrollTo selector="{{AdminOrderTotalSection.grandTotal}}" stepKey="scrollToOrderTotalSection"/> + <see selector="{{AdminOrderTotalSection.grandTotal}}" userInput="$$createProduct.price$$" stepKey="checkTotal"/> + </test> +</tests> diff --git a/app/code/Magento/SalesRule/Test/Mftf/ActionGroup/StorefrontApplyDiscountCodeActionGroup.xml b/app/code/Magento/SalesRule/Test/Mftf/ActionGroup/StorefrontApplyDiscountCodeActionGroup.xml new file mode 100644 index 0000000000000..063409e9fc7ea --- /dev/null +++ b/app/code/Magento/SalesRule/Test/Mftf/ActionGroup/StorefrontApplyDiscountCodeActionGroup.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd"> + <!-- Apply discount code during checkout --> + <actionGroup name="StorefrontApplyDiscountCodeActionGroup"> + <arguments> + <argument name="discountCode" type="string"/> + </arguments> + <click selector="{{DiscountSection.DiscountTab}}" stepKey="clickToAddDiscount"/> + <fillField selector="{{DiscountSection.DiscountInput}}" userInput="{{discountCode}}" stepKey="fillFieldDiscountCode"/> + <click selector="{{DiscountSection.ApplyCodeBtn}}" stepKey="clickToApplyDiscount"/> + <waitForPageLoad stepKey="waitForDiscountToBeAdded"/> + <see selector="{{DiscountSection.DiscountVerificationMsg}}" userInput="Your coupon was successfully applied" stepKey="assertDiscountApplyMessage"/> + </actionGroup> +</actionGroups> diff --git a/app/code/Magento/SalesRule/Test/Mftf/Section/DiscountSection.xml b/app/code/Magento/SalesRule/Test/Mftf/Section/DiscountSection.xml index 7e2ef0b512020..3639e295d2f11 100644 --- a/app/code/Magento/SalesRule/Test/Mftf/Section/DiscountSection.xml +++ b/app/code/Magento/SalesRule/Test/Mftf/Section/DiscountSection.xml @@ -13,5 +13,6 @@ <element name="DiscountInput" type="input" selector="#discount-code"/> <element name="ApplyCodeBtn" type="button" selector="//span[text()='Apply Discount']"/> <element name="CancelCoupon" type="button" selector="//button[@value='Cancel Coupon']"/> + <element name="DiscountVerificationMsg" type="button" selector="//div[contains(@class, 'discount-code _active')]//div[@data-role='checkout-messages']/div/div"/> </section> </sections> From 5882747dccef7eda4156ca5c04ba81bbacbc937b Mon Sep 17 00:00:00 2001 From: Maria Kovdrysh <kovdrysh@adobe.com> Date: Tue, 21 May 2019 12:57:50 -0500 Subject: [PATCH 05/36] MC-13212: Apply Promo Code during Checkout for physical product --- .../OpenStoreFrontProductPageActionGroup.xml | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 app/code/Magento/Catalog/Test/Mftf/ActionGroup/OpenStoreFrontProductPageActionGroup.xml diff --git a/app/code/Magento/Catalog/Test/Mftf/ActionGroup/OpenStoreFrontProductPageActionGroup.xml b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/OpenStoreFrontProductPageActionGroup.xml deleted file mode 100644 index 728c92474c255..0000000000000 --- a/app/code/Magento/Catalog/Test/Mftf/ActionGroup/OpenStoreFrontProductPageActionGroup.xml +++ /dev/null @@ -1,18 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - /** - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ ---> -<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd"> - <!-- Open product page by product url on Storefront --> - <actionGroup name="OpenStoreFrontProductPageActionGroup"> - <arguments> - <argument name="productUrlKey" type="string"/> - </arguments> - <amOnPage url="{{StorefrontProductPage.url(productUrlKey)}}" stepKey="amOnProductPage"/> - <waitForPageLoad stepKey="waitForProductPageLoad"/> - </actionGroup> -</actionGroups> From bb468a1b42c5e9b97b8803986c24b61e5f807ef0 Mon Sep 17 00:00:00 2001 From: Maria Kovdrysh <kovdrysh@adobe.com> Date: Tue, 21 May 2019 13:21:56 -0500 Subject: [PATCH 06/36] MC-6338: TinyMCE4 is applied as new WYSIWYG on Product Attribute --- ...lProductAttributePropertiesActionGroup.xml | 18 +++ ...AdminOpenAttributeSetByNameActionGroup.xml | 17 +++ ...minOpenAttributeSetGridPageActionGroup.xml | 14 ++ ...minOpenProductAttributePageActionGroup.xml | 14 ++ .../AdminOpenProductIndexPageActionGroup.xml | 14 ++ ...ontProductPageByProductNameActionGroup.xml | 17 +++ ...oductAttributeOnProductPageActionGroup.xml | 18 +++ .../Test/Mftf/Data/ProductAttributeData.xml | 23 ++++ .../Test/Mftf/Data/WYSIWYGConfigData.xml | 23 ++++ .../AdminCreateProductAttributeSection.xml | 1 + ...inCreateTextEditorProductAttributeTest.xml | 120 ++++++++++++++++++ 11 files changed, 279 insertions(+) create mode 100644 app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminFillProductAttributePropertiesActionGroup.xml create mode 100644 app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminOpenAttributeSetByNameActionGroup.xml create mode 100644 app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminOpenAttributeSetGridPageActionGroup.xml create mode 100644 app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminOpenProductAttributePageActionGroup.xml create mode 100644 app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminOpenProductIndexPageActionGroup.xml create mode 100644 app/code/Magento/Catalog/Test/Mftf/ActionGroup/OpenStorefrontProductPageByProductNameActionGroup.xml create mode 100644 app/code/Magento/Catalog/Test/Mftf/ActionGroup/StorefrontAssertProductAttributeOnProductPageActionGroup.xml create mode 100644 app/code/Magento/Catalog/Test/Mftf/Data/WYSIWYGConfigData.xml create mode 100644 app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateTextEditorProductAttributeTest.xml diff --git a/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminFillProductAttributePropertiesActionGroup.xml b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminFillProductAttributePropertiesActionGroup.xml new file mode 100644 index 0000000000000..cd850f8a7004d --- /dev/null +++ b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminFillProductAttributePropertiesActionGroup.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd"> + <actionGroup name="AdminFillProductAttributePropertiesActionGroup"> + <arguments> + <argument name="attributeName" type="string"/> + <argument name="attributeType" type="string"/> + </arguments> + <fillField selector="{{AttributePropertiesSection.DefaultLabel}}" userInput="{{attributeName}}" stepKey="fillDefaultLabel"/> + <selectOption selector="{{AttributePropertiesSection.InputType}}" userInput="{{attributeType}}" stepKey="selectInputType"/> + </actionGroup> +</actionGroups> diff --git a/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminOpenAttributeSetByNameActionGroup.xml b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminOpenAttributeSetByNameActionGroup.xml new file mode 100644 index 0000000000000..1ac7ac5e54bf5 --- /dev/null +++ b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminOpenAttributeSetByNameActionGroup.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd"> + <actionGroup name="AdminOpenAttributeSetByNameActionGroup"> + <arguments> + <argument name="attributeSetName" type="string" defaultValue="Default"/> + </arguments> + <click selector="{{AdminProductAttributeSetGridSection.AttributeSetName(attributeSetName)}}" stepKey="chooseAttributeSet"/> + <waitForPageLoad stepKey="waitForAttributeSetPageLoad"/> + </actionGroup> +</actionGroups> diff --git a/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminOpenAttributeSetGridPageActionGroup.xml b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminOpenAttributeSetGridPageActionGroup.xml new file mode 100644 index 0000000000000..c6f0c3332b1d5 --- /dev/null +++ b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminOpenAttributeSetGridPageActionGroup.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd"> + <actionGroup name="AdminOpenAttributeSetGridPageActionGroup"> + <amOnPage url="{{AdminProductAttributeSetGridPage.url}}" stepKey="goToAttributeSetPage"/> + <waitForPageLoad stepKey="waitForAttributeSetPageLoad"/> + </actionGroup> +</actionGroups> diff --git a/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminOpenProductAttributePageActionGroup.xml b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminOpenProductAttributePageActionGroup.xml new file mode 100644 index 0000000000000..b6be3fb172d33 --- /dev/null +++ b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminOpenProductAttributePageActionGroup.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd"> + <actionGroup name="AdminOpenProductAttributePageActionGroup"> + <amOnPage url="{{AdminProductAttributeGridPage.url}}" stepKey="goToAttributePage"/> + <waitForPageLoad stepKey="waitForAttributePageLoad"/> + </actionGroup> +</actionGroups> diff --git a/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminOpenProductIndexPageActionGroup.xml b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminOpenProductIndexPageActionGroup.xml new file mode 100644 index 0000000000000..ca1303f180ca4 --- /dev/null +++ b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminOpenProductIndexPageActionGroup.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd"> + <actionGroup name="AdminOpenProductIndexPageActionGroup"> + <amOnPage url="{{AdminProductIndexPage.url}}" stepKey="goToProductIndexPage"/> + <waitForPageLoad stepKey="waitForProductIndexPageLoad"/> + </actionGroup> +</actionGroups> diff --git a/app/code/Magento/Catalog/Test/Mftf/ActionGroup/OpenStorefrontProductPageByProductNameActionGroup.xml b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/OpenStorefrontProductPageByProductNameActionGroup.xml new file mode 100644 index 0000000000000..c25cdc403f8ec --- /dev/null +++ b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/OpenStorefrontProductPageByProductNameActionGroup.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd"> + <actionGroup name="OpenStorefrontProductPageByProductNameActionGroup"> + <arguments> + <argument name="productName" type="string" defaultValue="{{_defaultProduct.name}}"/> + </arguments> + <amOnPage url="{{productName}}.html" stepKey="amOnProductPage"/> + <waitForPageLoad stepKey="waitForProductPageLoad"/> + </actionGroup> +</actionGroups> diff --git a/app/code/Magento/Catalog/Test/Mftf/ActionGroup/StorefrontAssertProductAttributeOnProductPageActionGroup.xml b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/StorefrontAssertProductAttributeOnProductPageActionGroup.xml new file mode 100644 index 0000000000000..9ca01ee5dc0ad --- /dev/null +++ b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/StorefrontAssertProductAttributeOnProductPageActionGroup.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. +--> + +<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd"> + <actionGroup name="StorefrontAssertProductAttributeOnProductPageActionGroup"> + <arguments> + <argument name="attributeLabel" type="string"/> + <argument name="attributeValue" type="string"/> + </arguments> + <scrollTo selector="{{StorefrontProductMoreInformationSection.moreInformation}}" stepKey="scrollToMoreInformation"/> + <see selector="{{StorefrontProductMoreInformationSection.attributeLabel}}" userInput="{{attributeLabel}}" stepKey="seeAttributeLabel"/> + <see selector="{{StorefrontProductMoreInformationSection.attributeValue}}" userInput="{{attributeValue}}" stepKey="seeAttributeText"/> + </actionGroup> +</actionGroups> diff --git a/app/code/Magento/Catalog/Test/Mftf/Data/ProductAttributeData.xml b/app/code/Magento/Catalog/Test/Mftf/Data/ProductAttributeData.xml index 817dd637f81dd..02e5ae5ae36a5 100644 --- a/app/code/Magento/Catalog/Test/Mftf/Data/ProductAttributeData.xml +++ b/app/code/Magento/Catalog/Test/Mftf/Data/ProductAttributeData.xml @@ -320,4 +320,27 @@ <data key="option1_admin" unique="suffix">opt1'Admin</data> <data key="option1_frontend" unique="suffix">opt1'Front</data> </entity> + <entity name="productTextEditorAttribute" type="ProductAttribute"> + <data key="attribute_code" unique="suffix">attribute</data> + <data key="frontend_input">texteditor</data> + <data key="scope">global</data> + <data key="is_required">false</data> + <data key="is_unique">false</data> + <data key="is_searchable">true</data> + <data key="is_visible">true</data> + <data key="backend_type">text</data> + <data key="is_wysiwyg_enabled">true</data> + <data key="is_visible_in_advanced_search">true</data> + <data key="is_visible_on_front">true</data> + <data key="is_filterable">true</data> + <data key="is_filterable_in_search">true</data> + <data key="used_in_product_listing">true</data> + <data key="is_used_for_promo_rules">true</data> + <data key="is_comparable">true</data> + <data key="is_used_in_grid">true</data> + <data key="is_visible_in_grid">true</data> + <data key="is_filterable_in_grid">true</data> + <data key="used_for_sort_by">true</data> + <requiredEntity type="FrontendLabel">ProductAttributeFrontendLabel</requiredEntity> + </entity> </entities> diff --git a/app/code/Magento/Catalog/Test/Mftf/Data/WYSIWYGConfigData.xml b/app/code/Magento/Catalog/Test/Mftf/Data/WYSIWYGConfigData.xml new file mode 100644 index 0000000000000..7bb8cf5f4db37 --- /dev/null +++ b/app/code/Magento/Catalog/Test/Mftf/Data/WYSIWYGConfigData.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> + +<entities xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:DataGenerator/etc/dataProfileSchema.xsd"> + <entity name="EnableWYSIWYG"> + <data key="path">cms/wysiwyg/enabled</data> + <data key="scope_id">0</data> + <data key="label">Yes</data> + <data key="value">enabled</data> + </entity> + <entity name="EnableTinyMCE4"> + <data key="path">cms/wysiwyg/editor</data> + <data key="scope_id">0</data> + <data key="label">Yes</data> + <data key="value">mage/adminhtml/wysiwyg/tiny_mce/tinymce4Adapter</data> + </entity> +</entities> diff --git a/app/code/Magento/Catalog/Test/Mftf/Section/AdminCreateProductAttributeSection.xml b/app/code/Magento/Catalog/Test/Mftf/Section/AdminCreateProductAttributeSection.xml index d24c501152b78..fee6950faae1f 100644 --- a/app/code/Magento/Catalog/Test/Mftf/Section/AdminCreateProductAttributeSection.xml +++ b/app/code/Magento/Catalog/Test/Mftf/Section/AdminCreateProductAttributeSection.xml @@ -47,6 +47,7 @@ <element name="EnableWYSIWYG" type="select" selector="#enabled"/> <element name="useForPromoRuleConditions" type="select" selector="#is_used_for_promo_rules"/> <element name="StorefrontPropertiesSectionToggle" type="button" selector="#front_fieldset-wrapper"/> + <element name="visibleOnCatalogPagesOnStorefront" type="select" selector="#is_visible_on_front"/> </section> <section name="WYSIWYGProductAttributeSection"> <element name="ShowHideBtn" type="button" selector="#toggledefault_value_texteditor"/> diff --git a/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateTextEditorProductAttributeTest.xml b/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateTextEditorProductAttributeTest.xml new file mode 100644 index 0000000000000..229344dc8ee1f --- /dev/null +++ b/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateTextEditorProductAttributeTest.xml @@ -0,0 +1,120 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> + +<tests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd"> + <test name="AdminCreateTextEditorProductAttributeTest"> + <annotations> + <features value="Catalog"/> + <stories value="Create product Attribute"/> + <title value="Admin create text editor product attribute test"/> + <description value="Create text editor product attribute with TinyMCE4 enabled"/> + <severity value="CRITICAL"/> + <testCaseId value="MC-6338"/> + <group value="Catalog"/> + </annotations> + <before> + <!-- Enable WYSIWYG editor --> + <magentoCLI command="config:set {{EnableWYSIWYG.path}} {{EnableWYSIWYG.value}}" stepKey="enableWYSIWYG"/> + + <!-- Enable TinyMCE 4 --> + <magentoCLI command="config:set {{EnableTinyMCE4.path}} {{EnableTinyMCE4.value}}" stepKey="enableTinyMCE4"/> + + <!-- Login as admin --> + <actionGroup ref="LoginAsAdmin" stepKey="loginAsAdmin"/> + </before> + <after> + <!-- Delete attribute --> + <actionGroup ref="deleteProductAttribute" stepKey="deleteAttribute"> + <argument name="ProductAttribute" value="productTextEditorAttribute"/> + </actionGroup> + + <!-- Delete product --> + <actionGroup ref="deleteProductUsingProductGrid" stepKey="deleteProduct"> + <argument name="product" value="_defaultProduct"/> + </actionGroup> + + <!-- Log out --> + <actionGroup ref="logout" stepKey="logout"/> + </after> + + <!-- Go to Stores > Product --> + <actionGroup ref="AdminOpenProductAttributePageActionGroup" stepKey="openProductAttributePage"/> + + <!-- Create new product attribute --> + <click selector="{{AdminProductAttributeGridSection.createNewAttributeBtn}}" stepKey="createNewAttribute"/> + <actionGroup ref="AdminFillProductAttributePropertiesActionGroup" stepKey="fillAttributeProperties"> + <argument name="attributeName" value="{{productTextEditorAttribute.attribute_code}}"/> + <argument name="attributeType" value="{{productTextEditorAttribute.frontend_input}}"/> + </actionGroup> + + <!-- Update product attribute input type and assert WYSIWYG --> + <selectOption selector="{{AttributePropertiesSection.InputType}}" userInput="{{productAttributeWysiwyg.frontend_input}}" stepKey="updateInputType"/> + <click selector="{{StorefrontPropertiesSection.StoreFrontPropertiesTab}}" stepKey="clickStorefrontPropertiesTab"/> + <dontSeeElement selector="{{StorefrontPropertiesSection.EnableWYSIWYG}}" stepKey="dontSeeWYSIWYGEnableField"/> + + <!-- Change attribute visibility and input type --> + <selectOption selector="{{StorefrontPropertiesSection.visibleOnCatalogPagesOnStorefront}}" userInput="Yes" stepKey="enableVisibleOnStorefront"/> + <scrollToTopOfPage stepKey="scrollToPageTop"/> + <click selector="{{AttributePropertiesSection.propertiesTab}}" stepKey="clickPropertiesTab"/> + <selectOption selector="{{AttributePropertiesSection.InputType}}" userInput="{{productTextEditorAttribute.frontend_input}}" stepKey="returnInputType"/> + <actionGroup ref="saveProductAttribute" stepKey="saveAttribute"/> + + <!-- Go to Store > Attribute Set --> + <actionGroup ref="AdminOpenAttributeSetGridPageActionGroup" stepKey="openAttributeSetPage"/> + + <!-- Open Default attribute --> + <actionGroup ref="AdminOpenAttributeSetByNameActionGroup" stepKey="openDefaultAttributeSet"/> + + <!-- Add created attribute to Default attribute and save --> + <actionGroup ref="AssignAttributeToGroup" stepKey="assignAttributeToGroup"> + <argument name="group" value="Product Details"/> + <argument name="attribute" value="{{productTextEditorAttribute.attribute_code}}"/> + </actionGroup> + <actionGroup ref="SaveAttributeSet" stepKey="saveAttributeSet"/> + + <!-- Go Catalog > Product to create new product page --> + <actionGroup ref="AdminOpenProductIndexPageActionGroup" stepKey="goToProductIndexPage"/> + <actionGroup ref="goToCreateProductPage" stepKey="goToCreateProduct"> + <argument name="product" value="_defaultProduct"/> + </actionGroup> + + <!-- Select attribute set: Default --> + <actionGroup ref="AdminProductPageSelectAttributeSet" stepKey="selectAttributeSet"> + <argument name="attributeSetName" value="Default"/> + </actionGroup> + + <!-- Created product attribute appear on product form --> + <seeElement selector="{{AdminProductFormSection.attributeLabelByText(productTextEditorAttribute.attribute_code)}}" stepKey="seeAttributeLabelInProductForm"/> + + <!-- TinyMCE 4 is displayed in WYSIWYG content area --> + <seeElement selector="{{TinyMCESection.TinyMCE4}}" stepKey="seeTinyMCE4" /> + + <!-- Verify toolbar menu --> + <actionGroup ref="VerifyTinyMCEActionGroup" stepKey="verifyToolbarMenu"/> + + <!-- Add content into attribute --> + <executeJS function="tinyMCE.get('product_form_{{productTextEditorAttribute.attribute_code}}').setContent('This content from product page');" stepKey="executeJSFillContent"/> + + <!-- Click Show/Hide button and see Insert Image button --> + <scrollToTopOfPage stepKey="scrollToTop"/> + <click selector="{{ProductAttributeWYSIWYGSection.showHideBtn(productTextEditorAttribute.attribute_code)}}" stepKey="clickShowHideBtn"/> + <waitForElementVisible selector="{{TinyMCESection.InsertImageBtn}}" stepKey="waitForInsertImageBtn"/> + + <!-- Fill and save product form --> + <actionGroup ref="fillMainProductForm" stepKey="fillProductForm"/> + <actionGroup ref="saveProductForm" stepKey="saveProductForm"/> + + <!-- Assert product attribute on Storefront --> + <actionGroup ref="OpenStorefrontProductPageByProductNameActionGroup" stepKey="openProductPage"/> + <actionGroup ref="StorefrontAssertProductAttributeOnProductPageActionGroup" stepKey="assertProductAttribute"> + <argument name="attributeLabel" value="{{productTextEditorAttribute.attribute_code}}"/> + <argument name="attributeValue" value="This content from product page"/> + </actionGroup> + </test> +</tests> From 32802a40e48dbe5986cad3bd8859c18e355cfeb1 Mon Sep 17 00:00:00 2001 From: Maria Kovdrysh <kovdrysh@adobe.com> Date: Fri, 24 May 2019 10:03:59 -0500 Subject: [PATCH 07/36] MC-13581: Checkout with "Table Rates" for different states of the USA --- .../OpenStoreFrontProductPageActionGroup.xml | 17 +++ ...ngMethodOptionPresentInCartActionGroup.xml | 20 +++ .../Section/CheckoutCartSummarySection.xml | 2 + .../AdminSaveConfigActionGroup.xml | 16 +++ ...leRatesShippingMethodStatusActionGroup.xml | 20 +++ ...enShippingMethodsConfigPageActionGroup.xml | 15 +++ .../Data/TableRatesShippingMethodData.xml | 19 +++ .../AdminShippingMethodTableRatesSection.xml | 18 +++ ...esShippingMethodForDifferentStatesTest.xml | 114 ++++++++++++++++++ .../tests/_data/table_rate_30895.csv | 3 + 10 files changed, 244 insertions(+) create mode 100644 app/code/Magento/Catalog/Test/Mftf/ActionGroup/OpenStoreFrontProductPageActionGroup.xml create mode 100644 app/code/Magento/Checkout/Test/Mftf/ActionGroup/StorefrontAssertShippingMethodOptionPresentInCartActionGroup.xml create mode 100644 app/code/Magento/Config/Test/Mftf/ActionGroup/AdminSaveConfigActionGroup.xml create mode 100644 app/code/Magento/Shipping/Test/Mftf/ActionGroup/AdminChangeTableRatesShippingMethodStatusActionGroup.xml create mode 100644 app/code/Magento/Shipping/Test/Mftf/ActionGroup/AdminOpenShippingMethodsConfigPageActionGroup.xml create mode 100644 app/code/Magento/Shipping/Test/Mftf/Data/TableRatesShippingMethodData.xml create mode 100644 app/code/Magento/Shipping/Test/Mftf/Section/AdminShippingMethodTableRatesSection.xml create mode 100644 app/code/Magento/Shipping/Test/Mftf/Test/TableRatesShippingMethodForDifferentStatesTest.xml create mode 100644 dev/tests/acceptance/tests/_data/table_rate_30895.csv diff --git a/app/code/Magento/Catalog/Test/Mftf/ActionGroup/OpenStoreFrontProductPageActionGroup.xml b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/OpenStoreFrontProductPageActionGroup.xml new file mode 100644 index 0000000000000..4bfd5673e4a8b --- /dev/null +++ b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/OpenStoreFrontProductPageActionGroup.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd"> + <actionGroup name="OpenStoreFrontProductPageActionGroup"> + <arguments> + <argument name="productUrlKey" type="string"/> + </arguments> + <amOnPage url="{{StorefrontProductPage.url(productUrlKey)}}" stepKey="amOnProductPage"/> + <waitForPageLoad stepKey="waitForProductPageLoad"/> + </actionGroup> +</actionGroups> diff --git a/app/code/Magento/Checkout/Test/Mftf/ActionGroup/StorefrontAssertShippingMethodOptionPresentInCartActionGroup.xml b/app/code/Magento/Checkout/Test/Mftf/ActionGroup/StorefrontAssertShippingMethodOptionPresentInCartActionGroup.xml new file mode 100644 index 0000000000000..6e033268934a5 --- /dev/null +++ b/app/code/Magento/Checkout/Test/Mftf/ActionGroup/StorefrontAssertShippingMethodOptionPresentInCartActionGroup.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> + +<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd"> + <!-- Assert shipping method name and price are present in cart --> + <actionGroup name="StorefrontAssertShippingMethodOptionPresentInCartActionGroup"> + <arguments> + <argument name="methodName" type="string"/> + <argument name="price" type="string"/> + </arguments> + <see selector="{{CheckoutCartSummarySection.methodName}}" userInput="{{methodName}}" stepKey="seeShippingName"/> + <see selector="{{CheckoutCartSummarySection.shippingPrice}}" userInput="{{price}}" stepKey="seeShippingPrice"/> + </actionGroup> +</actionGroups> diff --git a/app/code/Magento/Checkout/Test/Mftf/Section/CheckoutCartSummarySection.xml b/app/code/Magento/Checkout/Test/Mftf/Section/CheckoutCartSummarySection.xml index 9df109a6c45c4..f3963e5deafbd 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Section/CheckoutCartSummarySection.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Section/CheckoutCartSummarySection.xml @@ -27,6 +27,8 @@ <element name="estimateShippingAndTax" type="text" selector="#block-shipping-heading" timeout="5"/> <element name="flatRateShippingMethod" type="input" selector="#s_method_flatrate_flatrate" timeout="30"/> <element name="shippingMethodLabel" type="text" selector="#co-shipping-method-form dl dt span"/> + <element name="methodName" type="text" selector="#co-shipping-method-form label"/> + <element name="shippingPrice" type="text" selector="#co-shipping-method-form span .price"/> <element name="shippingMethodElementId" type="radio" selector="#s_method_{{carrierCode}}_{{methodCode}}" parameterized="true"/> </section> </sections> diff --git a/app/code/Magento/Config/Test/Mftf/ActionGroup/AdminSaveConfigActionGroup.xml b/app/code/Magento/Config/Test/Mftf/ActionGroup/AdminSaveConfigActionGroup.xml new file mode 100644 index 0000000000000..6ed0cfe95cb94 --- /dev/null +++ b/app/code/Magento/Config/Test/Mftf/ActionGroup/AdminSaveConfigActionGroup.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> + +<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd"> + <actionGroup name="AdminSaveConfigActionGroup"> + <click selector="{{AdminConfigSection.saveButton}}" stepKey="clickSaveConfigBtn"/> + <waitForPageLoad stepKey="waitForPageLoad"/> + <see selector="{{AdminCategoryMessagesSection.SuccessMessage}}" userInput="You saved the configuration." stepKey="seeSuccessMessage"/> + </actionGroup> +</actionGroups> diff --git a/app/code/Magento/Shipping/Test/Mftf/ActionGroup/AdminChangeTableRatesShippingMethodStatusActionGroup.xml b/app/code/Magento/Shipping/Test/Mftf/ActionGroup/AdminChangeTableRatesShippingMethodStatusActionGroup.xml new file mode 100644 index 0000000000000..e506ca3a7662f --- /dev/null +++ b/app/code/Magento/Shipping/Test/Mftf/ActionGroup/AdminChangeTableRatesShippingMethodStatusActionGroup.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> + +<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd"> + <!-- Enable/Disable Table Rates shipping method --> + <actionGroup name="AdminChangeTableRatesShippingMethodStatusActionGroup"> + <arguments> + <argument name="status" type="string" defaultValue="1"/> + </arguments> + <conditionalClick selector="{{AdminShippingMethodTableRatesSection.carriersTableRateTab}}" dependentSelector="{{AdminShippingMethodTableRatesSection.carriersTableRateActive}}" visible="false" stepKey="expandTab"/> + <uncheckOption selector="{{AdminShippingMethodTableRatesSection.enabledUseSystemValue}}" stepKey="uncheckUseSystemValue"/> + <selectOption selector="{{AdminShippingMethodTableRatesSection.carriersTableRateActive}}" userInput="{{status}}" stepKey="changeTableRatesMethodStatus"/> + </actionGroup> +</actionGroups> diff --git a/app/code/Magento/Shipping/Test/Mftf/ActionGroup/AdminOpenShippingMethodsConfigPageActionGroup.xml b/app/code/Magento/Shipping/Test/Mftf/ActionGroup/AdminOpenShippingMethodsConfigPageActionGroup.xml new file mode 100644 index 0000000000000..a1fefcf13afa4 --- /dev/null +++ b/app/code/Magento/Shipping/Test/Mftf/ActionGroup/AdminOpenShippingMethodsConfigPageActionGroup.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> + +<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd"> + <actionGroup name="AdminOpenShippingMethodsConfigPageActionGroup"> + <amOnPage url="{{AdminShippingMethodsConfigPage.url}}" stepKey="navigateToAdminShippingMethodsPage"/> + <waitForPageLoad stepKey="waitForAdminShippingMethodsPageToLoad"/> + </actionGroup> +</actionGroups> diff --git a/app/code/Magento/Shipping/Test/Mftf/Data/TableRatesShippingMethodData.xml b/app/code/Magento/Shipping/Test/Mftf/Data/TableRatesShippingMethodData.xml new file mode 100644 index 0000000000000..47ef68cc9d765 --- /dev/null +++ b/app/code/Magento/Shipping/Test/Mftf/Data/TableRatesShippingMethodData.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> + +<entities xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:DataGenerator/etc/dataProfileSchema.xsd"> + <!-- Prices from file "table_rate_30895.csv" --> + <entity name="TableRatesWeightVSDestination" type="shipping_method"> + <data key="condition">Weight vs. Destination</data> + <data key="priceCA">5.00</data> + <data key="price">10.00</data> + <data key="title">Best Way</data> + <data key="methodName">Table Rate</data> + </entity> +</entities> diff --git a/app/code/Magento/Shipping/Test/Mftf/Section/AdminShippingMethodTableRatesSection.xml b/app/code/Magento/Shipping/Test/Mftf/Section/AdminShippingMethodTableRatesSection.xml new file mode 100644 index 0000000000000..3c570201c9970 --- /dev/null +++ b/app/code/Magento/Shipping/Test/Mftf/Section/AdminShippingMethodTableRatesSection.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> + +<sections xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Page/etc/SectionObject.xsd"> + <section name="AdminShippingMethodTableRatesSection"> + <element name="carriersTableRateTab" type="button" selector="#carriers_tablerate-head"/> + <element name="enabledUseSystemValue" type="checkbox" selector="#carriers_tablerate_active_inherit"/> + <element name="carriersTableRateActive" type="select" selector="#carriers_tablerate_active"/> + <element name="condition" type="select" selector="#carriers_tablerate_condition_name"/> + <element name="importFile" type="input" selector="#carriers_tablerate_import"/> + </section> +</sections> diff --git a/app/code/Magento/Shipping/Test/Mftf/Test/TableRatesShippingMethodForDifferentStatesTest.xml b/app/code/Magento/Shipping/Test/Mftf/Test/TableRatesShippingMethodForDifferentStatesTest.xml new file mode 100644 index 0000000000000..5721af7fdb71b --- /dev/null +++ b/app/code/Magento/Shipping/Test/Mftf/Test/TableRatesShippingMethodForDifferentStatesTest.xml @@ -0,0 +1,114 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> + +<tests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd"> + <test name="TableRatesShippingMethodForDifferentStatesTest"> + <annotations> + <features value="Shipping"/> + <stories value="Table Rates"/> + <title value="Table rates shipping method for different states test"/> + <description value="Checkout with Table Rates for different states of the USA"/> + <severity value="CRITICAL"/> + <testCaseId value="MC-13581"/> + <group value="shipping"/> + </annotations> + <before> + <!-- Create product --> + <createData entity="SimpleProduct2" stepKey="createProduct"/> + + <!-- Create customer --> + <createData entity="Simple_US_Customer_CA" stepKey="createCustomer"/> + + <!-- Login as admin --> + <actionGroup ref="LoginAsAdmin" stepKey="loginAsAdmin"/> + </before> + <after> + <!-- Delete product --> + <deleteData createDataKey="createProduct" stepKey="deleteProduct"/> + + <!-- Delete customer --> + <deleteData createDataKey="createCustomer" stepKey="deleteCustomer"/> + + <!-- Log out --> + <actionGroup ref="logout" stepKey="logout"/> + </after> + + <!-- Go to Stores > Configuration > Sales > Shipping Methods --> + <actionGroup ref="AdminOpenShippingMethodsConfigPageActionGroup" stepKey="openShippingMethodConfigPage"/> + + <!-- Switch to Website scope --> + <actionGroup ref="AdminSwitchWebsiteActionGroup" stepKey="AdminSwitchStoreView"> + <argument name="website" value="_defaultWebsite"/> + </actionGroup> + + <!-- Enable Table Rate method and save config --> + <actionGroup ref="AdminChangeTableRatesShippingMethodStatusActionGroup" stepKey="enableTableRatesShippingMethod"/> + <actionGroup ref="AdminSaveConfigActionGroup" stepKey="saveConfig"/> + + <!-- Make sure you have Condition Weight vs. Destination --> + <see selector="{{AdminShippingMethodTableRatesSection.condition}}" userInput="{{TableRatesWeightVSDestination.condition}}" stepKey="seeDefaultCondition"/> + + <!-- Import file and save config --> + <attachFile selector="{{AdminShippingMethodTableRatesSection.importFile}}" userInput="table_rate_30895.csv" stepKey="attachFileForImport"/> + <actionGroup ref="AdminSaveConfigActionGroup" stepKey="saveConfigs"/> + + <!-- Login as customer --> + <actionGroup ref="LoginToStorefrontActionGroup" stepKey="loginAsCustomer"> + <argument name="Customer" value="$$createCustomer$$"/> + </actionGroup> + + <!-- Add product to the shopping cart --> + <actionGroup ref="OpenStoreFrontProductPageActionGroup" stepKey="openProductPage"> + <argument name="productUrlKey" value="$$createProduct.custom_attributes[url_key]$$"/> + </actionGroup> + <actionGroup ref="StorefrontAddProductToCartActionGroup" stepKey="addProductToCart"> + <argument name="product" value="$$createProduct$$"/> + <argument name="productCount" value="1"/> + </actionGroup> + + <!-- Open the shopping cart page --> + <actionGroup ref="StorefrontOpenCartFromMinicartActionGroup" stepKey="openShoppingCart"/> + + <!-- Expand Estimate Shipping and Tax section in Summary --> + <conditionalClick selector="{{CheckoutCartSummarySection.estimateShippingAndTax}}" dependentSelector="{{CheckoutCartSummarySection.country}}" visible="false" stepKey="expandEstimateShippingAndTax"/> + <waitForLoadingMaskToDisappear stepKey="waitForLoadingMask"/> + + <!-- See available Table Rate option --> + <actionGroup ref="StorefrontAssertShippingMethodPresentInCartActionGroup" stepKey="assertShippingMethodLabel"> + <argument name="shippingMethod" value="{{TableRatesWeightVSDestination.title}}"/> + </actionGroup> + <actionGroup ref="StorefrontAssertShippingMethodOptionPresentInCartActionGroup" stepKey="assertShippingMethodOption"> + <argument name="methodName" value="{{TableRatesWeightVSDestination.methodName}}"/> + <argument name="price" value="{{TableRatesWeightVSDestination.priceCA}}"/> + </actionGroup> + + <!-- Change State to New York --> + <selectOption selector="{{CheckoutCartSummarySection.stateProvince}}" userInput="{{US_Address_NY.state}}" stepKey="selectAnotherState"/> + <waitForPageLoad stepKey="waitForShippingMethodLoad"/> + + <!-- See available Table Rate option for another state --> + <actionGroup ref="StorefrontAssertShippingMethodPresentInCartActionGroup" stepKey="assertShippingMethodLabelForAnotherState"> + <argument name="shippingMethod" value="{{TableRatesWeightVSDestination.title}}"/> + </actionGroup> + <actionGroup ref="StorefrontAssertShippingMethodOptionPresentInCartActionGroup" stepKey="assertShippingMethodOptionForAnotherState"> + <argument name="methodName" value="{{TableRatesWeightVSDestination.methodName}}"/> + <argument name="price" value="{{TableRatesWeightVSDestination.price}}"/> + </actionGroup> + + <!-- Rollback config --> + <actionGroup ref="AdminOpenShippingMethodsConfigPageActionGroup" stepKey="openShippingMethodSystemConfigPage"/> + <actionGroup ref="AdminSwitchWebsiteActionGroup" stepKey="AdminSwitchStoreViewToMainWebsite"> + <argument name="website" value="_defaultWebsite"/> + </actionGroup> + <actionGroup ref="AdminChangeTableRatesShippingMethodStatusActionGroup" stepKey="disableTableRatesShippingMethod"> + <argument name="status" value="0"/> + </actionGroup> + <actionGroup ref="AdminSaveConfigActionGroup" stepKey="saveSystemConfig"/> + </test> +</tests> diff --git a/dev/tests/acceptance/tests/_data/table_rate_30895.csv b/dev/tests/acceptance/tests/_data/table_rate_30895.csv new file mode 100644 index 0000000000000..6c4420c937815 --- /dev/null +++ b/dev/tests/acceptance/tests/_data/table_rate_30895.csv @@ -0,0 +1,3 @@ +Country,Region/State,Zip/Postal Code,Weight (and above),Shipping Price +US,CA,*,0,5 +US,*,*,0,10 From df831b1304a3bbf30371e67ffe0abce05eca4ef0 Mon Sep 17 00:00:00 2001 From: Maria Kovdrysh <kovdrysh@adobe.com> Date: Fri, 24 May 2019 14:44:45 -0500 Subject: [PATCH 08/36] MC-11681: Scrub secure data from User Creation logs --- .../AdminClickSearchInGridActionGroup.xml | 15 +++++++++++++++ .../AdminFillInputFilterFieldActionGroup.xml | 18 ++++++++++++++++++ .../Section/AdminDataGridFilterSection.xml | 1 + 3 files changed, 34 insertions(+) create mode 100644 app/code/Magento/Ui/Test/Mftf/ActionGroup/AdminClickSearchInGridActionGroup.xml create mode 100644 app/code/Magento/Ui/Test/Mftf/ActionGroup/AdminFillInputFilterFieldActionGroup.xml diff --git a/app/code/Magento/Ui/Test/Mftf/ActionGroup/AdminClickSearchInGridActionGroup.xml b/app/code/Magento/Ui/Test/Mftf/ActionGroup/AdminClickSearchInGridActionGroup.xml new file mode 100644 index 0000000000000..29e299115d223 --- /dev/null +++ b/app/code/Magento/Ui/Test/Mftf/ActionGroup/AdminClickSearchInGridActionGroup.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> + +<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd"> + <actionGroup name="AdminClickSearchInGridActionGroup"> + <click selector="{{AdminGridFilterControls.applyFilters}}" stepKey="clickSearch"/> + <waitForPageLoad stepKey="waitForSearchResult"/> + </actionGroup> +</actionGroups> diff --git a/app/code/Magento/Ui/Test/Mftf/ActionGroup/AdminFillInputFilterFieldActionGroup.xml b/app/code/Magento/Ui/Test/Mftf/ActionGroup/AdminFillInputFilterFieldActionGroup.xml new file mode 100644 index 0000000000000..cc63e5ac73069 --- /dev/null +++ b/app/code/Magento/Ui/Test/Mftf/ActionGroup/AdminFillInputFilterFieldActionGroup.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> + +<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd"> + <actionGroup name="AdminFillInputFilterFieldActionGroup"> + <arguments> + <argument name="filterInputName" type="string"/> + <argument name="filterValue" type="string"/> + </arguments> + <fillField selector="{{AdminDataGridFilterSection.inputFieldByNameAttrInGrid(filterInputName)}}" userInput="{{filterValue}}" stepKey="fillFilterInputField" /> + </actionGroup> +</actionGroups> diff --git a/app/code/Magento/Ui/Test/Mftf/Section/AdminDataGridFilterSection.xml b/app/code/Magento/Ui/Test/Mftf/Section/AdminDataGridFilterSection.xml index 6ae4ebafa0df1..fe69e60160d2c 100644 --- a/app/code/Magento/Ui/Test/Mftf/Section/AdminDataGridFilterSection.xml +++ b/app/code/Magento/Ui/Test/Mftf/Section/AdminDataGridFilterSection.xml @@ -12,6 +12,7 @@ <element name="filterForm" type="block" selector="[data-part='filter-form']" /> <element name="filterExpand" type="button" selector="//div[@class='admin__data-grid-header'][(not(ancestor::*[@class='sticky-header']) and not(contains(@style,'visibility: hidden'))) or (ancestor::*[@class='sticky-header' and not(contains(@style,'display: none'))])]//button[@data-action='grid-filter-expand']" /> <element name="inputFieldByNameAttr" type="input" selector="//*[@data-part='filter-form']//input[@name='{{inputNameAttr}}']" parameterized="true" /> + <element name="inputFieldByNameAttrInGrid" type="input" selector="//*[@data-role='filter-form']//input[@name='{{inputNameAttr}}']" parameterized="true" timeout="30" /> <element name="apply" type="button" selector="//*[@data-part='filter-form']//button[@data-action='grid-filter-apply']" /> <element name="clear" type="button" selector=".admin__data-grid-header [data-action='grid-filter-reset']" /> </section> From 383ad4a20f5175211e74198fac4f249505512cc4 Mon Sep 17 00:00:00 2001 From: Maria Kovdrysh <kovdrysh@adobe.com> Date: Fri, 31 May 2019 10:02:48 -0500 Subject: [PATCH 09/36] MC-6311: Checking double Import of products CSV file --- .../AdminOpenProductIndexPageActionGroup.xml | 14 + .../AdminCheckDoubleImportOfProductsTest.xml | 68 +++ .../Store/Test/Mftf/Data/StoreData.xml | 10 + .../tests/_data/prepared-for-sample-data.csv | 499 ++++++++++++++++++ 4 files changed, 591 insertions(+) create mode 100644 app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminOpenProductIndexPageActionGroup.xml create mode 100644 app/code/Magento/ImportExport/Test/Mftf/Test/AdminCheckDoubleImportOfProductsTest.xml create mode 100644 dev/tests/acceptance/tests/_data/prepared-for-sample-data.csv diff --git a/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminOpenProductIndexPageActionGroup.xml b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminOpenProductIndexPageActionGroup.xml new file mode 100644 index 0000000000000..ca1303f180ca4 --- /dev/null +++ b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminOpenProductIndexPageActionGroup.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd"> + <actionGroup name="AdminOpenProductIndexPageActionGroup"> + <amOnPage url="{{AdminProductIndexPage.url}}" stepKey="goToProductIndexPage"/> + <waitForPageLoad stepKey="waitForProductIndexPageLoad"/> + </actionGroup> +</actionGroups> diff --git a/app/code/Magento/ImportExport/Test/Mftf/Test/AdminCheckDoubleImportOfProductsTest.xml b/app/code/Magento/ImportExport/Test/Mftf/Test/AdminCheckDoubleImportOfProductsTest.xml new file mode 100644 index 0000000000000..43de37e665605 --- /dev/null +++ b/app/code/Magento/ImportExport/Test/Mftf/Test/AdminCheckDoubleImportOfProductsTest.xml @@ -0,0 +1,68 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> + +<tests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd"> + <test name="AdminCheckDoubleImportOfProductsTest"> + <annotations> + <description value="Checking double Import of products CSV file"/> + <stories value="Import Products"/> + <features value="Import/Export"/> + <title value="Admin check double import of products test"/> + <severity value="CRITICAL"/> + <testCaseId value="MC-6311"/> + <group value="importExport"/> + </annotations> + <before> + <!-- Login as admin --> + <actionGroup ref="LoginAsAdmin" stepKey="loginAsAdmin"/> + + <!-- Create additional store views --> + <actionGroup ref="AdminCreateStoreViewActionGroup" stepKey="createFirstStoreView"> + <argument name="customStore" value="secondStoreView"/> + </actionGroup> + <actionGroup ref="AdminCreateStoreViewActionGroup" stepKey="createSecondStoreView"> + <argument name="customStore" value="thirdStoreView"/> + </actionGroup> + </before> + <after> + <!-- Delete all imported products --> + <actionGroup ref="AdminOpenProductIndexPageActionGroup" stepKey="openProductIndexPage"/> + <actionGroup ref="clearFiltersAdminDataGrid" stepKey="clearGridFilter"/> + <actionGroup ref="adminDataGridSelectPerPage" stepKey="selectNumberOfProductsPerPage"> + <argument name="perPage" value="100"/> + </actionGroup> + <actionGroup ref="deleteProductsIfTheyExist" stepKey="deleteAllProducts"/> + + <!-- Delete additional store views --> + <actionGroup ref="AdminDeleteStoreViewActionGroup" stepKey="deleteFirstStoreView"> + <argument name="customStore" value="secondStoreView"/> + </actionGroup> + <actionGroup ref="AdminDeleteStoreViewActionGroup" stepKey="deleteSecondStoreView"> + <argument name="customStore" value="thirdStoreView"/> + </actionGroup> + + <!-- Log out --> + <actionGroup ref="logout" stepKey="logout"/> + </after> + + <!-- Import products with add/update behavior --> + <actionGroup ref="AdminImportProductsActionGroup" stepKey="adminImportProductsFirstTime"> + <argument name="behavior" value="Add/Update"/> + <argument name="importFile" value="prepared-for-sample-data.csv"/> + <argument name="importMessage" value="Created: 100, Updated: 3, Deleted: 0"/> + </actionGroup> + + <!-- Import products with add/update behavior again --> + <actionGroup ref="AdminImportProductsActionGroup" stepKey="adminImportProductsSecondTime"> + <argument name="behavior" value="Add/Update"/> + <argument name="importFile" value="prepared-for-sample-data.csv"/> + <argument name="importMessage" value="Created: 0, Updated: 300, Deleted: 0"/> + </actionGroup> + </test> +</tests> diff --git a/app/code/Magento/Store/Test/Mftf/Data/StoreData.xml b/app/code/Magento/Store/Test/Mftf/Data/StoreData.xml index f32b6dd83a2c6..1a1847bf38308 100644 --- a/app/code/Magento/Store/Test/Mftf/Data/StoreData.xml +++ b/app/code/Magento/Store/Test/Mftf/Data/StoreData.xml @@ -184,4 +184,14 @@ <data key="store_type">store</data> <data key="store_action">add</data> </entity> + + <!-- Store views from file "prepared-for-sample-data.csv"--> + <entity name="secondStoreView" type="store"> + <data key="name">second_storeview</data> + <data key="code">second_storeview</data> + </entity> + <entity name="thirdStoreView" type="store"> + <data key="name">third_store_view</data> + <data key="code">third_store_view</data> + </entity> </entities> \ No newline at end of file diff --git a/dev/tests/acceptance/tests/_data/prepared-for-sample-data.csv b/dev/tests/acceptance/tests/_data/prepared-for-sample-data.csv new file mode 100644 index 0000000000000..cb4f981717214 --- /dev/null +++ b/dev/tests/acceptance/tests/_data/prepared-for-sample-data.csv @@ -0,0 +1,499 @@ +sku,store_view_code,attribute_set_code,product_type,categories,product_websites,name,description,short_description,weight,product_online,tax_class_name,visibility,price,url_key,additional_attributes,qty,out_of_stock_qty,use_config_min_qty,is_qty_decimal,allow_backorders,use_config_backorders,min_cart_qty,use_config_min_sale_qty,max_cart_qty,use_config_max_sale_qty,is_in_stock,notify_on_stock_below,use_config_notify_stock_qty,manage_stock,use_config_manage_stock,use_config_qty_increments,qty_increments,use_config_enable_qty_inc,enable_qty_increments,is_decimal_divided,deferred_stock_update,use_config_deferred_stock_update,related_skus,upsell_skus,additional_images,custom_options,bundle_price_type,bundle_sku_type,bundle_price_view,bundle_weight_type,bundle_values,bundle_shipment_type,configurable_variations,configurable_variation_labels,associated_skus,brand,can_add_earmold,use_pcm,product_line,product_group,related_earmold_sku,warranty_product_type,extended_warranty_sku,show_default_warranty,show_extended_warranty,infor_product_class,infor_platform,local_private_label,infor_item_group,infor_serialized_item_group,infor_product_group,infor_sales_price_group,ignore_price_options,loss_and_damage_sku +10536515,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Extended Warranty 12 Months new,,,0.001,1,0,"Catalog, Search",133,10536515_Extended-Warranty-12-Months_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,Warranty,,NWY,,,,,,,,,,,, +10536515,second_storeview,Default,simple,,,Extended Warranty 12 Months,,,,,,"Catalog, Search",,10536515_Extended-Warranty-12-Months_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10536515,third_store_view,Default,simple,,,Extended Warranty 12 Months,,,,,,"Catalog, Search",,10536515_Extended-Warranty-12-Months_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10536516,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Extended Warranty 24 Months,,,0.001,1,0,"Catalog, Search",189,10536516_Extended-Warranty-24-Months_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,Warranty,,NWY,,,,,,,,,,,, +10536516,second_storeview,Default,simple,,,Extended Warranty 24 Months,,,,,,"Catalog, Search",,10536516_Extended-Warranty-24-Months_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10536516,third_store_view,Default,simple,,,Extended Warranty 24 Months,,,,,,"Catalog, Search",,10536516_Extended-Warranty-24-Months_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10240175,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,L&D CHARGE LEVEL 1,,,0.001,1,0,"Catalog, Search",150,10240175_LD-CHARGE-LEVEL-1_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,LossDamage,,S03,,,,,,,,,,,, +10240175,second_storeview,Default,simple,,,L&D CHARGE LEVEL 1,,,,,,"Catalog, Search",,10240175_LD-CHARGE-LEVEL-1_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10240175,third_store_view,Default,simple,,,L&D CHARGE LEVEL 1,,,,,,"Catalog, Search",,10240175_LD-CHARGE-LEVEL-1_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10240176,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,L&D CHARGE LEVEL 2,,,0.001,1,0,"Catalog, Search",220,10240176_LD-CHARGE-LEVEL-2_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,LossDamage,,S03,,,,,,,,,,,, +10240176,second_storeview,Default,simple,,,L&D CHARGE LEVEL 2,,,,,,"Catalog, Search",,10240176_LD-CHARGE-LEVEL-2_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10240176,third_store_view,Default,simple,,,L&D CHARGE LEVEL 2,,,,,,"Catalog, Search",,10240176_LD-CHARGE-LEVEL-2_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10825023,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,LICENSE CHARGES UNITY 3 REM,,,0.001,1,0,"Catalog, Search",1100,10825023_LICENSE-CHARGES-UNITY-3-REM_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A99,,,,,,,,,,,, +10825023,second_storeview,Default,simple,,,LICENSE CHARGES UNITY 3 REM,,,,,,"Catalog, Search",,10825023_LICENSE-CHARGES-UNITY-3-REM_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10825023,third_store_view,Default,simple,,,LICENSE CHARGES UNITY 3 REM,,,,,,"Catalog, Search",,10825023_LICENSE-CHARGES-UNITY-3-REM_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10825024,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,LICENSE CHARGES UNITY 3 SM,,,0.001,1,0,"Catalog, Search",1100,10825024_LICENSE-CHARGES-UNITY-3-SM_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A99,,,,,,,,,,,, +10825024,second_storeview,Default,simple,,,LICENSE CHARGES UNITY 3 SM,,,,,,"Catalog, Search",,10825024_LICENSE-CHARGES-UNITY-3-SM_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10825024,third_store_view,Default,simple,,,LICENSE CHARGES UNITY 3 SM,,,,,,"Catalog, Search",,10825024_LICENSE-CHARGES-UNITY-3-SM_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10825022,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,LICENSE CHARGES UNTIY 3 AUD,,,0.001,1,0,"Catalog, Search",1000,10825022_LICENSE-CHARGES-UNTIY-3-AUD_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A99,,,,,,,,,,,, +10825022,second_storeview,Default,simple,,,LICENSE CHARGES UNTIY 3 AUD,,,,,,"Catalog, Search",,10825022_LICENSE-CHARGES-UNTIY-3-AUD_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10825022,third_store_view,Default,simple,,,LICENSE CHARGES UNTIY 3 AUD,,,,,,"Catalog, Search",,10825022_LICENSE-CHARGES-UNTIY-3-AUD_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10601877,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Concha Lock S 45db 10/PACK,,,0.015,1,0,"Catalog, Search",6,10601877_Concha-Lock-S-45db--10PACK_transparent_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A99,,,,,,,,,,,, +10601877,second_storeview,Default,simple,,,Concha Lock S 45db 10/PACK,,,,,,"Catalog, Search",,10601877_Concha-Lock-S-45db--10PACK_transparent_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10601877,third_store_view,Default,simple,,,Concha Lock S 45db 10/PACK,,,,,,"Catalog, Search",,10601877_Concha-Lock-S-45db--10PACK_transparent_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10674949,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Otoform A SoftX,,Otoform softX Deep fit (8 refill w/o tips),500,1,0,"Catalog, Search",49,10674949_Otoform-A-SoftX_pink_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,S03,,,,,,,,,,,, +10674949,second_storeview,Default,simple,,,Otoform A SoftX,,Otoform softX Deep fit (8 refill w/o tips),,,,"Catalog, Search",,10674949_Otoform-A-SoftX_pink_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10674949,third_store_view,Default,simple,,,Otoform A SoftX,,Otoform softX Deep fit (8 refill w/o tips),,,,"Catalog, Search",,10674949_Otoform-A-SoftX_pink_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +7212678,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,EARHOOK SMALL H2030,,,0.35,1,0,"Catalog, Search",6,107212678_EARHOOK-SMALL-H2030_transparent_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,S01,,,,,,,,,,,, +7212678,second_storeview,Default,simple,,,EARHOOK SMALL H2030,,,,,,"Catalog, Search",,207212678_EARHOOK-SMALL-H2030_transparent_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +7212678,third_store_view,Default,simple,,,EARHOOK SMALL H2030,,,,,,"Catalog, Search",,307212678_EARHOOK-SMALL-H2030_transparent_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10296987,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Refill Open Tip 4MM,,10 pieces per Package,0.5,1,0,"Catalog, Search",10,110296987_Refill-Open-Tip-4MM_Open_4_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A13,,,,,,,,,,,, +10296987,second_storeview,Default,simple,,,Refill Open Tip 4MM,,10 pieces per Package,,,,"Catalog, Search",,10296987_Refill-Open-Tip-4MM_Open_4_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10296987,third_store_view,Default,simple,,,Refill Open Tip 4MM,,10 pieces per Package,,,,"Catalog, Search",,10296987_Refill-Open-Tip-4MM_Open_4_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10297179,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,HiPro 2 USB PC Interface,,,230,1,0,"Catalog, Search",1100,10297179_HiPro-2-USB-PC-Interface_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A05,,,,,,,,,,,, +10297179,second_storeview,Default,simple,,,HiPro 2 USB PC Interface,,,,,,"Catalog, Search",,10297179_HiPro-2-USB-PC-Interface_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10297179,third_store_view,Default,simple,,,HiPro 2 USB PC Interface,,,,,,"Catalog, Search",,10297179_HiPro-2-USB-PC-Interface_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10667517,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,ERU HP-Receiver,,,15,1,0,"Catalog, Search",108,10667517_ERU-HP-Receiver_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,ERU,,ITE,,,,,,,,,,,, +10667517,second_storeview,Default,simple,,,ERU HP-Receiver,,,,,,"Catalog, Search",,10667517_ERU-HP-Receiver_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10667517,third_store_view,Default,simple,,,ERU HP-Receiver,,,,,,"Catalog, Search",,10667517_ERU-HP-Receiver_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10942148,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SP 7 px Beige,,"Fits severe to profound hearing loss +small and reliable desiged BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2199,10942148_Motion-SP-7-px-Beige_beige_675_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10942148,second_storeview,Default,simple,,,Motion SP 7 px Beige,,"Fits severe to profound hearing loss +small and reliable desiged BTE with advanced primax Technology",,,,"Catalog, Search",,10942148_Motion-SP-7-px-Beige_beige_675_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10942148,third_store_view,Default,simple,,,Motion SP 7 px Beige,,"Fits severe to profound hearing loss +small and reliable desiged BTE with advanced primax Technology",,,,"Catalog, Search",,10942148_Motion-SP-7-px-Beige_beige_675_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934914,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SX 7 px Silver,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934914_Motion-SX-7-px-Silver_silver_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934914,second_storeview,Default,simple,,,Motion SX 7 px Silver,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934914_Motion-SX-7-px-Silver_silver_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934914,third_store_view,Default,simple,,,Motion SX 7 px Silver,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934914_Motion-SX-7-px-Silver_silver_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934639,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion P 7 px Silver,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934639_Motion-P-7-px-Silver_silver_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934639,second_storeview,Default,simple,,,Motion P 7 px Silver,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934639_Motion-P-7-px-Silver_silver_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934639,third_store_view,Default,simple,,,Motion P 7 px Silver,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934639_Motion-P-7-px-Silver_silver_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10942709,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SP 7 px Dark Granite,,"Fits severe to profound hearing loss +small and reliable desiged BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2199,10942709_Motion-SP-7-px-Dark-Granite_dark-granite_675_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10942709,second_storeview,Default,simple,,,Motion SP 7 px Dark Granite,,"Fits severe to profound hearing loss +small and reliable desiged BTE with advanced primax Technology",,,,"Catalog, Search",,10942709_Motion-SP-7-px-Dark-Granite_dark-granite_675_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10942709,third_store_view,Default,simple,,,Motion SP 7 px Dark Granite,,"Fits severe to profound hearing loss +small and reliable desiged BTE with advanced primax Technology",,,,"Catalog, Search",,10942709_Motion-SP-7-px-Dark-Granite_dark-granite_675_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10942710,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SP 7 px Grey,,"Fits severe to profound hearing loss +small and reliable desiged BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2199,10942710_Motion-SP-7-px-Grey_grey_675_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10942710,second_storeview,Default,simple,,,Motion SP 7 px Grey,,"Fits severe to profound hearing loss +small and reliable desiged BTE with advanced primax Technology",,,,"Catalog, Search",,10942710_Motion-SP-7-px-Grey_grey_675_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10942710,third_store_view,Default,simple,,,Motion SP 7 px Grey,,"Fits severe to profound hearing loss +small and reliable desiged BTE with advanced primax Technology",,,,"Catalog, Search",,10942710_Motion-SP-7-px-Grey_grey_675_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10942711,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SP 7 px Black,,"Fits severe to profound hearing loss +small and reliable desiged BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2199,10942711_Motion-SP-7-px-Black_black_675_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10942711,second_storeview,Default,simple,,,Motion SP 7 px Black,,"Fits severe to profound hearing loss +small and reliable desiged BTE with advanced primax Technology",,,,"Catalog, Search",,10942711_Motion-SP-7-px-Black_black_675_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10942711,third_store_view,Default,simple,,,Motion SP 7 px Black,,"Fits severe to profound hearing loss +small and reliable desiged BTE with advanced primax Technology",,,,"Catalog, Search",,10942711_Motion-SP-7-px-Black_black_675_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10942712,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SP 7 px Dark Brown,,"Fits severe to profound hearing loss +small and reliable desiged BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2199,10942712_Motion-SP-7-px-Dark-Brown_dark-brown_675_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10942712,second_storeview,Default,simple,,,Motion SP 7 px Dark Brown,,"Fits severe to profound hearing loss +small and reliable desiged BTE with advanced primax Technology",,,,"Catalog, Search",,10942712_Motion-SP-7-px-Dark-Brown_dark-brown_675_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10942712,third_store_view,Default,simple,,,Motion SP 7 px Dark Brown,,"Fits severe to profound hearing loss +small and reliable desiged BTE with advanced primax Technology",,,,"Catalog, Search",,10942712_Motion-SP-7-px-Dark-Brown_dark-brown_675_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10942713,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SP 7 px Granite,,"Fits severe to profound hearing loss +small and reliable desiged BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2199,10942713_Motion-SP-7-px-Granite_granite_675_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10942713,second_storeview,Default,simple,,,Motion SP 7 px Granite,,"Fits severe to profound hearing loss +small and reliable desiged BTE with advanced primax Technology",,,,"Catalog, Search",,10942713_Motion-SP-7-px-Granite_granite_675_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10942713,third_store_view,Default,simple,,,Motion SP 7 px Granite,,"Fits severe to profound hearing loss +small and reliable desiged BTE with advanced primax Technology",,,,"Catalog, Search",,10942713_Motion-SP-7-px-Granite_granite_675_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10936002,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SX 7 px Deep Red,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10936002_Motion-SX-7-px-Deep-Red_deep-red_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10936002,second_storeview,Default,simple,,,Motion SX 7 px Deep Red,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10936002_Motion-SX-7-px-Deep-Red_deep-red_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10936002,third_store_view,Default,simple,,,Motion SX 7 px Deep Red,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10936002_Motion-SX-7-px-Deep-Red_deep-red_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934904,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SX 7 px Black,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934904_Motion-SX-7-px-Black_black_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934904,second_storeview,Default,simple,,,Motion SX 7 px Black,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934904_Motion-SX-7-px-Black_black_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934904,third_store_view,Default,simple,,,Motion SX 7 px Black,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934904_Motion-SX-7-px-Black_black_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934905,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SX 7 px Brown,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934905_Motion-SX-7-px-Brown_brown_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934905,second_storeview,Default,simple,,,Motion SX 7 px Brown,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934905_Motion-SX-7-px-Brown_brown_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934905,third_store_view,Default,simple,,,Motion SX 7 px Brown,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934905_Motion-SX-7-px-Brown_brown_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934906,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SX 7 px Dark Granite,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934906_Motion-SX-7-px-Dark-Granite_dark-granite_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934906,second_storeview,Default,simple,,,Motion SX 7 px Dark Granite,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934906_Motion-SX-7-px-Dark-Granite_dark-granite_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934906,third_store_view,Default,simple,,,Motion SX 7 px Dark Granite,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934906_Motion-SX-7-px-Dark-Granite_dark-granite_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934909,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SX 7 px Granite,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934909_Motion-SX-7-px-Granite_granite_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934909,second_storeview,Default,simple,,,Motion SX 7 px Granite,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934909_Motion-SX-7-px-Granite_granite_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934909,third_store_view,Default,simple,,,Motion SX 7 px Granite,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934909_Motion-SX-7-px-Granite_granite_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934908,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SX 7 px Golden Blonde,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934908_Motion-SX-7-px-Golden-Blonde_golden-blonde_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934908,second_storeview,Default,simple,,,Motion SX 7 px Golden Blonde,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934908_Motion-SX-7-px-Golden-Blonde_golden-blonde_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934908,third_store_view,Default,simple,,,Motion SX 7 px Golden Blonde,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934908_Motion-SX-7-px-Golden-Blonde_golden-blonde_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934915,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SX 7 px Spirit,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934915_Motion-SX-7-px-Spirit_spirit_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934915,second_storeview,Default,simple,,,Motion SX 7 px Spirit,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934915_Motion-SX-7-px-Spirit_spirit_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934915,third_store_view,Default,simple,,,Motion SX 7 px Spirit,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934915_Motion-SX-7-px-Spirit_spirit_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934903,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SX 7 px Beige,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934903_Motion-SX-7-px-Beige_beige_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934903,second_storeview,Default,simple,,,Motion SX 7 px Beige,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934903_Motion-SX-7-px-Beige_beige_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934903,third_store_view,Default,simple,,,Motion SX 7 px Beige,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934903_Motion-SX-7-px-Beige_beige_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934910,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SX 7 px Grey,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934910_Motion-SX-7-px-Grey_grey_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934910,second_storeview,Default,simple,,,Motion SX 7 px Grey,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934910_Motion-SX-7-px-Grey_grey_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934910,third_store_view,Default,simple,,,Motion SX 7 px Grey,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934910_Motion-SX-7-px-Grey_grey_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934911,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SX 7 px Elegance,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934911_Motion-SX-7-px-Elegance_elegance_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934911,second_storeview,Default,simple,,,Motion SX 7 px Elegance,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934911_Motion-SX-7-px-Elegance_elegance_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934911,third_store_view,Default,simple,,,Motion SX 7 px Elegance,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934911_Motion-SX-7-px-Elegance_elegance_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934913,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SX 7 px Sandy Brown,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934913_Motion-SX-7-px-Sandy-Brown_dark-blonde_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934913,second_storeview,Default,simple,,,Motion SX 7 px Sandy Brown,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934913_Motion-SX-7-px-Sandy-Brown_dark-blonde_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934913,third_store_view,Default,simple,,,Motion SX 7 px Sandy Brown,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934913_Motion-SX-7-px-Sandy-Brown_dark-blonde_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934375,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion P 7 px Beige,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934375_Motion-P-7-px-Beige_beige_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934375,second_storeview,Default,simple,,,Motion P 7 px Beige,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934375_Motion-P-7-px-Beige_beige_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934375,third_store_view,Default,simple,,,Motion P 7 px Beige,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934375_Motion-P-7-px-Beige_beige_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934912,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SX 7 px Pearl White,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934912_Motion-SX-7-px-Pearl-White_pearl-white_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934912,second_storeview,Default,simple,,,Motion SX 7 px Pearl White,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934912_Motion-SX-7-px-Pearl-White_pearl-white_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934912,third_store_view,Default,simple,,,Motion SX 7 px Pearl White,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934912_Motion-SX-7-px-Pearl-White_pearl-white_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934622,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SA 7 px Pearl White,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934622_Motion-SA-7-px-Pearl-White_pearl-white_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934622,second_storeview,Default,simple,,,Motion SA 7 px Pearl White,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934622_Motion-SA-7-px-Pearl-White_pearl-white_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934622,third_store_view,Default,simple,,,Motion SA 7 px Pearl White,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934622_Motion-SA-7-px-Pearl-White_pearl-white_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934907,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SX 7 px Dark Champagne,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934907_Motion-SX-7-px-Dark-Champagne_dark-champagner_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934907,second_storeview,Default,simple,,,Motion SX 7 px Dark Champagne,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934907_Motion-SX-7-px-Dark-Champagne_dark-champagner_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934907,third_store_view,Default,simple,,,Motion SX 7 px Dark Champagne,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934907_Motion-SX-7-px-Dark-Champagne_dark-champagner_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10296988,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Refill Open Tip 6MM,,10 pieces per Package,0.5,1,0,"Catalog, Search",10,10296988_Refill-Open-Tip-6MM_Open_6_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A13,,,,,,,,,,,, +10296988,second_storeview,Default,simple,,,Refill Open Tip 6MM,,10 pieces per Package,,,,"Catalog, Search",,10296988_Refill-Open-Tip-6MM_Open_6_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10296988,third_store_view,Default,simple,,,Refill Open Tip 6MM,,10 pieces per Package,,,,"Catalog, Search",,10296988_Refill-Open-Tip-6MM_Open_6_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10296989,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Refill Open Tip 8MM,,10 pieces per Package,0.5,1,0,"Catalog, Search",10,10296989_Refill-Open-Tip--8MM_Open_8_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A13,,,,,,,,,,,, +10296989,second_storeview,Default,simple,,,Refill Open Tip 8MM,,10 pieces per Package,,,,"Catalog, Search",,10296989_Refill-Open-Tip--8MM_Open_8_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10296989,third_store_view,Default,simple,,,Refill Open Tip 8MM,,10 pieces per Package,,,,"Catalog, Search",,10296989_Refill-Open-Tip--8MM_Open_8_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934631,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion P 7 px Dark Granite,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934631_Motion-P-7-px-Dark-Granite_dark-granite_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934631,second_storeview,Default,simple,,,Motion P 7 px Dark Granite,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934631_Motion-P-7-px-Dark-Granite_dark-granite_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934631,third_store_view,Default,simple,,,Motion P 7 px Dark Granite,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934631_Motion-P-7-px-Dark-Granite_dark-granite_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934632,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion P 7 px Dark Champagne,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934632_Motion-P-7-px-Dark-Champagne_dark-champagner_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934632,second_storeview,Default,simple,,,Motion P 7 px Dark Champagne,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934632_Motion-P-7-px-Dark-Champagne_dark-champagner_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934632,third_store_view,Default,simple,,,Motion P 7 px Dark Champagne,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934632_Motion-P-7-px-Dark-Champagne_dark-champagner_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934633,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion P 7 px Golden Blonde,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934633_Motion-P-7-px-Golden-Blonde_golden-blonde_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934633,second_storeview,Default,simple,,,Motion P 7 px Golden Blonde,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934633_Motion-P-7-px-Golden-Blonde_golden-blonde_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934633,third_store_view,Default,simple,,,Motion P 7 px Golden Blonde,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934633_Motion-P-7-px-Golden-Blonde_golden-blonde_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934634,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion P 7 px Galactic Blue,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934634_Motion-P-7-px-Galactic-Blue_galactic-blue_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934634,second_storeview,Default,simple,,,Motion P 7 px Galactic Blue,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934634_Motion-P-7-px-Galactic-Blue_galactic-blue_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934634,third_store_view,Default,simple,,,Motion P 7 px Galactic Blue,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934634_Motion-P-7-px-Galactic-Blue_galactic-blue_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934635,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion P 7 px Granite,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934635_Motion-P-7-px-Granite_granite_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934635,second_storeview,Default,simple,,,Motion P 7 px Granite,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934635_Motion-P-7-px-Granite_granite_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934635,third_store_view,Default,simple,,,Motion P 7 px Granite,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934635_Motion-P-7-px-Granite_granite_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934636,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion P 7 px Grey,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934636_Motion-P-7-px-Grey_grey_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934636,second_storeview,Default,simple,,,Motion P 7 px Grey,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934636_Motion-P-7-px-Grey_grey_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934636,third_store_view,Default,simple,,,Motion P 7 px Grey,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934636_Motion-P-7-px-Grey_grey_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934638,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion P 7 px Sandy Brown,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934638_Motion-P-7-px-Sandy-Brown_dark-blonde_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934638,second_storeview,Default,simple,,,Motion P 7 px Sandy Brown,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934638_Motion-P-7-px-Sandy-Brown_dark-blonde_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934638,third_store_view,Default,simple,,,Motion P 7 px Sandy Brown,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934638_Motion-P-7-px-Sandy-Brown_dark-blonde_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934624,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SA 7 px Silver,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934624_Motion-SA-7-px-Silver_silver_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934624,second_storeview,Default,simple,,,Motion SA 7 px Silver,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934624_Motion-SA-7-px-Silver_silver_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934624,third_store_view,Default,simple,,,Motion SA 7 px Silver,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934624_Motion-SA-7-px-Silver_silver_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10939410,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion P 7 px Deep Red,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10939410_Motion-P-7-px-Deep-Red_deep-red_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10939410,second_storeview,Default,simple,,,Motion P 7 px Deep Red,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10939410_Motion-P-7-px-Deep-Red_deep-red_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10939410,third_store_view,Default,simple,,,Motion P 7 px Deep Red,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10939410_Motion-P-7-px-Deep-Red_deep-red_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934581,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion P 7 px Black,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934581_Motion-P-7-px-Black_black_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934581,second_storeview,Default,simple,,,Motion P 7 px Black,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934581_Motion-P-7-px-Black_black_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934581,third_store_view,Default,simple,,,Motion P 7 px Black,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934581_Motion-P-7-px-Black_black_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934582,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion P 7 px Brown,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934582_Motion-P-7-px-Brown_brown_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934582,second_storeview,Default,simple,,,Motion P 7 px Brown,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934582_Motion-P-7-px-Brown_brown_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934582,third_store_view,Default,simple,,,Motion P 7 px Brown,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934582_Motion-P-7-px-Brown_brown_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934585,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion P 7 px Candy Pink,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934585_Motion-P-7-px-Candy-Pink_candy-pink_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934585,second_storeview,Default,simple,,,Motion P 7 px Candy Pink,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934585_Motion-P-7-px-Candy-Pink_candy-pink_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934585,third_store_view,Default,simple,,,Motion P 7 px Candy Pink,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934585_Motion-P-7-px-Candy-Pink_candy-pink_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934637,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion P 7 px Pearl White,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934637_Motion-P-7-px-Pearl-White_pearl-white_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934637,second_storeview,Default,simple,,,Motion P 7 px Pearl White,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934637_Motion-P-7-px-Pearl-White_pearl-white_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934637,third_store_view,Default,simple,,,Motion P 7 px Pearl White,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934637_Motion-P-7-px-Pearl-White_pearl-white_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934611,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SA 7 px Beige,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934611_Motion-SA-7-px-Beige_beige_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934611,second_storeview,Default,simple,,,Motion SA 7 px Beige,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934611_Motion-SA-7-px-Beige_beige_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934611,third_store_view,Default,simple,,,Motion SA 7 px Beige,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934611_Motion-SA-7-px-Beige_beige_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934612,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SA 7 px Black,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934612_Motion-SA-7-px-Black_black_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934612,second_storeview,Default,simple,,,Motion SA 7 px Black,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934612_Motion-SA-7-px-Black_black_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934612,third_store_view,Default,simple,,,Motion SA 7 px Black,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934612_Motion-SA-7-px-Black_black_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934613,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SA 7 px Brown,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934613_Motion-SA-7-px-Brown_brown_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934613,second_storeview,Default,simple,,,Motion SA 7 px Brown,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934613_Motion-SA-7-px-Brown_brown_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934613,third_store_view,Default,simple,,,Motion SA 7 px Brown,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934613_Motion-SA-7-px-Brown_brown_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934614,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SA 7 px Candy Pink,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934614_Motion-SA-7-px-Candy-Pink_candy-pink_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934614,second_storeview,Default,simple,,,Motion SA 7 px Candy Pink,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934614_Motion-SA-7-px-Candy-Pink_candy-pink_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934614,third_store_view,Default,simple,,,Motion SA 7 px Candy Pink,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934614_Motion-SA-7-px-Candy-Pink_candy-pink_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934615,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SA 7 px Dark Granite,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934615_Motion-SA-7-px-Dark-Granite_dark-granite_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934615,second_storeview,Default,simple,,,Motion SA 7 px Dark Granite,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934615_Motion-SA-7-px-Dark-Granite_dark-granite_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934615,third_store_view,Default,simple,,,Motion SA 7 px Dark Granite,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934615_Motion-SA-7-px-Dark-Granite_dark-granite_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934616,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SA 7 px Dark Champagne,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934616_Motion-SA-7-px-Dark-Champagne_dark-champagner_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934616,second_storeview,Default,simple,,,Motion SA 7 px Dark Champagne,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934616_Motion-SA-7-px-Dark-Champagne_dark-champagner_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934616,third_store_view,Default,simple,,,Motion SA 7 px Dark Champagne,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934616_Motion-SA-7-px-Dark-Champagne_dark-champagner_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934617,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SA 7 px Golden Blonde,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",50,1,0,"Catalog, Search",2149,10934617_Motion-SA-7-px-Golden-Blonde_golden-blonde_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934617,second_storeview,Default,simple,,,Motion SA 7 px Golden Blonde,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934617_Motion-SA-7-px-Golden-Blonde_golden-blonde_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934617,third_store_view,Default,simple,,,Motion SA 7 px Golden Blonde,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934617_Motion-SA-7-px-Golden-Blonde_golden-blonde_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934618,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SA 7 px Galactic Blue,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934618_Motion-SA-7-px-Galactic-Blue_galactic-blue_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934618,second_storeview,Default,simple,,,Motion SA 7 px Galactic Blue,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934618_Motion-SA-7-px-Galactic-Blue_galactic-blue_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934618,third_store_view,Default,simple,,,Motion SA 7 px Galactic Blue,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934618_Motion-SA-7-px-Galactic-Blue_galactic-blue_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934619,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SA 7 px Granite,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934619_Motion-SA-7-px-Granite_granite_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934619,second_storeview,Default,simple,,,Motion SA 7 px Granite,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934619_Motion-SA-7-px-Granite_granite_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934619,third_store_view,Default,simple,,,Motion SA 7 px Granite,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934619_Motion-SA-7-px-Granite_granite_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934620,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SA 7 px Grey,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934620_Motion-SA-7-px-Grey_grey_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934620,second_storeview,Default,simple,,,Motion SA 7 px Grey,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934620_Motion-SA-7-px-Grey_grey_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934620,third_store_view,Default,simple,,,Motion SA 7 px Grey,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934620_Motion-SA-7-px-Grey_grey_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10936009,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SA 7 px Deep Red,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10936009_Motion-SA-7-px-Deep-Red_deep-red_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10936009,second_storeview,Default,simple,,,Motion SA 7 px Deep Red,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10936009_Motion-SA-7-px-Deep-Red_deep-red_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10936009,third_store_view,Default,simple,,,Motion SA 7 px Deep Red,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10936009_Motion-SA-7-px-Deep-Red_deep-red_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934625,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SA 7 px Spirit,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934625_Motion-SA-7-px-Spirit_spirit_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934625,second_storeview,Default,simple,,,Motion SA 7 px Spirit,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934625_Motion-SA-7-px-Spirit_spirit_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934625,third_store_view,Default,simple,,,Motion SA 7 px Spirit,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934625_Motion-SA-7-px-Spirit_spirit_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934623,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SA 7 px Dark Blonde,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934623_Motion-SA-7-px-Dark-Blonde_dark-blonde_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934623,second_storeview,Default,simple,,,Motion SA 7 px Dark Blonde,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934623_Motion-SA-7-px-Dark-Blonde_dark-blonde_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934623,third_store_view,Default,simple,,,Motion SA 7 px Dark Blonde,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934623_Motion-SA-7-px-Dark-Blonde_dark-blonde_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934621,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SA 7 px Elegance,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934621_Motion-SA-7-px-Elegance_elegance_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934621,second_storeview,Default,simple,,,Motion SA 7 px Elegance,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934621_Motion-SA-7-px-Elegance_elegance_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934621,third_store_view,Default,simple,,,Motion SA 7 px Elegance,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934621_Motion-SA-7-px-Elegance_elegance_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10296990,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Refill Open Tip 10MM,,10 pieces per Package,0.5,1,0,"Catalog, Search",10,10296990_Refill-Open-Tip-10MM_Open_10_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A13,,,,,,,,,,,, +10296990,second_storeview,Default,simple,,,Refill Open Tip 10MM,,10 pieces per Package,,,,"Catalog, Search",,10296990_Refill-Open-Tip-10MM_Open_10_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10296990,third_store_view,Default,simple,,,Refill Open Tip 10MM,,10 pieces per Package,,,,"Catalog, Search",,10296990_Refill-Open-Tip-10MM_Open_10_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10828292,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Thin Tubes Size 1R,,,1,1,0,"Catalog, Search",10,10828292_Thin-Tubes-Size-1R_Right_1_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A13,,,,,,,,,,,, +10828292,second_storeview,Default,simple,,,Thin Tubes Size 1R,,,,,,"Catalog, Search",,10828292_Thin-Tubes-Size-1R_Right_1_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10828292,third_store_view,Default,simple,,,Thin Tubes Size 1R,,,,,,"Catalog, Search",,10828292_Thin-Tubes-Size-1R_Right_1_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10828294,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Thin Tubes Size 2R,,,1,1,0,"Catalog, Search",10,10828294_Thin-Tubes-Size-2R_Right_2_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A13,,,,,,,,,,,, +10828294,second_storeview,Default,simple,,,Thin Tubes Size 2R,,,,,,"Catalog, Search",,10828294_Thin-Tubes-Size-2R_Right_2_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10828294,third_store_view,Default,simple,,,Thin Tubes Size 2R,,,,,,"Catalog, Search",,10828294_Thin-Tubes-Size-2R_Right_2_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10828296,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Thin Tubes Size 3R,,,1,1,0,"Catalog, Search",10,10828296_Thin-Tubes-Size-3R_Right_3_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A13,,,,,,,,,,,, +10828296,second_storeview,Default,simple,,,Thin Tubes Size 3R,,,,,,"Catalog, Search",,10828296_Thin-Tubes-Size-3R_Right_3_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10828296,third_store_view,Default,simple,,,Thin Tubes Size 3R,,,,,,"Catalog, Search",,10828296_Thin-Tubes-Size-3R_Right_3_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10296986,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Refill Closed Tip 8MM,,10 pieces per Package,0.5,1,0,"Catalog, Search",10,10296986_Refill-Closed-Tip-8MM_Closed_8_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A13,,,,,,,,,,,, +10296986,second_storeview,Default,simple,,,Refill Closed Tip 8MM,,10 pieces per Package,,,,"Catalog, Search",,10296986_Refill-Closed-Tip-8MM_Closed_8_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10296986,third_store_view,Default,simple,,,Refill Closed Tip 8MM,,10 pieces per Package,,,,"Catalog, Search",,10296986_Refill-Closed-Tip-8MM_Closed_8_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10296985,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Refill Double Tip 10/12MM,,10 pieces per Package,0.5,1,0,"Catalog, Search",10,10296985_Refill-Double-Tip-1012MM_Double_10_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A13,,,,,,,,,,,, +10296985,second_storeview,Default,simple,,,Refill Double Tip 10/12MM,,10 pieces per Package,,,,"Catalog, Search",,10296985_Refill-Double-Tip-1012MM_Double_10_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10296985,third_store_view,Default,simple,,,Refill Double Tip 10/12MM,,10 pieces per Package,,,,"Catalog, Search",,10296985_Refill-Double-Tip-1012MM_Double_10_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10296984,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Refill Double Tip 8/10MM,,10 pieces per Package,0.5,1,0,"Catalog, Search",10,10296984_Refill-Double-Tip-810MM_Double_8_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A13,,,,,,,,,,,, +10296984,second_storeview,Default,simple,,,Refill Double Tip 8/10MM,,10 pieces per Package,,,,"Catalog, Search",,10296984_Refill-Double-Tip-810MM_Double_8_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10296984,third_store_view,Default,simple,,,Refill Double Tip 8/10MM,,10 pieces per Package,,,,"Catalog, Search",,10296984_Refill-Double-Tip-810MM_Double_8_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10828298,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Thin Tubes Size 4R,,,1,1,0,"Catalog, Search",10,10828298_Thin-Tubes-Size-4R_Right_4_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A13,,,,,,,,,,,, +10828298,second_storeview,Default,simple,,,Thin Tubes Size 4R,,,,,,"Catalog, Search",,10828298_Thin-Tubes-Size-4R_Right_4_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10828298,third_store_view,Default,simple,,,Thin Tubes Size 4R,,,,,,"Catalog, Search",,10828298_Thin-Tubes-Size-4R_Right_4_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10828291,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Thin Tubes Size 1L,,,1,1,0,"Catalog, Search",10,10828291_Thin-Tubes-Size-1L_Left_1_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A13,,,,,,,,,,,, +10828291,second_storeview,Default,simple,,,Thin Tubes Size 1L,,,,,,"Catalog, Search",,10828291_Thin-Tubes-Size-1L_Left_1_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10828291,third_store_view,Default,simple,,,Thin Tubes Size 1L,,,,,,"Catalog, Search",,10828291_Thin-Tubes-Size-1L_Left_1_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10828293,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Thin Tubes Size 2L,,,1,1,0,"Catalog, Search",10,10828293_Thin-Tubes-Size-2L_Left_2_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A13,,,,,,,,,,,, +10828293,second_storeview,Default,simple,,,Thin Tubes Size 2L,,,,,,"Catalog, Search",,10828293_Thin-Tubes-Size-2L_Left_2_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10828293,third_store_view,Default,simple,,,Thin Tubes Size 2L,,,,,,"Catalog, Search",,10828293_Thin-Tubes-Size-2L_Left_2_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10828295,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Thin Tubes Size 3L,,,1,1,0,"Catalog, Search",10,10828295_Thin-Tubes-Size-3L_Left_3_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A13,,,,,,,,,,,, +10828295,second_storeview,Default,simple,,,Thin Tubes Size 3L,,,,,,"Catalog, Search",,10828295_Thin-Tubes-Size-3L_Left_3_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10828295,third_store_view,Default,simple,,,Thin Tubes Size 3L,,,,,,"Catalog, Search",,10828295_Thin-Tubes-Size-3L_Left_3_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10828297,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Thin Tubes Size 4L,,,1,1,0,"Catalog, Search",10,10828297_Thin-Tubes-Size-4L_Left_4_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A13,,,,,,,,,,,, +10828297,second_storeview,Default,simple,,,Thin Tubes Size 4L,,,,,,"Catalog, Search",,10828297_Thin-Tubes-Size-4L_Left_4_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10828297,third_store_view,Default,simple,,,Thin Tubes Size 4L,,,,,,"Catalog, Search",,10828297_Thin-Tubes-Size-4L_Left_4_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10673779,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Semi Open Tip Refill (Siemens),,,3,1,0,"Catalog, Search",10,10673779_Semi-Open-Tip-Refill-Siemens_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A07,,,,,,,,,,,, +10673779,second_storeview,Default,simple,,,Semi Open Tip Refill (Siemens),,,,,,"Catalog, Search",,10673779_Semi-Open-Tip-Refill-Siemens_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10673779,third_store_view,Default,simple,,,Semi Open Tip Refill (Siemens),,,,,,"Catalog, Search",,10673779_Semi-Open-Tip-Refill-Siemens_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10935754,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,HA MOTION S 3PX BG,,,50,1,0,"Catalog, Search",949,10935754_HA-MOTION-S-3PX-BG_beige_312_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,,,,,,,,,,,, +10935754,second_storeview,Default,simple,,,HA MOTION S 3PX BG,,,,,,"Catalog, Search",,10935754_HA-MOTION-S-3PX-BG_beige_312_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10935754,third_store_view,Default,simple,,,HA MOTION S 3PX BG,,,,,,"Catalog, Search",,10935754_HA-MOTION-S-3PX-BG_beige_312_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10296968,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Life Tube Fitting Set,,,1,1,0,"Catalog, Search",199,10296968_Life-Tube-Fitting-Set_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A13,,,,,,,,,,,, +10296968,second_storeview,Default,simple,,,Life Tube Fitting Set,,,,,,"Catalog, Search",,10296968_Life-Tube-Fitting-Set_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10296968,third_store_view,Default,simple,,,Life Tube Fitting Set,,,,,,"Catalog, Search",,10296968_Life-Tube-Fitting-Set_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +7227098,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,EARHOOK W. DAMPER,,,0.015,1,0,"Catalog, Search",6,307227098_EARHOOK-W-DAMPER_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,S01,,,,,,,,,,,, +7227098,second_storeview,Default,simple,,,EARHOOK W. DAMPER,,,,,,"Catalog, Search",,407227098_EARHOOK-W-DAMPER_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +7227098,third_store_view,Default,simple,,,EARHOOK W. DAMPER,,,,,,"Catalog, Search",,907227098_EARHOOK-W-DAMPER_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10824187,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,HiPro Extension Cable,,,100,1,0,"Catalog, Search",19,10824187_HiPro-Extension-Cable_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A05,,,,,,,,,,,, +10824187,second_storeview,Default,simple,,,HiPro Extension Cable,,,,,,"Catalog, Search",,10824187_HiPro-Extension-Cable_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10824187,third_store_view,Default,simple,,,HiPro Extension Cable,,,,,,"Catalog, Search",,10824187_HiPro-Extension-Cable_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10937826,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,NEW concha lock M 55/60db 10/pack,,,25,1,0,"Catalog, Search",6,10937826_NEW-concha-lock-M-5560db-10pack_transparent_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A99,,,,,,,,,,,, +10937826,second_storeview,Default,simple,,,NEW concha lock M 55/60db 10/pack,,,,,,"Catalog, Search",,10937826_NEW-concha-lock-M-5560db-10pack_transparent_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10937826,third_store_view,Default,simple,,,NEW concha lock M 55/60db 10/pack,,,,,,"Catalog, Search",,10937826_NEW-concha-lock-M-5560db-10pack_transparent_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +7784916,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,NOAHLink Cable Right,,,0.015,1,0,"Catalog, Search",75,507784916_NOAHLink-Cable-Right_red_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A05,,,,,,,,,,,, +7784916,second_storeview,Default,simple,,,NOAHLink Cable Right,,,,,,"Catalog, Search",,707784916_NOAHLink-Cable-Right_red_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +7784916,third_store_view,Default,simple,,,NOAHLink Cable Right,,,,,,"Catalog, Search",,607784916_NOAHLink-Cable-Right_red_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934901,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SX 5 px Silver,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",1459,10934901_Motion-SX-5-px-Silver_silver_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934901,second_storeview,Default,simple,,,Motion SX 5 px Silver,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934901_Motion-SX-5-px-Silver_silver_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934901,third_store_view,Default,simple,,,Motion SX 5 px Silver,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934901_Motion-SX-5-px-Silver_silver_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934520,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SA 5 px Elegance,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",1459,10934520_Motion-SA-5-px-Elegance_elegance_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934520,second_storeview,Default,simple,,,Motion SA 5 px Elegance,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934520_Motion-SA-5-px-Elegance_elegance_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934520,third_store_view,Default,simple,,,Motion SA 5 px Elegance,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934520_Motion-SA-5-px-Elegance_elegance_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934521,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SA 5 px Pearl White,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",1459,10934521_Motion-SA-5-px-Pearl-White_pearl-white_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934521,second_storeview,Default,simple,,,Motion SA 5 px Pearl White,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934521_Motion-SA-5-px-Pearl-White_pearl-white_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934521,third_store_view,Default,simple,,,Motion SA 5 px Pearl White,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934521_Motion-SA-5-px-Pearl-White_pearl-white_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934522,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SA 5 px Sandy Brown,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",1459,10934522_Motion-SA-5-px-Sandy-Brown_dark-blonde_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934522,second_storeview,Default,simple,,,Motion SA 5 px Sandy Brown,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934522_Motion-SA-5-px-Sandy-Brown_dark-blonde_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934522,third_store_view,Default,simple,,,Motion SA 5 px Sandy Brown,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934522_Motion-SA-5-px-Sandy-Brown_dark-blonde_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934523,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SA 5 px Silver,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",1459,10934523_Motion-SA-5-px-Silver_silver_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934523,second_storeview,Default,simple,,,Motion SA 5 px Silver,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934523_Motion-SA-5-px-Silver_silver_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934523,third_store_view,Default,simple,,,Motion SA 5 px Silver,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934523_Motion-SA-5-px-Silver_silver_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10942714,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SP 5 px Beige,,"Fits severe to profound hearing loss +small and reliable desiged BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",1479,10942714_Motion-SP-5-px-Beige_beige_675_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10942714,second_storeview,Default,simple,,,Motion SP 5 px Beige,,"Fits severe to profound hearing loss +small and reliable desiged BTE with advanced primax Technology",,,,"Catalog, Search",,10942714_Motion-SP-5-px-Beige_beige_675_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10942714,third_store_view,Default,simple,,,Motion SP 5 px Beige,,"Fits severe to profound hearing loss +small and reliable desiged BTE with advanced primax Technology",,,,"Catalog, Search",,10942714_Motion-SP-5-px-Beige_beige_675_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10942723,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SP 5 px Granite,,"Fits severe to profound hearing loss +small and reliable desiged BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",1479,10942723_Motion-SP-5-px-Granite_granite_675_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10942723,second_storeview,Default,simple,,,Motion SP 5 px Granite,,"Fits severe to profound hearing loss +small and reliable desiged BTE with advanced primax Technology",,,,"Catalog, Search",,10942723_Motion-SP-5-px-Granite_granite_675_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10942723,third_store_view,Default,simple,,,Motion SP 5 px Granite,,"Fits severe to profound hearing loss +small and reliable desiged BTE with advanced primax Technology",,,,"Catalog, Search",,10942723_Motion-SP-5-px-Granite_granite_675_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934524,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SA 5 px Spirit,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",1459,10934524_Motion-SA-5-px-Spirit_spirit_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934524,second_storeview,Default,simple,,,Motion SA 5 px Spirit,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934524_Motion-SA-5-px-Spirit_spirit_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934524,third_store_view,Default,simple,,,Motion SA 5 px Spirit,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934524_Motion-SA-5-px-Spirit_spirit_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10939409,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion P 5 px Deep Red,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",1459,10939409_Motion-P-5-px-Deep-Red_deep-red_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10939409,second_storeview,Default,simple,,,Motion P 5 px Deep Red,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10939409_Motion-P-5-px-Deep-Red_deep-red_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10939409,third_store_view,Default,simple,,,Motion P 5 px Deep Red,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10939409_Motion-P-5-px-Deep-Red_deep-red_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934652,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion P 5 px Beige,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",1459,10934652_Motion-P-5-px-Beige_beige_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934652,second_storeview,Default,simple,,,Motion P 5 px Beige,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934652_Motion-P-5-px-Beige_beige_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934652,third_store_view,Default,simple,,,Motion P 5 px Beige,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934652_Motion-P-5-px-Beige_beige_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934653,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion P 5 px Black,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",1459,10934653_Motion-P-5-px-Black_black_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934653,second_storeview,Default,simple,,,Motion P 5 px Black,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934653_Motion-P-5-px-Black_black_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934653,third_store_view,Default,simple,,,Motion P 5 px Black,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934653_Motion-P-5-px-Black_black_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934654,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion P 5 px Brown,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",1459,10934654_Motion-P-5-px-Brown_brown_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934654,second_storeview,Default,simple,,,Motion P 5 px Brown,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934654_Motion-P-5-px-Brown_brown_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934654,third_store_view,Default,simple,,,Motion P 5 px Brown,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934654_Motion-P-5-px-Brown_brown_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934655,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion P 5 px Candy Pink,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",1459,10934655_Motion-P-5-px-Candy-Pink_candy-pink_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934655,second_storeview,Default,simple,,,Motion P 5 px Candy Pink,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934655_Motion-P-5-px-Candy-Pink_candy-pink_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934655,third_store_view,Default,simple,,,Motion P 5 px Candy Pink,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934655_Motion-P-5-px-Candy-Pink_candy-pink_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934656,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion P 5 px Dark Granite,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",1459,10934656_Motion-P-5-px-Dark-Granite_dark-granite_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934656,second_storeview,Default,simple,,,Motion P 5 px Dark Granite,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934656_Motion-P-5-px-Dark-Granite_dark-granite_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934656,third_store_view,Default,simple,,,Motion P 5 px Dark Granite,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934656_Motion-P-5-px-Dark-Granite_dark-granite_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934657,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion P 5 px Dark Champagne,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",1459,10934657_Motion-P-5-px-Dark-Champagne_dark-champagner_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934657,second_storeview,Default,simple,,,Motion P 5 px Dark Champagne,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934657_Motion-P-5-px-Dark-Champagne_dark-champagner_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934657,third_store_view,Default,simple,,,Motion P 5 px Dark Champagne,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934657_Motion-P-5-px-Dark-Champagne_dark-champagner_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934658,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion P 5 px Golden Blonde,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",1459,10934658_Motion-P-5-px-Golden-Blonde_golden-blonde_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934658,second_storeview,Default,simple,,,Motion P 5 px Golden Blonde,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934658_Motion-P-5-px-Golden-Blonde_golden-blonde_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934658,third_store_view,Default,simple,,,Motion P 5 px Golden Blonde,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934658_Motion-P-5-px-Golden-Blonde_golden-blonde_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, \ No newline at end of file From ea64cc8d651393136055b3aa7f04b90f3237d477 Mon Sep 17 00:00:00 2001 From: Maria Kovdrysh <kovdrysh@adobe.com> Date: Fri, 31 May 2019 12:47:45 -0500 Subject: [PATCH 10/36] MC-6311: Checking double Import of products CSV file --- app/code/Magento/Catalog/Test/Mftf/Data/CategoryData.xml | 7 +++++++ .../Mftf/Test/AdminCheckDoubleImportOfProductsTest.xml | 5 +++++ 2 files changed, 12 insertions(+) diff --git a/app/code/Magento/Catalog/Test/Mftf/Data/CategoryData.xml b/app/code/Magento/Catalog/Test/Mftf/Data/CategoryData.xml index 27167d03d528e..13951a0d197d1 100644 --- a/app/code/Magento/Catalog/Test/Mftf/Data/CategoryData.xml +++ b/app/code/Magento/Catalog/Test/Mftf/Data/CategoryData.xml @@ -110,4 +110,11 @@ <data key="is_active">false</data> <data key="include_in_menu">false</data> </entity> + <!-- Category from file "prepared-for-sample-data.csv"--> + <entity name="Gear" type="category"> + <data key="name">Gear</data> + <data key="name_lwr">gear</data> + <data key="is_active">true</data> + <data key="include_in_menu">true</data> + </entity> </entities> diff --git a/app/code/Magento/ImportExport/Test/Mftf/Test/AdminCheckDoubleImportOfProductsTest.xml b/app/code/Magento/ImportExport/Test/Mftf/Test/AdminCheckDoubleImportOfProductsTest.xml index 43de37e665605..0f2dde99b9016 100644 --- a/app/code/Magento/ImportExport/Test/Mftf/Test/AdminCheckDoubleImportOfProductsTest.xml +++ b/app/code/Magento/ImportExport/Test/Mftf/Test/AdminCheckDoubleImportOfProductsTest.xml @@ -47,6 +47,11 @@ <argument name="customStore" value="thirdStoreView"/> </actionGroup> + <!-- Delete category --> + <actionGroup ref="DeleteCategory" stepKey="deleteCategory"> + <argument name="categoryEntity" value="Gear"/> + </actionGroup> + <!-- Log out --> <actionGroup ref="logout" stepKey="logout"/> </after> From 1d6a98135a30b0534389d46dbebdeb957a4d4eb0 Mon Sep 17 00:00:00 2001 From: Maria Kovdrysh <kovdrysh@adobe.com> Date: Tue, 4 Jun 2019 09:21:39 -0500 Subject: [PATCH 11/36] MC-6338: Admin create text editor product attribute test --- ...torefrontAssertProductAttributeOnProductPageActionGroup.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/code/Magento/Catalog/Test/Mftf/ActionGroup/StorefrontAssertProductAttributeOnProductPageActionGroup.xml b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/StorefrontAssertProductAttributeOnProductPageActionGroup.xml index 9ca01ee5dc0ad..26d2285614c65 100644 --- a/app/code/Magento/Catalog/Test/Mftf/ActionGroup/StorefrontAssertProductAttributeOnProductPageActionGroup.xml +++ b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/StorefrontAssertProductAttributeOnProductPageActionGroup.xml @@ -11,7 +11,8 @@ <argument name="attributeLabel" type="string"/> <argument name="attributeValue" type="string"/> </arguments> - <scrollTo selector="{{StorefrontProductMoreInformationSection.moreInformation}}" stepKey="scrollToMoreInformation"/> + <waitForElementVisible selector="{{StorefrontProductMoreInformationSection.moreInformation}}" stepKey="waitForMoreInformationVisible"/> + <click selector="{{StorefrontProductMoreInformationSection.moreInformation}}" stepKey="clickMoreInformationTab"/> <see selector="{{StorefrontProductMoreInformationSection.attributeLabel}}" userInput="{{attributeLabel}}" stepKey="seeAttributeLabel"/> <see selector="{{StorefrontProductMoreInformationSection.attributeValue}}" userInput="{{attributeValue}}" stepKey="seeAttributeText"/> </actionGroup> From 3aa61906ee37c6c940efa2ce135d53d5ec63fe6b Mon Sep 17 00:00:00 2001 From: Maria Kovdrysh <kovdrysh@adobe.com> Date: Tue, 4 Jun 2019 11:25:05 -0500 Subject: [PATCH 12/36] MC-6338: TinyMCE4 is applied as new WYSIWYG on Product Attribute --- ...oductAttributeOnProductPageActionGroup.xml | 19 ------------------- ...inCreateTextEditorProductAttributeTest.xml | 6 +++++- 2 files changed, 5 insertions(+), 20 deletions(-) delete mode 100644 app/code/Magento/Catalog/Test/Mftf/ActionGroup/StorefrontAssertProductAttributeOnProductPageActionGroup.xml diff --git a/app/code/Magento/Catalog/Test/Mftf/ActionGroup/StorefrontAssertProductAttributeOnProductPageActionGroup.xml b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/StorefrontAssertProductAttributeOnProductPageActionGroup.xml deleted file mode 100644 index 26d2285614c65..0000000000000 --- a/app/code/Magento/Catalog/Test/Mftf/ActionGroup/StorefrontAssertProductAttributeOnProductPageActionGroup.xml +++ /dev/null @@ -1,19 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/** - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. ---> - -<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd"> - <actionGroup name="StorefrontAssertProductAttributeOnProductPageActionGroup"> - <arguments> - <argument name="attributeLabel" type="string"/> - <argument name="attributeValue" type="string"/> - </arguments> - <waitForElementVisible selector="{{StorefrontProductMoreInformationSection.moreInformation}}" stepKey="waitForMoreInformationVisible"/> - <click selector="{{StorefrontProductMoreInformationSection.moreInformation}}" stepKey="clickMoreInformationTab"/> - <see selector="{{StorefrontProductMoreInformationSection.attributeLabel}}" userInput="{{attributeLabel}}" stepKey="seeAttributeLabel"/> - <see selector="{{StorefrontProductMoreInformationSection.attributeValue}}" userInput="{{attributeValue}}" stepKey="seeAttributeText"/> - </actionGroup> -</actionGroups> diff --git a/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateTextEditorProductAttributeTest.xml b/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateTextEditorProductAttributeTest.xml index 229344dc8ee1f..4f0c5b45a3904 100644 --- a/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateTextEditorProductAttributeTest.xml +++ b/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateTextEditorProductAttributeTest.xml @@ -110,9 +110,13 @@ <actionGroup ref="fillMainProductForm" stepKey="fillProductForm"/> <actionGroup ref="saveProductForm" stepKey="saveProductForm"/> + <!--Run full reindex and clear caches --> + <magentoCLI command="cache:flush" stepKey="flushCache"/> + <magentoCLI command="indexer:reindex" stepKey="reindex"/> + <!-- Assert product attribute on Storefront --> <actionGroup ref="OpenStorefrontProductPageByProductNameActionGroup" stepKey="openProductPage"/> - <actionGroup ref="StorefrontAssertProductAttributeOnProductPageActionGroup" stepKey="assertProductAttribute"> + <actionGroup ref="checkAttributeInMoreInformationTab" stepKey="checkAttributeInMoreInformationTab"> <argument name="attributeLabel" value="{{productTextEditorAttribute.attribute_code}}"/> <argument name="attributeValue" value="This content from product page"/> </actionGroup> From 81bf488f20a884371b87af94704acea2cd05558d Mon Sep 17 00:00:00 2001 From: Maria Kovdrysh <kovdrysh@adobe.com> Date: Wed, 5 Jun 2019 10:18:56 -0500 Subject: [PATCH 13/36] MC-6338: TinyMCE4 is applied as new WYSIWYG on Product Attribute --- .../Test/Mftf/Section/AdminProductFormSection.xml | 1 + .../AdminCreateTextEditorProductAttributeTest.xml | 14 +++++--------- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/app/code/Magento/Catalog/Test/Mftf/Section/AdminProductFormSection.xml b/app/code/Magento/Catalog/Test/Mftf/Section/AdminProductFormSection.xml index f515171e835db..090c431cf7655 100644 --- a/app/code/Magento/Catalog/Test/Mftf/Section/AdminProductFormSection.xml +++ b/app/code/Magento/Catalog/Test/Mftf/Section/AdminProductFormSection.xml @@ -192,6 +192,7 @@ </section> <section name="ProductDescriptionWysiwygSection"> <element name="EditArea" type="text" selector="#editorproduct_form_description .mce-edit-area"/> + <element name="attributeEditArea" type="textarea" selector="#product_form_{{attributeCode}}" parameterized="true" timeout="30"/> </section> <section name="ProductShortDescriptionWysiwygSection"> <element name="EditArea" type="text" selector="#editorproduct_form_short_description .mce-edit-area"/> diff --git a/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateTextEditorProductAttributeTest.xml b/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateTextEditorProductAttributeTest.xml index 4f0c5b45a3904..73b42c2fd4aef 100644 --- a/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateTextEditorProductAttributeTest.xml +++ b/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateTextEditorProductAttributeTest.xml @@ -16,7 +16,7 @@ <description value="Create text editor product attribute with TinyMCE4 enabled"/> <severity value="CRITICAL"/> <testCaseId value="MC-6338"/> - <group value="Catalog"/> + <group value="catalog"/> </annotations> <before> <!-- Enable WYSIWYG editor --> @@ -93,27 +93,23 @@ <seeElement selector="{{AdminProductFormSection.attributeLabelByText(productTextEditorAttribute.attribute_code)}}" stepKey="seeAttributeLabelInProductForm"/> <!-- TinyMCE 4 is displayed in WYSIWYG content area --> - <seeElement selector="{{TinyMCESection.TinyMCE4}}" stepKey="seeTinyMCE4" /> + <seeElement selector="{{TinyMCESection.TinyMCE4}}" stepKey="seeTinyMCE4"/> <!-- Verify toolbar menu --> <actionGroup ref="VerifyTinyMCEActionGroup" stepKey="verifyToolbarMenu"/> - <!-- Add content into attribute --> - <executeJS function="tinyMCE.get('product_form_{{productTextEditorAttribute.attribute_code}}').setContent('This content from product page');" stepKey="executeJSFillContent"/> - <!-- Click Show/Hide button and see Insert Image button --> <scrollToTopOfPage stepKey="scrollToTop"/> <click selector="{{ProductAttributeWYSIWYGSection.showHideBtn(productTextEditorAttribute.attribute_code)}}" stepKey="clickShowHideBtn"/> <waitForElementVisible selector="{{TinyMCESection.InsertImageBtn}}" stepKey="waitForInsertImageBtn"/> + <!-- Add content into attribute --> + <fillField selector="{{ProductDescriptionWysiwygSection.attributeEditArea(productTextEditorAttribute.attribute_code)}}" userInput="This content from product page" stepKey="setContent"/> + <!-- Fill and save product form --> <actionGroup ref="fillMainProductForm" stepKey="fillProductForm"/> <actionGroup ref="saveProductForm" stepKey="saveProductForm"/> - <!--Run full reindex and clear caches --> - <magentoCLI command="cache:flush" stepKey="flushCache"/> - <magentoCLI command="indexer:reindex" stepKey="reindex"/> - <!-- Assert product attribute on Storefront --> <actionGroup ref="OpenStorefrontProductPageByProductNameActionGroup" stepKey="openProductPage"/> <actionGroup ref="checkAttributeInMoreInformationTab" stepKey="checkAttributeInMoreInformationTab"> From 4fba61b9d505be1e9df7b506e8a97f654c5facb7 Mon Sep 17 00:00:00 2001 From: Maria Kovdrysh <kovdrysh@adobe.com> Date: Wed, 5 Jun 2019 13:19:31 -0500 Subject: [PATCH 14/36] MC-6338: TinyMCE4 is applied as new WYSIWYG on Product Attribute - test stabilization --- ...efrontCustomProductAttributeActionGroup.xml | 18 ++++++++++++++++++ ...StorefrontProductMoreInformationSection.xml | 3 +++ ...minCreateTextEditorProductAttributeTest.xml | 3 ++- 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 app/code/Magento/Catalog/Test/Mftf/ActionGroup/AssertStorefrontCustomProductAttributeActionGroup.xml diff --git a/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AssertStorefrontCustomProductAttributeActionGroup.xml b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AssertStorefrontCustomProductAttributeActionGroup.xml new file mode 100644 index 0000000000000..e27efb41a7ef7 --- /dev/null +++ b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AssertStorefrontCustomProductAttributeActionGroup.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd"> + <actionGroup name="AssertStorefrontCustomProductAttributeActionGroup"> + <arguments> + <argument name="attributeLabel" type="string"/> + <argument name="attributeValue" type="string"/> + </arguments> + <see userInput="{{attributeLabel}}" selector="{{StorefrontProductMoreInformationSection.customAttributeLabel(attributeLabel)}}" stepKey="seeAttributeLabel" /> + <see userInput="{{attributeValue}}" selector="{{StorefrontProductMoreInformationSection.customAttributeValue(attributeLabel)}}" stepKey="seeAttributeValue" /> + </actionGroup> +</actionGroups> diff --git a/app/code/Magento/Catalog/Test/Mftf/Section/StorefrontProductMoreInformationSection.xml b/app/code/Magento/Catalog/Test/Mftf/Section/StorefrontProductMoreInformationSection.xml index ee687fa62da93..7706c5f244bc9 100644 --- a/app/code/Magento/Catalog/Test/Mftf/Section/StorefrontProductMoreInformationSection.xml +++ b/app/code/Magento/Catalog/Test/Mftf/Section/StorefrontProductMoreInformationSection.xml @@ -11,6 +11,9 @@ <section name="StorefrontProductMoreInformationSection"> <element name="moreInformation" type="button" selector="#tab-label-additional-title" timeout="30"/> <element name="moreInformationTextArea" type="textarea" selector="#additional"/> + <element name="moreInformationSpecs" type="text" selector="#product-attribute-specs-table"/> + <element name="customAttributeLabel" type="text" selector="//th[./following-sibling::td[@data-th='{{attributeCode}}']]" parameterized="true" /> + <element name="customAttributeValue" type="text" selector="//td[@data-th='{{attributeCode}}']" parameterized="true" /> <element name="attributeLabel" type="text" selector=".col.label"/> <element name="attributeValue" type="text" selector=".col.data"/> </section> diff --git a/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateTextEditorProductAttributeTest.xml b/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateTextEditorProductAttributeTest.xml index 73b42c2fd4aef..4abae5f52bf5f 100644 --- a/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateTextEditorProductAttributeTest.xml +++ b/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateTextEditorProductAttributeTest.xml @@ -112,7 +112,8 @@ <!-- Assert product attribute on Storefront --> <actionGroup ref="OpenStorefrontProductPageByProductNameActionGroup" stepKey="openProductPage"/> - <actionGroup ref="checkAttributeInMoreInformationTab" stepKey="checkAttributeInMoreInformationTab"> + <scrollTo stepKey="scrollToMoreInformation" selector="{{StorefrontProductMoreInformationSection.moreInformationSpecs}}" /> + <actionGroup ref="AssertStorefrontCustomProductAttributeActionGroup" stepKey="checkAttributeInMoreInformationTab"> <argument name="attributeLabel" value="{{productTextEditorAttribute.attribute_code}}"/> <argument name="attributeValue" value="This content from product page"/> </actionGroup> From d98584fd69e91f720e85cf348a449f2a95fe190d Mon Sep 17 00:00:00 2001 From: Maria Kovdrysh <kovdrysh@adobe.com> Date: Wed, 5 Jun 2019 16:03:01 -0500 Subject: [PATCH 15/36] MC-13210: Register customer with image upload --- ...ctAttributeVisibleInStorefrontAdvancedSearchFormTest.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateMultipleSelectProductAttributeVisibleInStorefrontAdvancedSearchFormTest.xml b/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateMultipleSelectProductAttributeVisibleInStorefrontAdvancedSearchFormTest.xml index 1f558568e9248..4e096b7ebb142 100644 --- a/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateMultipleSelectProductAttributeVisibleInStorefrontAdvancedSearchFormTest.xml +++ b/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateMultipleSelectProductAttributeVisibleInStorefrontAdvancedSearchFormTest.xml @@ -34,6 +34,12 @@ <actionGroup ref="LoginAsAdmin" stepKey="loginAsAdmin"/> </before> <after> + <!-- Delete product attribute --> + <deleteData createDataKey="attribute" stepKey="deleteProductAttribute"/> + + <!-- Delete product attribute set --> + <deleteData createDataKey="createAttributeSet" stepKey="deleteAttributeSet"/> + <actionGroup ref="logout" stepKey="logout"/> </after> From 467dba6c488173c85e769d28703cb5c241c4650a Mon Sep 17 00:00:00 2001 From: Maria Kovdrysh <kovdrysh@adobe.com> Date: Thu, 6 Jun 2019 09:32:48 -0500 Subject: [PATCH 16/36] MC-13210: Register customer with image upload Fixed: MC-14715, MC-14718 --- app/code/Magento/Checkout/Test/Mftf/Data/ConfigData.xml | 7 +++++++ ...StorefrontAddBundleDynamicProductToShoppingCartTest.xml | 1 + .../Test/StorefrontAddGroupedProductToShoppingCartTest.xml | 1 + 3 files changed, 9 insertions(+) diff --git a/app/code/Magento/Checkout/Test/Mftf/Data/ConfigData.xml b/app/code/Magento/Checkout/Test/Mftf/Data/ConfigData.xml index 12974617d55ae..e9c949f2ef886 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Data/ConfigData.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Data/ConfigData.xml @@ -53,6 +53,13 @@ <data key="label">Yes</data> <data key="value">1</data> </entity> + <entity name="EnableFlatRateDefaultPrice"> + <data key="path">carriers/flatrate/price</data> + <data key="scope">carriers</data> + <data key="scope_id">1</data> + <data key="label">Yes</data> + <data key="value">5.00</data> + </entity> <entity name="EnableFlatRateToSpecificCountriesConfigData"> <data key="path">carriers/flatrate/sallowspecific</data> <data key="scope">carriers</data> diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddBundleDynamicProductToShoppingCartTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddBundleDynamicProductToShoppingCartTest.xml index 4d9b90f5713c2..78da50a44d1f1 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddBundleDynamicProductToShoppingCartTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddBundleDynamicProductToShoppingCartTest.xml @@ -19,6 +19,7 @@ <before> <magentoCLI command="config:set {{EnableFlatRateConfigData.path}} {{EnableFlatRateConfigData.value}}" stepKey="enableFlatRate"/> + <magentoCLI command="config:set {{EnableFlatRateDefaultPrice.path}} {{EnableFlatRateDefaultPrice.value}}" stepKey="enableFlatRateDefaultPrice"/> <createData entity="SimpleSubCategory" stepKey="createSubCategory"/> <!--Create simple product--> <createData entity="SimpleProduct2" stepKey="simpleProduct1"> diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddGroupedProductToShoppingCartTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddGroupedProductToShoppingCartTest.xml index 604c3a07e01ae..157cf66e65e27 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddGroupedProductToShoppingCartTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddGroupedProductToShoppingCartTest.xml @@ -19,6 +19,7 @@ <before> <magentoCLI command="config:set {{EnableFlatRateConfigData.path}} {{EnableFlatRateConfigData.value}}" stepKey="enableFlatRate"/> + <magentoCLI command="config:set {{EnableFlatRateDefaultPrice.path}} {{EnableFlatRateDefaultPrice.value}}" stepKey="enableFlatRateDefaultPrice"/> <!--Create Grouped product with three simple product --> <createData entity="ApiProductWithDescription" stepKey="simple1" before="simple2"> <field key="price">100.00</field> From 09c415bcd60523c0eeba6caffc5b8a9e7f004793 Mon Sep 17 00:00:00 2001 From: Maria Kovdrysh <kovdrysh@adobe.com> Date: Thu, 6 Jun 2019 10:36:27 -0500 Subject: [PATCH 17/36] MC-11971: Update Gift Wrapping for items Fixed: MC-15606 --- app/code/Magento/Checkout/Test/Mftf/Data/ConfigData.xml | 7 +++++++ ...CartPriceRuleAndVerifyRuleConditionIsNotAppliedTest.xml | 6 ++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/app/code/Magento/Checkout/Test/Mftf/Data/ConfigData.xml b/app/code/Magento/Checkout/Test/Mftf/Data/ConfigData.xml index 12974617d55ae..e9c949f2ef886 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Data/ConfigData.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Data/ConfigData.xml @@ -53,6 +53,13 @@ <data key="label">Yes</data> <data key="value">1</data> </entity> + <entity name="EnableFlatRateDefaultPrice"> + <data key="path">carriers/flatrate/price</data> + <data key="scope">carriers</data> + <data key="scope_id">1</data> + <data key="label">Yes</data> + <data key="value">5.00</data> + </entity> <entity name="EnableFlatRateToSpecificCountriesConfigData"> <data key="path">carriers/flatrate/sallowspecific</data> <data key="scope">carriers</data> diff --git a/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleAndVerifyRuleConditionIsNotAppliedTest.xml b/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleAndVerifyRuleConditionIsNotAppliedTest.xml index 22628e599823d..8a54e00375678 100644 --- a/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleAndVerifyRuleConditionIsNotAppliedTest.xml +++ b/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleAndVerifyRuleConditionIsNotAppliedTest.xml @@ -19,15 +19,17 @@ </annotations> <before> - <actionGroup ref = "LoginAsAdmin" stepKey="loginAsAdmin"/> + <magentoCLI command="config:set {{EnableFlatRateConfigData.path}} {{EnableFlatRateConfigData.value}}" stepKey="enableFlatRate"/> + <magentoCLI command="config:set {{EnableFlatRateDefaultPrice.path}} {{EnableFlatRateDefaultPrice.value}}" stepKey="enableFlatRateDefaultPrice"/> <createData entity="defaultSimpleProduct" stepKey="initialSimpleProduct"/> + <actionGroup ref="LoginAsAdmin" stepKey="loginAsAdmin"/> </before> <after> <deleteData stepKey="deleteProduct" createDataKey="initialSimpleProduct"/> <actionGroup ref="DeleteCartPriceRuleByName" stepKey="deleteCreatedCartPriceRule"> <argument name="ruleName" value="{{CartPriceRuleConditionNotApplied.name}}"/> </actionGroup> - <actionGroup ref="logout" stepKey="logout"/> + <actionGroup ref="logout" stepKey="logoutAsAdmin"/> </after> <!--Create cart price rule as per data and verify AssertCartPriceRuleSuccessSaveMessage--> From 9e3832705630f742b193ef9099f61a7db169cb4c Mon Sep 17 00:00:00 2001 From: Maria Kovdrysh <kovdrysh@adobe.com> Date: Thu, 6 Jun 2019 14:08:02 -0500 Subject: [PATCH 18/36] MC-11971: Update Gift Wrapping for items Fixed: MC-4466, MC-4461 --- .../StorefrontAddBundleDynamicProductToShoppingCartTest.xml | 1 + ...amicProductToShoppingCartWithDisableMiniCartSidebarTest.xml | 1 + .../StorefrontAddConfigurableProductToShoppingCartTest.xml | 1 + .../StorefrontAddDownloadableProductToShoppingCartTest.xml | 1 + .../Test/StorefrontAddGroupedProductToShoppingCartTest.xml | 1 + ...frontAddOneBundleMultiSelectOptionToTheShoppingCartTest.xml | 1 + ...rontAddTwoBundleMultiSelectOptionsToTheShoppingCartTest.xml | 1 + ...SummaryBlockItemDisplayWithDefaultDisplayLimitationTest.xml | 1 + ...yWhenMoreItemsAddedToTheCartThanDefaultDisplayLimitTest.xml | 1 + ...ckSimpleProductCartItemDisplayWithDefaultLimitationTest.xml | 1 + .../StorefrontDeleteBundleProductFromMiniShoppingCartTest.xml | 3 ++- ...efrontDeleteDownloadableProductFromMiniShoppingCartTest.xml | 3 ++- 12 files changed, 14 insertions(+), 2 deletions(-) diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddBundleDynamicProductToShoppingCartTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddBundleDynamicProductToShoppingCartTest.xml index 4d9b90f5713c2..78da50a44d1f1 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddBundleDynamicProductToShoppingCartTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddBundleDynamicProductToShoppingCartTest.xml @@ -19,6 +19,7 @@ <before> <magentoCLI command="config:set {{EnableFlatRateConfigData.path}} {{EnableFlatRateConfigData.value}}" stepKey="enableFlatRate"/> + <magentoCLI command="config:set {{EnableFlatRateDefaultPrice.path}} {{EnableFlatRateDefaultPrice.value}}" stepKey="enableFlatRateDefaultPrice"/> <createData entity="SimpleSubCategory" stepKey="createSubCategory"/> <!--Create simple product--> <createData entity="SimpleProduct2" stepKey="simpleProduct1"> diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddBundleDynamicProductToShoppingCartWithDisableMiniCartSidebarTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddBundleDynamicProductToShoppingCartWithDisableMiniCartSidebarTest.xml index 3dae3b3ae58d5..1454dde7eba46 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddBundleDynamicProductToShoppingCartWithDisableMiniCartSidebarTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddBundleDynamicProductToShoppingCartWithDisableMiniCartSidebarTest.xml @@ -20,6 +20,7 @@ <before> <magentoCLI stepKey="disableShoppingCartSidebar" command="config:set checkout/sidebar/display 0"/> <magentoCLI command="config:set {{EnableFlatRateConfigData.path}} {{EnableFlatRateConfigData.value}}" stepKey="enableFlatRate"/> + <magentoCLI command="config:set {{EnableFlatRateDefaultPrice.path}} {{EnableFlatRateDefaultPrice.value}}" stepKey="enableFlatRateDefaultPrice"/> <createData entity="SimpleSubCategory" stepKey="createSubCategory"/> <!--Create simple products--> diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddConfigurableProductToShoppingCartTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddConfigurableProductToShoppingCartTest.xml index d1196d9abec46..bd563df515f18 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddConfigurableProductToShoppingCartTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddConfigurableProductToShoppingCartTest.xml @@ -19,6 +19,7 @@ <before> <magentoCLI command="config:set {{EnableFlatRateConfigData.path}} {{EnableFlatRateConfigData.value}}" stepKey="enableFlatRate"/> + <magentoCLI command="config:set {{EnableFlatRateDefaultPrice.path}} {{EnableFlatRateDefaultPrice.value}}" stepKey="enableFlatRateDefaultPrice"/> <!-- Create Default Category --> <createData entity="_defaultCategory" stepKey="createCategory"/> diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddDownloadableProductToShoppingCartTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddDownloadableProductToShoppingCartTest.xml index 982c5fb339bf2..6574ac2a57349 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddDownloadableProductToShoppingCartTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddDownloadableProductToShoppingCartTest.xml @@ -19,6 +19,7 @@ <before> <magentoCLI command="config:set {{EnableFlatRateConfigData.path}} {{EnableFlatRateConfigData.value}}" stepKey="enableFlatRate"/> + <magentoCLI command="config:set {{EnableFlatRateDefaultPrice.path}} {{EnableFlatRateDefaultPrice.value}}" stepKey="enableFlatRateDefaultPrice"/> <createData entity="ApiDownloadableProduct" stepKey="createDownloadableProduct"/> <createData entity="downloadableLink1" stepKey="addDownloadableLink1"> <requiredEntity createDataKey="createDownloadableProduct"/> diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddGroupedProductToShoppingCartTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddGroupedProductToShoppingCartTest.xml index 604c3a07e01ae..157cf66e65e27 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddGroupedProductToShoppingCartTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddGroupedProductToShoppingCartTest.xml @@ -19,6 +19,7 @@ <before> <magentoCLI command="config:set {{EnableFlatRateConfigData.path}} {{EnableFlatRateConfigData.value}}" stepKey="enableFlatRate"/> + <magentoCLI command="config:set {{EnableFlatRateDefaultPrice.path}} {{EnableFlatRateDefaultPrice.value}}" stepKey="enableFlatRateDefaultPrice"/> <!--Create Grouped product with three simple product --> <createData entity="ApiProductWithDescription" stepKey="simple1" before="simple2"> <field key="price">100.00</field> diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddOneBundleMultiSelectOptionToTheShoppingCartTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddOneBundleMultiSelectOptionToTheShoppingCartTest.xml index d69f14ba12c7d..968d3d1ba516d 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddOneBundleMultiSelectOptionToTheShoppingCartTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddOneBundleMultiSelectOptionToTheShoppingCartTest.xml @@ -19,6 +19,7 @@ <before> <magentoCLI command="config:set {{EnableFlatRateConfigData.path}} {{EnableFlatRateConfigData.value}}" stepKey="enableFlatRate"/> + <magentoCLI command="config:set {{EnableFlatRateDefaultPrice.path}} {{EnableFlatRateDefaultPrice.value}}" stepKey="enableFlatRateDefaultPrice"/> <createData entity="SimpleSubCategory" stepKey="createSubCategory"/> <!--Create simple product--> <createData entity="SimpleProduct2" stepKey="simpleProduct1"> diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddTwoBundleMultiSelectOptionsToTheShoppingCartTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddTwoBundleMultiSelectOptionsToTheShoppingCartTest.xml index a6b7fd80e1d68..472c285770746 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddTwoBundleMultiSelectOptionsToTheShoppingCartTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddTwoBundleMultiSelectOptionsToTheShoppingCartTest.xml @@ -19,6 +19,7 @@ <before> <magentoCLI command="config:set {{EnableFlatRateConfigData.path}} {{EnableFlatRateConfigData.value}}" stepKey="enableFlatRate"/> + <magentoCLI command="config:set {{EnableFlatRateDefaultPrice.path}} {{EnableFlatRateDefaultPrice.value}}" stepKey="enableFlatRateDefaultPrice"/> <createData entity="SimpleSubCategory" stepKey="createSubCategory"/> <!--Create simple product--> <createData entity="SimpleProduct2" stepKey="simpleProduct1"> diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontCheckCartAndSummaryBlockItemDisplayWithDefaultDisplayLimitationTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontCheckCartAndSummaryBlockItemDisplayWithDefaultDisplayLimitationTest.xml index 1f39cc67218a2..93362ad2367f4 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontCheckCartAndSummaryBlockItemDisplayWithDefaultDisplayLimitationTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontCheckCartAndSummaryBlockItemDisplayWithDefaultDisplayLimitationTest.xml @@ -19,6 +19,7 @@ <before> <magentoCLI command="config:set {{EnableFlatRateConfigData.path}} {{EnableFlatRateConfigData.value}}" stepKey="enableFlatRate"/> + <magentoCLI command="config:set {{EnableFlatRateDefaultPrice.path}} {{EnableFlatRateDefaultPrice.value}}" stepKey="enableFlatRateDefaultPrice"/> <!--Create simple product--> <createData entity="SimpleProduct2" stepKey="simpleProduct1"> <field key="price">10.00</field> diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontCheckCartItemDisplayWhenMoreItemsAddedToTheCartThanDefaultDisplayLimitTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontCheckCartItemDisplayWhenMoreItemsAddedToTheCartThanDefaultDisplayLimitTest.xml index f77fa96c5d017..06ce898a2987c 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontCheckCartItemDisplayWhenMoreItemsAddedToTheCartThanDefaultDisplayLimitTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontCheckCartItemDisplayWhenMoreItemsAddedToTheCartThanDefaultDisplayLimitTest.xml @@ -19,6 +19,7 @@ <before> <magentoCLI command="config:set {{EnableFlatRateConfigData.path}} {{EnableFlatRateConfigData.value}}" stepKey="enableFlatRate"/> + <magentoCLI command="config:set {{EnableFlatRateDefaultPrice.path}} {{EnableFlatRateDefaultPrice.value}}" stepKey="enableFlatRateDefaultPrice"/> <!--Create simple product--> <createData entity="SimpleProduct2" stepKey="simpleProduct1"> <field key="price">10.00</field> diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontCheckSimpleProductCartItemDisplayWithDefaultLimitationTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontCheckSimpleProductCartItemDisplayWithDefaultLimitationTest.xml index c05469b282426..9d82d25184451 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontCheckSimpleProductCartItemDisplayWithDefaultLimitationTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontCheckSimpleProductCartItemDisplayWithDefaultLimitationTest.xml @@ -19,6 +19,7 @@ <before> <magentoCLI command="config:set {{EnableFlatRateConfigData.path}} {{EnableFlatRateConfigData.value}}" stepKey="enableFlatRate"/> + <magentoCLI command="config:set {{EnableFlatRateDefaultPrice.path}} {{EnableFlatRateDefaultPrice.value}}" stepKey="enableFlatRateDefaultPrice"/> <!--Create simple product--> <createData entity="SimpleProduct2" stepKey="simpleProduct1"> <field key="price">10.00</field> diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontDeleteBundleProductFromMiniShoppingCartTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontDeleteBundleProductFromMiniShoppingCartTest.xml index e8843ed841b49..7990aabc60cbd 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontDeleteBundleProductFromMiniShoppingCartTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontDeleteBundleProductFromMiniShoppingCartTest.xml @@ -21,6 +21,7 @@ <before> <actionGroup ref="LoginAsAdmin" stepKey="LoginAsAdmin"/> <magentoCLI command="config:set {{EnableFlatRateConfigData.path}} {{EnableFlatRateConfigData.value}}" stepKey="enableFlatRate"/> + <magentoCLI command="config:set {{EnableFlatRateDefaultPrice.path}} {{EnableFlatRateDefaultPrice.value}}" stepKey="enableFlatRateDefaultPrice"/> <createData entity="SimpleSubCategory" stepKey="createSubCategory"/> <!--Create simple product--> <createData entity="SimpleProduct2" stepKey="simpleProduct1"> @@ -88,4 +89,4 @@ <actionGroup ref="assertMiniCartEmpty" stepKey="miniCartEnpty"/> <dontSee selector="{{StorefrontMinicartSection.productLinkByName($$createBundleProduct.name$$)}}" stepKey="verifyAssertProductAbsentInMiniShoppingCart"/> </test> -</tests> \ No newline at end of file +</tests> diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontDeleteDownloadableProductFromMiniShoppingCartTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontDeleteDownloadableProductFromMiniShoppingCartTest.xml index be74a080317ea..04d03f34e2f1d 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontDeleteDownloadableProductFromMiniShoppingCartTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontDeleteDownloadableProductFromMiniShoppingCartTest.xml @@ -21,6 +21,7 @@ <before> <actionGroup ref="LoginAsAdmin" stepKey="LoginAsAdmin"/> <magentoCLI command="config:set {{EnableFlatRateConfigData.path}} {{EnableFlatRateConfigData.value}}" stepKey="enableFlatRate"/> + <magentoCLI command="config:set {{EnableFlatRateDefaultPrice.path}} {{EnableFlatRateDefaultPrice.value}}" stepKey="enableFlatRateDefaultPrice"/> <createData entity="ApiDownloadableProduct" stepKey="createDownloadableProduct"/> <createData entity="downloadableLink1" stepKey="addDownloadableLink1"> <requiredEntity createDataKey="createDownloadableProduct"/> @@ -70,4 +71,4 @@ <actionGroup ref="assertMiniCartEmpty" stepKey="miniCartEnpty"/> <dontSee selector="{{StorefrontMinicartSection.productLinkByName($$createDownloadableProduct.name$$)}}" stepKey="verifyAssertProductAbsentInMiniShoppingCart"/> </test> -</tests> \ No newline at end of file +</tests> From 0d4e5838f33bd706e3754a0e0d32e062edbcf5fa Mon Sep 17 00:00:00 2001 From: Maria Kovdrysh <kovdrysh@adobe.com> Date: Thu, 6 Jun 2019 15:01:18 -0500 Subject: [PATCH 19/36] MC-11971: Update Gift Wrapping for items Revert changes (Skipped tests which blocked by bug: MC-16684) --- .../StorefrontAddBundleDynamicProductToShoppingCartTest.xml | 3 +++ ...icProductToShoppingCartWithDisableMiniCartSidebarTest.xml | 3 +++ .../StorefrontAddConfigurableProductToShoppingCartTest.xml | 3 +++ .../Test/StorefrontAddGroupedProductToShoppingCartTest.xml | 3 +++ ...ontAddOneBundleMultiSelectOptionToTheShoppingCartTest.xml | 3 +++ ...ntAddTwoBundleMultiSelectOptionsToTheShoppingCartTest.xml | 3 +++ ...uleAndVerifyRuleConditionAndFreeShippingIsAppliedTest.xml | 5 ++++- ...teCartPriceRuleAndVerifyRuleConditionIsNotAppliedTest.xml | 3 +++ ...orMatchingSubtotalAndVerifyRuleConditionIsAppliedTest.xml | 3 +++ ...thMatchingCategoryAndVerifyRuleConditionIsAppliedTest.xml | 5 ++++- ...atchingTotalWeightAndVerifyRuleConditionIsAppliedTest.xml | 5 ++++- 11 files changed, 36 insertions(+), 3 deletions(-) diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddBundleDynamicProductToShoppingCartTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddBundleDynamicProductToShoppingCartTest.xml index 78da50a44d1f1..4c743f490f1b3 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddBundleDynamicProductToShoppingCartTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddBundleDynamicProductToShoppingCartTest.xml @@ -15,6 +15,9 @@ <testCaseId value="MC-14715"/> <severity value="CRITICAL"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-16684"/> + </skip> </annotations> <before> diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddBundleDynamicProductToShoppingCartWithDisableMiniCartSidebarTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddBundleDynamicProductToShoppingCartWithDisableMiniCartSidebarTest.xml index 1454dde7eba46..f391d3c731639 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddBundleDynamicProductToShoppingCartWithDisableMiniCartSidebarTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddBundleDynamicProductToShoppingCartWithDisableMiniCartSidebarTest.xml @@ -15,6 +15,9 @@ <testCaseId value="MC-14719"/> <severity value="CRITICAL"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-16684"/> + </skip> </annotations> <before> diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddConfigurableProductToShoppingCartTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddConfigurableProductToShoppingCartTest.xml index bd563df515f18..019d2ffe9877f 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddConfigurableProductToShoppingCartTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddConfigurableProductToShoppingCartTest.xml @@ -15,6 +15,9 @@ <testCaseId value="MC-14716"/> <severity value="CRITICAL"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-16684"/> + </skip> </annotations> <before> diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddGroupedProductToShoppingCartTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddGroupedProductToShoppingCartTest.xml index 157cf66e65e27..c555a9250dd6d 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddGroupedProductToShoppingCartTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddGroupedProductToShoppingCartTest.xml @@ -15,6 +15,9 @@ <testCaseId value="MC-14718"/> <severity value="CRITICAL"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-16684"/> + </skip> </annotations> <before> diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddOneBundleMultiSelectOptionToTheShoppingCartTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddOneBundleMultiSelectOptionToTheShoppingCartTest.xml index 968d3d1ba516d..db2e6e0dba481 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddOneBundleMultiSelectOptionToTheShoppingCartTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddOneBundleMultiSelectOptionToTheShoppingCartTest.xml @@ -15,6 +15,9 @@ <testCaseId value="MC-14727"/> <severity value="CRITICAL"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-16684"/> + </skip> </annotations> <before> diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddTwoBundleMultiSelectOptionsToTheShoppingCartTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddTwoBundleMultiSelectOptionsToTheShoppingCartTest.xml index 472c285770746..52cf9929be59d 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddTwoBundleMultiSelectOptionsToTheShoppingCartTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddTwoBundleMultiSelectOptionsToTheShoppingCartTest.xml @@ -15,6 +15,9 @@ <testCaseId value="MC-14728"/> <severity value="CRITICAL"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-16684"/> + </skip> </annotations> <before> diff --git a/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleAndVerifyRuleConditionAndFreeShippingIsAppliedTest.xml b/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleAndVerifyRuleConditionAndFreeShippingIsAppliedTest.xml index 33184f79f6f0c..7798ccb726923 100644 --- a/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleAndVerifyRuleConditionAndFreeShippingIsAppliedTest.xml +++ b/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleAndVerifyRuleConditionAndFreeShippingIsAppliedTest.xml @@ -16,6 +16,9 @@ <severity value="CRITICAL"/> <group value="SalesRule"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-16684"/> + </skip> </annotations> <before> @@ -110,4 +113,4 @@ <see selector="{{CheckoutCartSummarySection.shipping}}" userInput="$0.00" stepKey="seeAssertFreeShippingConditionApplied"/> <see selector="{{CheckoutCartSummarySection.discountAmount}}" userInput="-$280.00" stepKey="seeAssertDiscountAmountAppliedForMatchingItemsConditionIsTrue"/> </test> -</tests> \ No newline at end of file +</tests> diff --git a/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleAndVerifyRuleConditionIsNotAppliedTest.xml b/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleAndVerifyRuleConditionIsNotAppliedTest.xml index 8a54e00375678..3a48afebf5ccf 100644 --- a/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleAndVerifyRuleConditionIsNotAppliedTest.xml +++ b/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleAndVerifyRuleConditionIsNotAppliedTest.xml @@ -16,6 +16,9 @@ <severity value="CRITICAL"/> <group value="SalesRule"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-16684"/> + </skip> </annotations> <before> diff --git a/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleForMatchingSubtotalAndVerifyRuleConditionIsAppliedTest.xml b/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleForMatchingSubtotalAndVerifyRuleConditionIsAppliedTest.xml index ab62e51414e85..2b2834726f6bf 100644 --- a/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleForMatchingSubtotalAndVerifyRuleConditionIsAppliedTest.xml +++ b/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleForMatchingSubtotalAndVerifyRuleConditionIsAppliedTest.xml @@ -16,6 +16,9 @@ <severity value="CRITICAL"/> <group value="SalesRule"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-16684"/> + </skip> </annotations> <before> diff --git a/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleWithMatchingCategoryAndVerifyRuleConditionIsAppliedTest.xml b/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleWithMatchingCategoryAndVerifyRuleConditionIsAppliedTest.xml index e1a4ca40fd710..c2d8388eb8327 100644 --- a/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleWithMatchingCategoryAndVerifyRuleConditionIsAppliedTest.xml +++ b/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleWithMatchingCategoryAndVerifyRuleConditionIsAppliedTest.xml @@ -16,6 +16,9 @@ <severity value="CRITICAL"/> <group value="SalesRule"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-16684"/> + </skip> </annotations> <before> @@ -121,4 +124,4 @@ </actionGroup> <see selector="{{CheckoutCartSummarySection.discountAmount}}" userInput="-$61.50" stepKey="seeAssertDiscountAmountAppliedForMatchingCategory"/> </test> -</tests> \ No newline at end of file +</tests> diff --git a/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleWithMatchingTotalWeightAndVerifyRuleConditionIsAppliedTest.xml b/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleWithMatchingTotalWeightAndVerifyRuleConditionIsAppliedTest.xml index c62b0dd869281..d48491fdd9f56 100644 --- a/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleWithMatchingTotalWeightAndVerifyRuleConditionIsAppliedTest.xml +++ b/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleWithMatchingTotalWeightAndVerifyRuleConditionIsAppliedTest.xml @@ -16,6 +16,9 @@ <severity value="CRITICAL"/> <group value="SalesRule"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-16684"/> + </skip> </annotations> <before> @@ -109,4 +112,4 @@ </actionGroup> <see selector="{{CheckoutCartSummarySection.discountAmount}}" userInput="-$280.00" stepKey="seeAssertDiscountAmountAppliedForWeightConditionIsTrue"/> </test> -</tests> \ No newline at end of file +</tests> From 50d05d9ab80c7ae7a8f59f4feda3c1e3a849d42d Mon Sep 17 00:00:00 2001 From: Maria Kovdrysh <kovdrysh@adobe.com> Date: Thu, 6 Jun 2019 15:27:24 -0500 Subject: [PATCH 20/36] MC-11971: Update Gift Wrapping for items --- .../Sales/Test/Mftf/Section/AdminOrderFormAccountSection.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/app/code/Magento/Sales/Test/Mftf/Section/AdminOrderFormAccountSection.xml b/app/code/Magento/Sales/Test/Mftf/Section/AdminOrderFormAccountSection.xml index 5164a68df23b5..430211e52bfb5 100644 --- a/app/code/Magento/Sales/Test/Mftf/Section/AdminOrderFormAccountSection.xml +++ b/app/code/Magento/Sales/Test/Mftf/Section/AdminOrderFormAccountSection.xml @@ -15,6 +15,5 @@ <element name="requiredEmail" type="text" selector=".admin__field.required[data-ui-id='billing-address-fieldset-element-form-field-email']"/> <element name="defaultGeneral" type="text" selector="//*[contains(text(),'General')]" timeout="15"/> <element name="emailErrorMessage" type="text" selector="#email-error"/> - <element name="defaultGeneral" type="text" selector="//*[contains(text(),'General')]" timeout="15"/> </section> </sections> From dcab48876d1592600fbe25a943bb625cc3e16554 Mon Sep 17 00:00:00 2001 From: Maria Kovdrysh <kovdrysh@adobe.com> Date: Thu, 6 Jun 2019 16:43:39 -0500 Subject: [PATCH 21/36] MC-13212: Apply Promo Code during Checkout for physical product Fixed typo error --- .../Mftf/Test/StorefrontApplyPromoCodeDuringCheckoutTest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontApplyPromoCodeDuringCheckoutTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontApplyPromoCodeDuringCheckoutTest.xml index 5e625f5c8d309..707c2dfbca379 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontApplyPromoCodeDuringCheckoutTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontApplyPromoCodeDuringCheckoutTest.xml @@ -14,7 +14,7 @@ <stories value="OnePageCheckout with Promo Code"/> <title value="Storefront apply promo code during checkout test"/> <description value="Apply promo code during checkout for physical product"/> - <severity value="CRITICAl"/> + <severity value="CRITICAL"/> <testCaseId value="MC-13212"/> <group value="checkout"/> </annotations> From 3c7b20c57f2e63c1b3ab18dc9d6e7df776d23b36 Mon Sep 17 00:00:00 2001 From: Maria Kovdrysh <kovdrysh@adobe.com> Date: Fri, 7 Jun 2019 13:10:20 -0500 Subject: [PATCH 22/36] MC-11971: Update Gift Wrapping for items --- ...CancelTheCreatedOrderWithBankTransferPaymentMethodTest.xml | 4 ++-- ...ncelTheCreatedOrderWithCashOnDeliveryPaymentMethodTest.xml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/code/Magento/Sales/Test/Mftf/Test/AdminCancelTheCreatedOrderWithBankTransferPaymentMethodTest.xml b/app/code/Magento/Sales/Test/Mftf/Test/AdminCancelTheCreatedOrderWithBankTransferPaymentMethodTest.xml index 9457e4400947e..74cf3e9dd6b7a 100644 --- a/app/code/Magento/Sales/Test/Mftf/Test/AdminCancelTheCreatedOrderWithBankTransferPaymentMethodTest.xml +++ b/app/code/Magento/Sales/Test/Mftf/Test/AdminCancelTheCreatedOrderWithBankTransferPaymentMethodTest.xml @@ -26,7 +26,7 @@ <magentoCLI command="config:set {{EnablePaymentBankTransferConfigData.path}} {{EnablePaymentBankTransferConfigData.value}}" stepKey="enableBankTransferPayment"/> <!--Set default flat rate shipping method settings--> - <createData entity="FlatRateShippingMethodDefault" stepKey="setDefaultFlatRateShippingMethod"/> + <magentoCLI command="config:set {{EnableFlatRateConfigData.path}} {{EnableFlatRateConfigData.value}}" stepKey="enableFlatRate"/> <!--Create simple customer--> <createData entity="Simple_US_Customer_CA" stepKey="simpleCustomer"/> @@ -80,4 +80,4 @@ <waitForPageLoad stepKey="waitForOrderDetailsToLoad"/> <seeElement selector="{{StorefrontCustomerOrderViewSection.orderStatusInGrid('$orderId', 'Canceled')}}" stepKey="seeOrderStatusInGrid"/> </test> -</tests> \ No newline at end of file +</tests> diff --git a/app/code/Magento/Sales/Test/Mftf/Test/AdminCancelTheCreatedOrderWithCashOnDeliveryPaymentMethodTest.xml b/app/code/Magento/Sales/Test/Mftf/Test/AdminCancelTheCreatedOrderWithCashOnDeliveryPaymentMethodTest.xml index eeb6affec4fd5..a412adee939d2 100644 --- a/app/code/Magento/Sales/Test/Mftf/Test/AdminCancelTheCreatedOrderWithCashOnDeliveryPaymentMethodTest.xml +++ b/app/code/Magento/Sales/Test/Mftf/Test/AdminCancelTheCreatedOrderWithCashOnDeliveryPaymentMethodTest.xml @@ -26,7 +26,7 @@ <magentoCLI command="config:set {{EnableCashOnDeliveryConfigData.path}} {{EnableCashOnDeliveryConfigData.value}}" stepKey="enableCashOnDeliveryPayment"/> <!--Set default flat rate shipping method settings--> - <createData entity="FlatRateShippingMethodDefault" stepKey="setDefaultFlatRateShippingMethod"/> + <magentoCLI command="config:set {{EnableFlatRateConfigData.path}} {{EnableFlatRateConfigData.value}}" stepKey="enableFlatRate"/> <!--Create simple customer--> <createData entity="Simple_US_Customer_CA" stepKey="simpleCustomer"/> @@ -80,4 +80,4 @@ <waitForPageLoad stepKey="waitForOrderDetailsToLoad"/> <seeElement selector="{{StorefrontCustomerOrderViewSection.orderStatusInGrid('$orderId', 'Canceled')}}" stepKey="seeOrderStatusInGrid"/> </test> -</tests> \ No newline at end of file +</tests> From ef52b24eb051491ae4c0eb0e998572360268f2ad Mon Sep 17 00:00:00 2001 From: Maria Kovdrysh <kovdrysh@adobe.com> Date: Mon, 10 Jun 2019 14:46:53 -0500 Subject: [PATCH 23/36] MC-6338: TinyMCE4 is applied as new WYSIWYG on Product Attribute Fixed comments --- ...inCreateTextEditorProductAttributeTest.xml | 26 ++++++++++++------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateTextEditorProductAttributeTest.xml b/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateTextEditorProductAttributeTest.xml index 4abae5f52bf5f..fc7482c353136 100644 --- a/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateTextEditorProductAttributeTest.xml +++ b/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateTextEditorProductAttributeTest.xml @@ -43,35 +43,43 @@ <actionGroup ref="logout" stepKey="logout"/> </after> - <!-- Go to Stores > Product --> + <!-- Go to Stores > Product, click "Add New Attribute" --> <actionGroup ref="AdminOpenProductAttributePageActionGroup" stepKey="openProductAttributePage"/> - - <!-- Create new product attribute --> <click selector="{{AdminProductAttributeGridSection.createNewAttributeBtn}}" stepKey="createNewAttribute"/> + + <!-- Input value for Default Label. Verify dropdown of "Catalog Input Type for Store Owner" --> <actionGroup ref="AdminFillProductAttributePropertiesActionGroup" stepKey="fillAttributeProperties"> <argument name="attributeName" value="{{productTextEditorAttribute.attribute_code}}"/> <argument name="attributeType" value="{{productTextEditorAttribute.frontend_input}}"/> </actionGroup> - <!-- Update product attribute input type and assert WYSIWYG --> + <!-- Input value for "Catalog Input Type for Store Owner" --> <selectOption selector="{{AttributePropertiesSection.InputType}}" userInput="{{productAttributeWysiwyg.frontend_input}}" stepKey="updateInputType"/> + + <!-- Click on "Storefront Properties" tab on left menu --> <click selector="{{StorefrontPropertiesSection.StoreFrontPropertiesTab}}" stepKey="clickStorefrontPropertiesTab"/> <dontSeeElement selector="{{StorefrontPropertiesSection.EnableWYSIWYG}}" stepKey="dontSeeWYSIWYGEnableField"/> - <!-- Change attribute visibility and input type --> + <!-- Selection for "Visible on Catalog Pages on Storefront" --> <selectOption selector="{{StorefrontPropertiesSection.visibleOnCatalogPagesOnStorefront}}" userInput="Yes" stepKey="enableVisibleOnStorefront"/> <scrollToTopOfPage stepKey="scrollToPageTop"/> + + <!-- Go back to "Properties" tab on left menu --> <click selector="{{AttributePropertiesSection.propertiesTab}}" stepKey="clickPropertiesTab"/> + + <!-- Updated value for "Catalog Input Type for Store Owner" --> <selectOption selector="{{AttributePropertiesSection.InputType}}" userInput="{{productTextEditorAttribute.frontend_input}}" stepKey="returnInputType"/> + + <!-- Save Product Attribute --> <actionGroup ref="saveProductAttribute" stepKey="saveAttribute"/> <!-- Go to Store > Attribute Set --> <actionGroup ref="AdminOpenAttributeSetGridPageActionGroup" stepKey="openAttributeSetPage"/> - <!-- Open Default attribute --> + <!-- From grid, click on attribute set Default --> <actionGroup ref="AdminOpenAttributeSetByNameActionGroup" stepKey="openDefaultAttributeSet"/> - <!-- Add created attribute to Default attribute and save --> + <!-- Add Product Attribute to Default attribute by dragging and dropping this to the 'Project Details' folder. Then Save. --> <actionGroup ref="AssignAttributeToGroup" stepKey="assignAttributeToGroup"> <argument name="group" value="Product Details"/> <argument name="attribute" value="{{productTextEditorAttribute.attribute_code}}"/> @@ -84,7 +92,7 @@ <argument name="product" value="_defaultProduct"/> </actionGroup> - <!-- Select attribute set: Default --> + <!-- On product page, select Attribute Set: "Default" --> <actionGroup ref="AdminProductPageSelectAttributeSet" stepKey="selectAttributeSet"> <argument name="attributeSetName" value="Default"/> </actionGroup> @@ -106,7 +114,7 @@ <!-- Add content into attribute --> <fillField selector="{{ProductDescriptionWysiwygSection.attributeEditArea(productTextEditorAttribute.attribute_code)}}" userInput="This content from product page" stepKey="setContent"/> - <!-- Fill and save product form --> + <!-- Fill up all required fields for product form --> <actionGroup ref="fillMainProductForm" stepKey="fillProductForm"/> <actionGroup ref="saveProductForm" stepKey="saveProductForm"/> From 2843f3a9fdbde0cf9e4f58a441c3a1076414b164 Mon Sep 17 00:00:00 2001 From: Maria Kovdrysh <kovdrysh@adobe.com> Date: Mon, 10 Jun 2019 17:15:04 -0500 Subject: [PATCH 24/36] [WIP] [Pangolin][Sprint#1] Regression test automation Fixed: MC-14719, MC-14716 --- app/code/Magento/Checkout/Test/Mftf/Data/ConfigData.xml | 7 +++++++ ...ProductToShoppingCartWithDisableMiniCartSidebarTest.xml | 1 + .../StorefrontAddConfigurableProductToShoppingCartTest.xml | 1 + 3 files changed, 9 insertions(+) diff --git a/app/code/Magento/Checkout/Test/Mftf/Data/ConfigData.xml b/app/code/Magento/Checkout/Test/Mftf/Data/ConfigData.xml index 12974617d55ae..cd9cd59d20b64 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Data/ConfigData.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Data/ConfigData.xml @@ -53,6 +53,13 @@ <data key="label">Yes</data> <data key="value">1</data> </entity> + <entity name="EnableFlatRateDefaultPriceConfigData"> + <data key="path">carriers/flatrate/price</data> + <data key="scope">carriers</data> + <data key="scope_id">1</data> + <data key="label">Yes</data> + <data key="value">5.00</data> + </entity> <entity name="EnableFlatRateToSpecificCountriesConfigData"> <data key="path">carriers/flatrate/sallowspecific</data> <data key="scope">carriers</data> diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddBundleDynamicProductToShoppingCartWithDisableMiniCartSidebarTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddBundleDynamicProductToShoppingCartWithDisableMiniCartSidebarTest.xml index 3dae3b3ae58d5..9c00f2be1d60b 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddBundleDynamicProductToShoppingCartWithDisableMiniCartSidebarTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddBundleDynamicProductToShoppingCartWithDisableMiniCartSidebarTest.xml @@ -20,6 +20,7 @@ <before> <magentoCLI stepKey="disableShoppingCartSidebar" command="config:set checkout/sidebar/display 0"/> <magentoCLI command="config:set {{EnableFlatRateConfigData.path}} {{EnableFlatRateConfigData.value}}" stepKey="enableFlatRate"/> + <magentoCLI command="config:set {{EnableFlatRateDefaultPriceConfigData.path}} {{EnableFlatRateDefaultPriceConfigData.value}}" stepKey="enableFlatRatePrice"/> <createData entity="SimpleSubCategory" stepKey="createSubCategory"/> <!--Create simple products--> diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddConfigurableProductToShoppingCartTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddConfigurableProductToShoppingCartTest.xml index d1196d9abec46..09608eef7178a 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddConfigurableProductToShoppingCartTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddConfigurableProductToShoppingCartTest.xml @@ -19,6 +19,7 @@ <before> <magentoCLI command="config:set {{EnableFlatRateConfigData.path}} {{EnableFlatRateConfigData.value}}" stepKey="enableFlatRate"/> + <magentoCLI command="config:set {{EnableFlatRateDefaultPriceConfigData.path}} {{EnableFlatRateDefaultPriceConfigData.value}}" stepKey="enableFlatRatePrice"/> <!-- Create Default Category --> <createData entity="_defaultCategory" stepKey="createCategory"/> From 448e7b4f716cb2c92d8b0b208f0a076d790eab6d Mon Sep 17 00:00:00 2001 From: Maria Kovdrysh <kovdrysh@adobe.com> Date: Wed, 12 Jun 2019 11:10:27 -0500 Subject: [PATCH 25/36] MC-11971: Update Gift Wrapping for items --- .../Magento/Backend/Test/Mftf/Section/AdminHeaderSection.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/code/Magento/Backend/Test/Mftf/Section/AdminHeaderSection.xml b/app/code/Magento/Backend/Test/Mftf/Section/AdminHeaderSection.xml index 6475d0a3c8166..186bb183d68d6 100644 --- a/app/code/Magento/Backend/Test/Mftf/Section/AdminHeaderSection.xml +++ b/app/code/Magento/Backend/Test/Mftf/Section/AdminHeaderSection.xml @@ -13,5 +13,7 @@ <element name="adminUserAccountText" type="text" selector=".page-header .admin-user-account-text" /> <!-- Legacy heading section. Mostly used for admin 404 and 403 pages --> <element name="pageHeading" type="text" selector=".page-content .page-heading"/> + <!-- Used for page not found error --> + <element name="pageNotFoundTitle" type="text" selector=".page-title span"/> </section> </sections> From d89c2646a9677141aaeeb8b0eb588fc8b7151930 Mon Sep 17 00:00:00 2001 From: Maria Kovdrysh <kovdrysh@adobe.com> Date: Wed, 12 Jun 2019 11:30:20 -0500 Subject: [PATCH 26/36] MC-11971: Update Gift Wrapping for items Fixed tests after resolved conflict --- .../StorefrontAddBundleDynamicProductToShoppingCartTest.xml | 2 +- .../Test/StorefrontAddDownloadableProductToShoppingCartTest.xml | 2 +- .../Mftf/Test/StorefrontAddGroupedProductToShoppingCartTest.xml | 2 +- ...efrontAddOneBundleMultiSelectOptionToTheShoppingCartTest.xml | 2 +- ...frontAddTwoBundleMultiSelectOptionsToTheShoppingCartTest.xml | 2 +- ...dSummaryBlockItemDisplayWithDefaultDisplayLimitationTest.xml | 2 +- ...ayWhenMoreItemsAddedToTheCartThanDefaultDisplayLimitTest.xml | 2 +- ...eckSimpleProductCartItemDisplayWithDefaultLimitationTest.xml | 2 +- .../StorefrontDeleteBundleProductFromMiniShoppingCartTest.xml | 2 +- ...refrontDeleteDownloadableProductFromMiniShoppingCartTest.xml | 2 +- ...reateCartPriceRuleAndVerifyRuleConditionIsNotAppliedTest.xml | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddBundleDynamicProductToShoppingCartTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddBundleDynamicProductToShoppingCartTest.xml index 4c743f490f1b3..f63cf38d15fce 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddBundleDynamicProductToShoppingCartTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddBundleDynamicProductToShoppingCartTest.xml @@ -22,7 +22,7 @@ <before> <magentoCLI command="config:set {{EnableFlatRateConfigData.path}} {{EnableFlatRateConfigData.value}}" stepKey="enableFlatRate"/> - <magentoCLI command="config:set {{EnableFlatRateDefaultPrice.path}} {{EnableFlatRateDefaultPrice.value}}" stepKey="enableFlatRateDefaultPrice"/> + <magentoCLI command="config:set {{EnableFlatRateDefaultPriceConfigData.path}} {{EnableFlatRateDefaultPriceConfigData.value}}" stepKey="enableFlatRateDefaultPrice"/> <createData entity="SimpleSubCategory" stepKey="createSubCategory"/> <!--Create simple product--> <createData entity="SimpleProduct2" stepKey="simpleProduct1"> diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddDownloadableProductToShoppingCartTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddDownloadableProductToShoppingCartTest.xml index 6574ac2a57349..5a46dbc90e207 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddDownloadableProductToShoppingCartTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddDownloadableProductToShoppingCartTest.xml @@ -19,7 +19,7 @@ <before> <magentoCLI command="config:set {{EnableFlatRateConfigData.path}} {{EnableFlatRateConfigData.value}}" stepKey="enableFlatRate"/> - <magentoCLI command="config:set {{EnableFlatRateDefaultPrice.path}} {{EnableFlatRateDefaultPrice.value}}" stepKey="enableFlatRateDefaultPrice"/> + <magentoCLI command="config:set {{EnableFlatRateDefaultPriceConfigData.path}} {{EnableFlatRateDefaultPriceConfigData.value}}" stepKey="enableFlatRateDefaultPrice"/> <createData entity="ApiDownloadableProduct" stepKey="createDownloadableProduct"/> <createData entity="downloadableLink1" stepKey="addDownloadableLink1"> <requiredEntity createDataKey="createDownloadableProduct"/> diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddGroupedProductToShoppingCartTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddGroupedProductToShoppingCartTest.xml index c555a9250dd6d..247fab27143b8 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddGroupedProductToShoppingCartTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddGroupedProductToShoppingCartTest.xml @@ -22,7 +22,7 @@ <before> <magentoCLI command="config:set {{EnableFlatRateConfigData.path}} {{EnableFlatRateConfigData.value}}" stepKey="enableFlatRate"/> - <magentoCLI command="config:set {{EnableFlatRateDefaultPrice.path}} {{EnableFlatRateDefaultPrice.value}}" stepKey="enableFlatRateDefaultPrice"/> + <magentoCLI command="config:set {{EnableFlatRateDefaultPriceConfigData.path}} {{EnableFlatRateDefaultPriceConfigData.value}}" stepKey="enableFlatRateDefaultPrice"/> <!--Create Grouped product with three simple product --> <createData entity="ApiProductWithDescription" stepKey="simple1" before="simple2"> <field key="price">100.00</field> diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddOneBundleMultiSelectOptionToTheShoppingCartTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddOneBundleMultiSelectOptionToTheShoppingCartTest.xml index db2e6e0dba481..73fa380f4bc40 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddOneBundleMultiSelectOptionToTheShoppingCartTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddOneBundleMultiSelectOptionToTheShoppingCartTest.xml @@ -22,7 +22,7 @@ <before> <magentoCLI command="config:set {{EnableFlatRateConfigData.path}} {{EnableFlatRateConfigData.value}}" stepKey="enableFlatRate"/> - <magentoCLI command="config:set {{EnableFlatRateDefaultPrice.path}} {{EnableFlatRateDefaultPrice.value}}" stepKey="enableFlatRateDefaultPrice"/> + <magentoCLI command="config:set {{EnableFlatRateDefaultPriceConfigData.path}} {{EnableFlatRateDefaultPriceConfigData.value}}" stepKey="enableFlatRateDefaultPrice"/> <createData entity="SimpleSubCategory" stepKey="createSubCategory"/> <!--Create simple product--> <createData entity="SimpleProduct2" stepKey="simpleProduct1"> diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddTwoBundleMultiSelectOptionsToTheShoppingCartTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddTwoBundleMultiSelectOptionsToTheShoppingCartTest.xml index 52cf9929be59d..e2ff7f2c98dca 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddTwoBundleMultiSelectOptionsToTheShoppingCartTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddTwoBundleMultiSelectOptionsToTheShoppingCartTest.xml @@ -22,7 +22,7 @@ <before> <magentoCLI command="config:set {{EnableFlatRateConfigData.path}} {{EnableFlatRateConfigData.value}}" stepKey="enableFlatRate"/> - <magentoCLI command="config:set {{EnableFlatRateDefaultPrice.path}} {{EnableFlatRateDefaultPrice.value}}" stepKey="enableFlatRateDefaultPrice"/> + <magentoCLI command="config:set {{EnableFlatRateDefaultPriceConfigData.path}} {{EnableFlatRateDefaultPriceConfigData.value}}" stepKey="enableFlatRateDefaultPrice"/> <createData entity="SimpleSubCategory" stepKey="createSubCategory"/> <!--Create simple product--> <createData entity="SimpleProduct2" stepKey="simpleProduct1"> diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontCheckCartAndSummaryBlockItemDisplayWithDefaultDisplayLimitationTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontCheckCartAndSummaryBlockItemDisplayWithDefaultDisplayLimitationTest.xml index 93362ad2367f4..beb2d40f94cad 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontCheckCartAndSummaryBlockItemDisplayWithDefaultDisplayLimitationTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontCheckCartAndSummaryBlockItemDisplayWithDefaultDisplayLimitationTest.xml @@ -19,7 +19,7 @@ <before> <magentoCLI command="config:set {{EnableFlatRateConfigData.path}} {{EnableFlatRateConfigData.value}}" stepKey="enableFlatRate"/> - <magentoCLI command="config:set {{EnableFlatRateDefaultPrice.path}} {{EnableFlatRateDefaultPrice.value}}" stepKey="enableFlatRateDefaultPrice"/> + <magentoCLI command="config:set {{EnableFlatRateDefaultPriceConfigData.path}} {{EnableFlatRateDefaultPriceConfigData.value}}" stepKey="enableFlatRateDefaultPrice"/> <!--Create simple product--> <createData entity="SimpleProduct2" stepKey="simpleProduct1"> <field key="price">10.00</field> diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontCheckCartItemDisplayWhenMoreItemsAddedToTheCartThanDefaultDisplayLimitTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontCheckCartItemDisplayWhenMoreItemsAddedToTheCartThanDefaultDisplayLimitTest.xml index bbfa63a454c2d..09a5ce4c70373 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontCheckCartItemDisplayWhenMoreItemsAddedToTheCartThanDefaultDisplayLimitTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontCheckCartItemDisplayWhenMoreItemsAddedToTheCartThanDefaultDisplayLimitTest.xml @@ -22,7 +22,7 @@ <before> <magentoCLI command="config:set {{EnableFlatRateConfigData.path}} {{EnableFlatRateConfigData.value}}" stepKey="enableFlatRate"/> - <magentoCLI command="config:set {{EnableFlatRateDefaultPrice.path}} {{EnableFlatRateDefaultPrice.value}}" stepKey="enableFlatRateDefaultPrice"/> + <magentoCLI command="config:set {{EnableFlatRateDefaultPriceConfigData.path}} {{EnableFlatRateDefaultPriceConfigData.value}}" stepKey="enableFlatRateDefaultPrice"/> <!--Create simple product--> <createData entity="SimpleProduct2" stepKey="simpleProduct1"> <field key="price">10.00</field> diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontCheckSimpleProductCartItemDisplayWithDefaultLimitationTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontCheckSimpleProductCartItemDisplayWithDefaultLimitationTest.xml index 9d82d25184451..084c89312cc7e 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontCheckSimpleProductCartItemDisplayWithDefaultLimitationTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontCheckSimpleProductCartItemDisplayWithDefaultLimitationTest.xml @@ -19,7 +19,7 @@ <before> <magentoCLI command="config:set {{EnableFlatRateConfigData.path}} {{EnableFlatRateConfigData.value}}" stepKey="enableFlatRate"/> - <magentoCLI command="config:set {{EnableFlatRateDefaultPrice.path}} {{EnableFlatRateDefaultPrice.value}}" stepKey="enableFlatRateDefaultPrice"/> + <magentoCLI command="config:set {{EnableFlatRateDefaultPriceConfigData.path}} {{EnableFlatRateDefaultPriceConfigData.value}}" stepKey="enableFlatRateDefaultPrice"/> <!--Create simple product--> <createData entity="SimpleProduct2" stepKey="simpleProduct1"> <field key="price">10.00</field> diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontDeleteBundleProductFromMiniShoppingCartTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontDeleteBundleProductFromMiniShoppingCartTest.xml index 7990aabc60cbd..8f3ddbb27f62f 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontDeleteBundleProductFromMiniShoppingCartTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontDeleteBundleProductFromMiniShoppingCartTest.xml @@ -21,7 +21,7 @@ <before> <actionGroup ref="LoginAsAdmin" stepKey="LoginAsAdmin"/> <magentoCLI command="config:set {{EnableFlatRateConfigData.path}} {{EnableFlatRateConfigData.value}}" stepKey="enableFlatRate"/> - <magentoCLI command="config:set {{EnableFlatRateDefaultPrice.path}} {{EnableFlatRateDefaultPrice.value}}" stepKey="enableFlatRateDefaultPrice"/> + <magentoCLI command="config:set {{EnableFlatRateDefaultPriceConfigData.path}} {{EnableFlatRateDefaultPriceConfigData.value}}" stepKey="enableFlatRateDefaultPrice"/> <createData entity="SimpleSubCategory" stepKey="createSubCategory"/> <!--Create simple product--> <createData entity="SimpleProduct2" stepKey="simpleProduct1"> diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontDeleteDownloadableProductFromMiniShoppingCartTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontDeleteDownloadableProductFromMiniShoppingCartTest.xml index 04d03f34e2f1d..6a3f6ab4f7058 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontDeleteDownloadableProductFromMiniShoppingCartTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontDeleteDownloadableProductFromMiniShoppingCartTest.xml @@ -21,7 +21,7 @@ <before> <actionGroup ref="LoginAsAdmin" stepKey="LoginAsAdmin"/> <magentoCLI command="config:set {{EnableFlatRateConfigData.path}} {{EnableFlatRateConfigData.value}}" stepKey="enableFlatRate"/> - <magentoCLI command="config:set {{EnableFlatRateDefaultPrice.path}} {{EnableFlatRateDefaultPrice.value}}" stepKey="enableFlatRateDefaultPrice"/> + <magentoCLI command="config:set {{EnableFlatRateDefaultPriceConfigData.path}} {{EnableFlatRateDefaultPriceConfigData.value}}" stepKey="enableFlatRateDefaultPrice"/> <createData entity="ApiDownloadableProduct" stepKey="createDownloadableProduct"/> <createData entity="downloadableLink1" stepKey="addDownloadableLink1"> <requiredEntity createDataKey="createDownloadableProduct"/> diff --git a/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleAndVerifyRuleConditionIsNotAppliedTest.xml b/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleAndVerifyRuleConditionIsNotAppliedTest.xml index 3a48afebf5ccf..a7886222ff0f3 100644 --- a/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleAndVerifyRuleConditionIsNotAppliedTest.xml +++ b/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleAndVerifyRuleConditionIsNotAppliedTest.xml @@ -23,7 +23,7 @@ <before> <magentoCLI command="config:set {{EnableFlatRateConfigData.path}} {{EnableFlatRateConfigData.value}}" stepKey="enableFlatRate"/> - <magentoCLI command="config:set {{EnableFlatRateDefaultPrice.path}} {{EnableFlatRateDefaultPrice.value}}" stepKey="enableFlatRateDefaultPrice"/> + <magentoCLI command="config:set {{EnableFlatRateDefaultPriceConfigData.path}} {{EnableFlatRateDefaultPriceConfigData.value}}" stepKey="enableFlatRateDefaultPrice"/> <createData entity="defaultSimpleProduct" stepKey="initialSimpleProduct"/> <actionGroup ref="LoginAsAdmin" stepKey="loginAsAdmin"/> </before> From 6b594b99d0c40bfe71f699610e36418ad5c0c065 Mon Sep 17 00:00:00 2001 From: Maria Kovdrysh <kovdrysh@adobe.com> Date: Wed, 12 Jun 2019 11:58:30 -0500 Subject: [PATCH 27/36] MC-13210: Register customer with image upload --- .../Mftf/Section/AdminCustomerAccountInformationSection.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/code/Magento/Customer/Test/Mftf/Section/AdminCustomerAccountInformationSection.xml b/app/code/Magento/Customer/Test/Mftf/Section/AdminCustomerAccountInformationSection.xml index f302f70bc36b9..1de280ff4d114 100644 --- a/app/code/Magento/Customer/Test/Mftf/Section/AdminCustomerAccountInformationSection.xml +++ b/app/code/Magento/Customer/Test/Mftf/Section/AdminCustomerAccountInformationSection.xml @@ -33,6 +33,6 @@ <element name="emailRequiredMessage" type="text" selector="//input[@name='customer[email]']/../label[contains(.,'This is a required field.')]"/> <element name="customAttribute" type="select" selector="//select[contains(@name, 'customer[{{attribute_code}}]')]" parameterized="true"/> <element name="disabledGroup" type="text" selector="//div[@class='admin__action-group-wrap admin__action-multiselect-wrap action-select-wrap _disabled']"/> - <element name="attributeImage" type="image" selector="//div[contains(concat(' ',normalize-space(@class),' '),' file-uploader-preview ')]//img"/> + <element name="attributeImage" type="block" selector="//div[contains(concat(' ',normalize-space(@class),' '),' file-uploader-preview ')]//img"/> </section> </sections> From 79e48fe34ae8a4c6cae2253f7a442458df76a14b Mon Sep 17 00:00:00 2001 From: Maria Kovdrysh <kovdrysh@adobe.com> Date: Wed, 12 Jun 2019 12:06:22 -0500 Subject: [PATCH 28/36] MC-13210: Register customer with image upload Resolved conflict --- app/code/Magento/AmqpStore/LICENSE.txt | 48 ++ app/code/Magento/AmqpStore/LICENSE_AFL.txt | 48 ++ .../MassConsumerEnvelopeCallback.php | 101 ++++ .../Plugin/Framework/Amqp/Bulk/Exchange.php | 117 ++++ app/code/Magento/AmqpStore/README.md | 3 + app/code/Magento/AmqpStore/composer.json | 30 + app/code/Magento/AmqpStore/etc/di.xml | 15 + app/code/Magento/AmqpStore/etc/module.xml | 14 + app/code/Magento/AmqpStore/registration.php | 9 + .../Model/MassConsumer.php | 87 +-- .../Model/MassConsumerEnvelopeCallback.php | 137 +++++ .../FullCaptureAuthorizenetAcceptjsTest.xml | 1 + ...VirtualProductAuthorizenetAcceptjsTest.xml | 2 + app/code/Magento/Backend/Model/Url.php | 21 +- .../AdminLoginAfterJSMinificationTest.xml | 3 + .../BraintreeCreditCardOnCheckoutTest.xml | 2 + .../Mftf/Test/CaptchaFormsDisplayingTest.xml | 2 + .../Product/Helper/Form/Gallery/Content.php | 28 +- .../Catalog/Model/Category/FileInfo.php | 35 +- .../Observer/SetSpecialPriceStartDate.php | 3 +- ...lProductAttributePropertiesActionGroup.xml | 18 + ...AdminOpenAttributeSetByNameActionGroup.xml | 17 + ...minOpenAttributeSetGridPageActionGroup.xml | 14 + ...minOpenProductAttributePageActionGroup.xml | 14 + .../AdminOpenProductIndexPageActionGroup.xml | 14 + .../ActionGroup/AdminProductActionGroup.xml | 2 + ...frontCustomProductAttributeActionGroup.xml | 18 + ...ontProductPageByProductNameActionGroup.xml | 17 + ...rontAddProductToCartWithQtyActionGroup.xml | 1 + ...artCustomOptionsProductPageActionGroup.xml | 1 + ...ctSpecialPriceOnProductPageActionGroup.xml | 1 + ...ClickAddToCartOnProductPageActionGroup.xml | 1 + .../StorefrontProductPageActionGroup.xml | 2 + .../Catalog/Test/Mftf/Data/CategoryData.xml | 7 + .../Test/Mftf/Data/ProductAttributeData.xml | 23 + .../Test/Mftf/Data/WYSIWYGConfigData.xml | 23 + .../AdminCreateProductAttributeSection.xml | 2 + .../Mftf/Section/AdminProductFormSection.xml | 1 + ...torefrontProductMoreInformationSection.xml | 3 + .../AdminAddImageToWYSIWYGProductTest.xml | 3 + .../AdminAddInStockProductToTheCartTest.xml | 1 + ...inCreateTextEditorProductAttributeTest.xml | 129 ++++ ...tualProductOutOfStockWithTierPriceTest.xml | 3 + ...CustomOptionsSuiteAndImportOptionsTest.xml | 3 + ...roductWithTierPriceForGeneralGroupTest.xml | 3 + ...nCreateVirtualProductWithTierPriceTest.xml | 3 + ...teVirtualProductWithoutManageStockTest.xml | 3 + ...dPageNumberAfterSaveAndCloseActionTest.xml | 3 + ...CustomizableOptionToProductWithSKUTest.xml | 3 + ...UpdateProductAttributesGlobalScopeTest.xml | 3 + ...rifyDataOverridingOnStoreViewLevelTest.xml | 5 + ...rifyDataOverridingOnStoreViewLevelTest.xml | 4 + ...dminUpdateSimpleProductTieredPriceTest.xml | 3 + ...WithRegularPriceInStockEnabledFlatTest.xml | 3 + ...PriceInStockNotVisibleIndividuallyTest.xml | 3 + ...ceInStockVisibleInCatalogAndSearchTest.xml | 3 + ...arPriceInStockVisibleInCatalogOnlyTest.xml | 3 + ...larPriceInStockVisibleInSearchOnlyTest.xml | 3 + ...gularPriceInStockWithCustomOptionsTest.xml | 4 + ...eProductWithRegularPriceOutOfStockTest.xml | 3 + ...rPriceInStockVisibleInCategoryOnlyTest.xml | 3 + ...thCustomOptionsVisibleInSearchOnlyTest.xml | 3 + ...iceOutOfStockVisibleInCategoryOnlyTest.xml | 3 + ...eInStockVisibleInCategoryAndSearchTest.xml | 3 + ...tOfStockVisibleInCategoryAndSearchTest.xml | 3 + ...eInStockVisibleInCategoryAndSearchTest.xml | 3 + ...rPriceInStockVisibleInCategoryOnlyTest.xml | 3 + ...tOfStockVisibleInCategoryAndSearchTest.xml | 3 + .../Helper/Form/Gallery/ContentTest.php | 76 ++- .../Test/Unit/Model/Category/FileInfoTest.php | 123 ++-- .../Test/AdminExportBundleProductTest.xml | 3 + ...portGroupedProductWithSpecialPriceTest.xml | 3 + ...figurableProductsWithCustomOptionsTest.xml | 3 + ...igurableProductsWithAssignedImagesTest.xml | 3 + ...rtSimpleProductWithCustomAttributeTest.xml | 3 + .../AdminDeleteCatalogPriceRuleEntityTest.xml | 1 + ...uleForSimpleAndConfigurableProductTest.xml | 3 + ...RuleForSimpleProductAndFixedMethodTest.xml | 3 + ...orSimpleProductForNewCustomerGroupTest.xml | 3 + ...eForSimpleProductWithCustomOptionsTest.xml | 3 + .../StorefrontInactiveCatalogRuleTest.xml | 1 + ...eProductWithAssignedSimpleProductsTest.xml | 3 + ...eForConfigurableProductWithOptionsTest.xml | 3 + .../Model/Search/RequestGenerator.php | 2 +- .../Model/Search/RequestGeneratorTest.php | 5 +- .../CatalogSearch/etc/search_request.xml | 1 - .../Model/ShippingInformationManagement.php | 4 +- .../StorefrontAddToTheCartActionGroup.xml | 1 + ...ngMethodOptionPresentInCartActionGroup.xml | 20 + .../Checkout/Test/Mftf/Data/ConfigData.xml | 2 +- .../Section/CheckoutCartSummarySection.xml | 2 + .../Mftf/Test/EndToEndB2CGuestUserTest.xml | 5 + .../Mftf/Test/EndToEndB2CLoggedInUserTest.xml | 5 + ...oppingCartWithoutAnySelectedOptionTest.xml | 3 +- ...pingCartWithDisableMiniCartSidebarTest.xml | 1 + ...dConfigurableProductToShoppingCartTest.xml | 1 + ...ontAddGroupedProductToShoppingCartTest.xml | 3 + ...MultiSelectOptionToTheShoppingCartTest.xml | 3 + ...edToTheCartThanDefaultDisplayLimitTest.xml | 3 + .../Mftf/Test/StorefrontGuestCheckoutTest.xml | 3 + ...riceInShoppingCartAfterProductSaveTest.xml | 3 + .../Test/AdminAddImageToWYSIWYGBlockTest.xml | 3 + .../Test/AdminAddImageToWYSIWYGCMSTest.xml | 3 + .../AdminSaveConfigActionGroup.xml | 16 + ...onfigurableProductToTheCartActionGroup.xml | 1 + .../AdminConfigurableProductUpdateTest.xml | 3 + ...urableProductCategoryViewChildOnlyTest.xml | 3 + .../Controller/Account/CreatePassword.php | 33 +- .../Customer/Model/AccountManagement.php | 138 +++-- .../Customer/Model/CustomerAuthUpdate.php | 35 +- .../ConfirmCustomerByToken.php | 58 ++ .../GetCustomerByToken.php | 89 +++ .../Customer/Model/ResourceModel/Customer.php | 13 +- .../Mftf/Test/ChangeCustomerGroupTest.xml | 3 + .../Mftf/Test/EndToEndB2CLoggedInUserTest.xml | 3 + ...StorefrontCheckTaxAddingValidVATIdTest.xml | 4 + .../Unit/Model/CustomerAuthUpdateTest.php | 37 +- app/code/Magento/Directory/Block/Data.php | 33 +- .../Eav/Model/Validator/Attribute/Code.php | 11 + .../Model/Validator/Attribute/CodeTest.php | 5 +- .../Elasticsearch/etc/search_engine.xml | 3 + .../Elasticsearch6/etc/search_engine.xml | 12 + .../Magento/Email/Model/AbstractTemplate.php | 24 +- .../Test/Unit/Model/BackendTemplateTest.php | 23 +- app/code/Magento/Email/composer.json | 1 + .../AdminCheckDoubleImportOfProductsTest.xml | 73 +++ .../Newsletter/Block/Adminhtml/Problem.php | 6 +- .../Adminhtml/Subscriber/MassDelete.php | 15 +- .../Newsletter/Controller/Manage/Save.php | 11 +- .../Controller/Subscriber/Confirm.php | 1 + .../Magento/Newsletter/Model/Subscriber.php | 12 +- .../AdminAddImageToWYSIWYGNewsletterTest.xml | 3 + .../AdminAddWidgetToWYSIWYGNewsletterTest.xml | 3 + app/code/Magento/Paypal/Model/Cart.php | 3 +- .../Paypal/Model/Payflow/Transparent.php | 31 +- .../Paypal/Test/Unit/Model/CartTest.php | 15 +- .../Unit/Model/Payflow/TransparentTest.php | 566 +++++++----------- .../ResourceModel/Product/Sold/Collection.php | 10 +- .../CancelOrdersInOrderSalesReportTest.xml | 3 + .../Review/Block/Adminhtml/Edit/Form.php | 17 +- .../Controller/Adminhtml/Product/Save.php | 4 + .../view/frontend/web/js/process-reviews.js | 23 +- .../Adminhtml/Order/Create/Form/Address.php | 12 +- .../ActionGroup/AdminOrderActionGroup.xml | 1 + ...reateCreditMemoBankTransferPaymentTest.xml | 3 + ...reateCreditMemoConfigurableProductTest.xml | 3 + ...AdminCreateCreditMemoPartialRefundTest.xml | 3 + ...CreateCreditMemoWithCashOnDeliveryTest.xml | 3 + ...nCreateCreditMemoWithPurchaseOrderTest.xml | 3 + ...nMassOrdersCancelCompleteAndClosedTest.xml | 5 +- ...assOrdersCancelProcessingAndClosedTest.xml | 3 + .../AdminMassOrdersHoldOnCompleteTest.xml | 3 + ...ssOrdersHoldOnPendingAndProcessingTest.xml | 3 + ...AdminMassOrdersReleasePendingOrderTest.xml | 3 + ...MassOrdersUpdateCancelPendingOrderTest.xml | 3 + .../AdminOrdersReleaseInUnholdStatusTest.xml | 3 + .../Test/AdminReorderWithCatalogPriceTest.xml | 3 + ...dminSaveInAddressBookCheckboxStateTest.xml | 1 + ...mOrderStatusNotVisibleOnStorefrontTest.xml | 3 + ...stomOrderStatusVisibleOnStorefrontTest.xml | 3 + ...astOrderedSimpleProductOnOrderPageTest.xml | 3 + .../Order/Create/Form/AddressTest.php | 263 ++++++++ .../templates/order/create/form/address.phtml | 2 +- .../adminhtml/web/order/create/scripts.js | 3 + .../ApplyCartRuleOnStorefrontActionGroup.xml | 2 + .../StorefrontAddToTheCartActionGroup.xml | 1 + .../StorefrontSalesRuleActionGroup.xml | 1 + ...inCartRulesAppliedForProductInCartTest.xml | 3 + ...eConditionAndFreeShippingIsAppliedTest.xml | 3 + ...AndVerifyRuleConditionIsNotAppliedTest.xml | 3 + ...inCreateCartPriceRuleEmptyFromDateTest.xml | 1 + ...inCreateCartPriceRuleForCouponCodeTest.xml | 1 + ...ateCartPriceRuleForGeneratedCouponTest.xml | 1 + ...talAndVerifyRuleConditionIsAppliedTest.xml | 3 + ...oryAndVerifyRuleConditionIsAppliedTest.xml | 3 + ...ghtAndVerifyRuleConditionIsAppliedTest.xml | 3 + ...exConditionsAndVerifyDeleteMessageTest.xml | 3 + ...artPriceRuleForConfigurableProductTest.xml | 2 + .../Mftf/Test/EndToEndB2CGuestUserTest.xml | 5 + .../Mftf/Test/EndToEndB2CLoggedInUserTest.xml | 5 + .../Test/StorefrontCartPriceRuleCountry.xml | 1 + .../Test/StorefrontCartPriceRulePostcode.xml | 1 + .../Test/StorefrontCartPriceRuleQuantity.xml | 2 + .../Test/StorefrontCartPriceRuleState.xml | 1 + .../Test/StorefrontCartPriceRuleSubtotal.xml | 2 + .../Mftf/Section/AdminGlobalSearchSection.xml | 15 + .../AdminGlobalSearchOnProductPageTest.xml | 65 ++ .../Magento/SendFriend/Controller/Product.php | 3 +- ...leRatesShippingMethodStatusActionGroup.xml | 20 + .../Data/TableRatesShippingMethodData.xml | 19 + .../AdminShippingMethodTableRatesSection.xml | 18 + ...esShippingMethodForDifferentStatesTest.xml | 114 ++++ .../Store/Test/Mftf/Data/StoreData.xml | 10 + .../Block/Product/Renderer/Configurable.php | 18 +- .../StorefrontFilterByImageSwatchTest.xml | 3 + .../view/frontend/web/js/swatch-renderer.js | 8 +- ...AdminUpdateTaxRuleWithFixedZipUtahTest.xml | 3 + .../Mftf/Test/CheckCreditMemoTotalsTest.xml | 3 + .../Mftf/Test/StorefrontTaxQuoteCartTest.xml | 3 + .../Magento/Ui/view/base/web/js/form/form.js | 1 + ...SeveralWebsitesAndCheckURLRewritesTest.xml | 3 + .../Webapi/Model/Rest/Swagger/Generator.php | 48 +- .../Unit/Model/Rest/Swagger/GeneratorTest.php | 4 +- composer.json | 1 + composer.lock | 4 +- .../tests/_data/prepared-for-sample-data.csv | 499 +++++++++++++++ .../tests/_data/table_rate_30895.csv | 3 + .../Model/AsyncScheduleMultiStoreTest.php | 373 ++++++++++++ .../Magento/Catalog/Model/Product/UrlTest.php | 40 ++ .../Search/AttributeSearchWeightTest.php | 179 ++++++ .../products_for_sku_search_weight_score.php | 54 ++ .../ShippingInformationManagementTest.php | 142 +++++ .../Customer/Controller/AccountTest.php | 158 +++-- .../CollectionReindexOnAccountLockTest.php | 89 +++ .../Order/Create/Form/AddressTest.php | 8 + .../SendFriend/Controller/SendmailTest.php | 26 + .../Framework/App/Cache/FlushCacheByTags.php | 63 +- .../Test/Unit/Cache/FlushCacheByTagsTest.php | 63 +- lib/web/css/docs/source/_icons.less | 2 +- lib/web/mage/menu.js | 2 +- 220 files changed, 4422 insertions(+), 772 deletions(-) create mode 100644 app/code/Magento/AmqpStore/LICENSE.txt create mode 100644 app/code/Magento/AmqpStore/LICENSE_AFL.txt create mode 100644 app/code/Magento/AmqpStore/Plugin/AsynchronousOperations/MassConsumerEnvelopeCallback.php create mode 100644 app/code/Magento/AmqpStore/Plugin/Framework/Amqp/Bulk/Exchange.php create mode 100644 app/code/Magento/AmqpStore/README.md create mode 100644 app/code/Magento/AmqpStore/composer.json create mode 100644 app/code/Magento/AmqpStore/etc/di.xml create mode 100644 app/code/Magento/AmqpStore/etc/module.xml create mode 100644 app/code/Magento/AmqpStore/registration.php create mode 100644 app/code/Magento/AsynchronousOperations/Model/MassConsumerEnvelopeCallback.php create mode 100644 app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminFillProductAttributePropertiesActionGroup.xml create mode 100644 app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminOpenAttributeSetByNameActionGroup.xml create mode 100644 app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminOpenAttributeSetGridPageActionGroup.xml create mode 100644 app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminOpenProductAttributePageActionGroup.xml create mode 100644 app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminOpenProductIndexPageActionGroup.xml create mode 100644 app/code/Magento/Catalog/Test/Mftf/ActionGroup/AssertStorefrontCustomProductAttributeActionGroup.xml create mode 100644 app/code/Magento/Catalog/Test/Mftf/ActionGroup/OpenStorefrontProductPageByProductNameActionGroup.xml create mode 100644 app/code/Magento/Catalog/Test/Mftf/Data/WYSIWYGConfigData.xml create mode 100644 app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateTextEditorProductAttributeTest.xml create mode 100644 app/code/Magento/Checkout/Test/Mftf/ActionGroup/StorefrontAssertShippingMethodOptionPresentInCartActionGroup.xml create mode 100644 app/code/Magento/Config/Test/Mftf/ActionGroup/AdminSaveConfigActionGroup.xml create mode 100644 app/code/Magento/Customer/Model/ForgotPasswordToken/ConfirmCustomerByToken.php create mode 100644 app/code/Magento/Customer/Model/ForgotPasswordToken/GetCustomerByToken.php create mode 100644 app/code/Magento/Elasticsearch6/etc/search_engine.xml create mode 100644 app/code/Magento/ImportExport/Test/Mftf/Test/AdminCheckDoubleImportOfProductsTest.xml create mode 100644 app/code/Magento/Sales/Test/Unit/Block/Adminhtml/Order/Create/Form/AddressTest.php create mode 100644 app/code/Magento/Search/Test/Mftf/Section/AdminGlobalSearchSection.xml create mode 100644 app/code/Magento/Search/Test/Mftf/Test/AdminGlobalSearchOnProductPageTest.xml create mode 100644 app/code/Magento/Shipping/Test/Mftf/ActionGroup/AdminChangeTableRatesShippingMethodStatusActionGroup.xml create mode 100644 app/code/Magento/Shipping/Test/Mftf/Data/TableRatesShippingMethodData.xml create mode 100644 app/code/Magento/Shipping/Test/Mftf/Section/AdminShippingMethodTableRatesSection.xml create mode 100644 app/code/Magento/Shipping/Test/Mftf/Test/TableRatesShippingMethodForDifferentStatesTest.xml create mode 100644 dev/tests/acceptance/tests/_data/prepared-for-sample-data.csv create mode 100644 dev/tests/acceptance/tests/_data/table_rate_30895.csv create mode 100644 dev/tests/api-functional/testsuite/Magento/WebapiAsync/Model/AsyncScheduleMultiStoreTest.php create mode 100644 dev/tests/integration/testsuite/Magento/CatalogSearch/Model/Search/AttributeSearchWeightTest.php create mode 100644 dev/tests/integration/testsuite/Magento/CatalogSearch/_files/products_for_sku_search_weight_score.php create mode 100644 dev/tests/integration/testsuite/Magento/Checkout/Model/ShippingInformationManagementTest.php create mode 100644 dev/tests/integration/testsuite/Magento/Customer/Model/ResourceModel/Grid/CollectionReindexOnAccountLockTest.php diff --git a/app/code/Magento/AmqpStore/LICENSE.txt b/app/code/Magento/AmqpStore/LICENSE.txt new file mode 100644 index 0000000000000..49525fd99da9c --- /dev/null +++ b/app/code/Magento/AmqpStore/LICENSE.txt @@ -0,0 +1,48 @@ + +Open Software License ("OSL") v. 3.0 + +This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work: + +Licensed under the Open Software License version 3.0 + + 1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following: + + 1. to reproduce the Original Work in copies, either alone or as part of a collective work; + + 2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work; + + 3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License; + + 4. to perform the Original Work publicly; and + + 5. to display the Original Work publicly. + + 2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works. + + 3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work. + + 4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license. + + 5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c). + + 6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work. + + 7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer. + + 8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation. + + 9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c). + + 10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware. + + 11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License. + + 12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License. + + 13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. + + 14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + 15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You. + + 16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process. \ No newline at end of file diff --git a/app/code/Magento/AmqpStore/LICENSE_AFL.txt b/app/code/Magento/AmqpStore/LICENSE_AFL.txt new file mode 100644 index 0000000000000..f39d641b18a19 --- /dev/null +++ b/app/code/Magento/AmqpStore/LICENSE_AFL.txt @@ -0,0 +1,48 @@ + +Academic Free License ("AFL") v. 3.0 + +This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work: + +Licensed under the Academic Free License version 3.0 + + 1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following: + + 1. to reproduce the Original Work in copies, either alone or as part of a collective work; + + 2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work; + + 3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License; + + 4. to perform the Original Work publicly; and + + 5. to display the Original Work publicly. + + 2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works. + + 3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work. + + 4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license. + + 5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c). + + 6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work. + + 7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer. + + 8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation. + + 9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c). + + 10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware. + + 11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License. + + 12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License. + + 13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. + + 14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + 15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You. + + 16. Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process. diff --git a/app/code/Magento/AmqpStore/Plugin/AsynchronousOperations/MassConsumerEnvelopeCallback.php b/app/code/Magento/AmqpStore/Plugin/AsynchronousOperations/MassConsumerEnvelopeCallback.php new file mode 100644 index 0000000000000..e05004cea78cd --- /dev/null +++ b/app/code/Magento/AmqpStore/Plugin/AsynchronousOperations/MassConsumerEnvelopeCallback.php @@ -0,0 +1,101 @@ +<?php +/** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +declare(strict_types=1); + +namespace Magento\AmqpStore\Plugin\AsynchronousOperations; + +use Magento\Framework\Exception\NoSuchEntityException; +use Magento\Store\Model\StoreManagerInterface; +use Magento\Framework\MessageQueue\EnvelopeFactory; +use PhpAmqpLib\Wire\AMQPTable; +use Magento\Framework\MessageQueue\EnvelopeInterface; +use Magento\AsynchronousOperations\Model\MassConsumerEnvelopeCallback as SubjectMassConsumerEnvelopeCallback; +use Psr\Log\LoggerInterface; + +/** + * Plugin to get 'store_id' from the new custom header 'store_id' in amqp + * 'application_headers' properties and setCurrentStore by value 'store_id'. + */ +class MassConsumerEnvelopeCallback +{ + /** + * @var StoreManagerInterface + */ + private $storeManager; + + /** + * @var EnvelopeFactory + */ + private $envelopeFactory; + + /** + * @var LoggerInterface + */ + private $logger; + + /** + * @param EnvelopeFactory $envelopeFactory + * @param StoreManagerInterface $storeManager + * @param LoggerInterface $logger + */ + public function __construct( + EnvelopeFactory $envelopeFactory, + StoreManagerInterface $storeManager, + LoggerInterface $logger + ) { + $this->storeManager = $storeManager; + $this->envelopeFactory = $envelopeFactory; + $this->logger = $logger; + } + + /** + * Check if amqpProperties['application_headers'] have 'store_id' and use it to setCurrentStore + * Restore original store value in consumer process after execution. + * Reject queue messages because of wrong store_id. + * + * @param SubjectMassConsumerEnvelopeCallback $subject + * @param callable $proceed + * @param EnvelopeInterface $message + * @return void + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + public function aroundExecute( + SubjectMassConsumerEnvelopeCallback $subject, + callable $proceed, + EnvelopeInterface $message + ) { + $amqpProperties = $message->getProperties(); + if (isset($amqpProperties['application_headers'])) { + $headers = $amqpProperties['application_headers']; + if ($headers instanceof AMQPTable) { + $headers = $headers->getNativeData(); + } + if (isset($headers['store_id'])) { + $storeId = $headers['store_id']; + try { + $currentStoreId = $this->storeManager->getStore()->getId(); + } catch (NoSuchEntityException $e) { + $this->logger->error( + sprintf( + "Can't set currentStoreId during processing queue. Message rejected. Error %s.", + $e->getMessage() + ) + ); + $subject->getQueue()->reject($message, false, $e->getMessage()); + return; + } + if (isset($storeId) && $storeId !== $currentStoreId) { + $this->storeManager->setCurrentStore($storeId); + } + } + } + $proceed($message); + if (isset($storeId, $currentStoreId) && $storeId !== $currentStoreId) { + $this->storeManager->setCurrentStore($currentStoreId);//restore original store value + } + } +} diff --git a/app/code/Magento/AmqpStore/Plugin/Framework/Amqp/Bulk/Exchange.php b/app/code/Magento/AmqpStore/Plugin/Framework/Amqp/Bulk/Exchange.php new file mode 100644 index 0000000000000..c5db1f5300c29 --- /dev/null +++ b/app/code/Magento/AmqpStore/Plugin/Framework/Amqp/Bulk/Exchange.php @@ -0,0 +1,117 @@ +<?php +/** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +declare(strict_types=1); + +namespace Magento\AmqpStore\Plugin\Framework\Amqp\Bulk; + +use Magento\Framework\Exception\NoSuchEntityException; +use Magento\Store\Model\StoreManagerInterface; +use Magento\Framework\MessageQueue\EnvelopeFactory; +use PhpAmqpLib\Exception\AMQPInvalidArgumentException; +use PhpAmqpLib\Wire\AMQPTable; +use Magento\Framework\Amqp\Bulk\Exchange as SubjectExchange; +use Magento\Framework\MessageQueue\EnvelopeInterface; +use Psr\Log\LoggerInterface; + +/** + * Plugin to set 'store_id' to the new custom header 'store_id' in amqp + * 'application_headers'. + */ +class Exchange +{ + /** + * @var StoreManagerInterface + */ + private $storeManager; + + /** + * @var EnvelopeFactory + */ + private $envelopeFactory; + + /** + * @var LoggerInterface + */ + private $logger; + + /** + * Exchange constructor. + * @param EnvelopeFactory $envelopeFactory + * @param StoreManagerInterface $storeManager + * @param LoggerInterface $logger + */ + public function __construct( + EnvelopeFactory $envelopeFactory, + StoreManagerInterface $storeManager, + LoggerInterface $logger + ) { + $this->storeManager = $storeManager; + $this->envelopeFactory = $envelopeFactory; + $this->logger = $logger; + } + + /** + * Set current store_id in amqpProperties['application_headers'] + * so consumer may check store_id and execute operation in correct store scope. + * Prevent publishing inconsistent messages because of store_id not defined or wrong. + * + * @param SubjectExchange $subject + * @param string $topic + * @param EnvelopeInterface[] $envelopes + * @return array + * @throws AMQPInvalidArgumentException + * @throws \LogicException + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + public function beforeEnqueue(SubjectExchange $subject, $topic, array $envelopes) + { + try { + $storeId = $this->storeManager->getStore()->getId(); + } catch (NoSuchEntityException $e) { + $errorMessage = sprintf( + "Can't get current storeId and inject to amqp message. Error %s.", + $e->getMessage() + ); + $this->logger->error($errorMessage); + throw new \LogicException($errorMessage); + } + + $updatedEnvelopes = []; + foreach ($envelopes as $envelope) { + $properties = $envelope->getProperties(); + if (!isset($properties)) { + $properties = []; + } + if (isset($properties['application_headers'])) { + $headers = $properties['application_headers']; + if ($headers instanceof AMQPTable) { + try { + $headers->set('store_id', $storeId); + // phpcs:ignore Magento2.Exceptions.ThrowCatch + } catch (AMQPInvalidArgumentException $ea) { + $errorMessage = sprintf("Can't set storeId to amqp message. Error %s.", $ea->getMessage()); + $this->logger->error($errorMessage); + throw new AMQPInvalidArgumentException($errorMessage); + } + $properties['application_headers'] = $headers; + } + } else { + $properties['application_headers'] = new AMQPTable(['store_id' => $storeId]); + } + $updatedEnvelopes[] = $this->envelopeFactory->create( + [ + 'body' => $envelope->getBody(), + 'properties' => $properties + ] + ); + } + if (!empty($updatedEnvelopes)) { + $envelopes = $updatedEnvelopes; + } + return [$topic, $envelopes]; + } +} diff --git a/app/code/Magento/AmqpStore/README.md b/app/code/Magento/AmqpStore/README.md new file mode 100644 index 0000000000000..0f84c8ff3276e --- /dev/null +++ b/app/code/Magento/AmqpStore/README.md @@ -0,0 +1,3 @@ +# Amqp Store + +**AmqpStore** provides ability to specify store before publish messages with Amqp. diff --git a/app/code/Magento/AmqpStore/composer.json b/app/code/Magento/AmqpStore/composer.json new file mode 100644 index 0000000000000..bd11527bbb36e --- /dev/null +++ b/app/code/Magento/AmqpStore/composer.json @@ -0,0 +1,30 @@ +{ + "name": "magento/module-amqp-store", + "description": "N/A", + "config": { + "sort-packages": true + }, + "require": { + "magento/framework": "*", + "magento/framework-amqp": "*", + "magento/module-store": "*", + "php": "~7.1.3||~7.2.0" + }, + "suggest": { + "magento/module-asynchronous-operations": "*", + "magento/framework-message-queue": "*" + }, + "type": "magento2-module", + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\AmqpStore\\": "" + } + } +} diff --git a/app/code/Magento/AmqpStore/etc/di.xml b/app/code/Magento/AmqpStore/etc/di.xml new file mode 100644 index 0000000000000..3bbbebd249535 --- /dev/null +++ b/app/code/Magento/AmqpStore/etc/di.xml @@ -0,0 +1,15 @@ +<?xml version="1.0"?> +<!-- +/** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> + <type name="Magento\Framework\Amqp\Bulk\Exchange"> + <plugin name="amqpStoreIdFieldForAmqpBulkExchange" type="Magento\AmqpStore\Plugin\Framework\Amqp\Bulk\Exchange"/> + </type> + <type name="Magento\AsynchronousOperations\Model\MassConsumerEnvelopeCallback"> + <plugin name="amqpStoreIdFieldForAsynchronousOperationsMassConsumerEnvelopeCallback" type="Magento\AmqpStore\Plugin\AsynchronousOperations\MassConsumerEnvelopeCallback"/> + </type> +</config> diff --git a/app/code/Magento/AmqpStore/etc/module.xml b/app/code/Magento/AmqpStore/etc/module.xml new file mode 100644 index 0000000000000..085b97b5e2f96 --- /dev/null +++ b/app/code/Magento/AmqpStore/etc/module.xml @@ -0,0 +1,14 @@ +<?xml version="1.0"?> +<!-- +/** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> + <module name="Magento_AmqpStore"> + <sequence> + <module name="Magento_Store"/> + </sequence> + </module> +</config> diff --git a/app/code/Magento/AmqpStore/registration.php b/app/code/Magento/AmqpStore/registration.php new file mode 100644 index 0000000000000..4922879bfbf16 --- /dev/null +++ b/app/code/Magento/AmqpStore/registration.php @@ -0,0 +1,9 @@ +<?php +/** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +use \Magento\Framework\Component\ComponentRegistrar; + +ComponentRegistrar::register(ComponentRegistrar::MODULE, 'Magento_AmqpStore', __DIR__); diff --git a/app/code/Magento/AsynchronousOperations/Model/MassConsumer.php b/app/code/Magento/AsynchronousOperations/Model/MassConsumer.php index af1ef4400e442..e3ba8b0681971 100644 --- a/app/code/Magento/AsynchronousOperations/Model/MassConsumer.php +++ b/app/code/Magento/AsynchronousOperations/Model/MassConsumer.php @@ -8,18 +8,11 @@ namespace Magento\AsynchronousOperations\Model; -use Magento\Framework\App\ResourceConnection; use Magento\Framework\Registry; -use Psr\Log\LoggerInterface; -use Magento\Framework\MessageQueue\MessageLockException; -use Magento\Framework\MessageQueue\ConnectionLostException; -use Magento\Framework\Exception\NotFoundException; use Magento\Framework\MessageQueue\CallbackInvokerInterface; use Magento\Framework\MessageQueue\ConsumerConfigurationInterface; use Magento\Framework\MessageQueue\EnvelopeInterface; use Magento\Framework\MessageQueue\QueueInterface; -use Magento\Framework\MessageQueue\LockInterface; -use Magento\Framework\MessageQueue\MessageController; use Magento\Framework\MessageQueue\ConsumerInterface; /** @@ -34,64 +27,38 @@ class MassConsumer implements ConsumerInterface */ private $invoker; - /** - * @var \Magento\Framework\App\ResourceConnection - */ - private $resource; - /** * @var \Magento\Framework\MessageQueue\ConsumerConfigurationInterface */ private $configuration; /** - * @var \Magento\Framework\MessageQueue\MessageController - */ - private $messageController; - - /** - * @var LoggerInterface - */ - private $logger; - - /** - * @var OperationProcessor + * @var Registry */ - private $operationProcessor; + private $registry; /** - * @var Registry + * @var MassConsumerEnvelopeCallbackFactory */ - private $registry; + private $massConsumerEnvelopeCallback; /** * Initialize dependencies. * * @param CallbackInvokerInterface $invoker - * @param ResourceConnection $resource - * @param MessageController $messageController * @param ConsumerConfigurationInterface $configuration - * @param OperationProcessorFactory $operationProcessorFactory - * @param LoggerInterface $logger + * @param MassConsumerEnvelopeCallbackFactory $massConsumerEnvelopeCallback * @param Registry $registry */ public function __construct( CallbackInvokerInterface $invoker, - ResourceConnection $resource, - MessageController $messageController, ConsumerConfigurationInterface $configuration, - OperationProcessorFactory $operationProcessorFactory, - LoggerInterface $logger, + MassConsumerEnvelopeCallbackFactory $massConsumerEnvelopeCallback, Registry $registry = null ) { $this->invoker = $invoker; - $this->resource = $resource; - $this->messageController = $messageController; $this->configuration = $configuration; - $this->operationProcessor = $operationProcessorFactory->create([ - 'configuration' => $configuration - ]); - $this->logger = $logger; + $this->massConsumerEnvelopeCallback = $massConsumerEnvelopeCallback; $this->registry = $registry ?? \Magento\Framework\App\ObjectManager::getInstance() ->get(Registry::class); } @@ -122,38 +89,14 @@ public function process($maxNumberOfMessages = null) */ private function getTransactionCallback(QueueInterface $queue) { - return function (EnvelopeInterface $message) use ($queue) { - /** @var LockInterface $lock */ - $lock = null; - try { - $topicName = $message->getProperties()['topic_name']; - $lock = $this->messageController->lock($message, $this->configuration->getConsumerName()); - - $allowedTopics = $this->configuration->getTopicNames(); - if (in_array($topicName, $allowedTopics)) { - $this->operationProcessor->process($message->getBody()); - } else { - $queue->reject($message); - return; - } - $queue->acknowledge($message); - } catch (MessageLockException $exception) { - $queue->acknowledge($message); - } catch (ConnectionLostException $e) { - if ($lock) { - $this->resource->getConnection() - ->delete($this->resource->getTableName('queue_lock'), ['id = ?' => $lock->getId()]); - } - } catch (NotFoundException $e) { - $queue->acknowledge($message); - $this->logger->warning($e->getMessage()); - } catch (\Exception $e) { - $queue->reject($message, false, $e->getMessage()); - if ($lock) { - $this->resource->getConnection() - ->delete($this->resource->getTableName('queue_lock'), ['id = ?' => $lock->getId()]); - } - } + $callbackInstance = $this->massConsumerEnvelopeCallback->create( + [ + 'configuration' => $this->configuration, + 'queue' => $queue, + ] + ); + return function (EnvelopeInterface $message) use ($callbackInstance) { + $callbackInstance->execute($message); }; } } diff --git a/app/code/Magento/AsynchronousOperations/Model/MassConsumerEnvelopeCallback.php b/app/code/Magento/AsynchronousOperations/Model/MassConsumerEnvelopeCallback.php new file mode 100644 index 0000000000000..42437292e6f00 --- /dev/null +++ b/app/code/Magento/AsynchronousOperations/Model/MassConsumerEnvelopeCallback.php @@ -0,0 +1,137 @@ +<?php +/** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +declare(strict_types=1); + +namespace Magento\AsynchronousOperations\Model; + +use Magento\Framework\App\ResourceConnection; +use Psr\Log\LoggerInterface; +use Magento\Framework\MessageQueue\MessageLockException; +use Magento\Framework\MessageQueue\ConnectionLostException; +use Magento\Framework\Exception\NotFoundException; +use Magento\Framework\MessageQueue\ConsumerConfigurationInterface; +use Magento\Framework\MessageQueue\EnvelopeInterface; +use Magento\Framework\MessageQueue\QueueInterface; +use Magento\Framework\MessageQueue\LockInterface; +use Magento\Framework\MessageQueue\MessageController; + +/** + * Class used as public callback function by async consumer. + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ +class MassConsumerEnvelopeCallback +{ + /** + * @var QueueInterface + */ + private $queue; + + /** + * @var ResourceConnection + */ + private $resource; + + /** + * @var ConsumerConfigurationInterface + */ + private $configuration; + + /** + * @var MessageController + */ + private $messageController; + + /** + * @var LoggerInterface + */ + private $logger; + + /** + * @var OperationProcessor + */ + private $operationProcessor; + + /** + * @param ResourceConnection $resource + * @param MessageController $messageController + * @param ConsumerConfigurationInterface $configuration + * @param OperationProcessorFactory $operationProcessorFactory + * @param LoggerInterface $logger + * @param QueueInterface $queue + */ + public function __construct( + ResourceConnection $resource, + MessageController $messageController, + ConsumerConfigurationInterface $configuration, + OperationProcessorFactory $operationProcessorFactory, + LoggerInterface $logger, + QueueInterface $queue + ) { + $this->resource = $resource; + $this->messageController = $messageController; + $this->configuration = $configuration; + $this->operationProcessor = $operationProcessorFactory->create( + [ + 'configuration' => $configuration + ] + ); + $this->logger = $logger; + $this->queue = $queue; + } + + /** + * Get transaction callback. This handles the case of async. + * + * @param EnvelopeInterface $message + * @return void + */ + public function execute(EnvelopeInterface $message) + { + $queue = $this->queue; + /** @var LockInterface $lock */ + $lock = null; + try { + $topicName = $message->getProperties()['topic_name']; + $lock = $this->messageController->lock($message, $this->configuration->getConsumerName()); + + $allowedTopics = $this->configuration->getTopicNames(); + if (in_array($topicName, $allowedTopics)) { + $this->operationProcessor->process($message->getBody()); + } else { + $queue->reject($message); + return; + } + $queue->acknowledge($message); + } catch (MessageLockException $exception) { + $queue->acknowledge($message); + } catch (ConnectionLostException $e) { + if ($lock) { + $this->resource->getConnection() + ->delete($this->resource->getTableName('queue_lock'), ['id = ?' => $lock->getId()]); + } + } catch (NotFoundException $e) { + $queue->acknowledge($message); + $this->logger->warning($e->getMessage()); + } catch (\Exception $e) { + $queue->reject($message, false, $e->getMessage()); + if ($lock) { + $this->resource->getConnection() + ->delete($this->resource->getTableName('queue_lock'), ['id = ?' => $lock->getId()]); + } + } + } + + /** + * Get message queue. + * + * @return QueueInterface + */ + public function getQueue() + { + return $this->queue; + } +} diff --git a/app/code/Magento/AuthorizenetAcceptjs/Test/Mftf/Test/FullCaptureAuthorizenetAcceptjsTest.xml b/app/code/Magento/AuthorizenetAcceptjs/Test/Mftf/Test/FullCaptureAuthorizenetAcceptjsTest.xml index 42a78291436ed..6aa6792e0e0d4 100644 --- a/app/code/Magento/AuthorizenetAcceptjs/Test/Mftf/Test/FullCaptureAuthorizenetAcceptjsTest.xml +++ b/app/code/Magento/AuthorizenetAcceptjs/Test/Mftf/Test/FullCaptureAuthorizenetAcceptjsTest.xml @@ -54,6 +54,7 @@ <waitForPageLoad stepKey="waitForProductPage"/> <click selector="{{StorefrontProductActionSection.addToCart}}" stepKey="addProductToCart"/> <waitForPageLoad stepKey="waitForCartToFill"/> + <waitForElementVisible selector="{{StorefrontMessagesSection.success}}" stepKey="waitForSuccessMessage"/> <!--Checkout steps--> <actionGroup ref="GoToCheckoutFromMinicartActionGroup" stepKey="GoToCheckoutFromMinicartActionGroup"/> diff --git a/app/code/Magento/AuthorizenetAcceptjs/Test/Mftf/Test/GuestCheckoutVirtualProductAuthorizenetAcceptjsTest.xml b/app/code/Magento/AuthorizenetAcceptjs/Test/Mftf/Test/GuestCheckoutVirtualProductAuthorizenetAcceptjsTest.xml index 95c2436905212..6f71bd180766f 100644 --- a/app/code/Magento/AuthorizenetAcceptjs/Test/Mftf/Test/GuestCheckoutVirtualProductAuthorizenetAcceptjsTest.xml +++ b/app/code/Magento/AuthorizenetAcceptjs/Test/Mftf/Test/GuestCheckoutVirtualProductAuthorizenetAcceptjsTest.xml @@ -55,8 +55,10 @@ <waitForPageLoad stepKey="waitForProductPage"/> <click selector="{{StorefrontProductActionSection.addToCart}}" stepKey="addProductToCart"/> <waitForPageLoad stepKey="waitForCartToFill"/> + <waitForElementVisible selector="{{StorefrontMessagesSection.success}}" stepKey="waitForSuccessMessage"/> <click selector="{{StorefrontProductActionSection.addToCart}}" stepKey="addProductToCartAgain"/> <waitForPageLoad stepKey="waitForCartToFillAgain"/> + <waitForElementVisible selector="{{StorefrontMessagesSection.success}}" stepKey="waitForSuccessMessage2"/> <!--Checkout steps--> <actionGroup ref="GoToCheckoutFromMinicartActionGroup" stepKey="GoToCheckoutFromMinicartActionGroup"/> diff --git a/app/code/Magento/Backend/Model/Url.php b/app/code/Magento/Backend/Model/Url.php index f199fd0fe7bf1..ba0c3d1cfacee 100644 --- a/app/code/Magento/Backend/Model/Url.php +++ b/app/code/Magento/Backend/Model/Url.php @@ -13,6 +13,7 @@ * Class \Magento\Backend\Model\UrlInterface * * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + * @SuppressWarnings(PHPMD.CookieAndSessionMisuse) * @api * @since 100.0.2 */ @@ -366,6 +367,19 @@ protected function _getMenu() return $this->_menu; } + /** + * Set scope entity + * + * @param mixed $scopeId + * @return \Magento\Framework\UrlInterface + */ + public function setScope($scopeId) + { + parent::setScope($scopeId); + $this->_scope = $this->_scopeResolver->getScope($scopeId); + return $this; + } + /** * Set custom auth session * @@ -402,13 +416,13 @@ public function getAreaFrontName() } /** - * Retrieve action path. - * Add backend area front name as a prefix to action path + * Retrieve action path, add backend area front name as a prefix to action path * * @return string */ protected function _getActionPath() { + $path = parent::_getActionPath(); if ($path) { if ($this->getAreaFrontName()) { @@ -448,8 +462,7 @@ protected function _getConfigCacheId($path) } /** - * Get config data by path - * Use only global config values for backend + * Get config data by path, use only global config values for backend * * @param string $path * @return null|string diff --git a/app/code/Magento/Backend/Test/Mftf/Test/AdminLoginAfterJSMinificationTest.xml b/app/code/Magento/Backend/Test/Mftf/Test/AdminLoginAfterJSMinificationTest.xml index d3b2916ee5825..38749dfd792ca 100644 --- a/app/code/Magento/Backend/Test/Mftf/Test/AdminLoginAfterJSMinificationTest.xml +++ b/app/code/Magento/Backend/Test/Mftf/Test/AdminLoginAfterJSMinificationTest.xml @@ -18,6 +18,9 @@ <severity value="MAJOR"/> <group value="backend"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-17140"/> + </skip> </annotations> <before> <magentoCLI command="config:set {{MinifyJavaScriptFilesEnableConfigData.path}} {{MinifyJavaScriptFilesEnableConfigData.value}}" stepKey="enableJsMinification"/> diff --git a/app/code/Magento/Braintree/Test/Mftf/Test/BraintreeCreditCardOnCheckoutTest.xml b/app/code/Magento/Braintree/Test/Mftf/Test/BraintreeCreditCardOnCheckoutTest.xml index a781841e0a77b..ac653638b53a0 100644 --- a/app/code/Magento/Braintree/Test/Mftf/Test/BraintreeCreditCardOnCheckoutTest.xml +++ b/app/code/Magento/Braintree/Test/Mftf/Test/BraintreeCreditCardOnCheckoutTest.xml @@ -49,6 +49,7 @@ <waitForPageLoad stepKey="waitForPageLoad"/> <click selector="{{StorefrontProductActionSection.addToCart}}" stepKey="addProductToCart"/> <waitForPageLoad stepKey="waitForPageLoad1"/> + <waitForElementVisible selector="{{StorefrontMessagesSection.success}}" stepKey="waitForSuccessMessage"/> <!--Proceed to checkout--> <actionGroup ref="GoToCheckoutFromMinicartActionGroup" stepKey="GoToCheckoutFromMinicartActionGroup"/> @@ -74,6 +75,7 @@ <waitForPageLoad stepKey="waitForPageLoad6"/> <click selector="{{StorefrontProductActionSection.addToCart}}" stepKey="addProductToCart1"/> <waitForPageLoad stepKey="waitForPageLoad7"/> + <waitForElementVisible selector="{{StorefrontMessagesSection.success}}" stepKey="waitForSuccessMessage2"/> <!--Proceed to checkout--> <actionGroup ref="GoToCheckoutFromMinicartActionGroup" stepKey="GoToCheckoutFromMinicartActionGroup1"/> <click selector="{{CheckoutPaymentSection.addressAction('New Address')}}" stepKey="clickOnNewAddress"/> diff --git a/app/code/Magento/Captcha/Test/Mftf/Test/CaptchaFormsDisplayingTest.xml b/app/code/Magento/Captcha/Test/Mftf/Test/CaptchaFormsDisplayingTest.xml index 035e58de06ccf..977ee78c0d201 100644 --- a/app/code/Magento/Captcha/Test/Mftf/Test/CaptchaFormsDisplayingTest.xml +++ b/app/code/Magento/Captcha/Test/Mftf/Test/CaptchaFormsDisplayingTest.xml @@ -92,6 +92,8 @@ <amOnPage url="{{StorefrontProductPage.url($$createSimpleProduct.sku$$)}}" stepKey="openProductPage"/> <waitForPageLoad stepKey="waitForPageLoad"/> <click selector="{{StorefrontProductActionSection.addToCart}}" stepKey="addToCart" /> + <waitForPageLoad stepKey="waitForAddToCart"/> + <waitForElementVisible selector="{{StorefrontMessagesSection.success}}" stepKey="waitForSuccessMessage"/> <waitForText userInput="You added $$createSimpleProduct.name$$ to your shopping cart." stepKey="waitForText"/> <click selector="{{StorefrontMinicartSection.showCart}}" stepKey="clickCart"/> <click selector="{{StorefrontMinicartSection.goToCheckout}}" stepKey="goToCheckout"/> diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Helper/Form/Gallery/Content.php b/app/code/Magento/Catalog/Block/Adminhtml/Product/Helper/Form/Gallery/Content.php index 063503682f4db..f5d0ec7da617e 100644 --- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Helper/Form/Gallery/Content.php +++ b/app/code/Magento/Catalog/Block/Adminhtml/Product/Helper/Form/Gallery/Content.php @@ -19,6 +19,7 @@ use Magento\Framework\App\Filesystem\DirectoryList; use Magento\Framework\Exception\FileSystemException; use Magento\Backend\Block\DataProviders\ImageUploadConfig as ImageUploadConfigDataProvider; +use Magento\MediaStorage\Helper\File\Storage\Database; /** * Block for gallery content. @@ -50,25 +51,34 @@ class Content extends \Magento\Backend\Block\Widget */ private $imageUploadConfigDataProvider; + /** + * @var Database + */ + private $fileStorageDatabase; + /** * @param \Magento\Backend\Block\Template\Context $context * @param \Magento\Framework\Json\EncoderInterface $jsonEncoder * @param \Magento\Catalog\Model\Product\Media\Config $mediaConfig * @param array $data * @param ImageUploadConfigDataProvider $imageUploadConfigDataProvider + * @param Database $fileStorageDatabase */ public function __construct( \Magento\Backend\Block\Template\Context $context, \Magento\Framework\Json\EncoderInterface $jsonEncoder, \Magento\Catalog\Model\Product\Media\Config $mediaConfig, array $data = [], - ImageUploadConfigDataProvider $imageUploadConfigDataProvider = null + ImageUploadConfigDataProvider $imageUploadConfigDataProvider = null, + Database $fileStorageDatabase = null ) { $this->_jsonEncoder = $jsonEncoder; $this->_mediaConfig = $mediaConfig; parent::__construct($context, $data); $this->imageUploadConfigDataProvider = $imageUploadConfigDataProvider ?: ObjectManager::getInstance()->get(ImageUploadConfigDataProvider::class); + $this->fileStorageDatabase = $fileStorageDatabase + ?: ObjectManager::getInstance()->get(Database::class); } /** @@ -164,6 +174,13 @@ public function getImagesJson() $images = $this->sortImagesByPosition($value['images']); foreach ($images as &$image) { $image['url'] = $this->_mediaConfig->getMediaUrl($image['file']); + if ($this->fileStorageDatabase->checkDbUsage() && + !$mediaDir->isFile($this->_mediaConfig->getMediaPath($image['file'])) + ) { + $this->fileStorageDatabase->saveFileToFilesystem( + $this->_mediaConfig->getMediaPath($image['file']) + ); + } try { $fileHandler = $mediaDir->stat($this->_mediaConfig->getMediaPath($image['file'])); $image['size'] = $fileHandler['size']; @@ -187,9 +204,12 @@ public function getImagesJson() private function sortImagesByPosition($images) { if (is_array($images)) { - usort($images, function ($imageA, $imageB) { - return ($imageA['position'] < $imageB['position']) ? -1 : 1; - }); + usort( + $images, + function ($imageA, $imageB) { + return ($imageA['position'] < $imageB['position']) ? -1 : 1; + } + ); } return $images; } diff --git a/app/code/Magento/Catalog/Model/Category/FileInfo.php b/app/code/Magento/Catalog/Model/Category/FileInfo.php index 9715bb2b1616e..cd3592ef40a0f 100644 --- a/app/code/Magento/Catalog/Model/Category/FileInfo.php +++ b/app/code/Magento/Catalog/Model/Category/FileInfo.php @@ -43,6 +43,11 @@ class FileInfo */ private $baseDirectory; + /** + * @var ReadInterface + */ + private $pubDirectory; + /** * @param Filesystem $filesystem * @param Mime $mime @@ -82,6 +87,20 @@ private function getBaseDirectory() return $this->baseDirectory; } + /** + * Get Pub Directory read instance + * + * @return ReadInterface + */ + private function getPubDirectory() + { + if (!isset($this->pubDirectory)) { + $this->pubDirectory = $this->filesystem->getDirectoryRead(DirectoryList::PUB); + } + + return $this->pubDirectory; + } + /** * Retrieve MIME type of requested file * @@ -135,7 +154,7 @@ private function getFilePath($fileName) { $filePath = ltrim($fileName, '/'); - $mediaDirectoryRelativeSubpath = $this->getMediaDirectoryPathRelativeToBaseDirectoryPath(); + $mediaDirectoryRelativeSubpath = $this->getMediaDirectoryPathRelativeToBaseDirectoryPath($filePath); $isFileNameBeginsWithMediaDirectoryPath = $this->isBeginsWithMediaDirectoryPath($fileName); // if the file is not using a relative path, it resides in the catalog/category media directory @@ -160,7 +179,7 @@ public function isBeginsWithMediaDirectoryPath($fileName) { $filePath = ltrim($fileName, '/'); - $mediaDirectoryRelativeSubpath = $this->getMediaDirectoryPathRelativeToBaseDirectoryPath(); + $mediaDirectoryRelativeSubpath = $this->getMediaDirectoryPathRelativeToBaseDirectoryPath($filePath); $isFileNameBeginsWithMediaDirectoryPath = strpos($filePath, $mediaDirectoryRelativeSubpath) === 0; return $isFileNameBeginsWithMediaDirectoryPath; @@ -169,14 +188,22 @@ public function isBeginsWithMediaDirectoryPath($fileName) /** * Get media directory subpath relative to base directory path * + * @param string $filePath * @return string */ - private function getMediaDirectoryPathRelativeToBaseDirectoryPath() + private function getMediaDirectoryPathRelativeToBaseDirectoryPath(string $filePath = '') { - $baseDirectoryPath = $this->getBaseDirectory()->getAbsolutePath(); + $baseDirectory = $this->getBaseDirectory(); + $baseDirectoryPath = $baseDirectory->getAbsolutePath(); $mediaDirectoryPath = $this->getMediaDirectory()->getAbsolutePath(); + $pubDirectoryPath = $this->getPubDirectory()->getAbsolutePath(); $mediaDirectoryRelativeSubpath = substr($mediaDirectoryPath, strlen($baseDirectoryPath)); + $pubDirectory = $baseDirectory->getRelativePath($pubDirectoryPath); + + if (strpos($mediaDirectoryRelativeSubpath, $pubDirectory) === 0 && strpos($filePath, $pubDirectory) !== 0) { + $mediaDirectoryRelativeSubpath = substr($mediaDirectoryRelativeSubpath, strlen($pubDirectory)); + } return $mediaDirectoryRelativeSubpath; } diff --git a/app/code/Magento/Catalog/Observer/SetSpecialPriceStartDate.php b/app/code/Magento/Catalog/Observer/SetSpecialPriceStartDate.php index ed9f89efc6891..a898075befd16 100644 --- a/app/code/Magento/Catalog/Observer/SetSpecialPriceStartDate.php +++ b/app/code/Magento/Catalog/Observer/SetSpecialPriceStartDate.php @@ -38,10 +38,9 @@ public function execute(\Magento\Framework\Event\Observer $observer) { /** @var $product \Magento\Catalog\Model\Product */ $product = $observer->getEvent()->getProduct(); - if ($product->getSpecialPrice() && ! $product->getSpecialFromDate()) { + if ($product->getSpecialPrice() && $product->getSpecialFromDate() === null) { $product->setData('special_from_date', $this->localeDate->date()->setTime(0, 0)); } - return $this; } } diff --git a/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminFillProductAttributePropertiesActionGroup.xml b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminFillProductAttributePropertiesActionGroup.xml new file mode 100644 index 0000000000000..cd850f8a7004d --- /dev/null +++ b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminFillProductAttributePropertiesActionGroup.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd"> + <actionGroup name="AdminFillProductAttributePropertiesActionGroup"> + <arguments> + <argument name="attributeName" type="string"/> + <argument name="attributeType" type="string"/> + </arguments> + <fillField selector="{{AttributePropertiesSection.DefaultLabel}}" userInput="{{attributeName}}" stepKey="fillDefaultLabel"/> + <selectOption selector="{{AttributePropertiesSection.InputType}}" userInput="{{attributeType}}" stepKey="selectInputType"/> + </actionGroup> +</actionGroups> diff --git a/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminOpenAttributeSetByNameActionGroup.xml b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminOpenAttributeSetByNameActionGroup.xml new file mode 100644 index 0000000000000..1ac7ac5e54bf5 --- /dev/null +++ b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminOpenAttributeSetByNameActionGroup.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd"> + <actionGroup name="AdminOpenAttributeSetByNameActionGroup"> + <arguments> + <argument name="attributeSetName" type="string" defaultValue="Default"/> + </arguments> + <click selector="{{AdminProductAttributeSetGridSection.AttributeSetName(attributeSetName)}}" stepKey="chooseAttributeSet"/> + <waitForPageLoad stepKey="waitForAttributeSetPageLoad"/> + </actionGroup> +</actionGroups> diff --git a/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminOpenAttributeSetGridPageActionGroup.xml b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminOpenAttributeSetGridPageActionGroup.xml new file mode 100644 index 0000000000000..c6f0c3332b1d5 --- /dev/null +++ b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminOpenAttributeSetGridPageActionGroup.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd"> + <actionGroup name="AdminOpenAttributeSetGridPageActionGroup"> + <amOnPage url="{{AdminProductAttributeSetGridPage.url}}" stepKey="goToAttributeSetPage"/> + <waitForPageLoad stepKey="waitForAttributeSetPageLoad"/> + </actionGroup> +</actionGroups> diff --git a/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminOpenProductAttributePageActionGroup.xml b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminOpenProductAttributePageActionGroup.xml new file mode 100644 index 0000000000000..b6be3fb172d33 --- /dev/null +++ b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminOpenProductAttributePageActionGroup.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd"> + <actionGroup name="AdminOpenProductAttributePageActionGroup"> + <amOnPage url="{{AdminProductAttributeGridPage.url}}" stepKey="goToAttributePage"/> + <waitForPageLoad stepKey="waitForAttributePageLoad"/> + </actionGroup> +</actionGroups> diff --git a/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminOpenProductIndexPageActionGroup.xml b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminOpenProductIndexPageActionGroup.xml new file mode 100644 index 0000000000000..ca1303f180ca4 --- /dev/null +++ b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminOpenProductIndexPageActionGroup.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd"> + <actionGroup name="AdminOpenProductIndexPageActionGroup"> + <amOnPage url="{{AdminProductIndexPage.url}}" stepKey="goToProductIndexPage"/> + <waitForPageLoad stepKey="waitForProductIndexPageLoad"/> + </actionGroup> +</actionGroups> diff --git a/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminProductActionGroup.xml b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminProductActionGroup.xml index 3c44a8f1898ad..95e24f1f6fcfc 100644 --- a/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminProductActionGroup.xml +++ b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AdminProductActionGroup.xml @@ -304,9 +304,11 @@ </arguments> <waitForPageLoad stepKey="waitForPageLoad"/> <click selector="{{AdminProductFormSection.advancedPricingLink}}" stepKey="clickAdvancedPricingLink"/> + <waitForPageLoad stepKey="waitForAdvancedPricingModal"/> <waitForElementVisible selector="{{AdminProductFormAdvancedPricingSection.specialPrice}}" stepKey="waitSpecialPrice"/> <fillField userInput="{{price}}" selector="{{AdminProductFormAdvancedPricingSection.specialPrice}}" stepKey="fillSpecialPrice"/> <click selector="{{AdminProductFormAdvancedPricingSection.doneButton}}" stepKey="clickDone"/> + <waitForPageLoad stepKey="waitForAdvancedPricingModalGone"/> <waitForElementNotVisible selector="{{AdminProductFormAdvancedPricingSection.specialPrice}}" stepKey="waitForCloseModalWindow"/> </actionGroup> diff --git a/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AssertStorefrontCustomProductAttributeActionGroup.xml b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AssertStorefrontCustomProductAttributeActionGroup.xml new file mode 100644 index 0000000000000..e27efb41a7ef7 --- /dev/null +++ b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/AssertStorefrontCustomProductAttributeActionGroup.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd"> + <actionGroup name="AssertStorefrontCustomProductAttributeActionGroup"> + <arguments> + <argument name="attributeLabel" type="string"/> + <argument name="attributeValue" type="string"/> + </arguments> + <see userInput="{{attributeLabel}}" selector="{{StorefrontProductMoreInformationSection.customAttributeLabel(attributeLabel)}}" stepKey="seeAttributeLabel" /> + <see userInput="{{attributeValue}}" selector="{{StorefrontProductMoreInformationSection.customAttributeValue(attributeLabel)}}" stepKey="seeAttributeValue" /> + </actionGroup> +</actionGroups> diff --git a/app/code/Magento/Catalog/Test/Mftf/ActionGroup/OpenStorefrontProductPageByProductNameActionGroup.xml b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/OpenStorefrontProductPageByProductNameActionGroup.xml new file mode 100644 index 0000000000000..c25cdc403f8ec --- /dev/null +++ b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/OpenStorefrontProductPageByProductNameActionGroup.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd"> + <actionGroup name="OpenStorefrontProductPageByProductNameActionGroup"> + <arguments> + <argument name="productName" type="string" defaultValue="{{_defaultProduct.name}}"/> + </arguments> + <amOnPage url="{{productName}}.html" stepKey="amOnProductPage"/> + <waitForPageLoad stepKey="waitForProductPageLoad"/> + </actionGroup> +</actionGroups> diff --git a/app/code/Magento/Catalog/Test/Mftf/ActionGroup/StorefrontAddProductToCartWithQtyActionGroup.xml b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/StorefrontAddProductToCartWithQtyActionGroup.xml index 816085cf0ca26..5432d547e8025 100644 --- a/app/code/Magento/Catalog/Test/Mftf/ActionGroup/StorefrontAddProductToCartWithQtyActionGroup.xml +++ b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/StorefrontAddProductToCartWithQtyActionGroup.xml @@ -16,6 +16,7 @@ <fillField selector="{{StorefrontProductPageSection.qtyInput}}" userInput="{{productQty}}" stepKey="fillProduct1Quantity"/> <click selector="{{StorefrontProductActionSection.addToCart}}" stepKey="clickOnAddToCartButton"/> <waitForPageLoad stepKey="waitForProductToAddInCart"/> + <waitForElementVisible selector="{{StorefrontMessagesSection.success}}" stepKey="waitForSuccessMessage"/> <seeElement selector="{{StorefrontProductPageSection.successMsg}}" stepKey="seeSuccessSaveMessage"/> </actionGroup> </actionGroups> diff --git a/app/code/Magento/Catalog/Test/Mftf/ActionGroup/StorefrontAddToCartCustomOptionsProductPageActionGroup.xml b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/StorefrontAddToCartCustomOptionsProductPageActionGroup.xml index c7ae52d2b37c3..080b374c60b43 100644 --- a/app/code/Magento/Catalog/Test/Mftf/ActionGroup/StorefrontAddToCartCustomOptionsProductPageActionGroup.xml +++ b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/StorefrontAddToCartCustomOptionsProductPageActionGroup.xml @@ -14,6 +14,7 @@ </arguments> <click selector="{{StorefrontProductActionSection.addToCart}}" stepKey="addToCart"/> <waitForPageLoad stepKey="waitForPageLoad"/> + <waitForElementVisible selector="{{StorefrontMessagesSection.success}}" stepKey="waitForSuccessMessage"/> <see selector="{{StorefrontMessagesSection.success}}" userInput="You added {{productName}} to your shopping cart." stepKey="seeAddToCartSuccessMessage"/> </actionGroup> </actionGroups> diff --git a/app/code/Magento/Catalog/Test/Mftf/ActionGroup/StorefrontAssertProductSpecialPriceOnProductPageActionGroup.xml b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/StorefrontAssertProductSpecialPriceOnProductPageActionGroup.xml index ee71a3ace4449..9fefa71f10209 100644 --- a/app/code/Magento/Catalog/Test/Mftf/ActionGroup/StorefrontAssertProductSpecialPriceOnProductPageActionGroup.xml +++ b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/StorefrontAssertProductSpecialPriceOnProductPageActionGroup.xml @@ -13,6 +13,7 @@ </arguments> <amOnPage url="{{StorefrontProductPage.url(product.name)}}" stepKey="onFirstProductPage"/> <waitForPageLoad stepKey="waitForFirstProductPage"/> + <waitForElementVisible selector="{{StorefrontProductInfoMainSection.specialPriceValue}}" stepKey="waitForProductSpecialPrice"/> <grabTextFrom selector="{{StorefrontProductInfoMainSection.specialPriceValue}}" stepKey="grabProductSpecialPrice"/> <assertEquals actual="$grabProductSpecialPrice" expectedType="string" expected="{{specialPrice}}" stepKey="assertProductPriceValuesAreEqual"/> </actionGroup> diff --git a/app/code/Magento/Catalog/Test/Mftf/ActionGroup/StorefrontClickAddToCartOnProductPageActionGroup.xml b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/StorefrontClickAddToCartOnProductPageActionGroup.xml index fb2065d228d5a..1dcbc738c7651 100644 --- a/app/code/Magento/Catalog/Test/Mftf/ActionGroup/StorefrontClickAddToCartOnProductPageActionGroup.xml +++ b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/StorefrontClickAddToCartOnProductPageActionGroup.xml @@ -9,6 +9,7 @@ xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd"> <actionGroup name="StorefrontClickAddToCartOnProductPageActionGroup"> <click selector="{{StorefrontProductActionSection.addToCart}}" stepKey="addToCart" /> + <waitForPageLoad stepKey="waitForAddToCart"/> <waitForElementVisible selector="{{StorefrontMessagesSection.success}}" stepKey="waitForSuccessMessage" /> </actionGroup> </actionGroups> diff --git a/app/code/Magento/Catalog/Test/Mftf/ActionGroup/StorefrontProductPageActionGroup.xml b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/StorefrontProductPageActionGroup.xml index 8e0ef3ccbcf28..e6392118f79b8 100644 --- a/app/code/Magento/Catalog/Test/Mftf/ActionGroup/StorefrontProductPageActionGroup.xml +++ b/app/code/Magento/Catalog/Test/Mftf/ActionGroup/StorefrontProductPageActionGroup.xml @@ -13,9 +13,11 @@ <argument name="productName"/> </arguments> <click selector="{{StorefrontProductActionSection.addToCart}}" stepKey="addToCart"/> + <waitForPageLoad stepKey="waitForAddToCart"/> <waitForElementNotVisible selector="{{StorefrontProductActionSection.addToCartButtonTitleIsAdding}}" stepKey="waitForElementNotVisibleAddToCartButtonTitleIsAdding"/> <waitForElementNotVisible selector="{{StorefrontProductActionSection.addToCartButtonTitleIsAdded}}" stepKey="waitForElementNotVisibleAddToCartButtonTitleIsAdded"/> <waitForPageLoad stepKey="waitForPageLoad"/> + <waitForElementVisible selector="{{StorefrontMessagesSection.success}}" stepKey="waitForSuccessMessage"/> <see selector="{{StorefrontMessagesSection.success}}" userInput="You added {{productName}} to your shopping cart." stepKey="seeAddToCartSuccessMessage"/> </actionGroup> diff --git a/app/code/Magento/Catalog/Test/Mftf/Data/CategoryData.xml b/app/code/Magento/Catalog/Test/Mftf/Data/CategoryData.xml index 27167d03d528e..13951a0d197d1 100644 --- a/app/code/Magento/Catalog/Test/Mftf/Data/CategoryData.xml +++ b/app/code/Magento/Catalog/Test/Mftf/Data/CategoryData.xml @@ -110,4 +110,11 @@ <data key="is_active">false</data> <data key="include_in_menu">false</data> </entity> + <!-- Category from file "prepared-for-sample-data.csv"--> + <entity name="Gear" type="category"> + <data key="name">Gear</data> + <data key="name_lwr">gear</data> + <data key="is_active">true</data> + <data key="include_in_menu">true</data> + </entity> </entities> diff --git a/app/code/Magento/Catalog/Test/Mftf/Data/ProductAttributeData.xml b/app/code/Magento/Catalog/Test/Mftf/Data/ProductAttributeData.xml index 817dd637f81dd..02e5ae5ae36a5 100644 --- a/app/code/Magento/Catalog/Test/Mftf/Data/ProductAttributeData.xml +++ b/app/code/Magento/Catalog/Test/Mftf/Data/ProductAttributeData.xml @@ -320,4 +320,27 @@ <data key="option1_admin" unique="suffix">opt1'Admin</data> <data key="option1_frontend" unique="suffix">opt1'Front</data> </entity> + <entity name="productTextEditorAttribute" type="ProductAttribute"> + <data key="attribute_code" unique="suffix">attribute</data> + <data key="frontend_input">texteditor</data> + <data key="scope">global</data> + <data key="is_required">false</data> + <data key="is_unique">false</data> + <data key="is_searchable">true</data> + <data key="is_visible">true</data> + <data key="backend_type">text</data> + <data key="is_wysiwyg_enabled">true</data> + <data key="is_visible_in_advanced_search">true</data> + <data key="is_visible_on_front">true</data> + <data key="is_filterable">true</data> + <data key="is_filterable_in_search">true</data> + <data key="used_in_product_listing">true</data> + <data key="is_used_for_promo_rules">true</data> + <data key="is_comparable">true</data> + <data key="is_used_in_grid">true</data> + <data key="is_visible_in_grid">true</data> + <data key="is_filterable_in_grid">true</data> + <data key="used_for_sort_by">true</data> + <requiredEntity type="FrontendLabel">ProductAttributeFrontendLabel</requiredEntity> + </entity> </entities> diff --git a/app/code/Magento/Catalog/Test/Mftf/Data/WYSIWYGConfigData.xml b/app/code/Magento/Catalog/Test/Mftf/Data/WYSIWYGConfigData.xml new file mode 100644 index 0000000000000..7bb8cf5f4db37 --- /dev/null +++ b/app/code/Magento/Catalog/Test/Mftf/Data/WYSIWYGConfigData.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> + +<entities xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:DataGenerator/etc/dataProfileSchema.xsd"> + <entity name="EnableWYSIWYG"> + <data key="path">cms/wysiwyg/enabled</data> + <data key="scope_id">0</data> + <data key="label">Yes</data> + <data key="value">enabled</data> + </entity> + <entity name="EnableTinyMCE4"> + <data key="path">cms/wysiwyg/editor</data> + <data key="scope_id">0</data> + <data key="label">Yes</data> + <data key="value">mage/adminhtml/wysiwyg/tiny_mce/tinymce4Adapter</data> + </entity> +</entities> diff --git a/app/code/Magento/Catalog/Test/Mftf/Section/AdminCreateProductAttributeSection.xml b/app/code/Magento/Catalog/Test/Mftf/Section/AdminCreateProductAttributeSection.xml index d24c501152b78..9b75f7e6908a2 100644 --- a/app/code/Magento/Catalog/Test/Mftf/Section/AdminCreateProductAttributeSection.xml +++ b/app/code/Magento/Catalog/Test/Mftf/Section/AdminCreateProductAttributeSection.xml @@ -13,6 +13,7 @@ <element name="DefaultLabel" type="input" selector="#attribute_label"/> <element name="InputType" type="select" selector="#frontend_input"/> <element name="ValueRequired" type="select" selector="#is_required"/> + <element name="UpdateProductPreviewImage" type="select" selector="[name='update_product_preview_image']"/> <element name="AdvancedProperties" type="button" selector="#advanced_fieldset-wrapper"/> <element name="DefaultValue" type="input" selector="#default_value_text"/> <element name="Scope" type="select" selector="#is_global"/> @@ -47,6 +48,7 @@ <element name="EnableWYSIWYG" type="select" selector="#enabled"/> <element name="useForPromoRuleConditions" type="select" selector="#is_used_for_promo_rules"/> <element name="StorefrontPropertiesSectionToggle" type="button" selector="#front_fieldset-wrapper"/> + <element name="visibleOnCatalogPagesOnStorefront" type="select" selector="#is_visible_on_front"/> </section> <section name="WYSIWYGProductAttributeSection"> <element name="ShowHideBtn" type="button" selector="#toggledefault_value_texteditor"/> diff --git a/app/code/Magento/Catalog/Test/Mftf/Section/AdminProductFormSection.xml b/app/code/Magento/Catalog/Test/Mftf/Section/AdminProductFormSection.xml index 06f854bcc955c..177ac3b813a44 100644 --- a/app/code/Magento/Catalog/Test/Mftf/Section/AdminProductFormSection.xml +++ b/app/code/Magento/Catalog/Test/Mftf/Section/AdminProductFormSection.xml @@ -194,6 +194,7 @@ </section> <section name="ProductDescriptionWysiwygSection"> <element name="EditArea" type="text" selector="#editorproduct_form_description .mce-edit-area"/> + <element name="attributeEditArea" type="textarea" selector="#product_form_{{attributeCode}}" parameterized="true" timeout="30"/> </section> <section name="ProductShortDescriptionWysiwygSection"> <element name="EditArea" type="text" selector="#editorproduct_form_short_description .mce-edit-area"/> diff --git a/app/code/Magento/Catalog/Test/Mftf/Section/StorefrontProductMoreInformationSection.xml b/app/code/Magento/Catalog/Test/Mftf/Section/StorefrontProductMoreInformationSection.xml index ee687fa62da93..7706c5f244bc9 100644 --- a/app/code/Magento/Catalog/Test/Mftf/Section/StorefrontProductMoreInformationSection.xml +++ b/app/code/Magento/Catalog/Test/Mftf/Section/StorefrontProductMoreInformationSection.xml @@ -11,6 +11,9 @@ <section name="StorefrontProductMoreInformationSection"> <element name="moreInformation" type="button" selector="#tab-label-additional-title" timeout="30"/> <element name="moreInformationTextArea" type="textarea" selector="#additional"/> + <element name="moreInformationSpecs" type="text" selector="#product-attribute-specs-table"/> + <element name="customAttributeLabel" type="text" selector="//th[./following-sibling::td[@data-th='{{attributeCode}}']]" parameterized="true" /> + <element name="customAttributeValue" type="text" selector="//td[@data-th='{{attributeCode}}']" parameterized="true" /> <element name="attributeLabel" type="text" selector=".col.label"/> <element name="attributeValue" type="text" selector=".col.data"/> </section> diff --git a/app/code/Magento/Catalog/Test/Mftf/Test/AdminAddImageToWYSIWYGProductTest.xml b/app/code/Magento/Catalog/Test/Mftf/Test/AdminAddImageToWYSIWYGProductTest.xml index fd27b232053b8..f3d3e653b260b 100644 --- a/app/code/Magento/Catalog/Test/Mftf/Test/AdminAddImageToWYSIWYGProductTest.xml +++ b/app/code/Magento/Catalog/Test/Mftf/Test/AdminAddImageToWYSIWYGProductTest.xml @@ -16,6 +16,9 @@ <description value="Admin should be able to add image to WYSIWYG Editor on Product Page"/> <severity value="CRITICAL"/> <testCaseId value="MAGETWO-84375"/> + <skip> + <issueId value="MC-17232"/> + </skip> </annotations> <before> <actionGroup ref="LoginActionGroup" stepKey="login"/> diff --git a/app/code/Magento/Catalog/Test/Mftf/Test/AdminAddInStockProductToTheCartTest.xml b/app/code/Magento/Catalog/Test/Mftf/Test/AdminAddInStockProductToTheCartTest.xml index e3f4d6cbdde0d..feb4fffd12f5d 100644 --- a/app/code/Magento/Catalog/Test/Mftf/Test/AdminAddInStockProductToTheCartTest.xml +++ b/app/code/Magento/Catalog/Test/Mftf/Test/AdminAddInStockProductToTheCartTest.xml @@ -77,6 +77,7 @@ <fillField selector="{{StorefrontProductPageSection.qtyInput}}" userInput="1" stepKey="fillProductQuantity"/> <click selector="{{StorefrontProductActionSection.addToCart}}" stepKey="clickOnAddToCartButton"/> <waitForPageLoad stepKey="waitForProductToAddInCart"/> + <waitForElementVisible selector="{{StorefrontMessagesSection.success}}" stepKey="waitForSuccessMessage"/> <seeElement selector="{{StorefrontProductPageSection.successMsg}}" stepKey="seeSuccessSaveMessage"/> <seeElement selector="{{StorefrontMinicartSection.quantity(1)}}" stepKey="seeAddedProductQuantityInCart"/> <click selector="{{StorefrontMinicartSection.showCart}}" stepKey="clickOnMiniCart"/> diff --git a/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateTextEditorProductAttributeTest.xml b/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateTextEditorProductAttributeTest.xml new file mode 100644 index 0000000000000..fc7482c353136 --- /dev/null +++ b/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateTextEditorProductAttributeTest.xml @@ -0,0 +1,129 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> + +<tests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd"> + <test name="AdminCreateTextEditorProductAttributeTest"> + <annotations> + <features value="Catalog"/> + <stories value="Create product Attribute"/> + <title value="Admin create text editor product attribute test"/> + <description value="Create text editor product attribute with TinyMCE4 enabled"/> + <severity value="CRITICAL"/> + <testCaseId value="MC-6338"/> + <group value="catalog"/> + </annotations> + <before> + <!-- Enable WYSIWYG editor --> + <magentoCLI command="config:set {{EnableWYSIWYG.path}} {{EnableWYSIWYG.value}}" stepKey="enableWYSIWYG"/> + + <!-- Enable TinyMCE 4 --> + <magentoCLI command="config:set {{EnableTinyMCE4.path}} {{EnableTinyMCE4.value}}" stepKey="enableTinyMCE4"/> + + <!-- Login as admin --> + <actionGroup ref="LoginAsAdmin" stepKey="loginAsAdmin"/> + </before> + <after> + <!-- Delete attribute --> + <actionGroup ref="deleteProductAttribute" stepKey="deleteAttribute"> + <argument name="ProductAttribute" value="productTextEditorAttribute"/> + </actionGroup> + + <!-- Delete product --> + <actionGroup ref="deleteProductUsingProductGrid" stepKey="deleteProduct"> + <argument name="product" value="_defaultProduct"/> + </actionGroup> + + <!-- Log out --> + <actionGroup ref="logout" stepKey="logout"/> + </after> + + <!-- Go to Stores > Product, click "Add New Attribute" --> + <actionGroup ref="AdminOpenProductAttributePageActionGroup" stepKey="openProductAttributePage"/> + <click selector="{{AdminProductAttributeGridSection.createNewAttributeBtn}}" stepKey="createNewAttribute"/> + + <!-- Input value for Default Label. Verify dropdown of "Catalog Input Type for Store Owner" --> + <actionGroup ref="AdminFillProductAttributePropertiesActionGroup" stepKey="fillAttributeProperties"> + <argument name="attributeName" value="{{productTextEditorAttribute.attribute_code}}"/> + <argument name="attributeType" value="{{productTextEditorAttribute.frontend_input}}"/> + </actionGroup> + + <!-- Input value for "Catalog Input Type for Store Owner" --> + <selectOption selector="{{AttributePropertiesSection.InputType}}" userInput="{{productAttributeWysiwyg.frontend_input}}" stepKey="updateInputType"/> + + <!-- Click on "Storefront Properties" tab on left menu --> + <click selector="{{StorefrontPropertiesSection.StoreFrontPropertiesTab}}" stepKey="clickStorefrontPropertiesTab"/> + <dontSeeElement selector="{{StorefrontPropertiesSection.EnableWYSIWYG}}" stepKey="dontSeeWYSIWYGEnableField"/> + + <!-- Selection for "Visible on Catalog Pages on Storefront" --> + <selectOption selector="{{StorefrontPropertiesSection.visibleOnCatalogPagesOnStorefront}}" userInput="Yes" stepKey="enableVisibleOnStorefront"/> + <scrollToTopOfPage stepKey="scrollToPageTop"/> + + <!-- Go back to "Properties" tab on left menu --> + <click selector="{{AttributePropertiesSection.propertiesTab}}" stepKey="clickPropertiesTab"/> + + <!-- Updated value for "Catalog Input Type for Store Owner" --> + <selectOption selector="{{AttributePropertiesSection.InputType}}" userInput="{{productTextEditorAttribute.frontend_input}}" stepKey="returnInputType"/> + + <!-- Save Product Attribute --> + <actionGroup ref="saveProductAttribute" stepKey="saveAttribute"/> + + <!-- Go to Store > Attribute Set --> + <actionGroup ref="AdminOpenAttributeSetGridPageActionGroup" stepKey="openAttributeSetPage"/> + + <!-- From grid, click on attribute set Default --> + <actionGroup ref="AdminOpenAttributeSetByNameActionGroup" stepKey="openDefaultAttributeSet"/> + + <!-- Add Product Attribute to Default attribute by dragging and dropping this to the 'Project Details' folder. Then Save. --> + <actionGroup ref="AssignAttributeToGroup" stepKey="assignAttributeToGroup"> + <argument name="group" value="Product Details"/> + <argument name="attribute" value="{{productTextEditorAttribute.attribute_code}}"/> + </actionGroup> + <actionGroup ref="SaveAttributeSet" stepKey="saveAttributeSet"/> + + <!-- Go Catalog > Product to create new product page --> + <actionGroup ref="AdminOpenProductIndexPageActionGroup" stepKey="goToProductIndexPage"/> + <actionGroup ref="goToCreateProductPage" stepKey="goToCreateProduct"> + <argument name="product" value="_defaultProduct"/> + </actionGroup> + + <!-- On product page, select Attribute Set: "Default" --> + <actionGroup ref="AdminProductPageSelectAttributeSet" stepKey="selectAttributeSet"> + <argument name="attributeSetName" value="Default"/> + </actionGroup> + + <!-- Created product attribute appear on product form --> + <seeElement selector="{{AdminProductFormSection.attributeLabelByText(productTextEditorAttribute.attribute_code)}}" stepKey="seeAttributeLabelInProductForm"/> + + <!-- TinyMCE 4 is displayed in WYSIWYG content area --> + <seeElement selector="{{TinyMCESection.TinyMCE4}}" stepKey="seeTinyMCE4"/> + + <!-- Verify toolbar menu --> + <actionGroup ref="VerifyTinyMCEActionGroup" stepKey="verifyToolbarMenu"/> + + <!-- Click Show/Hide button and see Insert Image button --> + <scrollToTopOfPage stepKey="scrollToTop"/> + <click selector="{{ProductAttributeWYSIWYGSection.showHideBtn(productTextEditorAttribute.attribute_code)}}" stepKey="clickShowHideBtn"/> + <waitForElementVisible selector="{{TinyMCESection.InsertImageBtn}}" stepKey="waitForInsertImageBtn"/> + + <!-- Add content into attribute --> + <fillField selector="{{ProductDescriptionWysiwygSection.attributeEditArea(productTextEditorAttribute.attribute_code)}}" userInput="This content from product page" stepKey="setContent"/> + + <!-- Fill up all required fields for product form --> + <actionGroup ref="fillMainProductForm" stepKey="fillProductForm"/> + <actionGroup ref="saveProductForm" stepKey="saveProductForm"/> + + <!-- Assert product attribute on Storefront --> + <actionGroup ref="OpenStorefrontProductPageByProductNameActionGroup" stepKey="openProductPage"/> + <scrollTo stepKey="scrollToMoreInformation" selector="{{StorefrontProductMoreInformationSection.moreInformationSpecs}}" /> + <actionGroup ref="AssertStorefrontCustomProductAttributeActionGroup" stepKey="checkAttributeInMoreInformationTab"> + <argument name="attributeLabel" value="{{productTextEditorAttribute.attribute_code}}"/> + <argument name="attributeValue" value="This content from product page"/> + </actionGroup> + </test> +</tests> diff --git a/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateVirtualProductOutOfStockWithTierPriceTest.xml b/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateVirtualProductOutOfStockWithTierPriceTest.xml index 26ad7a46a73d7..e516a046e489e 100644 --- a/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateVirtualProductOutOfStockWithTierPriceTest.xml +++ b/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateVirtualProductOutOfStockWithTierPriceTest.xml @@ -17,6 +17,9 @@ <severity value="CRITICAL"/> <group value="catalog"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-17181"/> + </skip> </annotations> <before> <actionGroup ref="LoginAsAdmin" stepKey="loginAsAdmin"/> diff --git a/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateVirtualProductWithCustomOptionsSuiteAndImportOptionsTest.xml b/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateVirtualProductWithCustomOptionsSuiteAndImportOptionsTest.xml index 17769c79677f7..6ee3fa6c60b82 100644 --- a/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateVirtualProductWithCustomOptionsSuiteAndImportOptionsTest.xml +++ b/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateVirtualProductWithCustomOptionsSuiteAndImportOptionsTest.xml @@ -17,6 +17,9 @@ <severity value="CRITICAL"/> <group value="catalog"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-17181"/> + </skip> </annotations> <before> <actionGroup ref="LoginAsAdmin" stepKey="loginAsAdmin"/> diff --git a/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateVirtualProductWithTierPriceForGeneralGroupTest.xml b/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateVirtualProductWithTierPriceForGeneralGroupTest.xml index 78247f4943596..b777babf3b3aa 100644 --- a/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateVirtualProductWithTierPriceForGeneralGroupTest.xml +++ b/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateVirtualProductWithTierPriceForGeneralGroupTest.xml @@ -17,6 +17,9 @@ <severity value="CRITICAL"/> <group value="catalog"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-17181"/> + </skip> </annotations> <before> <actionGroup ref="LoginAsAdmin" stepKey="loginAsAdmin"/> diff --git a/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateVirtualProductWithTierPriceTest.xml b/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateVirtualProductWithTierPriceTest.xml index 6ef2569945fa6..28923674f4ab3 100644 --- a/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateVirtualProductWithTierPriceTest.xml +++ b/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateVirtualProductWithTierPriceTest.xml @@ -17,6 +17,9 @@ <severity value="CRITICAL"/> <group value="catalog"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-17181"/> + </skip> </annotations> <before> <actionGroup ref="LoginAsAdmin" stepKey="loginAsAdmin"/> diff --git a/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateVirtualProductWithoutManageStockTest.xml b/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateVirtualProductWithoutManageStockTest.xml index cb41b0292d33a..8c5085501b799 100644 --- a/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateVirtualProductWithoutManageStockTest.xml +++ b/app/code/Magento/Catalog/Test/Mftf/Test/AdminCreateVirtualProductWithoutManageStockTest.xml @@ -17,6 +17,9 @@ <severity value="CRITICAL"/> <group value="catalog"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-17181"/> + </skip> </annotations> <before> <actionGroup ref="LoginAsAdmin" stepKey="loginAsAdmin"/> diff --git a/app/code/Magento/Catalog/Test/Mftf/Test/AdminGridPageNumberAfterSaveAndCloseActionTest.xml b/app/code/Magento/Catalog/Test/Mftf/Test/AdminGridPageNumberAfterSaveAndCloseActionTest.xml index 053f165c8745c..672205d935dab 100644 --- a/app/code/Magento/Catalog/Test/Mftf/Test/AdminGridPageNumberAfterSaveAndCloseActionTest.xml +++ b/app/code/Magento/Catalog/Test/Mftf/Test/AdminGridPageNumberAfterSaveAndCloseActionTest.xml @@ -18,6 +18,9 @@ <testCaseId value="MAGETWO-96164"/> <useCaseId value="MAGETWO-96127"/> <group value="Catalog"/> + <skip> + <issueId value="MC-17332"/> + </skip> </annotations> <before> <actionGroup ref="LoginAsAdmin" stepKey="loginAsAdmin"/> diff --git a/app/code/Magento/Catalog/Test/Mftf/Test/AdminImportCustomizableOptionToProductWithSKUTest.xml b/app/code/Magento/Catalog/Test/Mftf/Test/AdminImportCustomizableOptionToProductWithSKUTest.xml index 4e182c2e0e5ac..877c3ecab7edf 100644 --- a/app/code/Magento/Catalog/Test/Mftf/Test/AdminImportCustomizableOptionToProductWithSKUTest.xml +++ b/app/code/Magento/Catalog/Test/Mftf/Test/AdminImportCustomizableOptionToProductWithSKUTest.xml @@ -18,6 +18,9 @@ <testCaseId value="MAGETWO-98211"/> <useCaseId value="MAGETWO-70232"/> <group value="catalog"/> + <skip> + <issueId value="MC-17140"/> + </skip> </annotations> <before> <actionGroup ref="LoginAsAdmin" stepKey="loginAsAdmin"/> diff --git a/app/code/Magento/Catalog/Test/Mftf/Test/AdminMassUpdateProductAttributesGlobalScopeTest.xml b/app/code/Magento/Catalog/Test/Mftf/Test/AdminMassUpdateProductAttributesGlobalScopeTest.xml index 8a44c8093ca5e..87e0bf3d2e9a0 100644 --- a/app/code/Magento/Catalog/Test/Mftf/Test/AdminMassUpdateProductAttributesGlobalScopeTest.xml +++ b/app/code/Magento/Catalog/Test/Mftf/Test/AdminMassUpdateProductAttributesGlobalScopeTest.xml @@ -18,6 +18,9 @@ <testCaseId value="MC-56"/> <group value="Catalog"/> <group value="Product Attributes"/> + <skip> + <issueId value="MC-17140"/> + </skip> </annotations> <before> <actionGroup ref="LoginAsAdmin" stepKey="loginAsAdmin"/> diff --git a/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateSimpleProductNameToVerifyDataOverridingOnStoreViewLevelTest.xml b/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateSimpleProductNameToVerifyDataOverridingOnStoreViewLevelTest.xml index 18e4ff9ee2c99..80f0c8ad10ede 100644 --- a/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateSimpleProductNameToVerifyDataOverridingOnStoreViewLevelTest.xml +++ b/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateSimpleProductNameToVerifyDataOverridingOnStoreViewLevelTest.xml @@ -52,9 +52,14 @@ <!-- Assign simple product to created store view --> <click selector="{{AdminCategoryMainActionsSection.CategoryStoreViewDropdownToggle}}" stepKey="clickCategoryStoreViewDropdownToggle"/> + <waitForPageLoad stepKey="waitForStoreViewDropdown"/> + <waitForElementVisible selector="{{AdminCategoryMainActionsSection.CategoryStoreViewOption(customStoreFR.name)}}" stepKey="waitForStoreViewOption"/> <click selector="{{AdminCategoryMainActionsSection.CategoryStoreViewOption(customStoreFR.name)}}" stepKey="selectCategoryStoreViewOption"/> + <waitForPageLoad stepKey="waitForAcceptModal"/> + <waitForElementVisible selector="{{AdminProductFormChangeStoreSection.acceptButton}}" stepKey="waitForAcceptButton"/> <click selector="{{AdminProductFormChangeStoreSection.acceptButton}}" stepKey="clickAcceptButton"/> <waitForPageLoad stepKey="waitForThePageToLoad"/> + <waitForElementNotVisible selector="{{AdminProductFormChangeStoreSection.acceptButton}}" stepKey="waitForAcceptButtonGone"/> <uncheckOption selector="{{AdminProductFormSection.productNameUseDefault}}" stepKey="uncheckProductStatus"/> <!-- Update default simple product with name --> diff --git a/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateSimpleProductPriceToVerifyDataOverridingOnStoreViewLevelTest.xml b/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateSimpleProductPriceToVerifyDataOverridingOnStoreViewLevelTest.xml index d5fc981b5b2e6..f698b3d89ffe9 100644 --- a/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateSimpleProductPriceToVerifyDataOverridingOnStoreViewLevelTest.xml +++ b/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateSimpleProductPriceToVerifyDataOverridingOnStoreViewLevelTest.xml @@ -52,7 +52,11 @@ <!-- Assign simple product to created store view --> <click selector="{{AdminCategoryMainActionsSection.CategoryStoreViewDropdownToggle}}" stepKey="clickCategoryStoreViewDropdownToggle"/> + <waitForPageLoad stepKey="waitForPageLoad"/> + <waitForElementVisible selector="{{AdminCategoryMainActionsSection.CategoryStoreViewOption(customStoreFR.name)}}" stepKey="waitForSelectCategoryStoreViewOption"/> <click selector="{{AdminCategoryMainActionsSection.CategoryStoreViewOption(customStoreFR.name)}}" stepKey="selectCategoryStoreViewOption"/> + <waitForPageLoad stepKey="waitForPageLoad1"/> + <waitForElementVisible selector="{{AdminProductFormChangeStoreSection.acceptButton}}" stepKey="waitForAcceptButton"/> <click selector="{{AdminProductFormChangeStoreSection.acceptButton}}" stepKey="clickAcceptButton"/> <waitForPageLoad stepKey="waitForPageToLoad"/> diff --git a/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateSimpleProductTieredPriceTest.xml b/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateSimpleProductTieredPriceTest.xml index 2c3aa5db75171..d151bae3ee110 100644 --- a/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateSimpleProductTieredPriceTest.xml +++ b/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateSimpleProductTieredPriceTest.xml @@ -17,6 +17,9 @@ <severity value="CRITICAL"/> <group value="catalog"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-17181"/> + </skip> </annotations> <before> <actionGroup ref="LoginAsAdmin" stepKey="loginAsAdmin"/> diff --git a/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateSimpleProductWithRegularPriceInStockEnabledFlatTest.xml b/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateSimpleProductWithRegularPriceInStockEnabledFlatTest.xml index a042c4d60ae4f..d30500de64a32 100644 --- a/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateSimpleProductWithRegularPriceInStockEnabledFlatTest.xml +++ b/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateSimpleProductWithRegularPriceInStockEnabledFlatTest.xml @@ -17,6 +17,9 @@ <severity value="CRITICAL"/> <group value="catalog"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-17181"/> + </skip> </annotations> <before> <actionGroup ref="LoginAsAdmin" stepKey="loginAsAdmin"/> diff --git a/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateSimpleProductWithRegularPriceInStockNotVisibleIndividuallyTest.xml b/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateSimpleProductWithRegularPriceInStockNotVisibleIndividuallyTest.xml index d08ef9c93999c..cb7b3d6278aa8 100644 --- a/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateSimpleProductWithRegularPriceInStockNotVisibleIndividuallyTest.xml +++ b/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateSimpleProductWithRegularPriceInStockNotVisibleIndividuallyTest.xml @@ -17,6 +17,9 @@ <severity value="CRITICAL"/> <group value="catalog"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-17181"/> + </skip> </annotations> <before> <actionGroup ref="LoginAsAdmin" stepKey="loginAsAdmin"/> diff --git a/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateSimpleProductWithRegularPriceInStockVisibleInCatalogAndSearchTest.xml b/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateSimpleProductWithRegularPriceInStockVisibleInCatalogAndSearchTest.xml index a695982921cfd..75b4a9728d08b 100644 --- a/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateSimpleProductWithRegularPriceInStockVisibleInCatalogAndSearchTest.xml +++ b/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateSimpleProductWithRegularPriceInStockVisibleInCatalogAndSearchTest.xml @@ -17,6 +17,9 @@ <severity value="CRITICAL"/> <group value="catalog"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-17181"/> + </skip> </annotations> <before> <actionGroup ref="LoginAsAdmin" stepKey="loginAsAdmin"/> diff --git a/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateSimpleProductWithRegularPriceInStockVisibleInCatalogOnlyTest.xml b/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateSimpleProductWithRegularPriceInStockVisibleInCatalogOnlyTest.xml index ba52c6d2bc261..f8b0b17c06253 100644 --- a/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateSimpleProductWithRegularPriceInStockVisibleInCatalogOnlyTest.xml +++ b/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateSimpleProductWithRegularPriceInStockVisibleInCatalogOnlyTest.xml @@ -17,6 +17,9 @@ <severity value="CRITICAL"/> <group value="catalog"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-17181"/> + </skip> </annotations> <before> <actionGroup ref="LoginAsAdmin" stepKey="loginAsAdmin"/> diff --git a/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateSimpleProductWithRegularPriceInStockVisibleInSearchOnlyTest.xml b/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateSimpleProductWithRegularPriceInStockVisibleInSearchOnlyTest.xml index cb5c24839e387..ee2a2514c9c7e 100644 --- a/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateSimpleProductWithRegularPriceInStockVisibleInSearchOnlyTest.xml +++ b/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateSimpleProductWithRegularPriceInStockVisibleInSearchOnlyTest.xml @@ -17,6 +17,9 @@ <severity value="CRITICAL"/> <group value="catalog"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-17181"/> + </skip> </annotations> <before> <actionGroup ref="LoginAsAdmin" stepKey="loginAsAdmin"/> diff --git a/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateSimpleProductWithRegularPriceInStockWithCustomOptionsTest.xml b/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateSimpleProductWithRegularPriceInStockWithCustomOptionsTest.xml index 318ab6555235e..7921ed6c3e459 100644 --- a/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateSimpleProductWithRegularPriceInStockWithCustomOptionsTest.xml +++ b/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateSimpleProductWithRegularPriceInStockWithCustomOptionsTest.xml @@ -17,6 +17,9 @@ <severity value="CRITICAL"/> <group value="catalog"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-17181"/> + </skip> </annotations> <before> <actionGroup ref="LoginAsAdmin" stepKey="loginAsAdmin"/> @@ -150,6 +153,7 @@ <fillField selector="{{StorefrontProductPageSection.qtyInput}}" userInput="1" stepKey="fillProductQuantity"/> <click selector="{{StorefrontProductActionSection.addToCart}}" stepKey="clickOnAddToCartButton"/> <waitForPageLoad stepKey="waitForProductToAddInCart"/> + <waitForElementVisible selector="{{StorefrontMessagesSection.success}}" stepKey="waitForSuccessMessage"/> <seeElement selector="{{StorefrontProductPageSection.successMsg}}" stepKey="seeYouAddedSimpleprod4ToYourShoppingCartSuccessSaveMessage"/> <seeElement selector="{{StorefrontMinicartSection.quantity(1)}}" stepKey="seeAddedProductQuantityInCart"/> <click selector="{{StorefrontMinicartSection.showCart}}" stepKey="clickOnMiniCart"/> diff --git a/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateSimpleProductWithRegularPriceOutOfStockTest.xml b/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateSimpleProductWithRegularPriceOutOfStockTest.xml index 54ed753b80a1c..0125b4c1e713d 100644 --- a/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateSimpleProductWithRegularPriceOutOfStockTest.xml +++ b/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateSimpleProductWithRegularPriceOutOfStockTest.xml @@ -17,6 +17,9 @@ <severity value="CRITICAL"/> <group value="catalog"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-17181"/> + </skip> </annotations> <before> <actionGroup ref="LoginAsAdmin" stepKey="loginAsAdmin"/> diff --git a/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateVirtualProductWithRegularPriceInStockVisibleInCategoryOnlyTest.xml b/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateVirtualProductWithRegularPriceInStockVisibleInCategoryOnlyTest.xml index 9bdc93e61e499..d7ceefb03d3b1 100644 --- a/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateVirtualProductWithRegularPriceInStockVisibleInCategoryOnlyTest.xml +++ b/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateVirtualProductWithRegularPriceInStockVisibleInCategoryOnlyTest.xml @@ -17,6 +17,9 @@ <severity value="CRITICAL"/> <group value="catalog"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-17181"/> + </skip> </annotations> <before> diff --git a/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateVirtualProductWithRegularPriceInStockWithCustomOptionsVisibleInSearchOnlyTest.xml b/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateVirtualProductWithRegularPriceInStockWithCustomOptionsVisibleInSearchOnlyTest.xml index 34d85e7b46850..ef02b73ea16d4 100644 --- a/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateVirtualProductWithRegularPriceInStockWithCustomOptionsVisibleInSearchOnlyTest.xml +++ b/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateVirtualProductWithRegularPriceInStockWithCustomOptionsVisibleInSearchOnlyTest.xml @@ -17,6 +17,9 @@ <severity value="CRITICAL"/> <group value="catalog"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-17181"/> + </skip> </annotations> <before> diff --git a/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateVirtualProductWithRegularPriceOutOfStockVisibleInCategoryOnlyTest.xml b/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateVirtualProductWithRegularPriceOutOfStockVisibleInCategoryOnlyTest.xml index e64022b311614..b5ee6d8112b50 100644 --- a/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateVirtualProductWithRegularPriceOutOfStockVisibleInCategoryOnlyTest.xml +++ b/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateVirtualProductWithRegularPriceOutOfStockVisibleInCategoryOnlyTest.xml @@ -17,6 +17,9 @@ <severity value="CRITICAL"/> <group value="catalog"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-17181"/> + </skip> </annotations> <before> diff --git a/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateVirtualProductWithSpecialPriceInStockVisibleInCategoryAndSearchTest.xml b/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateVirtualProductWithSpecialPriceInStockVisibleInCategoryAndSearchTest.xml index 9b6a56d6f81d8..64342d18198c5 100644 --- a/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateVirtualProductWithSpecialPriceInStockVisibleInCategoryAndSearchTest.xml +++ b/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateVirtualProductWithSpecialPriceInStockVisibleInCategoryAndSearchTest.xml @@ -17,6 +17,9 @@ <severity value="CRITICAL"/> <group value="catalog"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-17181"/> + </skip> </annotations> <before> diff --git a/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateVirtualProductWithSpecialPriceOutOfStockVisibleInCategoryAndSearchTest.xml b/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateVirtualProductWithSpecialPriceOutOfStockVisibleInCategoryAndSearchTest.xml index 920a0a494bae5..7378a7f111c30 100644 --- a/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateVirtualProductWithSpecialPriceOutOfStockVisibleInCategoryAndSearchTest.xml +++ b/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateVirtualProductWithSpecialPriceOutOfStockVisibleInCategoryAndSearchTest.xml @@ -17,6 +17,9 @@ <severity value="CRITICAL"/> <group value="catalog"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-17181"/> + </skip> </annotations> <before> diff --git a/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateVirtualProductWithTierPriceInStockVisibleInCategoryAndSearchTest.xml b/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateVirtualProductWithTierPriceInStockVisibleInCategoryAndSearchTest.xml index d4ec5e410d9ff..ddb4002a5dba3 100644 --- a/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateVirtualProductWithTierPriceInStockVisibleInCategoryAndSearchTest.xml +++ b/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateVirtualProductWithTierPriceInStockVisibleInCategoryAndSearchTest.xml @@ -17,6 +17,9 @@ <severity value="CRITICAL"/> <group value="catalog"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-17181"/> + </skip> </annotations> <before> diff --git a/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateVirtualProductWithTierPriceInStockVisibleInCategoryOnlyTest.xml b/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateVirtualProductWithTierPriceInStockVisibleInCategoryOnlyTest.xml index 717d710b4a288..9aff504f58f81 100644 --- a/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateVirtualProductWithTierPriceInStockVisibleInCategoryOnlyTest.xml +++ b/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateVirtualProductWithTierPriceInStockVisibleInCategoryOnlyTest.xml @@ -17,6 +17,9 @@ <severity value="CRITICAL"/> <group value="catalog"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-17181"/> + </skip> </annotations> <before> diff --git a/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateVirtualProductWithTierPriceOutOfStockVisibleInCategoryAndSearchTest.xml b/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateVirtualProductWithTierPriceOutOfStockVisibleInCategoryAndSearchTest.xml index 703a4e24cdca9..41796bcc2c3a9 100644 --- a/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateVirtualProductWithTierPriceOutOfStockVisibleInCategoryAndSearchTest.xml +++ b/app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateVirtualProductWithTierPriceOutOfStockVisibleInCategoryAndSearchTest.xml @@ -17,6 +17,9 @@ <severity value="CRITICAL"/> <group value="catalog"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-17181"/> + </skip> </annotations> <before> diff --git a/app/code/Magento/Catalog/Test/Unit/Block/Adminhtml/Product/Helper/Form/Gallery/ContentTest.php b/app/code/Magento/Catalog/Test/Unit/Block/Adminhtml/Product/Helper/Form/Gallery/ContentTest.php index 249c32ff276c3..9a2199859a1df 100644 --- a/app/code/Magento/Catalog/Test/Unit/Block/Adminhtml/Product/Helper/Form/Gallery/ContentTest.php +++ b/app/code/Magento/Catalog/Test/Unit/Block/Adminhtml/Product/Helper/Form/Gallery/ContentTest.php @@ -9,6 +9,7 @@ use Magento\Catalog\Model\Entity\Attribute; use Magento\Catalog\Model\Product; use Magento\Framework\Phrase; +use Magento\MediaStorage\Helper\File\Storage\Database; /** * @SuppressWarnings(PHPMD.CouplingBetweenObjects) @@ -50,6 +51,11 @@ class ContentTest extends \PHPUnit\Framework\TestCase */ protected $imageHelper; + /** + * @var \Magento\MediaStorage\Helper\File\Storage\Database|\PHPUnit_Framework_MockObject_MockObject + */ + protected $databaseMock; + /** * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager */ @@ -71,13 +77,18 @@ public function setUp() ->disableOriginalConstructor() ->getMock(); + $this->databaseMock = $this->getMockBuilder(Database::class) + ->disableOriginalConstructor() + ->getMock(); + $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); $this->content = $this->objectManager->getObject( \Magento\Catalog\Block\Adminhtml\Product\Helper\Form\Gallery\Content::class, [ 'mediaConfig' => $this->mediaConfigMock, 'jsonEncoder' => $this->jsonEncoderMock, - 'filesystem' => $this->fileSystemMock + 'filesystem' => $this->fileSystemMock, + 'fileStorageDatabase' => $this->databaseMock ] ); } @@ -143,6 +154,13 @@ public function testGetImagesJson() $this->readMock->expects($this->any())->method('stat')->willReturnMap($sizeMap); $this->jsonEncoderMock->expects($this->once())->method('encode')->willReturnCallback('json_encode'); + $this->readMock->expects($this->any()) + ->method('isFile') + ->will($this->returnValue(true)); + $this->databaseMock->expects($this->any()) + ->method('checkDbUsage') + ->will($this->returnValue(false)); + $this->assertSame(json_encode($imagesResult), $this->content->getImagesJson()); } @@ -210,6 +228,14 @@ public function testGetImagesJsonWithException() $this->fileSystemMock->expects($this->any())->method('getDirectoryRead')->willReturn($this->readMock); $this->mediaConfigMock->expects($this->any())->method('getMediaUrl'); $this->mediaConfigMock->expects($this->any())->method('getMediaPath'); + + $this->readMock->expects($this->any()) + ->method('isFile') + ->will($this->returnValue(true)); + $this->databaseMock->expects($this->any()) + ->method('checkDbUsage') + ->will($this->returnValue(false)); + $this->readMock->expects($this->any())->method('stat')->willReturnOnConsecutiveCalls( $this->throwException( new \Magento\Framework\Exception\FileSystemException(new Phrase('test')) @@ -365,4 +391,52 @@ private function getMediaAttribute(string $label, string $attributeCode) return $mediaAttribute; } + + /** + * Test GetImagesJson() calls MediaStorage functions to obtain image from DB prior to stat call + * + * @return void + */ + public function testGetImagesJsonMediaStorageMode() + { + $images = [ + 'images' => [ + [ + 'value_id' => '0', + 'file' => 'file_1.jpg', + 'media_type' => 'image', + 'position' => '0' + ] + ] + ]; + + $mediaPath = [ + ['file_1.jpg', 'catalog/product/image_1.jpg'] + ]; + + $this->content->setElement($this->galleryMock); + + $this->galleryMock->expects($this->once()) + ->method('getImages') + ->willReturn($images); + $this->fileSystemMock->expects($this->once()) + ->method('getDirectoryRead') + ->willReturn($this->readMock); + $this->mediaConfigMock->expects($this->any()) + ->method('getMediaPath') + ->willReturnMap($mediaPath); + + $this->readMock->expects($this->any()) + ->method('isFile') + ->will($this->returnValue(false)); + $this->databaseMock->expects($this->any()) + ->method('checkDbUsage') + ->will($this->returnValue(true)); + + $this->databaseMock->expects($this->once()) + ->method('saveFileToFilesystem') + ->with('catalog/product/image_1.jpg'); + + $this->content->getImagesJson(); + } } diff --git a/app/code/Magento/Catalog/Test/Unit/Model/Category/FileInfoTest.php b/app/code/Magento/Catalog/Test/Unit/Model/Category/FileInfoTest.php index 8ca823127e66c..6c6a69ec39c85 100644 --- a/app/code/Magento/Catalog/Test/Unit/Model/Category/FileInfoTest.php +++ b/app/code/Magento/Catalog/Test/Unit/Model/Category/FileInfoTest.php @@ -9,31 +9,41 @@ use Magento\Framework\App\Filesystem\DirectoryList; use Magento\Framework\File\Mime; use Magento\Framework\Filesystem; -use Magento\Framework\Filesystem\Directory\WriteInterface; use Magento\Framework\Filesystem\Directory\ReadInterface; +use Magento\Framework\Filesystem\Directory\WriteInterface; +use PHPUnit\Framework\MockObject\MockObject; +use PHPUnit\Framework\TestCase; -class FileInfoTest extends \PHPUnit\Framework\TestCase +/** + * Test for Magento\Catalog\Model\Category\FileInfo class. + */ +class FileInfoTest extends TestCase { /** - * @var Filesystem|\PHPUnit_Framework_MockObject_MockObject + * @var Filesystem|MockObject */ private $filesystem; /** - * @var Mime|\PHPUnit_Framework_MockObject_MockObject + * @var Mime|MockObject */ private $mime; /** - * @var WriteInterface|\PHPUnit_Framework_MockObject_MockObject + * @var WriteInterface|MockObject */ private $mediaDirectory; /** - * @var ReadInterface|\PHPUnit_Framework_MockObject_MockObject + * @var ReadInterface|MockObject */ private $baseDirectory; + /** + * @var ReadInterface|MockObject + */ + private $pubDirectory; + /** * @var FileInfo */ @@ -44,30 +54,43 @@ protected function setUp() $this->mediaDirectory = $this->getMockBuilder(WriteInterface::class) ->getMockForAbstractClass(); - $this->baseDirectory = $this->getMockBuilder(ReadInterface::class) + $this->baseDirectory = $baseDirectory = $this->getMockBuilder(ReadInterface::class) + ->getMockForAbstractClass(); + + $this->pubDirectory = $pubDirectory = $this->getMockBuilder(ReadInterface::class) ->getMockForAbstractClass(); $this->filesystem = $this->getMockBuilder(Filesystem::class) ->disableOriginalConstructor() ->getMock(); - $this->filesystem->expects($this->any()) - ->method('getDirectoryWrite') + + $this->filesystem->method('getDirectoryWrite') ->with(DirectoryList::MEDIA) ->willReturn($this->mediaDirectory); - $this->filesystem->expects($this->any()) - ->method('getDirectoryRead') - ->with(DirectoryList::ROOT) - ->willReturn($this->baseDirectory); + $this->filesystem->method('getDirectoryRead') + ->willReturnCallback( + function ($arg) use ($baseDirectory, $pubDirectory) { + if ($arg === DirectoryList::PUB) { + return $pubDirectory; + } + return $baseDirectory; + } + ); $this->mime = $this->getMockBuilder(Mime::class) ->disableOriginalConstructor() ->getMock(); - $this->baseDirectory->expects($this->any()) - ->method('getAbsolutePath') - ->with(null) - ->willReturn('/a/b/c'); + $this->baseDirectory->method('getAbsolutePath') + ->willReturn('/a/b/c/'); + + $this->baseDirectory->method('getRelativePath') + ->with('/a/b/c/pub/') + ->willReturn('pub/'); + + $this->pubDirectory->method('getAbsolutePath') + ->willReturn('/a/b/c/pub/'); $this->model = new FileInfo( $this->filesystem, @@ -85,12 +108,12 @@ public function testGetMimeType() $this->mediaDirectory->expects($this->at(0)) ->method('getAbsolutePath') ->with(null) - ->willReturn('/a/b/c/pub/media'); + ->willReturn('/a/b/c/pub/media/'); $this->mediaDirectory->expects($this->at(1)) ->method('getAbsolutePath') ->with(null) - ->willReturn('/a/b/c/pub/media'); + ->willReturn('/a/b/c/pub/media/'); $this->mediaDirectory->expects($this->at(2)) ->method('getAbsolutePath') @@ -113,13 +136,11 @@ public function testGetStat() $expected = ['size' => 1]; - $this->mediaDirectory->expects($this->any()) - ->method('getAbsolutePath') + $this->mediaDirectory->method('getAbsolutePath') ->with(null) - ->willReturn('/a/b/c/pub/media'); + ->willReturn('/a/b/c/pub/media/'); - $this->mediaDirectory->expects($this->once()) - ->method('stat') + $this->mediaDirectory->method('stat') ->with($mediaPath . $fileName) ->willReturn($expected); @@ -130,22 +151,52 @@ public function testGetStat() $this->assertEquals(1, $result['size']); } - public function testIsExist() + /** + * @param $fileName + * @param $fileMediaPath + * @dataProvider isExistProvider + */ + public function testIsExist($fileName, $fileMediaPath) { - $mediaPath = '/catalog/category'; + $this->mediaDirectory->method('getAbsolutePath') + ->willReturn('/a/b/c/pub/media/'); - $fileName = '/filename.ext1'; - - $this->mediaDirectory->expects($this->any()) - ->method('getAbsolutePath') - ->with(null) - ->willReturn('/a/b/c/pub/media'); - - $this->mediaDirectory->expects($this->once()) - ->method('isExist') - ->with($mediaPath . $fileName) + $this->mediaDirectory->method('isExist') + ->with($fileMediaPath) ->willReturn(true); $this->assertTrue($this->model->isExist($fileName)); } + + public function isExistProvider() + { + return [ + ['/filename.ext1', '/catalog/category/filename.ext1'], + ['/pub/media/filename.ext1', 'filename.ext1'], + ['/media/filename.ext1', 'filename.ext1'] + ]; + } + + /** + * @param $fileName + * @param $expected + * @dataProvider isBeginsWithMediaDirectoryPathProvider + */ + public function testIsBeginsWithMediaDirectoryPath($fileName, $expected) + { + $this->mediaDirectory->method('getAbsolutePath') + ->willReturn('/a/b/c/pub/media/'); + + $this->assertEquals($expected, $this->model->isBeginsWithMediaDirectoryPath($fileName)); + } + + public function isBeginsWithMediaDirectoryPathProvider() + { + return [ + ['/pub/media/test/filename.ext1', true], + ['/media/test/filename.ext1', true], + ['/test/filename.ext1', false], + ['test2/filename.ext1', false] + ]; + } } diff --git a/app/code/Magento/CatalogImportExport/Test/Mftf/Test/AdminExportBundleProductTest.xml b/app/code/Magento/CatalogImportExport/Test/Mftf/Test/AdminExportBundleProductTest.xml index 74345e64a7c9a..281c8c0db307a 100644 --- a/app/code/Magento/CatalogImportExport/Test/Mftf/Test/AdminExportBundleProductTest.xml +++ b/app/code/Magento/CatalogImportExport/Test/Mftf/Test/AdminExportBundleProductTest.xml @@ -18,6 +18,9 @@ <testCaseId value="MC-14008"/> <group value="catalog_import_export"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-15934"/> + </skip> </annotations> <before> <!--Create bundle product with dynamic price with two simple products --> diff --git a/app/code/Magento/CatalogImportExport/Test/Mftf/Test/AdminExportGroupedProductWithSpecialPriceTest.xml b/app/code/Magento/CatalogImportExport/Test/Mftf/Test/AdminExportGroupedProductWithSpecialPriceTest.xml index b0ac6a4bc95ac..c47b7dc83af28 100644 --- a/app/code/Magento/CatalogImportExport/Test/Mftf/Test/AdminExportGroupedProductWithSpecialPriceTest.xml +++ b/app/code/Magento/CatalogImportExport/Test/Mftf/Test/AdminExportGroupedProductWithSpecialPriceTest.xml @@ -18,6 +18,9 @@ <testCaseId value="MC-14009"/> <group value="catalog_import_export"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-15934"/> + </skip> </annotations> <before> <!-- Create first simple product and add special price --> diff --git a/app/code/Magento/CatalogImportExport/Test/Mftf/Test/AdminExportSimpleAndConfigurableProductsWithCustomOptionsTest.xml b/app/code/Magento/CatalogImportExport/Test/Mftf/Test/AdminExportSimpleAndConfigurableProductsWithCustomOptionsTest.xml index 1870cb21bd55b..160abe617995d 100644 --- a/app/code/Magento/CatalogImportExport/Test/Mftf/Test/AdminExportSimpleAndConfigurableProductsWithCustomOptionsTest.xml +++ b/app/code/Magento/CatalogImportExport/Test/Mftf/Test/AdminExportSimpleAndConfigurableProductsWithCustomOptionsTest.xml @@ -18,6 +18,9 @@ <testCaseId value="MC-14005"/> <group value="catalog_import_export"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-15934"/> + </skip> </annotations> <before> <!-- Create category --> diff --git a/app/code/Magento/CatalogImportExport/Test/Mftf/Test/AdminExportSimpleProductAndConfigurableProductsWithAssignedImagesTest.xml b/app/code/Magento/CatalogImportExport/Test/Mftf/Test/AdminExportSimpleProductAndConfigurableProductsWithAssignedImagesTest.xml index 00bf647886ef5..3b8da4055ab7e 100644 --- a/app/code/Magento/CatalogImportExport/Test/Mftf/Test/AdminExportSimpleProductAndConfigurableProductsWithAssignedImagesTest.xml +++ b/app/code/Magento/CatalogImportExport/Test/Mftf/Test/AdminExportSimpleProductAndConfigurableProductsWithAssignedImagesTest.xml @@ -18,6 +18,9 @@ <testCaseId value="MC-14004"/> <group value="catalog_import_export"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-17140"/> + </skip> </annotations> <before> <!-- Create category --> diff --git a/app/code/Magento/CatalogImportExport/Test/Mftf/Test/AdminExportSimpleProductWithCustomAttributeTest.xml b/app/code/Magento/CatalogImportExport/Test/Mftf/Test/AdminExportSimpleProductWithCustomAttributeTest.xml index 238a3286dc40d..f958978a9efae 100644 --- a/app/code/Magento/CatalogImportExport/Test/Mftf/Test/AdminExportSimpleProductWithCustomAttributeTest.xml +++ b/app/code/Magento/CatalogImportExport/Test/Mftf/Test/AdminExportSimpleProductWithCustomAttributeTest.xml @@ -18,6 +18,9 @@ <testCaseId value="MC-14007"/> <group value="catalog_import_export"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-15934"/> + </skip> </annotations> <before> <!-- Create simple product with custom attribute set --> diff --git a/app/code/Magento/CatalogRule/Test/Mftf/Test/AdminDeleteCatalogPriceRuleEntityTest.xml b/app/code/Magento/CatalogRule/Test/Mftf/Test/AdminDeleteCatalogPriceRuleEntityTest.xml index 02539110dc1a9..06392764290ac 100644 --- a/app/code/Magento/CatalogRule/Test/Mftf/Test/AdminDeleteCatalogPriceRuleEntityTest.xml +++ b/app/code/Magento/CatalogRule/Test/Mftf/Test/AdminDeleteCatalogPriceRuleEntityTest.xml @@ -209,6 +209,7 @@ <selectOption selector="{{StorefrontProductInfoMainSection.productAttributeOptionsSelectButton}}" userInput="option1" stepKey="selectOption1"/> <click selector="{{StorefrontProductActionSection.addToCart}}" stepKey="addToCart1"/> <waitForPageLoad time="30" stepKey="waitForPageLoad4"/> + <waitForElementVisible selector="{{StorefrontMessagesSection.success}}" stepKey="waitForSuccessMessage"/> <see selector="{{StorefrontMessagesSection.success}}" userInput="You added $$createConfigProduct1.name$ to your shopping cart." stepKey="seeAddToCartSuccessMessage"/> <click selector="{{StorefrontMinicartSection.showCart}}" stepKey="openMiniShoppingCart1"/> <waitForPageLoad time="30" stepKey="waitForPageLoad5"/> diff --git a/app/code/Magento/CatalogRule/Test/Mftf/Test/ApplyCatalogRuleForSimpleAndConfigurableProductTest.xml b/app/code/Magento/CatalogRule/Test/Mftf/Test/ApplyCatalogRuleForSimpleAndConfigurableProductTest.xml index be2e31d0766bd..b9e7bfb4d41e4 100644 --- a/app/code/Magento/CatalogRule/Test/Mftf/Test/ApplyCatalogRuleForSimpleAndConfigurableProductTest.xml +++ b/app/code/Magento/CatalogRule/Test/Mftf/Test/ApplyCatalogRuleForSimpleAndConfigurableProductTest.xml @@ -17,6 +17,9 @@ <testCaseId value="MC-14770"/> <group value="CatalogRule"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-17140"/> + </skip> </annotations> <before> <!-- Login as Admin --> diff --git a/app/code/Magento/CatalogRule/Test/Mftf/Test/ApplyCatalogRuleForSimpleProductAndFixedMethodTest.xml b/app/code/Magento/CatalogRule/Test/Mftf/Test/ApplyCatalogRuleForSimpleProductAndFixedMethodTest.xml index 7b7953c1d9b06..3405d0c4e776d 100644 --- a/app/code/Magento/CatalogRule/Test/Mftf/Test/ApplyCatalogRuleForSimpleProductAndFixedMethodTest.xml +++ b/app/code/Magento/CatalogRule/Test/Mftf/Test/ApplyCatalogRuleForSimpleProductAndFixedMethodTest.xml @@ -17,6 +17,9 @@ <testCaseId value="MC-14771"/> <group value="CatalogRule"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-17140"/> + </skip> </annotations> <before> <!-- Login as Admin --> diff --git a/app/code/Magento/CatalogRule/Test/Mftf/Test/ApplyCatalogRuleForSimpleProductForNewCustomerGroupTest.xml b/app/code/Magento/CatalogRule/Test/Mftf/Test/ApplyCatalogRuleForSimpleProductForNewCustomerGroupTest.xml index e4af21cac6723..c3bcde92bd1f2 100644 --- a/app/code/Magento/CatalogRule/Test/Mftf/Test/ApplyCatalogRuleForSimpleProductForNewCustomerGroupTest.xml +++ b/app/code/Magento/CatalogRule/Test/Mftf/Test/ApplyCatalogRuleForSimpleProductForNewCustomerGroupTest.xml @@ -17,6 +17,9 @@ <testCaseId value="MC-14772"/> <group value="CatalogRule"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-17140"/> + </skip> </annotations> <before> <!-- Login as Admin --> diff --git a/app/code/Magento/CatalogRule/Test/Mftf/Test/ApplyCatalogRuleForSimpleProductWithCustomOptionsTest.xml b/app/code/Magento/CatalogRule/Test/Mftf/Test/ApplyCatalogRuleForSimpleProductWithCustomOptionsTest.xml index 5b7e722c92a02..055eacaeb2b78 100644 --- a/app/code/Magento/CatalogRule/Test/Mftf/Test/ApplyCatalogRuleForSimpleProductWithCustomOptionsTest.xml +++ b/app/code/Magento/CatalogRule/Test/Mftf/Test/ApplyCatalogRuleForSimpleProductWithCustomOptionsTest.xml @@ -17,6 +17,9 @@ <testCaseId value="MC-14769"/> <group value="CatalogRule"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-16684"/> + </skip> </annotations> <before> <!-- Login as Admin --> diff --git a/app/code/Magento/CatalogRule/Test/Mftf/Test/StorefrontInactiveCatalogRuleTest.xml b/app/code/Magento/CatalogRule/Test/Mftf/Test/StorefrontInactiveCatalogRuleTest.xml index c6ecc1c6d9658..22fcf6870c19d 100644 --- a/app/code/Magento/CatalogRule/Test/Mftf/Test/StorefrontInactiveCatalogRuleTest.xml +++ b/app/code/Magento/CatalogRule/Test/Mftf/Test/StorefrontInactiveCatalogRuleTest.xml @@ -57,6 +57,7 @@ <!-- Verify price is not discounted in the cart --> <click selector="{{StorefrontProductActionSection.addToCart}}" stepKey="addToCart"/> <waitForPageLoad stepKey="waitForCart"/> + <waitForElementVisible selector="{{StorefrontMessagesSection.success}}" stepKey="waitForSuccessMessage"/> <amOnPage url="{{CheckoutCartPage.url}}" stepKey="goToCheckout"/> <waitForPageLoad stepKey="waitForCheckout"/> <see selector="{{CheckoutCartSummarySection.subtotal}}" userInput="$$createProduct.price$$" stepKey="seePrice3"/> diff --git a/app/code/Magento/CatalogRuleConfigurable/Test/Mftf/Test/AdminApplyCatalogRuleForConfigurableProductWithAssignedSimpleProductsTest.xml b/app/code/Magento/CatalogRuleConfigurable/Test/Mftf/Test/AdminApplyCatalogRuleForConfigurableProductWithAssignedSimpleProductsTest.xml index 5bb45f58bcd27..3e700b5bcfb1b 100644 --- a/app/code/Magento/CatalogRuleConfigurable/Test/Mftf/Test/AdminApplyCatalogRuleForConfigurableProductWithAssignedSimpleProductsTest.xml +++ b/app/code/Magento/CatalogRuleConfigurable/Test/Mftf/Test/AdminApplyCatalogRuleForConfigurableProductWithAssignedSimpleProductsTest.xml @@ -17,6 +17,9 @@ <testCaseId value="MC-14063"/> <group value="catalogRuleConfigurable"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-17140"/> + </skip> </annotations> <before> <!-- Create category for first configurable product --> diff --git a/app/code/Magento/CatalogRuleConfigurable/Test/Mftf/Test/AdminApplyCatalogRuleForConfigurableProductWithOptionsTest.xml b/app/code/Magento/CatalogRuleConfigurable/Test/Mftf/Test/AdminApplyCatalogRuleForConfigurableProductWithOptionsTest.xml index 408e181aa1c87..e53e51c626aa9 100644 --- a/app/code/Magento/CatalogRuleConfigurable/Test/Mftf/Test/AdminApplyCatalogRuleForConfigurableProductWithOptionsTest.xml +++ b/app/code/Magento/CatalogRuleConfigurable/Test/Mftf/Test/AdminApplyCatalogRuleForConfigurableProductWithOptionsTest.xml @@ -17,6 +17,9 @@ <testCaseId value="MC-14062"/> <group value="catalogRuleConfigurable"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-17140"/> + </skip> </annotations> <before> <!-- Create category --> diff --git a/app/code/Magento/CatalogSearch/Model/Search/RequestGenerator.php b/app/code/Magento/CatalogSearch/Model/Search/RequestGenerator.php index 0adc2fcecbfa7..8f8ba39ebd329 100644 --- a/app/code/Magento/CatalogSearch/Model/Search/RequestGenerator.php +++ b/app/code/Magento/CatalogSearch/Model/Search/RequestGenerator.php @@ -103,7 +103,7 @@ private function generateRequest($attributeType, $container, $useFulltext) } } /** @var $attribute Attribute */ - if (!$attribute->getIsSearchable() || in_array($attribute->getAttributeCode(), ['price', 'sku'], true)) { + if (!$attribute->getIsSearchable() || in_array($attribute->getAttributeCode(), ['price'], true)) { // Some fields have their own specific handlers continue; } diff --git a/app/code/Magento/CatalogSearch/Test/Unit/Model/Search/RequestGeneratorTest.php b/app/code/Magento/CatalogSearch/Test/Unit/Model/Search/RequestGeneratorTest.php index b52c9cfd67494..a8c654652a32f 100644 --- a/app/code/Magento/CatalogSearch/Test/Unit/Model/Search/RequestGeneratorTest.php +++ b/app/code/Magento/CatalogSearch/Test/Unit/Model/Search/RequestGeneratorTest.php @@ -9,6 +9,9 @@ use Magento\CatalogSearch\Model\Search\RequestGenerator\GeneratorResolver; use Magento\CatalogSearch\Model\Search\RequestGenerator\GeneratorInterface; +/** + * Test for \Magento\CatalogSearch\Model\Search\RequestGenerator + */ class RequestGeneratorTest extends \PHPUnit\Framework\TestCase { /** @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager */ @@ -61,7 +64,7 @@ public function attributesProvider() return [ [ [ - 'quick_search_container' => ['queries' => 0, 'filters' => 0, 'aggregations' => 0], + 'quick_search_container' => ['queries' => 1, 'filters' => 0, 'aggregations' => 0], 'advanced_search_container' => ['queries' => 0, 'filters' => 0, 'aggregations' => 0], 'catalog_view_container' => ['queries' => 0, 'filters' => 0, 'aggregations' => 0] ], diff --git a/app/code/Magento/CatalogSearch/etc/search_request.xml b/app/code/Magento/CatalogSearch/etc/search_request.xml index d7bfb2e6b4a5c..6f9eb6e20666e 100644 --- a/app/code/Magento/CatalogSearch/etc/search_request.xml +++ b/app/code/Magento/CatalogSearch/etc/search_request.xml @@ -19,7 +19,6 @@ <queryReference clause="must" ref="visibility"/> </query> <query xsi:type="matchQuery" value="$search_term$" name="search"> - <match field="sku"/> <match field="*"/> </query> <query xsi:type="filteredQuery" name="category"> diff --git a/app/code/Magento/Checkout/Model/ShippingInformationManagement.php b/app/code/Magento/Checkout/Model/ShippingInformationManagement.php index cd3bd2c5a7deb..499e02d681f9c 100644 --- a/app/code/Magento/Checkout/Model/ShippingInformationManagement.php +++ b/app/code/Magento/Checkout/Model/ShippingInformationManagement.php @@ -191,7 +191,9 @@ public function saveAddressInformation( $shippingAddress = $quote->getShippingAddress(); - if (!$shippingAddress->getShippingRateByCode($shippingAddress->getShippingMethod())) { + if (!$quote->getIsVirtual() + && !$shippingAddress->getShippingRateByCode($shippingAddress->getShippingMethod()) + ) { throw new NoSuchEntityException( __('Carrier with such method not found: %1, %2', $carrierCode, $methodCode) ); diff --git a/app/code/Magento/Checkout/Test/Mftf/ActionGroup/StorefrontAddToTheCartActionGroup.xml b/app/code/Magento/Checkout/Test/Mftf/ActionGroup/StorefrontAddToTheCartActionGroup.xml index 88e81199e3705..1603758016e0d 100644 --- a/app/code/Magento/Checkout/Test/Mftf/ActionGroup/StorefrontAddToTheCartActionGroup.xml +++ b/app/code/Magento/Checkout/Test/Mftf/ActionGroup/StorefrontAddToTheCartActionGroup.xml @@ -13,5 +13,6 @@ <scrollTo selector="{{StorefrontProductActionSection.addToCart}}" stepKey="scrollToAddToCartButton"/> <click selector="{{StorefrontProductActionSection.addToCart}}" stepKey="addToCart"/> <waitForPageLoad stepKey="waitForPageToLoad"/> + <waitForElementVisible selector="{{StorefrontMessagesSection.success}}" stepKey="waitForSuccessMessage"/> </actionGroup> </actionGroups> diff --git a/app/code/Magento/Checkout/Test/Mftf/ActionGroup/StorefrontAssertShippingMethodOptionPresentInCartActionGroup.xml b/app/code/Magento/Checkout/Test/Mftf/ActionGroup/StorefrontAssertShippingMethodOptionPresentInCartActionGroup.xml new file mode 100644 index 0000000000000..6e033268934a5 --- /dev/null +++ b/app/code/Magento/Checkout/Test/Mftf/ActionGroup/StorefrontAssertShippingMethodOptionPresentInCartActionGroup.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> + +<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd"> + <!-- Assert shipping method name and price are present in cart --> + <actionGroup name="StorefrontAssertShippingMethodOptionPresentInCartActionGroup"> + <arguments> + <argument name="methodName" type="string"/> + <argument name="price" type="string"/> + </arguments> + <see selector="{{CheckoutCartSummarySection.methodName}}" userInput="{{methodName}}" stepKey="seeShippingName"/> + <see selector="{{CheckoutCartSummarySection.shippingPrice}}" userInput="{{price}}" stepKey="seeShippingPrice"/> + </actionGroup> +</actionGroups> diff --git a/app/code/Magento/Checkout/Test/Mftf/Data/ConfigData.xml b/app/code/Magento/Checkout/Test/Mftf/Data/ConfigData.xml index e9c949f2ef886..cd9cd59d20b64 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Data/ConfigData.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Data/ConfigData.xml @@ -53,7 +53,7 @@ <data key="label">Yes</data> <data key="value">1</data> </entity> - <entity name="EnableFlatRateDefaultPrice"> + <entity name="EnableFlatRateDefaultPriceConfigData"> <data key="path">carriers/flatrate/price</data> <data key="scope">carriers</data> <data key="scope_id">1</data> diff --git a/app/code/Magento/Checkout/Test/Mftf/Section/CheckoutCartSummarySection.xml b/app/code/Magento/Checkout/Test/Mftf/Section/CheckoutCartSummarySection.xml index c9acfb62aa7a1..59c5054245ad6 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Section/CheckoutCartSummarySection.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Section/CheckoutCartSummarySection.xml @@ -29,6 +29,8 @@ <element name="estimateShippingAndTax" type="text" selector="#block-shipping-heading" timeout="5"/> <element name="flatRateShippingMethod" type="input" selector="#s_method_flatrate_flatrate" timeout="30"/> <element name="shippingMethodLabel" type="text" selector="#co-shipping-method-form dl dt span"/> + <element name="methodName" type="text" selector="#co-shipping-method-form label"/> + <element name="shippingPrice" type="text" selector="#co-shipping-method-form span .price"/> <element name="shippingMethodElementId" type="radio" selector="#s_method_{{carrierCode}}_{{methodCode}}" parameterized="true"/> </section> </sections> diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/EndToEndB2CGuestUserTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/EndToEndB2CGuestUserTest.xml index 5335ec2ad775d..a4864d612a45f 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/EndToEndB2CGuestUserTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/EndToEndB2CGuestUserTest.xml @@ -9,6 +9,11 @@ <tests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd"> <test name="EndToEndB2CGuestUserTest"> + <annotations> + <skip> + <issueId value="MC-16684"/> + </skip> + </annotations> <!-- Step 3: User adds products to cart --> <comment userInput="Start of adding products to cart" stepKey="startOfAddingProductsToCart" after="endOfBrowsingCatalog"/> <!-- Add Simple Product 1 to cart --> diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/EndToEndB2CLoggedInUserTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/EndToEndB2CLoggedInUserTest.xml index 65627787e2a05..a4784a5cdc227 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/EndToEndB2CLoggedInUserTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/EndToEndB2CLoggedInUserTest.xml @@ -9,6 +9,11 @@ <tests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd"> <test name="EndToEndB2CLoggedInUserTest"> + <annotations> + <skip> + <issueId value="MC-16684"/> + </skip> + </annotations> <!-- Step 3: User adds products to cart --> <comment userInput="Start of adding products to cart" stepKey="startOfAddingProductsToCart" after="endOfBrowsingCatalog"/> <!-- Add Simple Product 1 to cart --> diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StoreFrontAddProductWithAllTypesOfCustomOptionToTheShoppingCartWithoutAnySelectedOptionTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StoreFrontAddProductWithAllTypesOfCustomOptionToTheShoppingCartWithoutAnySelectedOptionTest.xml index 2ac84000fd1e8..d108dc3657a40 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/StoreFrontAddProductWithAllTypesOfCustomOptionToTheShoppingCartWithoutAnySelectedOptionTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StoreFrontAddProductWithAllTypesOfCustomOptionToTheShoppingCartWithoutAnySelectedOptionTest.xml @@ -36,7 +36,8 @@ </actionGroup> <!--Click on Add To Cart button--> - <actionGroup ref="StorefrontAddToTheCartActionGroup" stepKey="clickOnAddToCartButton"/> + <click selector="{{StorefrontProductActionSection.addToCart}}" stepKey="addToCart"/> + <waitForPageLoad stepKey="waitForPageToLoad"/> <!--Assert all types of product options field displayed Required message --> <actionGroup ref="AssertStorefrontSeeElementActionGroup" stepKey="assertRequiredProductOptionField"> diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddBundleDynamicProductToShoppingCartWithDisableMiniCartSidebarTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddBundleDynamicProductToShoppingCartWithDisableMiniCartSidebarTest.xml index 3dae3b3ae58d5..9c00f2be1d60b 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddBundleDynamicProductToShoppingCartWithDisableMiniCartSidebarTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddBundleDynamicProductToShoppingCartWithDisableMiniCartSidebarTest.xml @@ -20,6 +20,7 @@ <before> <magentoCLI stepKey="disableShoppingCartSidebar" command="config:set checkout/sidebar/display 0"/> <magentoCLI command="config:set {{EnableFlatRateConfigData.path}} {{EnableFlatRateConfigData.value}}" stepKey="enableFlatRate"/> + <magentoCLI command="config:set {{EnableFlatRateDefaultPriceConfigData.path}} {{EnableFlatRateDefaultPriceConfigData.value}}" stepKey="enableFlatRatePrice"/> <createData entity="SimpleSubCategory" stepKey="createSubCategory"/> <!--Create simple products--> diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddConfigurableProductToShoppingCartTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddConfigurableProductToShoppingCartTest.xml index d1196d9abec46..09608eef7178a 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddConfigurableProductToShoppingCartTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddConfigurableProductToShoppingCartTest.xml @@ -19,6 +19,7 @@ <before> <magentoCLI command="config:set {{EnableFlatRateConfigData.path}} {{EnableFlatRateConfigData.value}}" stepKey="enableFlatRate"/> + <magentoCLI command="config:set {{EnableFlatRateDefaultPriceConfigData.path}} {{EnableFlatRateDefaultPriceConfigData.value}}" stepKey="enableFlatRatePrice"/> <!-- Create Default Category --> <createData entity="_defaultCategory" stepKey="createCategory"/> diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddGroupedProductToShoppingCartTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddGroupedProductToShoppingCartTest.xml index 157cf66e65e27..c555a9250dd6d 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddGroupedProductToShoppingCartTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddGroupedProductToShoppingCartTest.xml @@ -15,6 +15,9 @@ <testCaseId value="MC-14718"/> <severity value="CRITICAL"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-16684"/> + </skip> </annotations> <before> diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddOneBundleMultiSelectOptionToTheShoppingCartTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddOneBundleMultiSelectOptionToTheShoppingCartTest.xml index d69f14ba12c7d..f4770c5270997 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddOneBundleMultiSelectOptionToTheShoppingCartTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddOneBundleMultiSelectOptionToTheShoppingCartTest.xml @@ -15,6 +15,9 @@ <testCaseId value="MC-14727"/> <severity value="CRITICAL"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-16684"/> + </skip> </annotations> <before> diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontCheckCartItemDisplayWhenMoreItemsAddedToTheCartThanDefaultDisplayLimitTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontCheckCartItemDisplayWhenMoreItemsAddedToTheCartThanDefaultDisplayLimitTest.xml index f77fa96c5d017..9c78666fb01c4 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontCheckCartItemDisplayWhenMoreItemsAddedToTheCartThanDefaultDisplayLimitTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontCheckCartItemDisplayWhenMoreItemsAddedToTheCartThanDefaultDisplayLimitTest.xml @@ -15,6 +15,9 @@ <testCaseId value="MC-14720"/> <severity value="CRITICAL"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-17140"/> + </skip> </annotations> <before> diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontGuestCheckoutTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontGuestCheckoutTest.xml index bdf672a8d4857..15410921f1bb1 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontGuestCheckoutTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontGuestCheckoutTest.xml @@ -78,6 +78,9 @@ <severity value="CRITICAL"/> <testCaseId value="MAGETWO-97001"/> <group value="checkout"/> + <skip> + <issueId value="MC-17140"/> + </skip> </annotations> <before> <magentoCLI stepKey="disableSidebar" command="config:set checkout/sidebar/display 0" /> diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontUpdatePriceInShoppingCartAfterProductSaveTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontUpdatePriceInShoppingCartAfterProductSaveTest.xml index b4747a6bf7273..d27cb83a8ca5b 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontUpdatePriceInShoppingCartAfterProductSaveTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontUpdatePriceInShoppingCartAfterProductSaveTest.xml @@ -17,6 +17,9 @@ <severity value="CRITICAL"/> <testCaseId value="MAGETWO-58179"/> <group value="checkout"/> + <skip> + <issueId value="MC-16684"/> + </skip> </annotations> <before> <createData entity="SimpleProduct2" stepKey="createSimpleProduct"> diff --git a/app/code/Magento/Cms/Test/Mftf/Test/AdminAddImageToWYSIWYGBlockTest.xml b/app/code/Magento/Cms/Test/Mftf/Test/AdminAddImageToWYSIWYGBlockTest.xml index 03edc69e6d625..5baf75d43c53f 100644 --- a/app/code/Magento/Cms/Test/Mftf/Test/AdminAddImageToWYSIWYGBlockTest.xml +++ b/app/code/Magento/Cms/Test/Mftf/Test/AdminAddImageToWYSIWYGBlockTest.xml @@ -16,6 +16,9 @@ <description value="Admin should be able to add image to WYSIWYG content of Block"/> <severity value="CRITICAL"/> <testCaseId value="MAGETWO-84376"/> + <skip> + <issueId value="MC-17232"/> + </skip> </annotations> <before> <createData entity="_defaultCmsPage" stepKey="createCMSPage" /> diff --git a/app/code/Magento/Cms/Test/Mftf/Test/AdminAddImageToWYSIWYGCMSTest.xml b/app/code/Magento/Cms/Test/Mftf/Test/AdminAddImageToWYSIWYGCMSTest.xml index 205850f888797..e63a6be51bcc0 100644 --- a/app/code/Magento/Cms/Test/Mftf/Test/AdminAddImageToWYSIWYGCMSTest.xml +++ b/app/code/Magento/Cms/Test/Mftf/Test/AdminAddImageToWYSIWYGCMSTest.xml @@ -16,6 +16,9 @@ <description value="Admin should be able to add image to WYSIWYG content of CMS Page"/> <severity value="CRITICAL"/> <testCaseId value="MAGETWO-85825"/> + <skip> + <issueId value="MC-17232"/> + </skip> </annotations> <before> <createData entity="_defaultCmsPage" stepKey="createCMSPage" /> diff --git a/app/code/Magento/Config/Test/Mftf/ActionGroup/AdminSaveConfigActionGroup.xml b/app/code/Magento/Config/Test/Mftf/ActionGroup/AdminSaveConfigActionGroup.xml new file mode 100644 index 0000000000000..6ed0cfe95cb94 --- /dev/null +++ b/app/code/Magento/Config/Test/Mftf/ActionGroup/AdminSaveConfigActionGroup.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> + +<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd"> + <actionGroup name="AdminSaveConfigActionGroup"> + <click selector="{{AdminConfigSection.saveButton}}" stepKey="clickSaveConfigBtn"/> + <waitForPageLoad stepKey="waitForPageLoad"/> + <see selector="{{AdminCategoryMessagesSection.SuccessMessage}}" userInput="You saved the configuration." stepKey="seeSuccessMessage"/> + </actionGroup> +</actionGroups> diff --git a/app/code/Magento/ConfigurableProduct/Test/Mftf/ActionGroup/StorefrontAddConfigurableProductToTheCartActionGroup.xml b/app/code/Magento/ConfigurableProduct/Test/Mftf/ActionGroup/StorefrontAddConfigurableProductToTheCartActionGroup.xml index 9e3935501adee..380ffb1d0c781 100644 --- a/app/code/Magento/ConfigurableProduct/Test/Mftf/ActionGroup/StorefrontAddConfigurableProductToTheCartActionGroup.xml +++ b/app/code/Magento/ConfigurableProduct/Test/Mftf/ActionGroup/StorefrontAddConfigurableProductToTheCartActionGroup.xml @@ -21,6 +21,7 @@ <fillField selector="{{StorefrontProductPageSection.qtyInput}}" userInput="{{qty}}" stepKey="fillProductQuantity"/> <click selector="{{StorefrontProductActionSection.addToCart}}" stepKey="clickOnAddToCartButton"/> <waitForPageLoad stepKey="waitForProductToAddInCart"/> + <waitForElementVisible selector="{{StorefrontMessagesSection.success}}" stepKey="waitForSuccessMessage"/> <seeElement selector="{{StorefrontProductPageSection.successMsg}}" stepKey="seeSuccessSaveMessage"/> </actionGroup> </actionGroups> \ No newline at end of file diff --git a/app/code/Magento/ConfigurableProduct/Test/Mftf/Test/AdminConfigurableProductUpdateTest.xml b/app/code/Magento/ConfigurableProduct/Test/Mftf/Test/AdminConfigurableProductUpdateTest.xml index 39aa516077c56..1791fc002ab95 100644 --- a/app/code/Magento/ConfigurableProduct/Test/Mftf/Test/AdminConfigurableProductUpdateTest.xml +++ b/app/code/Magento/ConfigurableProduct/Test/Mftf/Test/AdminConfigurableProductUpdateTest.xml @@ -17,6 +17,9 @@ <testCaseId value="MC-88"/> <group value="ConfigurableProduct"/> <severity value="AVERAGE"/> + <skip> + <issueId value="MC-17140"/> + </skip> </annotations> <before> diff --git a/app/code/Magento/ConfigurableProduct/Test/Mftf/Test/StorefrontConfigurableProductCategoryViewChildOnlyTest.xml b/app/code/Magento/ConfigurableProduct/Test/Mftf/Test/StorefrontConfigurableProductCategoryViewChildOnlyTest.xml index 1959551f8de2d..ac468fc92e4db 100644 --- a/app/code/Magento/ConfigurableProduct/Test/Mftf/Test/StorefrontConfigurableProductCategoryViewChildOnlyTest.xml +++ b/app/code/Magento/ConfigurableProduct/Test/Mftf/Test/StorefrontConfigurableProductCategoryViewChildOnlyTest.xml @@ -17,6 +17,9 @@ <severity value="CRITICAL"/> <testCaseId value="MC-5832"/> <group value="ConfigurableProduct"/> + <skip> + <issueId value="MC-17140"/> + </skip> </annotations> <before> <!-- Create the category --> diff --git a/app/code/Magento/Customer/Controller/Account/CreatePassword.php b/app/code/Magento/Customer/Controller/Account/CreatePassword.php index 124ac912a7ccf..d12ec57d3c339 100644 --- a/app/code/Magento/Customer/Controller/Account/CreatePassword.php +++ b/app/code/Magento/Customer/Controller/Account/CreatePassword.php @@ -3,13 +3,17 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types=1); + namespace Magento\Customer\Controller\Account; use Magento\Customer\Api\AccountManagementInterface; +use Magento\Customer\Model\ForgotPasswordToken\ConfirmCustomerByToken; use Magento\Customer\Model\Session; use Magento\Framework\App\Action\HttpGetActionInterface; use Magento\Framework\View\Result\PageFactory; use Magento\Framework\App\Action\Context; +use Magento\Framework\App\ObjectManager; /** * Class CreatePassword @@ -34,20 +38,30 @@ class CreatePassword extends \Magento\Customer\Controller\AbstractAccount implem protected $resultPageFactory; /** - * @param Context $context - * @param Session $customerSession - * @param PageFactory $resultPageFactory - * @param AccountManagementInterface $accountManagement + * @var \Magento\Customer\Model\ForgotPasswordToken\ConfirmCustomerByToken + */ + private $confirmByToken; + + /** + * @param \Magento\Framework\App\Action\Context $context + * @param \Magento\Customer\Model\Session $customerSession + * @param \Magento\Framework\View\Result\PageFactory $resultPageFactory + * @param \Magento\Customer\Api\AccountManagementInterface $accountManagement + * @param \Magento\Customer\Model\ForgotPasswordToken\ConfirmCustomerByToken $confirmByToken */ public function __construct( Context $context, Session $customerSession, PageFactory $resultPageFactory, - AccountManagementInterface $accountManagement + AccountManagementInterface $accountManagement, + ConfirmCustomerByToken $confirmByToken = null ) { $this->session = $customerSession; $this->resultPageFactory = $resultPageFactory; $this->accountManagement = $accountManagement; + $this->confirmByToken = $confirmByToken + ?? ObjectManager::getInstance()->get(ConfirmCustomerByToken::class); + parent::__construct($context); } @@ -67,6 +81,8 @@ public function execute() try { $this->accountManagement->validateResetPasswordLinkToken(null, $resetPasswordToken); + $this->confirmByToken->execute($resetPasswordToken); + if ($isDirectLink) { $this->session->setRpToken($resetPasswordToken); $resultRedirect = $this->resultRedirectFactory->create(); @@ -77,16 +93,17 @@ public function execute() /** @var \Magento\Framework\View\Result\Page $resultPage */ $resultPage = $this->resultPageFactory->create(); $resultPage->getLayout() - ->getBlock('resetPassword') - ->setResetPasswordLinkToken($resetPasswordToken); + ->getBlock('resetPassword') + ->setResetPasswordLinkToken($resetPasswordToken); return $resultPage; } } catch (\Exception $exception) { - $this->messageManager->addError(__('Your password reset link has expired.')); + $this->messageManager->addErrorMessage(__('Your password reset link has expired.')); /** @var \Magento\Framework\Controller\Result\Redirect $resultRedirect */ $resultRedirect = $this->resultRedirectFactory->create(); $resultRedirect->setPath('*/*/forgotpassword'); + return $resultRedirect; } } diff --git a/app/code/Magento/Customer/Model/AccountManagement.php b/app/code/Magento/Customer/Model/AccountManagement.php index 8439a3f2308c2..15d98af86b72e 100644 --- a/app/code/Magento/Customer/Model/AccountManagement.php +++ b/app/code/Magento/Customer/Model/AccountManagement.php @@ -17,6 +17,7 @@ use Magento\Customer\Model\Config\Share as ConfigShare; use Magento\Customer\Model\Customer as CustomerModel; use Magento\Customer\Model\Customer\CredentialsValidator; +use Magento\Customer\Model\ForgotPasswordToken\GetCustomerByToken; use Magento\Customer\Model\Metadata\Validator; use Magento\Customer\Model\ResourceModel\Visitor\CollectionFactory; use Magento\Directory\Model\AllowedCountries; @@ -44,7 +45,6 @@ use Magento\Framework\Intl\DateTimeFactory; use Magento\Framework\Mail\Template\TransportBuilder; use Magento\Framework\Math\Random; -use Magento\Framework\Phrase; use Magento\Framework\Reflection\DataObjectProcessor; use Magento\Framework\Registry; use Magento\Framework\Session\SaveHandlerInterface; @@ -345,6 +345,11 @@ class AccountManagement implements AccountManagementInterface */ private $allowedCountriesReader; + /** + * @var GetCustomerByToken + */ + private $getByToken; + /** * @param CustomerFactory $customerFactory * @param ManagerInterface $eventManager @@ -377,10 +382,12 @@ class AccountManagement implements AccountManagementInterface * @param CollectionFactory|null $visitorCollectionFactory * @param SearchCriteriaBuilder|null $searchCriteriaBuilder * @param AddressRegistry|null $addressRegistry + * @param GetCustomerByToken|null $getByToken * @param AllowedCountries|null $allowedCountriesReader + * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.ExcessiveParameterList) * @SuppressWarnings(PHPMD.NPathComplexity) - * @SuppressWarnings(PHPMD.CyclomaticComplexity) + * @SuppressWarnings(PHPMD.LongVariable) */ public function __construct( CustomerFactory $customerFactory, @@ -414,6 +421,7 @@ public function __construct( CollectionFactory $visitorCollectionFactory = null, SearchCriteriaBuilder $searchCriteriaBuilder = null, AddressRegistry $addressRegistry = null, + GetCustomerByToken $getByToken = null, AllowedCountries $allowedCountriesReader = null ) { $this->customerFactory = $customerFactory; @@ -439,23 +447,26 @@ public function __construct( $this->customerModel = $customerModel; $this->objectFactory = $objectFactory; $this->extensibleDataObjectConverter = $extensibleDataObjectConverter; + $objectManager = ObjectManager::getInstance(); $this->credentialsValidator = - $credentialsValidator ?: ObjectManager::getInstance()->get(CredentialsValidator::class); - $this->dateTimeFactory = $dateTimeFactory ?: ObjectManager::getInstance()->get(DateTimeFactory::class); - $this->accountConfirmation = $accountConfirmation ?: ObjectManager::getInstance() + $credentialsValidator ?: $objectManager->get(CredentialsValidator::class); + $this->dateTimeFactory = $dateTimeFactory ?: $objectManager->get(DateTimeFactory::class); + $this->accountConfirmation = $accountConfirmation ?: $objectManager ->get(AccountConfirmation::class); $this->sessionManager = $sessionManager - ?: ObjectManager::getInstance()->get(SessionManagerInterface::class); + ?: $objectManager->get(SessionManagerInterface::class); $this->saveHandler = $saveHandler - ?: ObjectManager::getInstance()->get(SaveHandlerInterface::class); + ?: $objectManager->get(SaveHandlerInterface::class); $this->visitorCollectionFactory = $visitorCollectionFactory - ?: ObjectManager::getInstance()->get(CollectionFactory::class); + ?: $objectManager->get(CollectionFactory::class); $this->searchCriteriaBuilder = $searchCriteriaBuilder - ?: ObjectManager::getInstance()->get(SearchCriteriaBuilder::class); + ?: $objectManager->get(SearchCriteriaBuilder::class); $this->addressRegistry = $addressRegistry - ?: ObjectManager::getInstance()->get(AddressRegistry::class); + ?: $objectManager->get(AddressRegistry::class); + $this->getByToken = $getByToken + ?: $objectManager->get(GetCustomerByToken::class); $this->allowedCountriesReader = $allowedCountriesReader - ?: ObjectManager::getInstance()->get(AllowedCountries::class); + ?: $objectManager->get(AllowedCountries::class); } /** @@ -521,8 +532,11 @@ public function activateById($customerId, $confirmationKey) * @param \Magento\Customer\Api\Data\CustomerInterface $customer * @param string $confirmationKey * @return \Magento\Customer\Api\Data\CustomerInterface - * @throws \Magento\Framework\Exception\State\InvalidTransitionException - * @throws \Magento\Framework\Exception\State\InputMismatchException + * @throws InputException + * @throws InputMismatchException + * @throws InvalidTransitionException + * @throws LocalizedException + * @throws NoSuchEntityException */ private function activateCustomer($customer, $confirmationKey) { @@ -630,42 +644,6 @@ public function initiatePasswordReset($email, $template, $websiteId = null) return false; } - /** - * Match a customer by their RP token. - * - * @param string $rpToken - * @throws ExpiredException - * @throws NoSuchEntityException - * @return CustomerInterface - * @throws LocalizedException - */ - private function matchCustomerByRpToken(string $rpToken): CustomerInterface - { - $this->searchCriteriaBuilder->addFilter( - 'rp_token', - $rpToken - ); - $this->searchCriteriaBuilder->setPageSize(1); - $found = $this->customerRepository->getList( - $this->searchCriteriaBuilder->create() - ); - if ($found->getTotalCount() > 1) { - //Failed to generated unique RP token - throw new ExpiredException( - new Phrase('Reset password token expired.') - ); - } - if ($found->getTotalCount() === 0) { - //Customer with such token not found. - throw NoSuchEntityException::singleField( - 'rp_token', - $rpToken - ); - } - //Unique customer found. - return $found->getItems()[0]; - } - /** * Handle not supported template * @@ -674,15 +652,17 @@ private function matchCustomerByRpToken(string $rpToken): CustomerInterface */ private function handleUnknownTemplate($template) { - throw new InputException(__( - 'Invalid value of "%value" provided for the %fieldName field. Possible values: %template1 or %template2.', - [ - 'value' => $template, - 'fieldName' => 'template', - 'template1' => AccountManagement::EMAIL_REMINDER, - 'template2' => AccountManagement::EMAIL_RESET - ] - )); + throw new InputException( + __( + 'Invalid value of "%value" provided for the %fieldName field. Possible values: %template1 or %template2.', + [ + 'value' => $template, + 'fieldName' => 'template', + 'template1' => AccountManagement::EMAIL_REMINDER, + 'template2' => AccountManagement::EMAIL_RESET + ] + ) + ); } /** @@ -691,7 +671,7 @@ private function handleUnknownTemplate($template) public function resetPassword($email, $resetToken, $newPassword) { if (!$email) { - $customer = $this->matchCustomerByRpToken($resetToken); + $customer = $this->getByToken->execute($resetToken); $email = $customer->getEmail(); } else { $customer = $this->customerRepository->get($email); @@ -830,6 +810,8 @@ public function getConfirmationStatus($customerId) /** * @inheritdoc + * + * @throws LocalizedException */ public function createAccount(CustomerInterface $customer, $password = null, $redirectUrl = '') { @@ -852,6 +834,8 @@ public function createAccount(CustomerInterface $customer, $password = null, $re /** * @inheritdoc + * + * @throws InputMismatchException * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) */ @@ -987,6 +971,8 @@ protected function sendEmailConfirmation(CustomerInterface $customer, $redirectU /** * @inheritdoc + * + * @throws InvalidEmailOrPasswordException */ public function changePassword($email, $currentPassword, $newPassword) { @@ -1000,6 +986,8 @@ public function changePassword($email, $currentPassword, $newPassword) /** * @inheritdoc + * + * @throws InvalidEmailOrPasswordException */ public function changePasswordById($customerId, $currentPassword, $newPassword) { @@ -1137,12 +1125,14 @@ public function isCustomerInStore($customerWebsiteId, $storeId) * * @param int $customerId * @param string $resetPasswordLinkToken + * * @return bool - * @throws \Magento\Framework\Exception\State\InputMismatchException If token is mismatched - * @throws \Magento\Framework\Exception\State\ExpiredException If token is expired - * @throws \Magento\Framework\Exception\InputException If token or customer id is invalid - * @throws \Magento\Framework\Exception\NoSuchEntityException If customer doesn't exist + * @throws ExpiredException If token is expired + * @throws InputException If token or customer id is invalid + * @throws InputMismatchException If token is mismatched * @throws LocalizedException + * @throws NoSuchEntityException If customer doesn't exist + * @SuppressWarnings(PHPMD.LongVariable) */ private function validateResetPasswordToken($customerId, $resetPasswordLinkToken) { @@ -1157,7 +1147,8 @@ private function validateResetPasswordToken($customerId, $resetPasswordLinkToken if ($customerId === null) { //Looking for the customer. - $customerId = $this->matchCustomerByRpToken($resetPasswordLinkToken) + $customerId = $this->getByToken + ->execute($resetPasswordLinkToken) ->getId(); } if (!is_string($resetPasswordLinkToken) || empty($resetPasswordLinkToken)) { @@ -1325,13 +1316,20 @@ protected function sendEmailTemplate( } $transport = $this->transportBuilder->setTemplateIdentifier($templateId) - ->setTemplateOptions(['area' => Area::AREA_FRONTEND, 'store' => $storeId]) + ->setTemplateOptions( + [ + 'area' => Area::AREA_FRONTEND, + 'store' => $storeId + ] + ) ->setTemplateVars($templateParams) - ->setFrom($this->scopeConfig->getValue( - $sender, - ScopeInterface::SCOPE_STORE, - $storeId - )) + ->setFrom( + $this->scopeConfig->getValue( + $sender, + ScopeInterface::SCOPE_STORE, + $storeId + ) + ) ->addTo($email, $this->customerViewHelper->getCustomerName($customer)) ->getTransport(); diff --git a/app/code/Magento/Customer/Model/CustomerAuthUpdate.php b/app/code/Magento/Customer/Model/CustomerAuthUpdate.php index 06de649524e71..bc9bffb6ffdf0 100644 --- a/app/code/Magento/Customer/Model/CustomerAuthUpdate.php +++ b/app/code/Magento/Customer/Model/CustomerAuthUpdate.php @@ -6,31 +6,43 @@ namespace Magento\Customer\Model; +use Magento\Customer\Model\ResourceModel\Customer as CustomerResourceModel; +use Magento\Framework\App\ObjectManager; +use Magento\Framework\Exception\NoSuchEntityException; + /** * Customer Authentication update model. */ class CustomerAuthUpdate { /** - * @var \Magento\Customer\Model\CustomerRegistry + * @var CustomerRegistry */ protected $customerRegistry; /** - * @var \Magento\Customer\Model\ResourceModel\Customer + * @var CustomerResourceModel */ protected $customerResourceModel; /** - * @param \Magento\Customer\Model\CustomerRegistry $customerRegistry - * @param \Magento\Customer\Model\ResourceModel\Customer $customerResourceModel + * @var Customer + */ + private $customerModel; + + /** + * @param CustomerRegistry $customerRegistry + * @param CustomerResourceModel $customerResourceModel + * @param Customer|null $customerModel */ public function __construct( - \Magento\Customer\Model\CustomerRegistry $customerRegistry, - \Magento\Customer\Model\ResourceModel\Customer $customerResourceModel + CustomerRegistry $customerRegistry, + CustomerResourceModel $customerResourceModel, + Customer $customerModel = null ) { $this->customerRegistry = $customerRegistry; $this->customerResourceModel = $customerResourceModel; + $this->customerModel = $customerModel ?: ObjectManager::getInstance()->get(Customer::class); } /** @@ -38,21 +50,30 @@ public function __construct( * * @param int $customerId * @return $this + * @throws NoSuchEntityException */ public function saveAuth($customerId) { $customerSecure = $this->customerRegistry->retrieveSecureData($customerId); + $this->customerResourceModel->load($this->customerModel, $customerId); + $currentLockExpiresVal = $this->customerModel->getData('lock_expires'); + $newLockExpiresVal = $customerSecure->getData('lock_expires'); + $this->customerResourceModel->getConnection()->update( $this->customerResourceModel->getTable('customer_entity'), [ 'failures_num' => $customerSecure->getData('failures_num'), 'first_failure' => $customerSecure->getData('first_failure'), - 'lock_expires' => $customerSecure->getData('lock_expires'), + 'lock_expires' => $newLockExpiresVal, ], $this->customerResourceModel->getConnection()->quoteInto('entity_id = ?', $customerId) ); + if ($currentLockExpiresVal !== $newLockExpiresVal) { + $this->customerModel->reindex(); + } + return $this; } } diff --git a/app/code/Magento/Customer/Model/ForgotPasswordToken/ConfirmCustomerByToken.php b/app/code/Magento/Customer/Model/ForgotPasswordToken/ConfirmCustomerByToken.php new file mode 100644 index 0000000000000..6aadc814a4b9b --- /dev/null +++ b/app/code/Magento/Customer/Model/ForgotPasswordToken/ConfirmCustomerByToken.php @@ -0,0 +1,58 @@ +<?php +/** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +declare(strict_types=1); + +namespace Magento\Customer\Model\ForgotPasswordToken; + +use Magento\Customer\Api\CustomerRepositoryInterface; + +/** + * Confirm customer by reset password token + */ +class ConfirmCustomerByToken +{ + /** + * @var GetCustomerByToken + */ + private $getByToken; + + /** + * @var CustomerRepositoryInterface + */ + private $customerRepository; + + /** + * ConfirmByToken constructor. + * + * @param GetCustomerByToken $getByToken + * @param CustomerRepositoryInterface $customerRepository + */ + public function __construct( + GetCustomerByToken $getByToken, + CustomerRepositoryInterface $customerRepository + ) { + $this->getByToken = $getByToken; + $this->customerRepository = $customerRepository; + } + + /** + * Confirm customer account my rp_token + * + * @param string $resetPasswordToken + * + * @return void + * @throws \Magento\Framework\Exception\LocalizedException + */ + public function execute(string $resetPasswordToken): void + { + $customer = $this->getByToken->execute($resetPasswordToken); + if ($customer->getConfirmation()) { + $this->customerRepository->save( + $customer->setConfirmation(null) + ); + } + } +} diff --git a/app/code/Magento/Customer/Model/ForgotPasswordToken/GetCustomerByToken.php b/app/code/Magento/Customer/Model/ForgotPasswordToken/GetCustomerByToken.php new file mode 100644 index 0000000000000..09af4e296bd92 --- /dev/null +++ b/app/code/Magento/Customer/Model/ForgotPasswordToken/GetCustomerByToken.php @@ -0,0 +1,89 @@ +<?php +/** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +declare(strict_types=1); + +namespace Magento\Customer\Model\ForgotPasswordToken; + +use Magento\Customer\Api\CustomerRepositoryInterface; +use Magento\Customer\Api\Data\CustomerInterface; +use Magento\Framework\Api\SearchCriteriaBuilder; +use Magento\Framework\Exception\NoSuchEntityException; +use Magento\Framework\Exception\State\ExpiredException; +use Magento\Framework\Phrase; + +/** + * Get Customer By reset password token + * @SuppressWarnings(PHPMD.LongVariable) + */ +class GetCustomerByToken +{ + /** + * @var \Magento\Customer\Api\CustomerRepositoryInterface + */ + private $customerRepository; + + /** + * @var \Magento\Framework\Api\SearchCriteriaBuilder + */ + private $searchCriteriaBuilder; + + /** + * ForgotPassword constructor. + * + * @param \Magento\Customer\Api\CustomerRepositoryInterface $customerRepository + * @param \Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder + */ + public function __construct( + CustomerRepositoryInterface $customerRepository, + SearchCriteriaBuilder $searchCriteriaBuilder + ) { + $this->customerRepository = $customerRepository; + $this->searchCriteriaBuilder = $searchCriteriaBuilder; + } + + /** + * Get customer by rp_token + * + * @param string $resetPasswordToken + * + * @return \Magento\Customer\Api\Data\CustomerInterface + * @throws ExpiredException + * @throws NoSuchEntityException + * @throws \Magento\Framework\Exception\LocalizedException + */ + public function execute(string $resetPasswordToken):CustomerInterface + { + $this->searchCriteriaBuilder->addFilter( + 'rp_token', + $resetPasswordToken + ); + $this->searchCriteriaBuilder->setPageSize(1); + $found = $this->customerRepository->getList( + $this->searchCriteriaBuilder->create() + ); + + if ($found->getTotalCount() > 1) { + //Failed to generated unique RP token + throw new ExpiredException( + new Phrase('Reset password token expired.') + ); + } + if ($found->getTotalCount() === 0) { + //Customer with such token not found. + new NoSuchEntityException( + new Phrase( + 'No such entity with rp_token = %value', + [ + 'value' => $resetPasswordToken + ] + ) + ); + } + + //Unique customer found. + return $found->getItems()[0]; + } +} diff --git a/app/code/Magento/Customer/Model/ResourceModel/Customer.php b/app/code/Magento/Customer/Model/ResourceModel/Customer.php index 2eb1ef897e70e..94196df6fe093 100644 --- a/app/code/Magento/Customer/Model/ResourceModel/Customer.php +++ b/app/code/Magento/Customer/Model/ResourceModel/Customer.php @@ -95,9 +95,12 @@ protected function _getDefaultAttributes() /** * Check customer scope, email and confirmation key before saving * - * @param \Magento\Framework\DataObject $customer + * @param \Magento\Framework\DataObject|\Magento\Customer\Api\Data\CustomerInterface $customer + * * @return $this - * @throws \Magento\Framework\Exception\LocalizedException + * @throws AlreadyExistsException + * @throws ValidatorException + * @throws \Magento\Framework\Exception\NoSuchEntityException * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) */ @@ -141,9 +144,7 @@ protected function _beforeSave(\Magento\Framework\DataObject $customer) } // set confirmation key logic - if ($customer->getForceConfirmed() || $customer->getPasswordHash() == '') { - $customer->setConfirmation(null); - } elseif (!$customer->getId() && $customer->isConfirmationRequired()) { + if (!$customer->getId() && $customer->isConfirmationRequired()) { $customer->setConfirmation($customer->getRandomConfirmationKey()); } // remove customer confirmation key from database, if empty @@ -163,7 +164,7 @@ protected function _beforeSave(\Magento\Framework\DataObject $customer) * * @param \Magento\Customer\Model\Customer $customer * @return void - * @throws \Magento\Framework\Validator\Exception + * @throws ValidatorException */ protected function _validate($customer) { diff --git a/app/code/Magento/Customer/Test/Mftf/Test/ChangeCustomerGroupTest.xml b/app/code/Magento/Customer/Test/Mftf/Test/ChangeCustomerGroupTest.xml index fb083f39ad387..e35a1ad61dc7c 100644 --- a/app/code/Magento/Customer/Test/Mftf/Test/ChangeCustomerGroupTest.xml +++ b/app/code/Magento/Customer/Test/Mftf/Test/ChangeCustomerGroupTest.xml @@ -67,6 +67,9 @@ <stories value="Change Customer Group"/> <group value="customer"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-17140"/> + </skip> </annotations> <remove keyForRemoval="filterCustomer"/> diff --git a/app/code/Magento/Customer/Test/Mftf/Test/EndToEndB2CLoggedInUserTest.xml b/app/code/Magento/Customer/Test/Mftf/Test/EndToEndB2CLoggedInUserTest.xml index 901018c2fd074..2b24233e8b072 100644 --- a/app/code/Magento/Customer/Test/Mftf/Test/EndToEndB2CLoggedInUserTest.xml +++ b/app/code/Magento/Customer/Test/Mftf/Test/EndToEndB2CLoggedInUserTest.xml @@ -17,6 +17,9 @@ <description value="New user signup and browses catalog, searches for product, adds product to cart, adds product to wishlist, compares products, uses coupon code and checks out."/> <severity value="CRITICAL"/> <testCaseId value="MAGETWO-87653"/> + <skip> + <issueId value="MC-17140"/> + </skip> </annotations> <before> <resetCookie userInput="PHPSESSID" stepKey="resetCookieForCart"/> diff --git a/app/code/Magento/Customer/Test/Mftf/Test/StorefrontCheckTaxAddingValidVATIdTest.xml b/app/code/Magento/Customer/Test/Mftf/Test/StorefrontCheckTaxAddingValidVATIdTest.xml index ab805193854b0..0cba9159dd5ac 100644 --- a/app/code/Magento/Customer/Test/Mftf/Test/StorefrontCheckTaxAddingValidVATIdTest.xml +++ b/app/code/Magento/Customer/Test/Mftf/Test/StorefrontCheckTaxAddingValidVATIdTest.xml @@ -17,6 +17,9 @@ <severity value="MAJOR"/> <testCaseId value="MAGETWO-95028"/> <group value="customer"/> + <skip> + <issueId value="MC-16684"/> + </skip> </annotations> <before> <!--Log In--> @@ -83,6 +86,7 @@ <!--Add a product to the cart--> <click selector="{{StorefrontProductActionSection.addToCart}}" stepKey="addProductToCart"/> <waitForPageLoad stepKey="waitForAddProductToCart"/> + <waitForElementVisible selector="{{StorefrontMessagesSection.success}}" stepKey="waitForSuccessMessage"/> <!--Proceed to checkout--> <actionGroup ref="GoToCheckoutFromMinicartActionGroup" stepKey="GoToCheckoutFromMinicartActionGroup"/> <!-- Click next button to open payment section --> diff --git a/app/code/Magento/Customer/Test/Unit/Model/CustomerAuthUpdateTest.php b/app/code/Magento/Customer/Test/Unit/Model/CustomerAuthUpdateTest.php index a1a243066bb7d..81a612c519f52 100644 --- a/app/code/Magento/Customer/Test/Unit/Model/CustomerAuthUpdateTest.php +++ b/app/code/Magento/Customer/Test/Unit/Model/CustomerAuthUpdateTest.php @@ -5,7 +5,14 @@ */ namespace Magento\Customer\Test\Unit\Model; +use Magento\Customer\Model\Customer as CustomerModel; use Magento\Customer\Model\CustomerAuthUpdate; +use Magento\Customer\Model\CustomerRegistry; +use Magento\Customer\Model\Data\CustomerSecure; +use Magento\Customer\Model\ResourceModel\Customer as CustomerResourceModel; +use Magento\Framework\DB\Adapter\AdapterInterface; +use Magento\Framework\Exception\NoSuchEntityException; +use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; /** * Class CustomerAuthUpdateTest @@ -18,17 +25,22 @@ class CustomerAuthUpdateTest extends \PHPUnit\Framework\TestCase protected $model; /** - * @var \Magento\Customer\Model\CustomerRegistry|\PHPUnit_Framework_MockObject_MockObject + * @var CustomerRegistry|\PHPUnit_Framework_MockObject_MockObject */ protected $customerRegistry; /** - * @var \Magento\Customer\Model\ResourceModel\Customer|\PHPUnit_Framework_MockObject_MockObject + * @var CustomerResourceModel|\PHPUnit_Framework_MockObject_MockObject */ protected $customerResourceModel; /** - * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager + * @var CustomerModel|\PHPUnit_Framework_MockObject_MockObject + */ + protected $customerModel; + + /** + * @var ObjectManager */ protected $objectManager; @@ -37,32 +49,36 @@ class CustomerAuthUpdateTest extends \PHPUnit\Framework\TestCase */ protected function setUp() { - $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + $this->objectManager = new ObjectManager($this); $this->customerRegistry = - $this->createMock(\Magento\Customer\Model\CustomerRegistry::class); + $this->createMock(CustomerRegistry::class); $this->customerResourceModel = - $this->createMock(\Magento\Customer\Model\ResourceModel\Customer::class); + $this->createMock(CustomerResourceModel::class); + $this->customerModel = + $this->createMock(CustomerModel::class); $this->model = $this->objectManager->getObject( - \Magento\Customer\Model\CustomerAuthUpdate::class, + CustomerAuthUpdate::class, [ 'customerRegistry' => $this->customerRegistry, 'customerResourceModel' => $this->customerResourceModel, + 'customerModel' => $this->customerModel ] ); } /** * test SaveAuth + * @throws NoSuchEntityException */ public function testSaveAuth() { $customerId = 1; - $customerSecureMock = $this->createMock(\Magento\Customer\Model\Data\CustomerSecure::class); + $customerSecureMock = $this->createMock(CustomerSecure::class); - $dbAdapter = $this->createMock(\Magento\Framework\DB\Adapter\AdapterInterface::class); + $dbAdapter = $this->createMock(AdapterInterface::class); $this->customerRegistry->expects($this->once()) ->method('retrieveSecureData') @@ -98,6 +114,9 @@ public function testSaveAuth() $customerId ); + $this->customerModel->expects($this->once()) + ->method('reindex'); + $this->model->saveAuth($customerId); } } diff --git a/app/code/Magento/Directory/Block/Data.php b/app/code/Magento/Directory/Block/Data.php index 333e9e03706b9..d4c46469e4771 100644 --- a/app/code/Magento/Directory/Block/Data.php +++ b/app/code/Magento/Directory/Block/Data.php @@ -3,6 +3,8 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types=1); + namespace Magento\Directory\Block; /** @@ -173,10 +175,33 @@ public function getRegionCollection() * Returns region html select * * @return string + * @deprecated + * @see getRegionSelect() method for more configurations */ public function getRegionHtmlSelect() { + return $this->getRegionSelect(); + } + + /** + * Returns region html select + * + * @param null|int $value + * @param string $name + * @param string $id + * @param string $title + * @return string + */ + public function getRegionSelect( + ?int $value = null, + string $name = 'region', + string $id = 'state', + string $title = 'State/Province' + ): string { \Magento\Framework\Profiler::start('TEST: ' . __METHOD__, ['group' => 'TEST', 'method' => __METHOD__]); + if ($value === null) { + $value = (int)$this->getRegionId(); + } $cacheKey = 'DIRECTORY_REGION_SELECT_STORE' . $this->_storeManager->getStore()->getId(); $cache = $this->_configCacheType->load($cacheKey); if ($cache) { @@ -188,15 +213,15 @@ public function getRegionHtmlSelect() $html = $this->getLayout()->createBlock( \Magento\Framework\View\Element\Html\Select::class )->setName( - 'region' + $name )->setTitle( - __('State/Province') + __($title) )->setId( - 'state' + $id )->setClass( 'required-entry validate-state' )->setValue( - (int)$this->getRegionId() + $value )->setOptions( $options )->getHtml(); diff --git a/app/code/Magento/Eav/Model/Validator/Attribute/Code.php b/app/code/Magento/Eav/Model/Validator/Attribute/Code.php index f3ee37721b8ce..6447507ea175a 100644 --- a/app/code/Magento/Eav/Model/Validator/Attribute/Code.php +++ b/app/code/Magento/Eav/Model/Validator/Attribute/Code.php @@ -7,6 +7,7 @@ namespace Magento\Eav\Model\Validator\Attribute; +use Magento\Catalog\Ui\DataProvider\Product\Form\Modifier\AbstractModifier; use Magento\Eav\Model\Entity\Attribute; use Magento\Framework\Exception\LocalizedException; use Magento\Framework\Validator\AbstractValidator; @@ -65,6 +66,16 @@ public function isValid($attributeCode): bool ); } + /** + * Check attribute_code for prohibited prefix + */ + if (strpos($attributeCode, AbstractModifier::CONTAINER_PREFIX) === 0) { + $errorMessages[] = __( + '"%1" prefix is reserved by the system and cannot be used in attribute code names.', + AbstractModifier::CONTAINER_PREFIX + ); + } + $this->_addMessages($errorMessages); return !$this->hasMessages(); diff --git a/app/code/Magento/Eav/Test/Unit/Model/Validator/Attribute/CodeTest.php b/app/code/Magento/Eav/Test/Unit/Model/Validator/Attribute/CodeTest.php index 9db290bcba3e1..7216fad0ae70b 100644 --- a/app/code/Magento/Eav/Test/Unit/Model/Validator/Attribute/CodeTest.php +++ b/app/code/Magento/Eav/Test/Unit/Model/Validator/Attribute/CodeTest.php @@ -61,7 +61,10 @@ public function isValidDataProvider(): array ], [ 'more_than_60_chars_more_than_60_chars_more_than_60_chars_more', false - ] + ], [ + 'container_attribute', + false, + ], ]; } } diff --git a/app/code/Magento/Elasticsearch/etc/search_engine.xml b/app/code/Magento/Elasticsearch/etc/search_engine.xml index 34b6432b15c03..51af3038b9c8d 100644 --- a/app/code/Magento/Elasticsearch/etc/search_engine.xml +++ b/app/code/Magento/Elasticsearch/etc/search_engine.xml @@ -9,4 +9,7 @@ <engine name="elasticsearch"> <feature name="synonyms" support="true" /> </engine> + <engine name="elasticsearch5"> + <feature name="synonyms" support="true" /> + </engine> </engines> diff --git a/app/code/Magento/Elasticsearch6/etc/search_engine.xml b/app/code/Magento/Elasticsearch6/etc/search_engine.xml new file mode 100644 index 0000000000000..40bc69bfd8298 --- /dev/null +++ b/app/code/Magento/Elasticsearch6/etc/search_engine.xml @@ -0,0 +1,12 @@ +<?xml version="1.0"?> +<!-- +/** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<engines xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Search/etc/search_engine.xsd"> + <engine name="elasticsearch6"> + <feature name="synonyms" support="true" /> + </engine> +</engines> diff --git a/app/code/Magento/Email/Model/AbstractTemplate.php b/app/code/Magento/Email/Model/AbstractTemplate.php index a6ecdaf24ebbb..5eae1d1462184 100644 --- a/app/code/Magento/Email/Model/AbstractTemplate.php +++ b/app/code/Magento/Email/Model/AbstractTemplate.php @@ -14,10 +14,12 @@ use Magento\Store\Model\Information as StoreInformation; use Magento\Store\Model\ScopeInterface; use Magento\Store\Model\Store; +use Magento\MediaStorage\Helper\File\Storage\Database; /** - * Template model class + * Template model class. * + * phpcs:disable Magento2.Classes.AbstractApi * @author Magento Core Team <core@magentocommerce.com> * @SuppressWarnings(PHPMD.CouplingBetweenObjects) * @SuppressWarnings(PHPMD.TooManyFields) @@ -163,6 +165,11 @@ abstract class AbstractTemplate extends AbstractModel implements TemplateTypesIn */ private $urlModel; + /** + * @var Database + */ + private $fileStorageDatabase; + /** * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\View\DesignInterface $design @@ -177,6 +184,7 @@ abstract class AbstractTemplate extends AbstractModel implements TemplateTypesIn * @param \Magento\Framework\Filter\FilterManager $filterManager * @param \Magento\Framework\UrlInterface $urlModel * @param array $data + * @param Database $fileStorageDatabase * * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ @@ -193,7 +201,8 @@ public function __construct( \Magento\Email\Model\TemplateFactory $templateFactory, \Magento\Framework\Filter\FilterManager $filterManager, \Magento\Framework\UrlInterface $urlModel, - array $data = [] + array $data = [], + Database $fileStorageDatabase = null ) { $this->design = $design; $this->area = isset($data['area']) ? $data['area'] : null; @@ -207,6 +216,8 @@ public function __construct( $this->templateFactory = $templateFactory; $this->filterManager = $filterManager; $this->urlModel = $urlModel; + $this->fileStorageDatabase = $fileStorageDatabase ?: + \Magento\Framework\App\ObjectManager::getInstance()->get(Database::class); parent::__construct($context, $registry, null, null, $data); } @@ -394,6 +405,11 @@ protected function getLogoUrl($store) if ($fileName) { $uploadDir = \Magento\Email\Model\Design\Backend\Logo::UPLOAD_DIR; $mediaDirectory = $this->filesystem->getDirectoryRead(DirectoryList::MEDIA); + if ($this->fileStorageDatabase->checkDbUsage() && + !$mediaDirectory->isFile($uploadDir . '/' . $fileName) + ) { + $this->fileStorageDatabase->saveFileToFilesystem($uploadDir . '/' . $fileName); + } if ($mediaDirectory->isFile($uploadDir . '/' . $fileName)) { return $this->storeManager->getStore()->getBaseUrl( \Magento\Framework\UrlInterface::URL_TYPE_MEDIA @@ -490,7 +506,6 @@ protected function addEmailVariables($variables, $storeId) /** * Apply design config so that emails are processed within the context of the appropriate area/store/theme. - * Can be called multiple times without issue. * * @return bool */ @@ -664,8 +679,7 @@ public function getTemplateFilter() } /** - * Save current design config and replace with design config from specified store - * Event is not dispatched. + * Save current design config and replace with design config from specified store. Event is not dispatched. * * @param null|bool|int|string $storeId * @param string $area diff --git a/app/code/Magento/Email/Test/Unit/Model/BackendTemplateTest.php b/app/code/Magento/Email/Test/Unit/Model/BackendTemplateTest.php index 31a04b0b2bbd0..1ceccd4414cc0 100644 --- a/app/code/Magento/Email/Test/Unit/Model/BackendTemplateTest.php +++ b/app/code/Magento/Email/Test/Unit/Model/BackendTemplateTest.php @@ -12,6 +12,9 @@ use Magento\Email\Model\BackendTemplate; use Magento\Framework\ObjectManagerInterface; +/** + * Tests for adminhtml email template model. + */ class BackendTemplateTest extends \PHPUnit\Framework\TestCase { /** @@ -46,6 +49,11 @@ class BackendTemplateTest extends \PHPUnit\Framework\TestCase */ private $serializerMock; + /** + * @var \Magento\MediaStorage\Helper\File\Storage\Database|\PHPUnit_Framework_MockObject_MockObject + */ + private $databaseHelperMock; + protected function setUp() { $helper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); @@ -56,6 +64,7 @@ protected function setUp() $this->structureMock = $this->createMock(\Magento\Config\Model\Config\Structure::class); $this->structureMock->expects($this->any())->method('getFieldPathsByAttribute')->willReturn(['path' => 'test']); + $this->databaseHelperMock = $this->createMock(\Magento\MediaStorage\Helper\File\Storage\Database::class); $this->resourceModelMock = $this->createMock(\Magento\Email\Model\ResourceModel\Template::class); $this->resourceModelMock->expects($this->any()) ->method('getSystemConfigByPathsAndTemplateId') @@ -64,8 +73,18 @@ protected function setUp() $objectManagerMock = $this->createMock(\Magento\Framework\ObjectManagerInterface::class); $objectManagerMock->expects($this->any()) ->method('get') - ->with(\Magento\Email\Model\ResourceModel\Template::class) - ->will($this->returnValue($this->resourceModelMock)); + ->willReturnCallback( + function ($value) { + switch ($value) { + case \Magento\MediaStorage\Helper\File\Storage\Database::class: + return ($this->databaseHelperMock); + case \Magento\Email\Model\ResourceModel\Template::class: + return ($this->resourceModelMock); + default: + return(null); + } + } + ); \Magento\Framework\App\ObjectManager::setInstance($objectManagerMock); diff --git a/app/code/Magento/Email/composer.json b/app/code/Magento/Email/composer.json index 1011b16f8537d..e887adef1fbc9 100644 --- a/app/code/Magento/Email/composer.json +++ b/app/code/Magento/Email/composer.json @@ -12,6 +12,7 @@ "magento/module-config": "*", "magento/module-store": "*", "magento/module-theme": "*", + "magento/module-media-storage": "*", "magento/module-variable": "*" }, "suggest": { diff --git a/app/code/Magento/ImportExport/Test/Mftf/Test/AdminCheckDoubleImportOfProductsTest.xml b/app/code/Magento/ImportExport/Test/Mftf/Test/AdminCheckDoubleImportOfProductsTest.xml new file mode 100644 index 0000000000000..0f2dde99b9016 --- /dev/null +++ b/app/code/Magento/ImportExport/Test/Mftf/Test/AdminCheckDoubleImportOfProductsTest.xml @@ -0,0 +1,73 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> + +<tests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd"> + <test name="AdminCheckDoubleImportOfProductsTest"> + <annotations> + <description value="Checking double Import of products CSV file"/> + <stories value="Import Products"/> + <features value="Import/Export"/> + <title value="Admin check double import of products test"/> + <severity value="CRITICAL"/> + <testCaseId value="MC-6311"/> + <group value="importExport"/> + </annotations> + <before> + <!-- Login as admin --> + <actionGroup ref="LoginAsAdmin" stepKey="loginAsAdmin"/> + + <!-- Create additional store views --> + <actionGroup ref="AdminCreateStoreViewActionGroup" stepKey="createFirstStoreView"> + <argument name="customStore" value="secondStoreView"/> + </actionGroup> + <actionGroup ref="AdminCreateStoreViewActionGroup" stepKey="createSecondStoreView"> + <argument name="customStore" value="thirdStoreView"/> + </actionGroup> + </before> + <after> + <!-- Delete all imported products --> + <actionGroup ref="AdminOpenProductIndexPageActionGroup" stepKey="openProductIndexPage"/> + <actionGroup ref="clearFiltersAdminDataGrid" stepKey="clearGridFilter"/> + <actionGroup ref="adminDataGridSelectPerPage" stepKey="selectNumberOfProductsPerPage"> + <argument name="perPage" value="100"/> + </actionGroup> + <actionGroup ref="deleteProductsIfTheyExist" stepKey="deleteAllProducts"/> + + <!-- Delete additional store views --> + <actionGroup ref="AdminDeleteStoreViewActionGroup" stepKey="deleteFirstStoreView"> + <argument name="customStore" value="secondStoreView"/> + </actionGroup> + <actionGroup ref="AdminDeleteStoreViewActionGroup" stepKey="deleteSecondStoreView"> + <argument name="customStore" value="thirdStoreView"/> + </actionGroup> + + <!-- Delete category --> + <actionGroup ref="DeleteCategory" stepKey="deleteCategory"> + <argument name="categoryEntity" value="Gear"/> + </actionGroup> + + <!-- Log out --> + <actionGroup ref="logout" stepKey="logout"/> + </after> + + <!-- Import products with add/update behavior --> + <actionGroup ref="AdminImportProductsActionGroup" stepKey="adminImportProductsFirstTime"> + <argument name="behavior" value="Add/Update"/> + <argument name="importFile" value="prepared-for-sample-data.csv"/> + <argument name="importMessage" value="Created: 100, Updated: 3, Deleted: 0"/> + </actionGroup> + + <!-- Import products with add/update behavior again --> + <actionGroup ref="AdminImportProductsActionGroup" stepKey="adminImportProductsSecondTime"> + <argument name="behavior" value="Add/Update"/> + <argument name="importFile" value="prepared-for-sample-data.csv"/> + <argument name="importMessage" value="Created: 0, Updated: 300, Deleted: 0"/> + </actionGroup> + </test> +</tests> diff --git a/app/code/Magento/Newsletter/Block/Adminhtml/Problem.php b/app/code/Magento/Newsletter/Block/Adminhtml/Problem.php index 61a17d7ad5e51..0c66e46a850ee 100644 --- a/app/code/Magento/Newsletter/Block/Adminhtml/Problem.php +++ b/app/code/Magento/Newsletter/Block/Adminhtml/Problem.php @@ -41,7 +41,7 @@ public function __construct( } /** - * @return void + * @inheritDoc * @SuppressWarnings(PHPMD.UnusedLocalVariable) */ protected function _construct() @@ -83,7 +83,7 @@ protected function _prepareLayout() /** * Get the html element for unsubscribe button * - * @return $string + * @return string */ public function getUnsubscribeButtonHtml() { @@ -93,7 +93,7 @@ public function getUnsubscribeButtonHtml() /** * Get the html element for delete button * - * @return $string + * @return string */ public function getDeleteButtonHtml() { diff --git a/app/code/Magento/Newsletter/Controller/Adminhtml/Subscriber/MassDelete.php b/app/code/Magento/Newsletter/Controller/Adminhtml/Subscriber/MassDelete.php index 7f02e4ea13445..cdef44b2da757 100644 --- a/app/code/Magento/Newsletter/Controller/Adminhtml/Subscriber/MassDelete.php +++ b/app/code/Magento/Newsletter/Controller/Adminhtml/Subscriber/MassDelete.php @@ -6,22 +6,27 @@ */ namespace Magento\Newsletter\Controller\Adminhtml\Subscriber; -use Magento\Newsletter\Controller\Adminhtml\Subscriber; use Magento\Backend\App\Action\Context; +use Magento\Framework\App\Action\HttpPostActionInterface; +use Magento\Framework\App\ObjectManager; use Magento\Framework\App\Response\Http\FileFactory; +use Magento\Newsletter\Controller\Adminhtml\Subscriber; use Magento\Newsletter\Model\SubscriberFactory; -use Magento\Framework\App\ObjectManager; -class MassDelete extends Subscriber +/** + * Subscriber mass delete controller. + */ +class MassDelete extends Subscriber implements HttpPostActionInterface { /** * @var SubscriberFactory */ private $subscriberFactory; - + /** * @param Context $context * @param FileFactory $fileFactory + * @param SubscriberFactory|null $subscriberFactory */ public function __construct( Context $context, @@ -31,7 +36,7 @@ public function __construct( $this->subscriberFactory = $subscriberFactory ?: ObjectManager::getInstance()->get(SubscriberFactory::class); parent::__construct($context, $fileFactory); } - + /** * Delete one or more subscribers action * diff --git a/app/code/Magento/Newsletter/Controller/Manage/Save.php b/app/code/Magento/Newsletter/Controller/Manage/Save.php index 698c2d19aae68..d7d511e2d1906 100644 --- a/app/code/Magento/Newsletter/Controller/Manage/Save.php +++ b/app/code/Magento/Newsletter/Controller/Manage/Save.php @@ -3,11 +3,12 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types=1); namespace Magento\Newsletter\Controller\Manage; use Magento\Customer\Api\CustomerRepositoryInterface as CustomerRepository; -use Magento\Customer\Model\Customer; +use Magento\Customer\Api\Data\CustomerInterface; use Magento\Framework\App\Action\HttpGetActionInterface; use Magento\Framework\App\Action\HttpPostActionInterface; use Magento\Newsletter\Model\Subscriber; @@ -65,7 +66,7 @@ public function __construct( /** * Save newsletter subscription preference action * - * @return void|null + * @return \Magento\Framework\App\ResponseInterface */ public function execute() { @@ -110,16 +111,16 @@ public function execute() $this->messageManager->addError(__('Something went wrong while saving your subscription.')); } } - $this->_redirect('customer/account/'); + return $this->_redirect('customer/account/'); } /** * Set ignore_validation_flag to skip unnecessary address and customer validation * - * @param Customer $customer + * @param CustomerInterface $customer * @return void */ - private function setIgnoreValidationFlag($customer) + private function setIgnoreValidationFlag(CustomerInterface $customer): void { $customer->setData('ignore_validation_flag', true); } diff --git a/app/code/Magento/Newsletter/Controller/Subscriber/Confirm.php b/app/code/Magento/Newsletter/Controller/Subscriber/Confirm.php index c27717f4c7793..6f566761b2f87 100644 --- a/app/code/Magento/Newsletter/Controller/Subscriber/Confirm.php +++ b/app/code/Magento/Newsletter/Controller/Subscriber/Confirm.php @@ -4,6 +4,7 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types=1); namespace Magento\Newsletter\Controller\Subscriber; diff --git a/app/code/Magento/Newsletter/Model/Subscriber.php b/app/code/Magento/Newsletter/Model/Subscriber.php index e7e5d5f202811..117783495406a 100644 --- a/app/code/Magento/Newsletter/Model/Subscriber.php +++ b/app/code/Magento/Newsletter/Model/Subscriber.php @@ -7,11 +7,11 @@ use Magento\Customer\Api\AccountManagementInterface; use Magento\Customer\Api\CustomerRepositoryInterface; -use Magento\Framework\Exception\MailException; -use Magento\Framework\Exception\NoSuchEntityException; use Magento\Customer\Api\Data\CustomerInterfaceFactory; use Magento\Framework\Api\DataObjectHelper; use Magento\Framework\App\ObjectManager; +use Magento\Framework\Exception\MailException; +use Magento\Framework\Exception\NoSuchEntityException; /** * Subscriber model @@ -31,6 +31,7 @@ * @method int getSubscriberId() * @method Subscriber setSubscriberId(int $value) * + * @SuppressWarnings(PHPMD.CookieAndSessionMisuse) * @SuppressWarnings(PHPMD.CouplingBetweenObjects) * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @@ -402,6 +403,7 @@ public function loadByCustomerId($customerId) $this->setSubscriberConfirmCode($this->randomSequence()); $this->save(); } + // phpcs:ignore Magento2.CodeAnalysis.EmptyBlock } catch (NoSuchEntityException $e) { } return $this; @@ -493,7 +495,9 @@ public function subscribe($email) $this->sendConfirmationSuccessEmail(); } return $this->getStatus(); + // phpcs:ignore Magento2.Exceptions.ThrowCatch } catch (\Exception $e) { + // phpcs:ignore Magento2.Exceptions.DirectThrow throw new \Exception($e->getMessage()); } } @@ -559,7 +563,7 @@ public function updateSubscription($customerId) * * @param int $customerId * @param bool $subscribe indicates whether the customer should be subscribed or unsubscribed - * @return $this + * @return $this * * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) @@ -686,7 +690,7 @@ public function confirm($code) * Mark receiving subscriber of queue newsletter * * @param \Magento\Newsletter\Model\Queue $queue - * @return boolean + * @return Subscriber */ public function received(\Magento\Newsletter\Model\Queue $queue) { diff --git a/app/code/Magento/Newsletter/Test/Mftf/Test/AdminAddImageToWYSIWYGNewsletterTest.xml b/app/code/Magento/Newsletter/Test/Mftf/Test/AdminAddImageToWYSIWYGNewsletterTest.xml index f69f94dbd79e3..a343a20a6d57c 100644 --- a/app/code/Magento/Newsletter/Test/Mftf/Test/AdminAddImageToWYSIWYGNewsletterTest.xml +++ b/app/code/Magento/Newsletter/Test/Mftf/Test/AdminAddImageToWYSIWYGNewsletterTest.xml @@ -16,6 +16,9 @@ <description value="Admin should be able to add image to WYSIWYG content Newsletter"/> <severity value="CRITICAL"/> <testCaseId value="MAGETWO-84377"/> + <skip> + <issueId value="MC-17233"/> + </skip> </annotations> <before> <actionGroup ref="LoginActionGroup" stepKey="login"/> diff --git a/app/code/Magento/Newsletter/Test/Mftf/Test/AdminAddWidgetToWYSIWYGNewsletterTest.xml b/app/code/Magento/Newsletter/Test/Mftf/Test/AdminAddWidgetToWYSIWYGNewsletterTest.xml index 50a6b74a67233..016f07b8a2f44 100644 --- a/app/code/Magento/Newsletter/Test/Mftf/Test/AdminAddWidgetToWYSIWYGNewsletterTest.xml +++ b/app/code/Magento/Newsletter/Test/Mftf/Test/AdminAddWidgetToWYSIWYGNewsletterTest.xml @@ -16,6 +16,9 @@ <description value="Admin should be able to add widget to WYSIWYG Editor Newsletter"/> <severity value="CRITICAL"/> <testCaseId value="MAGETWO-84682"/> + <skip> + <issueId value="MC-17140"/> + </skip> </annotations> <before> <actionGroup ref="LoginActionGroup" stepKey="login"/> diff --git a/app/code/Magento/Paypal/Model/Cart.php b/app/code/Magento/Paypal/Model/Cart.php index cef17fab8d916..90bc2b5e632de 100644 --- a/app/code/Magento/Paypal/Model/Cart.php +++ b/app/code/Magento/Paypal/Model/Cart.php @@ -9,6 +9,7 @@ /** * PayPal-specific model for shopping cart items and totals + * * The main idea is to accommodate all possible totals into PayPal-compatible 4 totals and line items */ class Cart extends \Magento\Payment\Model\Cart @@ -179,7 +180,7 @@ protected function _applyDiscountTaxCompensationWorkaround( ) { $dataContainer = $salesEntity->getTaxContainer(); $this->addTax((double)$dataContainer->getBaseDiscountTaxCompensationAmount()); - $this->addTax((double)$dataContainer->getBaseShippingDiscountTaxCompensationAmount()); + $this->addTax((double)$dataContainer->getBaseShippingDiscountTaxCompensationAmnt()); } /** diff --git a/app/code/Magento/Paypal/Model/Payflow/Transparent.php b/app/code/Magento/Paypal/Model/Payflow/Transparent.php index c308731c69527..f90c8f3792428 100644 --- a/app/code/Magento/Paypal/Model/Payflow/Transparent.php +++ b/app/code/Magento/Paypal/Model/Payflow/Transparent.php @@ -3,6 +3,7 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types=1); namespace Magento\Paypal\Model\Payflow; @@ -59,6 +60,11 @@ class Transparent extends Payflowpro implements TransparentInterface */ private $paymentExtensionFactory; + /** + * @var \Magento\Paypal\Model\CartFactory + */ + private $payPalCartFactory; + /** * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry @@ -76,6 +82,7 @@ class Transparent extends Payflowpro implements TransparentInterface * @param ResponseValidator $responseValidator * @param PaymentTokenInterfaceFactory $paymentTokenFactory * @param OrderPaymentExtensionInterfaceFactory $paymentExtensionFactory + * @param \Magento\Paypal\Model\CartFactory $payPalCartFactory * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection * @param array $data @@ -98,6 +105,7 @@ public function __construct( ResponseValidator $responseValidator, PaymentTokenInterfaceFactory $paymentTokenFactory, OrderPaymentExtensionInterfaceFactory $paymentExtensionFactory, + \Magento\Paypal\Model\CartFactory $payPalCartFactory, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, array $data = [] @@ -123,9 +131,12 @@ public function __construct( $this->responseValidator = $responseValidator; $this->paymentTokenFactory = $paymentTokenFactory; $this->paymentExtensionFactory = $paymentExtensionFactory; + $this->payPalCartFactory = $payPalCartFactory; } /** + * Gets response validator instance. + * * @return ResponseValidator */ public function getResponceValidator() @@ -162,13 +173,19 @@ public function authorize(InfoInterface $payment, $amount) $this->addRequestOrderInfo($request, $order); $request = $this->fillCustomerContacts($order, $request); + /** @var \Magento\Paypal\Model\Cart $payPalCart */ + $payPalCart = $this->payPalCartFactory->create(['salesModel' => $order]); + $payPalCart->getAmounts(); + $token = $payment->getAdditionalInformation(self::PNREF); $request->setData('trxtype', self::TRXTYPE_AUTH_ONLY); $request->setData('origid', $token); $request->setData('amt', $this->formatPrice($amount)); $request->setData('currency', $order->getBaseCurrencyCode()); - $request->setData('taxamt', $this->formatPrice($order->getBaseTaxAmount())); - $request->setData('freightamt', $this->formatPrice($order->getBaseShippingAmount())); + $request->setData('itemamt', $this->formatPrice($payPalCart->getSubtotal())); + $request->setData('taxamt', $this->formatPrice($payPalCart->getTax())); + $request->setData('freightamt', $this->formatPrice($payPalCart->getShipping())); + $request->setData('discount', $this->formatPrice($payPalCart->getDiscount())); $response = $this->postRequest($request, $this->getConfig()); $this->processErrors($response); @@ -178,6 +195,7 @@ public function authorize(InfoInterface $payment, $amount) } catch (LocalizedException $exception) { $payment->setParentTransactionId($response->getData(self::PNREF)); $this->void($payment); + // phpcs:ignore Magento2.Exceptions.ThrowCatch throw new LocalizedException(__("The payment couldn't be processed at this time. Please try again later.")); } @@ -200,10 +218,12 @@ public function getConfigInterface() } /** + * Creates vault payment token. + * * @param Payment $payment * @param string $token - * @throws LocalizedException * @return void + * @throws \Exception */ protected function createPaymentToken(Payment $payment, $token) { @@ -222,8 +242,11 @@ protected function createPaymentToken(Payment $payment, $token) } /** + * Generates CC expiration date by year and month provided in payment. + * * @param Payment $payment * @return string + * @throws \Exception */ private function getExpirationDate(Payment $payment) { @@ -242,6 +265,8 @@ private function getExpirationDate(Payment $payment) } /** + * Returns payment extension attributes instance. + * * @param Payment $payment * @return \Magento\Sales\Api\Data\OrderPaymentExtensionInterface */ diff --git a/app/code/Magento/Paypal/Test/Unit/Model/CartTest.php b/app/code/Magento/Paypal/Test/Unit/Model/CartTest.php index 28837727533d2..88e7ee152b5de 100644 --- a/app/code/Magento/Paypal/Test/Unit/Model/CartTest.php +++ b/app/code/Magento/Paypal/Test/Unit/Model/CartTest.php @@ -7,6 +7,9 @@ use Magento\Paypal\Model\Cart; +/** + * @see \Magento\Paypal\Model\Cart + */ class CartTest extends \PHPUnit\Framework\TestCase { /** @@ -70,7 +73,7 @@ protected function setUp() public function testInvalidGetAllItems($items) { $taxContainer = new \Magento\Framework\DataObject( - ['base_discount_tax_compensation_amount' => 0.2, 'base_shipping_discount_tax_compensation_amount' => 0.1] + ['base_discount_tax_compensation_amount' => 0.2, 'base_shipping_discount_tax_compensation_amnt' => 0.1] ); $this->_salesModel->expects($this->once())->method('getTaxContainer')->will($this->returnValue($taxContainer)); $this->_salesModel->expects($this->once())->method('getAllItems')->will($this->returnValue($items)); @@ -146,7 +149,7 @@ public function testInvalidTotalsGetAllItems($values, $transferDiscount) $this->assertEquals( $values['base_tax_amount'] + $values['base_discount_tax_compensation_amount'] + - $values['base_shipping_discount_tax_compensation_amount'], + $values['base_shipping_discount_tax_compensation_amnt'], $this->_model->getTax() ); $this->assertEquals($values['base_shipping_amount'], $this->_model->getShipping()); @@ -162,7 +165,7 @@ public function invalidTotalsGetAllItemsDataProvider() [ [ 'base_discount_tax_compensation_amount' => 0, - 'base_shipping_discount_tax_compensation_amount' => 0, + 'base_shipping_discount_tax_compensation_amnt' => 0, 'base_subtotal' => 0, 'base_tax_amount' => 0, 'base_shipping_amount' => 0, @@ -174,7 +177,7 @@ public function invalidTotalsGetAllItemsDataProvider() [ [ 'base_discount_tax_compensation_amount' => 1, - 'base_shipping_discount_tax_compensation_amount' => 2, + 'base_shipping_discount_tax_compensation_amnt' => 2, 'base_subtotal' => 3, 'base_tax_amount' => 4, 'base_shipping_amount' => 5, @@ -255,8 +258,8 @@ protected function _prepareInvalidModelData($values, $transferDiscount) [ 'base_discount_tax_compensation_amount' => $values['base_discount_tax_compensation_amount'], - 'base_shipping_discount_tax_compensation_amount' => - $values['base_shipping_discount_tax_compensation_amount'], + 'base_shipping_discount_tax_compensation_amnt' => + $values['base_shipping_discount_tax_compensation_amnt'], ] ); $expectedSubtotal = $values['base_subtotal']; diff --git a/app/code/Magento/Paypal/Test/Unit/Model/Payflow/TransparentTest.php b/app/code/Magento/Paypal/Test/Unit/Model/Payflow/TransparentTest.php index e6a994cba78c3..f6df35ae272b7 100644 --- a/app/code/Magento/Paypal/Test/Unit/Model/Payflow/TransparentTest.php +++ b/app/code/Magento/Paypal/Test/Unit/Model/Payflow/TransparentTest.php @@ -3,446 +3,298 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types=1); namespace Magento\Paypal\Test\Unit\Model\Payflow; -use Magento\Paypal\Block\Payment\Info; +use Magento\Framework\App\Config\ScopeConfigInterface; +use Magento\Framework\DataObject; +use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper; +use Magento\Payment\Model\Method\ConfigInterface as PaymentConfigInterface; +use Magento\Payment\Model\Method\ConfigInterfaceFactory as PaymentConfigInterfaceFactory; +use Magento\Paypal\Model\Cart as PayPalCart; +use Magento\Paypal\Model\CartFactory as PayPalCartFactory; +use Magento\Paypal\Model\Payflow\Service\Gateway as PayPalPayflowGateway; +use Magento\Paypal\Model\Payflow\Transparent as PayPalPayflowTransparent; use Magento\Paypal\Model\Payflowpro; -use Magento\Paypal\Model\Payflow\Transparent; +use Magento\Sales\Api\Data\OrderPaymentExtensionInterface; +use Magento\Sales\Api\Data\OrderPaymentExtensionInterfaceFactory as PaymentExtensionInterfaceFactory; +use Magento\Sales\Model\Order; +use Magento\Sales\Model\Order\Payment; +use Magento\Store\Api\Data\StoreInterface; +use Magento\Store\Model\ScopeInterface; +use Magento\Store\Model\StoreManagerInterface; use Magento\Vault\Api\Data\PaymentTokenInterface; -use Magento\Vault\Model\CreditCardTokenFactory; +use Magento\Vault\Api\Data\PaymentTokenInterfaceFactory; +use PHPUnit_Framework_MockObject_MockObject as MockObject; /** - * Class TransparentTest - * - * Test class for \Magento\Paypal\Model\Payflow\Transparent * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class TransparentTest extends \PHPUnit\Framework\TestCase { - /** @var Transparent|\PHPUnit_Framework_MockObject_MockObject */ - protected $object; - - /** @var \Magento\Paypal\Model\Payflow\Service\Gateway|\PHPUnit_Framework_MockObject_MockObject */ - protected $gatewayMock; - - /** @var \Magento\Store\Model\StoreManagerInterface|\PHPUnit_Framework_MockObject_MockObject */ - protected $storeManagerMock; - - /** @var \Magento\Payment\Model\Method\ConfigInterfaceFactory|\PHPUnit_Framework_MockObject_MockObject */ - protected $configFactoryMock; - - /** @var \Magento\Payment\Model\Method\ConfigInterface|\PHPUnit_Framework_MockObject_MockObject */ - protected $configMock; + /** + * @var PayPalPayflowTransparent + */ + private $subject; - /** @var \Magento\Framework\DataObject */ - protected $responseMock; + /** + * @var PaymentConfigInterface|MockObject + */ + private $paymentConfig; - /** @var \Magento\Sales\Model\Order\Payment\Info|\PHPUnit_Framework_MockObject_MockObject */ - protected $paymentMock; + /** + * @var PayPalPayflowGateway|MockObject + */ + private $payPalPayflowGateway; - /** @var \Magento\Framework\DataObject|\PHPUnit_Framework_MockObject_MockObject */ - protected $orderMock; + /** + * @var PaymentTokenInterface|MockObject + */ + private $paymentToken; - /** @var \Magento\Framework\DataObject|\PHPUnit_Framework_MockObject_MockObject */ - protected $addressBillingMock; + /** + * @var PayPalCart|MockObject + */ + private $payPalCart; - /** @var \Magento\Framework\DataObject|\PHPUnit_Framework_MockObject_MockObject */ - protected $addressShippingMock; + /** + * @var ScopeConfigInterface|MockObject + */ + private $scopeConfig; /** - * @var CreditCardTokenFactory|\PHPUnit_Framework_MockObject_MockObject + * @var Payment|MockObject */ - protected $paymentTokenFactory; + private $payment; /** - * @var \PHPUnit_Framework_MockObject_MockObject| - * \Magento\Paypal\Model\Payflow\Service\Response\Validator\ResponseValidator + * @var Order|MockObject */ - protected $responseValidator; + private $order; - protected function setUp() + public function setUp() { - $this->paymentMock = $this->getMockBuilder(\Magento\Sales\Model\Order\Payment::class) - ->setMethods([]) - ->disableOriginalConstructor() - ->getMock(); - - $this->paymentTokenFactory = $this->getMockBuilder(CreditCardTokenFactory::class) - ->disableOriginalConstructor() - ->setMethods(['create']) - ->getMock(); - - $this->gatewayMock = $this->getMockBuilder(\Magento\Paypal\Model\Payflow\Service\Gateway::class) - ->setMethods(['postRequest']) - ->disableOriginalConstructor() - ->getMock(); - $this->storeManagerMock = $this->getMockBuilder(\Magento\Store\Model\StoreManagerInterface::class) - ->setMethods(['getStore', 'getId']) - ->disableOriginalConstructor() - ->getMockForAbstractClass(); - $this->storeManagerMock->method('getStore') - ->willReturnSelf(); - $this->configMock = $this->getMockBuilder(\Magento\Paypal\Model\PayflowConfig::class) - ->disableOriginalConstructor() - ->getMock(); - $this->configFactoryMock = $this->getMockBuilder(\Magento\Payment\Model\Method\ConfigInterfaceFactory::class) - ->setMethods(['create']) - ->disableOriginalConstructor() - ->getMock(); - $this->configFactoryMock->method('create') - ->willReturn($this->configMock); - $this->responseMock = new \Magento\Framework\DataObject(); - $this->responseValidator = $this->getMockBuilder( - \Magento\Paypal\Model\Payflow\Service\Response\Validator\ResponseValidator::class - )->disableOriginalConstructor() - ->setMethods(['validate']) - ->getMock(); + $this->initPayment(); - $objectHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); - $this->object = $objectHelper->getObject( - \Magento\Paypal\Model\Payflow\Transparent::class, - [ - 'gateway' => $this->gatewayMock, - 'storeManager' => $this->storeManagerMock, - 'configFactory' => $this->configFactoryMock, - 'responseValidator' => $this->responseValidator, - 'paymentTokenFactory' => $this->paymentTokenFactory - ] - ); + $this->subject = (new ObjectManagerHelper($this)) + ->getObject( + PayPalPayflowTransparent::class, + [ + 'configFactory' => $this->getPaymentConfigInterfaceFactory(), + 'paymentExtensionFactory' => $this->getPaymentExtensionInterfaceFactory(), + 'storeManager' => $this->getStoreManager(), + 'gateway' => $this->getPayPalPayflowGateway(), + 'paymentTokenFactory' => $this->getPaymentTokenFactory(), + 'payPalCartFactory' => $this->getPayPalCartFactory(), + 'scopeConfig' => $this->getScopeConfig(), + ] + ); } /** - * Initializing a collection Mock for Authorize method + * Asserts that authorize request to Payflow gateway is valid. * - * @return void + * @dataProvider validAuthorizeRequestDataProvider + * @param DataObject $validAuthorizeRequest + * @throws \Magento\Framework\Exception\LocalizedException + * @throws \Magento\Framework\Exception\State\InvalidTransitionException */ - protected function initializationAuthorizeMock() + public function testValidAuthorizeRequest(DataObject $validAuthorizeRequest) { - $this->orderMock = $this->getMockBuilder(\Magento\Sales\Model\Order::class) - ->setMethods([ - 'getCustomerId', 'getBillingAddress', 'getShippingAddress', 'getCustomerEmail', - 'getId', 'getIncrementId', 'getBaseCurrencyCode' - ]) - ->disableOriginalConstructor() - ->getMock(); - $this->addressBillingMock = $this->getMockBuilder(\Magento\Framework\DataObject::class) - ->setMethods( + $this->scopeConfig->method('getValue') + ->willReturnMap( [ - 'getFirstname', - 'getLastname', - 'getStreet', - 'getCity', - 'getRegionCode', - 'getPostcode', - 'getCountryId' + ['payment/payflowpro/user', ScopeInterface::SCOPE_STORE, null, 'user'], + ['payment/payflowpro/vendor', ScopeInterface::SCOPE_STORE, null, 'vendor'], + ['payment/payflowpro/partner', ScopeInterface::SCOPE_STORE, null, 'partner'], + ['payment/payflowpro/pwd', ScopeInterface::SCOPE_STORE, null, 'pwd'], + ['payment/payflowpro/verbosity', ScopeInterface::SCOPE_STORE, null, 'verbosity'], ] - )->disableOriginalConstructor() - ->getMock(); - $this->addressShippingMock = $this->getMockBuilder(\Magento\Framework\DataObject::class) - ->setMethods( + ); + $this->paymentConfig->method('getBuildNotationCode')->willReturn('BUTTONSOURCE'); + $this->payment->method('getAdditionalInformation') + ->willReturnMap( [ - 'getFirstname', - 'getLastname', - 'getStreet', - 'getCity', - 'getRegionCode', - 'getPostcode', - 'getCountryId' + [Payflowpro::PNREF, 'XXXXXXXXXXXX'], ] - )->disableOriginalConstructor() - ->getMock(); - } + ); + $this->order->method('getIncrementId')->willReturn('000000001'); + $this->order->method('getBaseCurrencyCode')->willReturn('USD'); + $this->payPalCart->method('getSubtotal')->willReturn(5.00); + $this->payPalCart->method('getTax')->willReturn(5.00); + $this->payPalCart->method('getShipping')->willReturn(5.00); + $this->payPalCart->method('getDiscount')->willReturn(5.00); + + $this->payPalPayflowGateway->expects($this->once()) + ->method('postRequest') + ->with($this->equalTo($validAuthorizeRequest)); - /** - * Build data for request for operation Authorize - * - * @return void - */ - protected function buildRequestData() - { - $this->paymentMock->expects($this->once()) - ->method('getOrder') - ->willReturn($this->orderMock); - $this->orderMock->expects($this->once()) - ->method('getBaseCurrencyCode') - ->willReturn('USD'); - $this->orderMock->expects($this->once()) - ->method('getBillingAddress') - ->willReturn($this->addressBillingMock); - $this->orderMock->expects(static::once()) - ->method('getId') - ->willReturn(1); - $this->orderMock->expects(static::once()) - ->method('getIncrementId') - ->willReturn('0000001'); - $this->orderMock->expects($this->once()) - ->method('getShippingAddress') - ->willReturn($this->addressShippingMock); - $this->addressBillingMock->expects($this->once()) - ->method('getFirstname') - ->willReturn('Firstname'); - $this->addressBillingMock->expects($this->once()) - ->method('getLastname') - ->willReturn('Lastname'); - $this->addressBillingMock->expects($this->once()) - ->method('getStreet') - ->willReturn(['street-1', 'street-2']); - $this->addressBillingMock->expects($this->once()) - ->method('getCity') - ->willReturn('City'); - $this->addressBillingMock->expects($this->once()) - ->method('getRegionCode') - ->willReturn('RegionCode'); - $this->addressBillingMock->expects($this->once()) - ->method('getPostcode') - ->willReturn('Postcode'); - $this->addressBillingMock->expects($this->once()) - ->method('getCountryId') - ->willReturn('CountryId'); - $this->orderMock->expects($this->once()) - ->method('getCustomerEmail') - ->willReturn('customer@email.com'); - $this->addressShippingMock->expects($this->once()) - ->method('getFirstname') - ->willReturn('Firstname'); - $this->addressShippingMock->expects($this->once()) - ->method('getLastname') - ->willReturn('Lastname'); - $this->addressShippingMock->expects($this->once()) - ->method('getStreet') - ->willReturn(['street-1', 'street-2']); - $this->addressShippingMock->expects($this->once()) - ->method('getCity') - ->willReturn('City'); - $this->addressShippingMock->expects($this->once()) - ->method('getRegionCode') - ->willReturn('RegionCode'); - $this->addressShippingMock->expects($this->once()) - ->method('getPostcode') - ->willReturn('Postcode'); - $this->addressShippingMock->expects($this->once()) - ->method('getCountryId') - ->willReturn('CountryId'); + $this->subject->authorize($this->payment, 10); } /** - * @return \Magento\Framework\DataObject + * @return array */ - protected function crateVoidResponseMock() + public function validAuthorizeRequestDataProvider(): array { - $voidResponseMock = new \Magento\Framework\DataObject( + return [ [ - 'result_code' => Transparent::RESPONSE_CODE_APPROVED, - 'pnref' => 'test-pnref' + new DataObject( + [ + 'user' => 'user', + 'vendor' => 'vendor', + 'partner' => 'partner', + 'pwd' => 'pwd', + 'verbosity' => 'verbosity', + 'BUTTONSOURCE' => 'BUTTONSOURCE', + 'tender' => 'C', + 'custref' => '000000001', + 'invnum' => '000000001', + 'comment1' => '000000001', + 'trxtype' => 'A', + 'origid' => 'XXXXXXXXXXXX', + 'amt' => '10.00', + 'currency' => 'USD', + 'itemamt' => '5.00', + 'taxamt' => '5.00', + 'freightamt' => '5.00', + 'discount' => '5.00', + ] + ), ] - ); - - $this->responseMock->setData(Transparent::PNREF, 'test-pnref'); - - $this->paymentMock->expects($this->once()) - ->method('setParentTransactionId') - ->with('test-pnref'); - $this->paymentMock->expects($this->once()) - ->method('getParentTransactionId') - ->willReturn('test-pnref'); - $this->paymentMock->expects($this->once()) - ->method('setTransactionId') - ->with('test-pnref') - ->willReturnSelf(); - $this->paymentMock->expects($this->once()) - ->method('setIsTransactionClosed') - ->with(1) - ->willReturnSelf(); - $this->paymentMock->expects($this->once()) - ->method('setShouldCloseParentTransaction') - ->with(1); - - return $voidResponseMock; + ]; } /** - * @expectedException \Exception + * @return PaymentConfigInterfaceFactory|MockObject */ - public function testAuthorizeException() + private function getPaymentConfigInterfaceFactory() { - $this->initializationAuthorizeMock(); - $this->buildRequestData(); + $paymentConfigInterfaceFactory = $this->getMockBuilder(PaymentConfigInterfaceFactory::class) + ->setMethods(['create']) + ->disableOriginalConstructor() + ->getMock(); + $this->paymentConfig = $this->getMockBuilder(PaymentConfigInterface::class) + ->setMethods(['setStoreId', 'setMethodInstance', 'setMethod', 'getBuildNotationCode']) + ->getMockForAbstractClass(); - $this->gatewayMock->expects($this->once()) - ->method('postRequest') - ->willThrowException(new \Exception()); + $paymentConfigInterfaceFactory->method('create')->willReturn($this->paymentConfig); - $this->object->authorize($this->paymentMock, 33); + return $paymentConfigInterfaceFactory; } /** - * @expectedException \Magento\Framework\Exception\LocalizedException - * @expectedExceptionMessage The payment couldn't be processed at this time. Please try again later. + * @return PaymentExtensionInterfaceFactory|MockObject */ - public function testAuthorizeValidationException() + private function getPaymentExtensionInterfaceFactory() { - $this->initializationAuthorizeMock(); - $this->buildRequestData(); - $voidResponseMock = $this->crateVoidResponseMock(); + $paymentExtensionInterfaceFactory = $this->getMockBuilder(PaymentExtensionInterfaceFactory::class) + ->setMethods(['create']) + ->disableOriginalConstructor() + ->getMock(); + $orderPaymentExtension = $this->getMockBuilder(OrderPaymentExtensionInterface::class) + ->setMethods(['setVaultPaymentToken']) + ->disableOriginalConstructor() + ->getMock(); - $this->gatewayMock->expects($this->at(0)) - ->method('postRequest') - ->willReturn($this->responseMock); + $paymentExtensionInterfaceFactory->method('create')->willReturn($orderPaymentExtension); - $this->responseValidator->expects($this->once()) - ->method('validate') - ->with($this->responseMock) - ->willThrowException(new \Magento\Framework\Exception\LocalizedException(__('Error'))); + return $paymentExtensionInterfaceFactory; + } - $this->gatewayMock->expects($this->at(1)) - ->method('postRequest') - ->willReturn($voidResponseMock); + /** + * @return StoreManagerInterface|MockObject + */ + private function getStoreManager() + { + $storeManager = $this->getMockBuilder(StoreManagerInterface::class) + ->getMockForAbstractClass(); + $store = $this->getMockBuilder(StoreInterface::class) + ->getMockForAbstractClass(); + + $storeManager->method('getStore')->willReturn($store); - $this->paymentMock->expects($this->once()) - ->method('getAdditionalInformation') - ->with(Payflowpro::PNREF) - ->willReturn('test-pnref'); + return $storeManager; + } - $this->responseMock->setData('result_code', Payflowpro::RESPONSE_CODE_FRAUDSERVICE_FILTER); + /** + * @return PayPalPayflowGateway|MockObject + */ + private function getPayPalPayflowGateway() + { + $this->payPalPayflowGateway = $this->getMockBuilder(PayPalPayflowGateway::class) + ->disableOriginalConstructor() + ->getMock(); + $this->payPalPayflowGateway->method('postRequest') + ->willReturn(new DataObject()); - $this->object->authorize($this->paymentMock, 33); + return $this->payPalPayflowGateway; } /** - * @param int $resultCode - * @param int $origResult - * - * @expectedException \Magento\Framework\Exception\LocalizedException - * @dataProvider authorizeLocalizedExceptionDataProvider + * @return PaymentTokenInterfaceFactory|MockObject */ - public function testAuthorizeLocalizedException( - $resultCode, - $origResult - ) { - $this->initializationAuthorizeMock(); - $this->buildRequestData(); + private function getPaymentTokenFactory() + { + $paymentTokenInterfaceFactory = $this->getMockBuilder(PaymentTokenInterfaceFactory::class) + ->disableOriginalConstructor() + ->getMock(); + $this->paymentToken = $this->getMockBuilder(PaymentTokenInterface::class) + ->getMockForAbstractClass(); - $this->responseMock->setData('result_code', $resultCode); - $this->responseMock->setData('origresult', $origResult); + $paymentTokenInterfaceFactory->method('create')->willReturn($this->paymentToken); - $this->gatewayMock->expects($this->exactly(1)) - ->method('postRequest') - ->willReturn($this->responseMock); - $this->object->authorize($this->paymentMock, 33); + return $paymentTokenInterfaceFactory; } /** - * @return array + * @return PayPalCartFactory|MockObject */ - public function authorizeLocalizedExceptionDataProvider() + private function getPayPalCartFactory() { - return [ - [ - 'origResult' => Payflowpro::RESPONSE_CODE_APPROVED, - 'resultCode' => Payflowpro::RESPONSE_CODE_DECLINED_BY_FILTER - ], - [ - 'origResult' => Payflowpro::RESPONSE_CODE_DECLINED_BY_FILTER, - 'resultCode' => Payflowpro::RESPONSE_CODE_FRAUDSERVICE_FILTER - ], - [ - 'origResult' => Payflowpro::RESPONSE_CODE_DECLINED, - 'resultCode' => 1111111111 - ], - [ - 'origResult' => 3432432423, - 'resultCode' => 23233432423 - ], - ]; + $payPalCartFactory = $this->getMockBuilder(PayPalCartFactory::class) + ->setMethods(['create']) + ->disableOriginalConstructor() + ->getMock(); + $this->payPalCart = $this->getMockBuilder(PayPalCart::class) + ->disableOriginalConstructor() + ->getMock(); + + $payPalCartFactory->method('create')->willReturn($this->payPalCart); + + return $payPalCartFactory; } /** - * Test method - * with resultCode = RESPONSE_CODE_APPROVED and Origresult != RESPONSE_CODE_FRAUDSERVICE_FILTER + * @return ScopeConfigInterface|MockObject */ - public function testAuthorize() + private function getScopeConfig() { - $this->initializationAuthorizeMock(); - $this->buildRequestData(); - - $paymentTokenMock = $this->createMock(PaymentTokenInterface::class); - $extensionAttributes = $this->getMockBuilder(\Magento\Sales\Api\Data\OrderPaymentExtensionInterface::class) - ->disableOriginalConstructor() - ->setMethods(['setVaultPaymentToken']) + $this->scopeConfig = $this->getMockBuilder(ScopeConfigInterface::class) ->getMockForAbstractClass(); - $ccDetails = [ - 'cc_type' => 'VI', - 'cc_number' => '1111' - ]; - - $this->responseMock->setData('result_code', Payflowpro::RESPONSE_CODE_APPROVED); - $this->responseMock->setData('origresult', 0); - $this->responseMock->setData('pnref', 'test-pnref'); - - $this->gatewayMock->expects($this->once())->method('postRequest')->willReturn($this->responseMock); - - $this->responseValidator->expects($this->once()) - ->method('validate') - ->with($this->responseMock); - - $this->paymentMock->expects($this->once()) - ->method('setTransactionId') - ->with('test-pnref') - ->willReturnSelf(); - $this->paymentMock->expects($this->once()) - ->method('setIsTransactionClosed') - ->with(0); - $this->paymentMock->expects($this->once()) - ->method('getCcExpYear') - ->willReturn('2017'); - $this->paymentMock->expects($this->once()) - ->method('getCcExpMonth') - ->willReturn('12'); - $this->paymentMock->expects(static::any()) - ->method('getAdditionalInformation') - ->willReturnMap( - [ - [Transparent::CC_DETAILS, $ccDetails], - [Transparent::PNREF, 'test-pnref'] - ] - ); - $this->paymentTokenFactory->expects(static::once()) - ->method('create') - ->willReturn($paymentTokenMock); - $paymentTokenMock->expects(static::once()) - ->method('setGatewayToken') - ->with('test-pnref'); - $paymentTokenMock->expects(static::once()) - ->method('setTokenDetails') - ->with(json_encode($ccDetails)); - $paymentTokenMock->expects(static::once()) - ->method('setExpiresAt') - ->with('2018-01-01 00:00:00'); - - $this->paymentMock->expects(static::once()) - ->method('getExtensionAttributes') - ->willReturn($extensionAttributes); - $extensionAttributes->expects(static::once()) - ->method('setVaultPaymentToken') - ->with($paymentTokenMock); - - $this->paymentMock->expects($this->at(8)) - ->method('unsAdditionalInformation') - ->with(Transparent::CC_DETAILS); - $this->paymentMock->expects($this->at(9)) - ->method('unsAdditionalInformation') - ->with(Transparent::PNREF); - - $this->assertSame($this->object, $this->object->authorize($this->paymentMock, 33)); + return $this->scopeConfig; } /** - * @covers \Magento\Paypal\Model\Payflow\Transparent::getInfoBlockType() + * @return Payment|MockObject */ - public function testGetInfoBlockType() + private function initPayment() { - static::assertEquals(Info::class, $this->object->getInfoBlockType()); + $this->payment = $this->getMockBuilder(Payment::class) + ->disableOriginalConstructor() + ->getMock(); + $this->order = $this->getMockBuilder(Order::class) + ->disableOriginalConstructor() + ->getMock(); + + $this->payment->method('getOrder')->willReturn($this->order); + $this->payment->method('setTransactionId')->willReturnSelf(); + $this->payment->method('setIsTransactionClosed')->willReturnSelf(); + $this->payment->method('getCcExpYear')->willReturn('2019'); + $this->payment->method('getCcExpMonth')->willReturn('05'); + + return $this->payment; } } diff --git a/app/code/Magento/Reports/Model/ResourceModel/Product/Sold/Collection.php b/app/code/Magento/Reports/Model/ResourceModel/Product/Sold/Collection.php index 61dc77d188438..35a14e09e314f 100644 --- a/app/code/Magento/Reports/Model/ResourceModel/Product/Sold/Collection.php +++ b/app/code/Magento/Reports/Model/ResourceModel/Product/Sold/Collection.php @@ -14,6 +14,8 @@ use Magento\Framework\DB\Select; /** + * Data collection. + * * @SuppressWarnings(PHPMD.DepthOfInheritance) * @api * @since 100.0.2 @@ -21,7 +23,7 @@ class Collection extends \Magento\Reports\Model\ResourceModel\Order\Collection { /** - * Set Date range to collection + * Set Date range to collection. * * @param int $from * @param int $to @@ -79,6 +81,10 @@ public function addOrderedQty($from = '', $to = '') )->having( 'order_items.qty_ordered > ?', 0 + )->columns( + 'SUM(order_items.qty_ordered) as ordered_qty' + )->group( + 'order_items.product_id' ); return $this; } @@ -116,6 +122,8 @@ public function setOrder($attribute, $dir = self::SORT_ORDER_DESC) } /** + * @inheritdoc + * * @return Select * @since 100.2.0 */ diff --git a/app/code/Magento/Reports/Test/Mftf/Test/CancelOrdersInOrderSalesReportTest.xml b/app/code/Magento/Reports/Test/Mftf/Test/CancelOrdersInOrderSalesReportTest.xml index 7cb23e54aa1b7..ee39eac1e3719 100644 --- a/app/code/Magento/Reports/Test/Mftf/Test/CancelOrdersInOrderSalesReportTest.xml +++ b/app/code/Magento/Reports/Test/Mftf/Test/CancelOrdersInOrderSalesReportTest.xml @@ -17,6 +17,9 @@ <severity value="MAJOR"/> <testCaseId value="MAGETWO-95960"/> <useCaseId value="MAGETWO-95823"/> + <skip> + <issueId value="MC-17274"/> + </skip> </annotations> <before> diff --git a/app/code/Magento/Review/Block/Adminhtml/Edit/Form.php b/app/code/Magento/Review/Block/Adminhtml/Edit/Form.php index 4f7237a0b44be..346d5b60aad1b 100644 --- a/app/code/Magento/Review/Block/Adminhtml/Edit/Form.php +++ b/app/code/Magento/Review/Block/Adminhtml/Edit/Form.php @@ -75,6 +75,17 @@ protected function _prepareForm() $review = $this->_coreRegistry->registry('review_data'); $product = $this->_productFactory->create()->load($review->getEntityPkValue()); + $formActionParams = [ + 'id' => $this->getRequest()->getParam('id'), + 'ret' => $this->_coreRegistry->registry('ret') + ]; + if ($this->getRequest()->getParam('productId')) { + $formActionParams['productId'] = $this->getRequest()->getParam('productId'); + } + if ($this->getRequest()->getParam('customerId')) { + $formActionParams['customerId'] = $this->getRequest()->getParam('customerId'); + } + /** @var \Magento\Framework\Data\Form $form */ $form = $this->_formFactory->create( [ @@ -82,11 +93,7 @@ protected function _prepareForm() 'id' => 'edit_form', 'action' => $this->getUrl( 'review/*/save', - [ - 'id' => $this->getRequest()->getParam('id'), - 'ret' => $this->_coreRegistry->registry('ret'), - 'productId' => $this->getRequest()->getParam('productId') - ] + $formActionParams ), 'method' => 'post', ], diff --git a/app/code/Magento/Review/Controller/Adminhtml/Product/Save.php b/app/code/Magento/Review/Controller/Adminhtml/Product/Save.php index 57b1e538ddb6b..d9498580c39ba 100644 --- a/app/code/Magento/Review/Controller/Adminhtml/Product/Save.php +++ b/app/code/Magento/Review/Controller/Adminhtml/Product/Save.php @@ -77,6 +77,10 @@ public function execute() if ($productId) { $resultRedirect->setPath("catalog/product/edit/id/$productId"); } + $customerId = (int)$this->getRequest()->getParam('customerId'); + if ($customerId) { + $resultRedirect->setPath("customer/index/edit/id/$customerId"); + } return $resultRedirect; } $resultRedirect->setPath('review/*/'); diff --git a/app/code/Magento/Review/view/frontend/web/js/process-reviews.js b/app/code/Magento/Review/view/frontend/web/js/process-reviews.js index 690c7dd917f4b..9d1083d662d5a 100644 --- a/app/code/Magento/Review/view/frontend/web/js/process-reviews.js +++ b/app/code/Magento/Review/view/frontend/web/js/process-reviews.js @@ -50,18 +50,23 @@ define([ $(function () { $('.product-info-main .reviews-actions a').click(function (event) { - var anchor; + var anchor, addReviewBlock; event.preventDefault(); anchor = $(this).attr('href').replace(/^.*?(#|$)/, ''); - $('.product.data.items [data-role="content"]').each(function (index) { //eslint-disable-line - if (this.id == 'reviews') { //eslint-disable-line eqeqeq - $('.product.data.items').tabs('activate', index); - $('html, body').animate({ - scrollTop: $('#' + anchor).offset().top - 50 - }, 300); - } - }); + addReviewBlock = $('.block.review-add .block-content #' + anchor); + + if (addReviewBlock.length) { + $('.product.data.items [data-role="content"]').each(function (index) { //eslint-disable-line + if (this.id == 'reviews') { //eslint-disable-line eqeqeq + $('.product.data.items').tabs('activate', index); + } + }); + $('html, body').animate({ + scrollTop: addReviewBlock.offset().top - 50 + }, 300); + } + }); }); }; diff --git a/app/code/Magento/Sales/Block/Adminhtml/Order/Create/Form/Address.php b/app/code/Magento/Sales/Block/Adminhtml/Order/Create/Form/Address.php index 0e3d308df912e..e4b9dd4c63b93 100644 --- a/app/code/Magento/Sales/Block/Adminhtml/Order/Create/Form/Address.php +++ b/app/code/Magento/Sales/Block/Adminhtml/Order/Create/Form/Address.php @@ -9,6 +9,8 @@ use Magento\Framework\App\ObjectManager; use Magento\Framework\Data\Form\Element\AbstractElement; use Magento\Framework\Pricing\PriceCurrencyInterface; +use Magento\Customer\Api\Data\AddressInterface; +use Magento\Eav\Model\AttributeDataFactory; /** * Order create address form @@ -191,17 +193,19 @@ public function getAddressCollectionJson() $emptyAddressForm = $this->_customerFormFactory->create( 'customer_address', 'adminhtml_customer_address', - [\Magento\Customer\Api\Data\AddressInterface::COUNTRY_ID => $defaultCountryId] + [AddressInterface::COUNTRY_ID => $defaultCountryId] ); - $data = [0 => $emptyAddressForm->outputData(\Magento\Eav\Model\AttributeDataFactory::OUTPUT_FORMAT_JSON)]; + $data = [0 => $emptyAddressForm->outputData(AttributeDataFactory::OUTPUT_FORMAT_JSON)]; foreach ($this->getAddressCollection() as $address) { $addressForm = $this->_customerFormFactory->create( 'customer_address', 'adminhtml_customer_address', - $this->addressMapper->toFlatArray($address) + $this->addressMapper->toFlatArray($address), + false, + false ); $data[$address->getId()] = $addressForm->outputData( - \Magento\Eav\Model\AttributeDataFactory::OUTPUT_FORMAT_JSON + AttributeDataFactory::OUTPUT_FORMAT_JSON ); } diff --git a/app/code/Magento/Sales/Test/Mftf/ActionGroup/AdminOrderActionGroup.xml b/app/code/Magento/Sales/Test/Mftf/ActionGroup/AdminOrderActionGroup.xml index c1159c030de0a..f7d24cda34142 100644 --- a/app/code/Magento/Sales/Test/Mftf/ActionGroup/AdminOrderActionGroup.xml +++ b/app/code/Magento/Sales/Test/Mftf/ActionGroup/AdminOrderActionGroup.xml @@ -412,6 +412,7 @@ <argument name="customer"/> </arguments> <amOnPage stepKey="navigateToNewOrderPage" url="{{AdminOrderCreatePage.url}}"/> + <waitForPageLoad stepKey="waitForNewOrderPageOpened"/> <click stepKey="chooseCustomer" selector="{{AdminOrdersGridSection.customerInOrdersSection(customer.firstname)}}"/> <waitForPageLoad stepKey="waitForStoresPageOpened"/> <click selector="{{OrdersGridSection.addProducts}}" stepKey="clickOnAddProducts"/> diff --git a/app/code/Magento/Sales/Test/Mftf/Test/AdminCreateCreditMemoBankTransferPaymentTest.xml b/app/code/Magento/Sales/Test/Mftf/Test/AdminCreateCreditMemoBankTransferPaymentTest.xml index 89003ed89fd13..e498279ee99ae 100644 --- a/app/code/Magento/Sales/Test/Mftf/Test/AdminCreateCreditMemoBankTransferPaymentTest.xml +++ b/app/code/Magento/Sales/Test/Mftf/Test/AdminCreateCreditMemoBankTransferPaymentTest.xml @@ -17,6 +17,9 @@ <testCaseId value="MC-15862"/> <group value="sales"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-17140"/> + </skip> </annotations> <before> <actionGroup ref="LoginAsAdmin" stepKey="LoginAsAdmin"/> diff --git a/app/code/Magento/Sales/Test/Mftf/Test/AdminCreateCreditMemoConfigurableProductTest.xml b/app/code/Magento/Sales/Test/Mftf/Test/AdminCreateCreditMemoConfigurableProductTest.xml index 4da7ec3e22d42..06cffd27933d9 100644 --- a/app/code/Magento/Sales/Test/Mftf/Test/AdminCreateCreditMemoConfigurableProductTest.xml +++ b/app/code/Magento/Sales/Test/Mftf/Test/AdminCreateCreditMemoConfigurableProductTest.xml @@ -17,6 +17,9 @@ <testCaseId value="MC-15865"/> <group value="sales"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-17140"/> + </skip> </annotations> <before> <actionGroup ref="LoginAsAdmin" stepKey="LoginAsAdmin"/> diff --git a/app/code/Magento/Sales/Test/Mftf/Test/AdminCreateCreditMemoPartialRefundTest.xml b/app/code/Magento/Sales/Test/Mftf/Test/AdminCreateCreditMemoPartialRefundTest.xml index 03bd436834c11..256be7cde7188 100644 --- a/app/code/Magento/Sales/Test/Mftf/Test/AdminCreateCreditMemoPartialRefundTest.xml +++ b/app/code/Magento/Sales/Test/Mftf/Test/AdminCreateCreditMemoPartialRefundTest.xml @@ -17,6 +17,9 @@ <testCaseId value="MC-15861"/> <group value="sales"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-17140"/> + </skip> </annotations> <before> <actionGroup ref="LoginAsAdmin" stepKey="LoginAsAdmin"/> diff --git a/app/code/Magento/Sales/Test/Mftf/Test/AdminCreateCreditMemoWithCashOnDeliveryTest.xml b/app/code/Magento/Sales/Test/Mftf/Test/AdminCreateCreditMemoWithCashOnDeliveryTest.xml index 29df8d56bd5a6..d7d2abb5b2e8a 100644 --- a/app/code/Magento/Sales/Test/Mftf/Test/AdminCreateCreditMemoWithCashOnDeliveryTest.xml +++ b/app/code/Magento/Sales/Test/Mftf/Test/AdminCreateCreditMemoWithCashOnDeliveryTest.xml @@ -17,6 +17,9 @@ <testCaseId value="MC-15863"/> <group value="sales"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-17140"/> + </skip> </annotations> <before> <actionGroup ref="LoginAsAdmin" stepKey="LoginAsAdmin"/> diff --git a/app/code/Magento/Sales/Test/Mftf/Test/AdminCreateCreditMemoWithPurchaseOrderTest.xml b/app/code/Magento/Sales/Test/Mftf/Test/AdminCreateCreditMemoWithPurchaseOrderTest.xml index 1c3aaf0d3b440..95b326a13fa5b 100644 --- a/app/code/Magento/Sales/Test/Mftf/Test/AdminCreateCreditMemoWithPurchaseOrderTest.xml +++ b/app/code/Magento/Sales/Test/Mftf/Test/AdminCreateCreditMemoWithPurchaseOrderTest.xml @@ -17,6 +17,9 @@ <testCaseId value="MC-15864"/> <group value="sales"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-17140"/> + </skip> </annotations> <before> <actionGroup ref="LoginAsAdmin" stepKey="LoginAsAdmin"/> diff --git a/app/code/Magento/Sales/Test/Mftf/Test/AdminMassOrdersCancelCompleteAndClosedTest.xml b/app/code/Magento/Sales/Test/Mftf/Test/AdminMassOrdersCancelCompleteAndClosedTest.xml index 00cd6409c6e60..e5f43818c1524 100644 --- a/app/code/Magento/Sales/Test/Mftf/Test/AdminMassOrdersCancelCompleteAndClosedTest.xml +++ b/app/code/Magento/Sales/Test/Mftf/Test/AdminMassOrdersCancelCompleteAndClosedTest.xml @@ -17,6 +17,9 @@ <testCaseId value="MC-16183"/> <group value="sales"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-17274"/> + </skip> </annotations> <before> <actionGroup ref="LoginAsAdmin" stepKey="LoginAsAdmin"/> @@ -56,7 +59,7 @@ <assertNotEmpty actual="$getSecondOrderId" stepKey="assertSecondOrderIdIsNotEmpty" after="getSecondOrderId"/> <!-- Create CreditMemo for second Order --> - <actionGroup ref="AdminCreateInvoiceAndCreditMemoActionGroup" stepKey="createCreditMemo"/> + <actionGroup ref="AdminCreateInvoiceAndCreditMemoActionGroup" stepKey="createCreditMemo"/> <!-- Navigate to backend: Go to Sales > Orders --> <amOnPage url="{{AdminOrdersPage.url}}" stepKey="onOrderPage"/> diff --git a/app/code/Magento/Sales/Test/Mftf/Test/AdminMassOrdersCancelProcessingAndClosedTest.xml b/app/code/Magento/Sales/Test/Mftf/Test/AdminMassOrdersCancelProcessingAndClosedTest.xml index 5e524bcf6e05c..b9e7106676e2c 100644 --- a/app/code/Magento/Sales/Test/Mftf/Test/AdminMassOrdersCancelProcessingAndClosedTest.xml +++ b/app/code/Magento/Sales/Test/Mftf/Test/AdminMassOrdersCancelProcessingAndClosedTest.xml @@ -17,6 +17,9 @@ <testCaseId value="MC-16184"/> <group value="sales"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-17274"/> + </skip> </annotations> <before> <actionGroup ref="LoginAsAdmin" stepKey="LoginAsAdmin"/> diff --git a/app/code/Magento/Sales/Test/Mftf/Test/AdminMassOrdersHoldOnCompleteTest.xml b/app/code/Magento/Sales/Test/Mftf/Test/AdminMassOrdersHoldOnCompleteTest.xml index 179e1aa35a4e9..913361c77cdd2 100644 --- a/app/code/Magento/Sales/Test/Mftf/Test/AdminMassOrdersHoldOnCompleteTest.xml +++ b/app/code/Magento/Sales/Test/Mftf/Test/AdminMassOrdersHoldOnCompleteTest.xml @@ -17,6 +17,9 @@ <testCaseId value="MC-16186"/> <group value="sales"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-17274"/> + </skip> </annotations> <before> <actionGroup ref="LoginAsAdmin" stepKey="LoginAsAdmin"/> diff --git a/app/code/Magento/Sales/Test/Mftf/Test/AdminMassOrdersHoldOnPendingAndProcessingTest.xml b/app/code/Magento/Sales/Test/Mftf/Test/AdminMassOrdersHoldOnPendingAndProcessingTest.xml index ec0ec8ca222da..8e3b3b5361437 100644 --- a/app/code/Magento/Sales/Test/Mftf/Test/AdminMassOrdersHoldOnPendingAndProcessingTest.xml +++ b/app/code/Magento/Sales/Test/Mftf/Test/AdminMassOrdersHoldOnPendingAndProcessingTest.xml @@ -17,6 +17,9 @@ <testCaseId value="MC-16185"/> <group value="sales"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-17274"/> + </skip> </annotations> <before> <actionGroup ref="LoginAsAdmin" stepKey="LoginAsAdmin"/> diff --git a/app/code/Magento/Sales/Test/Mftf/Test/AdminMassOrdersReleasePendingOrderTest.xml b/app/code/Magento/Sales/Test/Mftf/Test/AdminMassOrdersReleasePendingOrderTest.xml index 6c97c4add6313..e7a936b088f4f 100644 --- a/app/code/Magento/Sales/Test/Mftf/Test/AdminMassOrdersReleasePendingOrderTest.xml +++ b/app/code/Magento/Sales/Test/Mftf/Test/AdminMassOrdersReleasePendingOrderTest.xml @@ -17,6 +17,9 @@ <testCaseId value="MC-16188"/> <group value="sales"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-17274"/> + </skip> </annotations> <before> <actionGroup ref="LoginAsAdmin" stepKey="LoginAsAdmin"/> diff --git a/app/code/Magento/Sales/Test/Mftf/Test/AdminMassOrdersUpdateCancelPendingOrderTest.xml b/app/code/Magento/Sales/Test/Mftf/Test/AdminMassOrdersUpdateCancelPendingOrderTest.xml index d7c9664b8bce2..f2995f07d137d 100644 --- a/app/code/Magento/Sales/Test/Mftf/Test/AdminMassOrdersUpdateCancelPendingOrderTest.xml +++ b/app/code/Magento/Sales/Test/Mftf/Test/AdminMassOrdersUpdateCancelPendingOrderTest.xml @@ -17,6 +17,9 @@ <testCaseId value="MC-16182"/> <group value="sales"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-17274"/> + </skip> </annotations> <before> <actionGroup ref="LoginAsAdmin" stepKey="LoginAsAdmin"/> diff --git a/app/code/Magento/Sales/Test/Mftf/Test/AdminOrdersReleaseInUnholdStatusTest.xml b/app/code/Magento/Sales/Test/Mftf/Test/AdminOrdersReleaseInUnholdStatusTest.xml index 009f86256a910..30f66cb9fd312 100644 --- a/app/code/Magento/Sales/Test/Mftf/Test/AdminOrdersReleaseInUnholdStatusTest.xml +++ b/app/code/Magento/Sales/Test/Mftf/Test/AdminOrdersReleaseInUnholdStatusTest.xml @@ -17,6 +17,9 @@ <testCaseId value="MC-16187"/> <group value="sales"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-17274"/> + </skip> </annotations> <before> <actionGroup ref="LoginAsAdmin" stepKey="LoginAsAdmin"/> diff --git a/app/code/Magento/Sales/Test/Mftf/Test/AdminReorderWithCatalogPriceTest.xml b/app/code/Magento/Sales/Test/Mftf/Test/AdminReorderWithCatalogPriceTest.xml index f4b133167819c..d2c9bd0f24b77 100644 --- a/app/code/Magento/Sales/Test/Mftf/Test/AdminReorderWithCatalogPriceTest.xml +++ b/app/code/Magento/Sales/Test/Mftf/Test/AdminReorderWithCatalogPriceTest.xml @@ -18,6 +18,9 @@ <useCaseId value="MAGETWO-99691"/> <group value="sales"/> <group value="catalogRule"/> + <skip> + <issueId value="MC-17140"/> + </skip> </annotations> <before> <!--Create the catalog price rule --> diff --git a/app/code/Magento/Sales/Test/Mftf/Test/AdminSaveInAddressBookCheckboxStateTest.xml b/app/code/Magento/Sales/Test/Mftf/Test/AdminSaveInAddressBookCheckboxStateTest.xml index e6f40b586d2ae..650152a191d16 100644 --- a/app/code/Magento/Sales/Test/Mftf/Test/AdminSaveInAddressBookCheckboxStateTest.xml +++ b/app/code/Magento/Sales/Test/Mftf/Test/AdminSaveInAddressBookCheckboxStateTest.xml @@ -10,6 +10,7 @@ xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd"> <test name="AdminSaveInAddressBookCheckboxStateTest"> <annotations> + <stories value="Create Order"/> <title value="The state of 'Save in address book' check-box inside 'Shipping Address' section on 'create Order' Admin page"/> <description value="The state of 'Save in address book' check-box inside 'Shipping Address' section on 'create Order' Admin page"/> <features value="Sales"/> diff --git a/app/code/Magento/Sales/Test/Mftf/Test/AssignCustomOrderStatusNotVisibleOnStorefrontTest.xml b/app/code/Magento/Sales/Test/Mftf/Test/AssignCustomOrderStatusNotVisibleOnStorefrontTest.xml index c292afe65cdf3..d66078e245aee 100644 --- a/app/code/Magento/Sales/Test/Mftf/Test/AssignCustomOrderStatusNotVisibleOnStorefrontTest.xml +++ b/app/code/Magento/Sales/Test/Mftf/Test/AssignCustomOrderStatusNotVisibleOnStorefrontTest.xml @@ -18,6 +18,9 @@ <testCaseId value="MC-16053"/> <group value="sales"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-17274"/> + </skip> </annotations> <before> <!-- Create customer --> diff --git a/app/code/Magento/Sales/Test/Mftf/Test/AssignCustomOrderStatusVisibleOnStorefrontTest.xml b/app/code/Magento/Sales/Test/Mftf/Test/AssignCustomOrderStatusVisibleOnStorefrontTest.xml index d81baf7755eab..102fec494d125 100644 --- a/app/code/Magento/Sales/Test/Mftf/Test/AssignCustomOrderStatusVisibleOnStorefrontTest.xml +++ b/app/code/Magento/Sales/Test/Mftf/Test/AssignCustomOrderStatusVisibleOnStorefrontTest.xml @@ -18,6 +18,9 @@ <testCaseId value="MC-16054"/> <group value="sales"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-17274"/> + </skip> </annotations> <remove keyForRemoval="seeEmptyMessage"/> diff --git a/app/code/Magento/Sales/Test/Mftf/Test/MoveLastOrderedSimpleProductOnOrderPageTest.xml b/app/code/Magento/Sales/Test/Mftf/Test/MoveLastOrderedSimpleProductOnOrderPageTest.xml index f13a934276e35..66f0a14ea2712 100644 --- a/app/code/Magento/Sales/Test/Mftf/Test/MoveLastOrderedSimpleProductOnOrderPageTest.xml +++ b/app/code/Magento/Sales/Test/Mftf/Test/MoveLastOrderedSimpleProductOnOrderPageTest.xml @@ -18,6 +18,9 @@ <testCaseId value="MC-16154"/> <group value="sales"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-17274"/> + </skip> </annotations> <before> <!-- Login as admin --> diff --git a/app/code/Magento/Sales/Test/Unit/Block/Adminhtml/Order/Create/Form/AddressTest.php b/app/code/Magento/Sales/Test/Unit/Block/Adminhtml/Order/Create/Form/AddressTest.php new file mode 100644 index 0000000000000..5b6d6ded1561a --- /dev/null +++ b/app/code/Magento/Sales/Test/Unit/Block/Adminhtml/Order/Create/Form/AddressTest.php @@ -0,0 +1,263 @@ +<?php +/** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +declare(strict_types=1); + +namespace Magento\Sales\Test\Unit\Block\Adminhtml\Order\Create\Form; + +use Magento\Backend\Model\Session\Quote as QuoteSession; +use Magento\Store\Model\Store; +use Magento\Directory\Helper\Data as DirectoryHelper; +use Magento\Eav\Model\AttributeDataFactory; +use Magento\Sales\Block\Adminhtml\Order\Create\Form\Address; +use Magento\Customer\Api\AddressRepositoryInterface; +use Magento\Customer\Api\Data\AddressSearchResultsInterface; +use Magento\Customer\Api\Data\AddressInterface; +use Magento\Customer\Model\Metadata\Form; +use Magento\Customer\Model\Metadata\FormFactory; +use Magento\Customer\Model\Address\Mapper; +use Magento\Framework\Api\FilterBuilder; +use Magento\Framework\Api\Filter; +use Magento\Framework\Api\SearchCriteriaBuilder; +use Magento\Framework\Api\SearchCriteria; +use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; +use PHPUnit\Framework\TestCase; +use PHPUnit_Framework_MockObject_MockObject as MockObject; + +/** + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ +class AddressTest extends TestCase +{ + /** + * @var QuoteSession|MockObject + */ + private $quoteSession; + + /** + * @var Store|MockObject + */ + private $store; + + /** + * @var DirectoryHelper|MockObject + */ + private $directoryHelper; + + /** + * @var int + */ + private $defaultCountryId; + + /** + * @var int + */ + private $customerId; + + /** + * @var int + */ + private $addressId; + + /** + * @var FormFactory|MockObject + */ + private $formFactory; + + /** + * @var FilterBuilder|MockObject + */ + private $filterBuilder; + + /** + * @var SearchCriteriaBuilder|MockObject + */ + private $criteriaBuilder; + + /** + * @var AddressInterface|MockObject + */ + private $addressItem; + + /** + * @var AddressRepositoryInterface|MockObject + */ + private $addressService; + + /** + * @var Mapper|MockObject + */ + private $addressMapper; + + /** + * @var Address + */ + private $address; + + /** + * @var ObjectManager + */ + private $objectManager; + + /** + * @inheritdoc + */ + protected function setUp() + { + $this->objectManager = new ObjectManager($this); + + $this->defaultCountryId = 1; + $this->customerId = 10; + $this->addressId = 100; + + $this->quoteSession = $this->getMockBuilder(QuoteSession::class) + ->disableOriginalConstructor() + ->setMethods(['getStore', 'getCustomerId']) + ->getMock(); + $this->store = $this->getMockBuilder(Store::class) + ->disableOriginalConstructor() + ->getMock(); + $this->quoteSession->expects($this->any()) + ->method('getStore') + ->willReturn($this->store); + $this->quoteSession->expects($this->any()) + ->method('getCustomerId') + ->willReturn($this->customerId); + $this->directoryHelper = $this->getMockBuilder(DirectoryHelper::class) + ->disableOriginalConstructor() + ->setMethods(['getDefaultCountry']) + ->getMock(); + $this->directoryHelper->expects($this->any()) + ->method('getDefaultCountry') + ->willReturn($this->defaultCountryId); + $this->formFactory = $this->getMockBuilder(FormFactory::class) + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMock(); + $this->filterBuilder = $this->getMockBuilder(FilterBuilder::class) + ->disableOriginalConstructor() + ->setMethods(['setField', 'setValue', 'setConditionType', 'create']) + ->getMock(); + $this->criteriaBuilder = $this->getMockBuilder(SearchCriteriaBuilder::class) + ->disableOriginalConstructor() + ->setMethods(['create', 'addFilters']) + ->getMock(); + $this->addressService = $this->getMockBuilder(AddressRepositoryInterface::class) + ->setMethods(['getList']) + ->getMockForAbstractClass(); + $this->addressItem = $this->getMockBuilder(AddressInterface::class) + ->setMethods(['getId']) + ->getMockForAbstractClass(); + $this->addressItem->expects($this->any()) + ->method('getId') + ->willReturn($this->addressId); + $this->addressMapper = $this->getMockBuilder(Mapper::class) + ->disableOriginalConstructor() + ->setMethods(['toFlatArray']) + ->getMock(); + + $this->address = $this->objectManager->getObject( + Address::class, + [ + 'directoryHelper' => $this->directoryHelper, + 'sessionQuote' => $this->quoteSession, + 'customerFormFactory' => $this->formFactory, + 'filterBuilder' => $this->filterBuilder, + 'criteriaBuilder' => $this->criteriaBuilder, + 'addressService' => $this->addressService, + 'addressMapper' => $this->addressMapper + ] + ); + } + + public function testGetAddressCollectionJson() + { + /** @var Form|MockObject $emptyForm */ + $emptyForm = $this->getMockBuilder(Form::class) + ->disableOriginalConstructor() + ->setMethods(['outputData']) + ->getMock(); + $emptyForm->expects($this->once()) + ->method('outputData') + ->with(AttributeDataFactory::OUTPUT_FORMAT_JSON) + ->willReturn('emptyFormData'); + + /** @var Filter|MockObject $filter */ + $filter = $this->getMockBuilder(Filter::class) + ->disableOriginalConstructor() + ->getMock(); + $this->filterBuilder->expects($this->once()) + ->method('setField') + ->with('parent_id') + ->willReturnSelf(); + $this->filterBuilder->expects($this->once()) + ->method('setValue') + ->with($this->customerId) + ->willReturnSelf(); + $this->filterBuilder->expects($this->once()) + ->method('setConditionType') + ->with('eq') + ->willReturnSelf(); + $this->filterBuilder->expects($this->once()) + ->method('create') + ->willReturn($filter); + + /** @var SearchCriteria|MockObject $searchCriteria */ + $searchCriteria = $this->getMockBuilder(SearchCriteria::class) + ->disableOriginalConstructor() + ->getMock(); + $this->criteriaBuilder->expects($this->once()) + ->method('create') + ->willReturn($searchCriteria); + $this->criteriaBuilder->expects($this->once()) + ->method('addFilters') + ->with([$filter]); + + /** @var AddressSearchResultsInterface|MockObject $result */ + $result = $this->getMockBuilder(AddressSearchResultsInterface::class) + ->setMethods(['getList']) + ->getMockForAbstractClass(); + $result->expects($this->once()) + ->method('getItems') + ->willReturn([$this->addressItem]); + $this->addressService->expects($this->once()) + ->method('getList') + ->with($searchCriteria) + ->willReturn($result); + + /** @var Form|MockObject $emptyForm */ + $addressForm = $this->getMockBuilder(Form::class) + ->disableOriginalConstructor() + ->setMethods(['outputData']) + ->getMock(); + $addressForm->expects($this->once()) + ->method('outputData') + ->with(AttributeDataFactory::OUTPUT_FORMAT_JSON) + ->willReturn('addressFormData'); + $this->addressMapper->expects($this->once()) + ->method('toFlatArray') + ->with($this->addressItem) + ->willReturn([]); + + $this->directoryHelper->expects($this->once()) + ->method('getDefaultCountry') + ->with($this->store) + ->willReturn($this->defaultCountryId); + $this->formFactory->expects($this->at(0)) + ->method('create') + ->with( + 'customer_address', + 'adminhtml_customer_address', + [AddressInterface::COUNTRY_ID => $this->defaultCountryId] + ) + ->willReturn($emptyForm); + $this->formFactory->expects($this->at(1)) + ->method('create') + ->with('customer_address', 'adminhtml_customer_address', [], false, false) + ->willReturn($addressForm); + + $this->address->getAddressCollectionJson(); + } +} diff --git a/app/code/Magento/Sales/view/adminhtml/templates/order/create/form/address.phtml b/app/code/Magento/Sales/view/adminhtml/templates/order/create/form/address.phtml index ad2641577c4a7..22db07d046fc9 100644 --- a/app/code/Magento/Sales/view/adminhtml/templates/order/create/form/address.phtml +++ b/app/code/Magento/Sales/view/adminhtml/templates/order/create/form/address.phtml @@ -32,7 +32,7 @@ if ($block->getIsShipping()): require(["Magento_Sales/order/create/form"], function(){ order.shippingAddressContainer = '<?= /* @escapeNotVerified */ $_fieldsContainerId ?>'; - order.setAddresses(<?= /* @escapeVerfied */ $block->getAddressCollectionJson() ?>); + order.setAddresses(<?= /* @noEscape */ $block->getAddressCollectionJson() ?>); }); </script> diff --git a/app/code/Magento/Sales/view/adminhtml/web/order/create/scripts.js b/app/code/Magento/Sales/view/adminhtml/web/order/create/scripts.js index cc0924ca20677..5f20325eb686e 100644 --- a/app/code/Magento/Sales/view/adminhtml/web/order/create/scripts.js +++ b/app/code/Magento/Sales/view/adminhtml/web/order/create/scripts.js @@ -573,6 +573,9 @@ define([ applyCoupon : function(code){ this.loadArea(['items', 'shipping_method', 'totals', 'billing_method'], true, {'order[coupon][code]':code, reset_shipping: 0}); this.orderItemChanged = false; + jQuery('html, body').animate({ + scrollTop: 0 + }); }, addProduct : function(id){ diff --git a/app/code/Magento/SalesRule/Test/Mftf/ActionGroup/ApplyCartRuleOnStorefrontActionGroup.xml b/app/code/Magento/SalesRule/Test/Mftf/ActionGroup/ApplyCartRuleOnStorefrontActionGroup.xml index 37e171823b11a..60ee9fb1fa1a6 100644 --- a/app/code/Magento/SalesRule/Test/Mftf/ActionGroup/ApplyCartRuleOnStorefrontActionGroup.xml +++ b/app/code/Magento/SalesRule/Test/Mftf/ActionGroup/ApplyCartRuleOnStorefrontActionGroup.xml @@ -13,6 +13,8 @@ <argument name="couponCode" type="string"/> </arguments> <click selector="{{StorefrontProductActionSection.addToCart}}" stepKey="addToCart" /> + <waitForPageLoad stepKey="waitForAddToCart"/> + <waitForElementVisible selector="{{StorefrontMessagesSection.success}}" stepKey="waitForSuccessMessage"/> <waitForText userInput="You added {{product.name}} to your shopping cart." stepKey="waitForText"/> <amOnPage url="{{CheckoutCartPage.url}}" stepKey="goToCheckoutPage"/> <waitForPageLoad stepKey="waitForPageLoad1"/> diff --git a/app/code/Magento/SalesRule/Test/Mftf/ActionGroup/StorefrontAddToTheCartActionGroup.xml b/app/code/Magento/SalesRule/Test/Mftf/ActionGroup/StorefrontAddToTheCartActionGroup.xml index 57ed2b67be10e..10f4dd562bf01 100644 --- a/app/code/Magento/SalesRule/Test/Mftf/ActionGroup/StorefrontAddToTheCartActionGroup.xml +++ b/app/code/Magento/SalesRule/Test/Mftf/ActionGroup/StorefrontAddToTheCartActionGroup.xml @@ -12,5 +12,6 @@ <scrollTo selector="{{StorefrontProductActionSection.addToCart}}" stepKey="scrollToAddToCartButton"/> <click selector="{{StorefrontProductActionSection.addToCart}}" stepKey="addToCart"/> <waitForPageLoad stepKey="waitForPageToLoad"/> + <waitForElementVisible selector="{{StorefrontMessagesSection.success}}" stepKey="waitForSuccessMessage"/> </actionGroup> </actionGroups> diff --git a/app/code/Magento/SalesRule/Test/Mftf/ActionGroup/StorefrontSalesRuleActionGroup.xml b/app/code/Magento/SalesRule/Test/Mftf/ActionGroup/StorefrontSalesRuleActionGroup.xml index 3e55eb4f26607..3963fb13ca94d 100644 --- a/app/code/Magento/SalesRule/Test/Mftf/ActionGroup/StorefrontSalesRuleActionGroup.xml +++ b/app/code/Magento/SalesRule/Test/Mftf/ActionGroup/StorefrontSalesRuleActionGroup.xml @@ -51,6 +51,7 @@ <fillField selector="{{StorefrontProductActionSection.quantity}}" userInput="{{quantity}}" stepKey="fillQuantity"/> <click selector="{{StorefrontProductActionSection.addToCart}}" stepKey="addProductToCart"/> <waitForPageLoad stepKey="waitForAddToCart"/> + <waitForElementVisible selector="{{StorefrontMessagesSection.success}}" stepKey="waitForSuccessMessage"/> <amOnPage url="{{CheckoutCartPage.url}}" stepKey="goToCartPage"/> <waitForPageLoad stepKey="waitForCartPage"/> <waitForElementVisible selector="{{CheckoutCartSummarySection.discountAmount}}" stepKey="waitForDiscountElement"/> diff --git a/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCartRulesAppliedForProductInCartTest.xml b/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCartRulesAppliedForProductInCartTest.xml index ab085dc5ae137..dc5b624c4eabf 100644 --- a/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCartRulesAppliedForProductInCartTest.xml +++ b/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCartRulesAppliedForProductInCartTest.xml @@ -18,6 +18,9 @@ <testCaseId value="MAGETWO-96722"/> <useCaseId value="MAGETWO-96410"/> <group value="SalesRule"/> + <skip> + <issueId value="MC-16684"/> + </skip> </annotations> <before> diff --git a/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleAndVerifyRuleConditionAndFreeShippingIsAppliedTest.xml b/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleAndVerifyRuleConditionAndFreeShippingIsAppliedTest.xml index 33184f79f6f0c..f87b02d6ff04a 100644 --- a/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleAndVerifyRuleConditionAndFreeShippingIsAppliedTest.xml +++ b/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleAndVerifyRuleConditionAndFreeShippingIsAppliedTest.xml @@ -16,6 +16,9 @@ <severity value="CRITICAL"/> <group value="SalesRule"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-16684"/> + </skip> </annotations> <before> diff --git a/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleAndVerifyRuleConditionIsNotAppliedTest.xml b/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleAndVerifyRuleConditionIsNotAppliedTest.xml index 22628e599823d..6941e95a60c74 100644 --- a/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleAndVerifyRuleConditionIsNotAppliedTest.xml +++ b/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleAndVerifyRuleConditionIsNotAppliedTest.xml @@ -16,6 +16,9 @@ <severity value="CRITICAL"/> <group value="SalesRule"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-16684"/> + </skip> </annotations> <before> diff --git a/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleEmptyFromDateTest.xml b/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleEmptyFromDateTest.xml index e6676dab4eb5e..f5b285f2f0286 100644 --- a/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleEmptyFromDateTest.xml +++ b/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleEmptyFromDateTest.xml @@ -85,6 +85,7 @@ <waitForPageLoad stepKey="waitForProductPageLoad"/> <click selector="{{StorefrontProductActionSection.addToCart}}" stepKey="addProductToCart"/> <waitForPageLoad stepKey="waitForAddToCart"/> + <waitForElementVisible selector="{{StorefrontMessagesSection.success}}" stepKey="waitForSuccessMessage"/> <amOnPage url="{{CheckoutCartPage.url}}" stepKey="goToCartPage"/> <waitForPageLoad stepKey="waitForCartPage"/> <actionGroup ref="StorefrontApplyCouponActionGroup" stepKey="applyCoupon"> diff --git a/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleForCouponCodeTest.xml b/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleForCouponCodeTest.xml index 3deb688de9c34..712475186d5bf 100644 --- a/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleForCouponCodeTest.xml +++ b/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleForCouponCodeTest.xml @@ -77,6 +77,7 @@ <waitForPageLoad stepKey="waitForProductPageLoad"/> <click selector="{{StorefrontProductActionSection.addToCart}}" stepKey="addProductToCart"/> <waitForPageLoad stepKey="waitForAddToCart"/> + <waitForElementVisible selector="{{StorefrontMessagesSection.success}}" stepKey="waitForSuccessMessage"/> <amOnPage url="{{CheckoutCartPage.url}}" stepKey="goToCartPage"/> <waitForPageLoad stepKey="waitForCartPage"/> <actionGroup ref="StorefrontApplyCouponActionGroup" stepKey="applyCoupon"> diff --git a/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleForGeneratedCouponTest.xml b/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleForGeneratedCouponTest.xml index 7b350c0208cc1..03dffe9f448ea 100644 --- a/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleForGeneratedCouponTest.xml +++ b/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleForGeneratedCouponTest.xml @@ -76,6 +76,7 @@ <waitForPageLoad stepKey="waitForProductPageLoad"/> <click selector="{{StorefrontProductActionSection.addToCart}}" stepKey="addProductToCart"/> <waitForPageLoad stepKey="waitForAddToCart"/> + <waitForElementVisible selector="{{StorefrontMessagesSection.success}}" stepKey="waitForSuccessMessage"/> <amOnPage url="{{CheckoutCartPage.url}}" stepKey="goToCartPage"/> <waitForPageLoad stepKey="waitForCartPage"/> <conditionalClick selector="{{StorefrontSalesRuleCartCouponSection.couponHeader}}" dependentSelector="{{StorefrontSalesRuleCartCouponSection.discountBlockActive}}" visible="false" stepKey="clickCouponHeader"/> diff --git a/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleForMatchingSubtotalAndVerifyRuleConditionIsAppliedTest.xml b/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleForMatchingSubtotalAndVerifyRuleConditionIsAppliedTest.xml index ab62e51414e85..2b2834726f6bf 100644 --- a/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleForMatchingSubtotalAndVerifyRuleConditionIsAppliedTest.xml +++ b/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleForMatchingSubtotalAndVerifyRuleConditionIsAppliedTest.xml @@ -16,6 +16,9 @@ <severity value="CRITICAL"/> <group value="SalesRule"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-16684"/> + </skip> </annotations> <before> diff --git a/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleWithMatchingCategoryAndVerifyRuleConditionIsAppliedTest.xml b/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleWithMatchingCategoryAndVerifyRuleConditionIsAppliedTest.xml index e1a4ca40fd710..02ff63f0efb9f 100644 --- a/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleWithMatchingCategoryAndVerifyRuleConditionIsAppliedTest.xml +++ b/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleWithMatchingCategoryAndVerifyRuleConditionIsAppliedTest.xml @@ -16,6 +16,9 @@ <severity value="CRITICAL"/> <group value="SalesRule"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-16684"/> + </skip> </annotations> <before> diff --git a/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleWithMatchingTotalWeightAndVerifyRuleConditionIsAppliedTest.xml b/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleWithMatchingTotalWeightAndVerifyRuleConditionIsAppliedTest.xml index c62b0dd869281..11088badb05e7 100644 --- a/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleWithMatchingTotalWeightAndVerifyRuleConditionIsAppliedTest.xml +++ b/app/code/Magento/SalesRule/Test/Mftf/Test/AdminCreateCartPriceRuleWithMatchingTotalWeightAndVerifyRuleConditionIsAppliedTest.xml @@ -16,6 +16,9 @@ <severity value="CRITICAL"/> <group value="SalesRule"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-16684"/> + </skip> </annotations> <before> diff --git a/app/code/Magento/SalesRule/Test/Mftf/Test/AdminDeleteActiveSalesRuleWithComplexConditionsAndVerifyDeleteMessageTest.xml b/app/code/Magento/SalesRule/Test/Mftf/Test/AdminDeleteActiveSalesRuleWithComplexConditionsAndVerifyDeleteMessageTest.xml index 7baec93c73905..d106c086a6065 100644 --- a/app/code/Magento/SalesRule/Test/Mftf/Test/AdminDeleteActiveSalesRuleWithComplexConditionsAndVerifyDeleteMessageTest.xml +++ b/app/code/Magento/SalesRule/Test/Mftf/Test/AdminDeleteActiveSalesRuleWithComplexConditionsAndVerifyDeleteMessageTest.xml @@ -16,6 +16,9 @@ <severity value="CRITICAL"/> <group value="salesRule"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-17175"/> + </skip> </annotations> <before> diff --git a/app/code/Magento/SalesRule/Test/Mftf/Test/CartPriceRuleForConfigurableProductTest.xml b/app/code/Magento/SalesRule/Test/Mftf/Test/CartPriceRuleForConfigurableProductTest.xml index e2687f5f16baf..1eba06126ff6f 100644 --- a/app/code/Magento/SalesRule/Test/Mftf/Test/CartPriceRuleForConfigurableProductTest.xml +++ b/app/code/Magento/SalesRule/Test/Mftf/Test/CartPriceRuleForConfigurableProductTest.xml @@ -122,11 +122,13 @@ <waitForPageLoad stepKey="waitForProductPageLoad1"/> <click selector="{{StorefrontProductActionSection.addToCart}}" stepKey="addProductToCart1"/> <waitForPageLoad stepKey="waitForAddToCart1"/> + <waitForElementVisible selector="{{StorefrontMessagesSection.success}}" stepKey="waitForSuccessMessage"/> <!-- Add the second product to the cart --> <amOnPage url="$$createConfigChildProduct2.sku$$.html" stepKey="goToProductPage2"/> <waitForPageLoad stepKey="waitForProductPageLoad2"/> <click selector="{{StorefrontProductActionSection.addToCart}}" stepKey="addProductToCart2"/> <waitForPageLoad stepKey="waitForAddToCart2"/> + <waitForElementVisible selector="{{StorefrontMessagesSection.success}}" stepKey="waitForSuccessMessage2"/> <!--View and edit cart--> <actionGroup ref="clickViewAndEditCartFromMiniCart" stepKey="clickViewAndEditCartFromMiniCart"/> diff --git a/app/code/Magento/SalesRule/Test/Mftf/Test/EndToEndB2CGuestUserTest.xml b/app/code/Magento/SalesRule/Test/Mftf/Test/EndToEndB2CGuestUserTest.xml index 0d365dc089e43..d9c578e9be334 100644 --- a/app/code/Magento/SalesRule/Test/Mftf/Test/EndToEndB2CGuestUserTest.xml +++ b/app/code/Magento/SalesRule/Test/Mftf/Test/EndToEndB2CGuestUserTest.xml @@ -9,6 +9,11 @@ <tests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd"> <test name="EndToEndB2CGuestUserTest"> + <annotations> + <skip> + <issueId value="MC-16684"/> + </skip> + </annotations> <before> <createData entity="ApiSalesRule" stepKey="createSalesRule"/> <createData entity="ApiSalesRuleCoupon" stepKey="createSalesRuleCoupon"> diff --git a/app/code/Magento/SalesRule/Test/Mftf/Test/EndToEndB2CLoggedInUserTest.xml b/app/code/Magento/SalesRule/Test/Mftf/Test/EndToEndB2CLoggedInUserTest.xml index 7a995b1feeeda..f816e93d4bc42 100644 --- a/app/code/Magento/SalesRule/Test/Mftf/Test/EndToEndB2CLoggedInUserTest.xml +++ b/app/code/Magento/SalesRule/Test/Mftf/Test/EndToEndB2CLoggedInUserTest.xml @@ -9,6 +9,11 @@ <tests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd"> <test name="EndToEndB2CLoggedInUserTest"> + <annotations> + <skip> + <issueId value="MC-16684"/> + </skip> + </annotations> <before> <createData entity="ApiSalesRule" stepKey="createSalesRule"/> <createData entity="ApiSalesRuleCoupon" stepKey="createSalesRuleCoupon"> diff --git a/app/code/Magento/SalesRule/Test/Mftf/Test/StorefrontCartPriceRuleCountry.xml b/app/code/Magento/SalesRule/Test/Mftf/Test/StorefrontCartPriceRuleCountry.xml index 045fdbb33763f..ffd50e43a2344 100644 --- a/app/code/Magento/SalesRule/Test/Mftf/Test/StorefrontCartPriceRuleCountry.xml +++ b/app/code/Magento/SalesRule/Test/Mftf/Test/StorefrontCartPriceRuleCountry.xml @@ -68,6 +68,7 @@ <fillField selector="{{StorefrontProductActionSection.quantity}}" userInput="1" stepKey="fillQuantity"/> <click selector="{{StorefrontProductActionSection.addToCart}}" stepKey="addProductToCart"/> <waitForPageLoad stepKey="waitForAddToCart"/> + <waitForElementVisible selector="{{StorefrontMessagesSection.success}}" stepKey="waitForSuccessMessage"/> <!-- Should not see the discount yet because we have not set country --> <amOnPage url="{{CheckoutCartPage.url}}" stepKey="goToCartPage"/> diff --git a/app/code/Magento/SalesRule/Test/Mftf/Test/StorefrontCartPriceRulePostcode.xml b/app/code/Magento/SalesRule/Test/Mftf/Test/StorefrontCartPriceRulePostcode.xml index d8c3ef9c32b0b..765f10e44d81b 100644 --- a/app/code/Magento/SalesRule/Test/Mftf/Test/StorefrontCartPriceRulePostcode.xml +++ b/app/code/Magento/SalesRule/Test/Mftf/Test/StorefrontCartPriceRulePostcode.xml @@ -72,6 +72,7 @@ <fillField selector="{{StorefrontProductActionSection.quantity}}" userInput="1" stepKey="fillQuantity"/> <click selector="{{StorefrontProductActionSection.addToCart}}" stepKey="addProductToCart"/> <waitForPageLoad stepKey="waitForAddToCart"/> + <waitForElementVisible selector="{{StorefrontMessagesSection.success}}" stepKey="waitForSuccessMessage"/> <!-- Should not see the discount yet because we have not filled in postcode --> <amOnPage url="{{CheckoutCartPage.url}}" stepKey="goToCartPage"/> diff --git a/app/code/Magento/SalesRule/Test/Mftf/Test/StorefrontCartPriceRuleQuantity.xml b/app/code/Magento/SalesRule/Test/Mftf/Test/StorefrontCartPriceRuleQuantity.xml index 51d11b4e5cb1c..cde5e351e1b70 100644 --- a/app/code/Magento/SalesRule/Test/Mftf/Test/StorefrontCartPriceRuleQuantity.xml +++ b/app/code/Magento/SalesRule/Test/Mftf/Test/StorefrontCartPriceRuleQuantity.xml @@ -68,6 +68,7 @@ <fillField selector="{{StorefrontProductActionSection.quantity}}" userInput="1" stepKey="fillQuantity"/> <click selector="{{StorefrontProductActionSection.addToCart}}" stepKey="addProductToCart"/> <waitForPageLoad stepKey="waitForAddToCart"/> + <waitForElementVisible selector="{{StorefrontMessagesSection.success}}" stepKey="waitForSuccessMessage"/> <!-- Should not see the discount yet because we have only 1 item in our cart --> <amOnPage url="{{CheckoutCartPage.url}}" stepKey="goToCartPage"/> @@ -81,6 +82,7 @@ <fillField selector="{{StorefrontProductActionSection.quantity}}" userInput="1" stepKey="fillQuantity2"/> <click selector="{{StorefrontProductActionSection.addToCart}}" stepKey="addProductToCart2"/> <waitForPageLoad stepKey="waitForAddToCart2"/> + <waitForElementVisible selector="{{StorefrontMessagesSection.success}}" stepKey="waitForSuccessMessage2"/> <!-- Now we should see the discount because we have more than 1 item --> <amOnPage url="{{CheckoutCartPage.url}}" stepKey="goToCartPage2"/> diff --git a/app/code/Magento/SalesRule/Test/Mftf/Test/StorefrontCartPriceRuleState.xml b/app/code/Magento/SalesRule/Test/Mftf/Test/StorefrontCartPriceRuleState.xml index 647f4d6e5c800..d6806e2a2966b 100644 --- a/app/code/Magento/SalesRule/Test/Mftf/Test/StorefrontCartPriceRuleState.xml +++ b/app/code/Magento/SalesRule/Test/Mftf/Test/StorefrontCartPriceRuleState.xml @@ -68,6 +68,7 @@ <fillField selector="{{StorefrontProductActionSection.quantity}}" userInput="1" stepKey="fillQuantity"/> <click selector="{{StorefrontProductActionSection.addToCart}}" stepKey="addProductToCart"/> <waitForPageLoad stepKey="waitForAddToCart"/> + <waitForElementVisible selector="{{StorefrontMessagesSection.success}}" stepKey="waitForSuccessMessage"/> <!-- Should not see the discount yet because we have not filled in postcode --> <amOnPage url="{{CheckoutCartPage.url}}" stepKey="goToCartPage"/> diff --git a/app/code/Magento/SalesRule/Test/Mftf/Test/StorefrontCartPriceRuleSubtotal.xml b/app/code/Magento/SalesRule/Test/Mftf/Test/StorefrontCartPriceRuleSubtotal.xml index 7c9c52e1c02ac..8ff747607ea30 100644 --- a/app/code/Magento/SalesRule/Test/Mftf/Test/StorefrontCartPriceRuleSubtotal.xml +++ b/app/code/Magento/SalesRule/Test/Mftf/Test/StorefrontCartPriceRuleSubtotal.xml @@ -67,6 +67,7 @@ <fillField selector="{{StorefrontProductActionSection.quantity}}" userInput="1" stepKey="fillQuantity"/> <click selector="{{StorefrontProductActionSection.addToCart}}" stepKey="addProductToCart"/> <waitForPageLoad stepKey="waitForAddToCart"/> + <waitForElementVisible selector="{{StorefrontMessagesSection.success}}" stepKey="waitForSuccessMessage"/> <!-- Should not see the discount yet because we have not exceeded $200 --> <amOnPage url="{{CheckoutCartPage.url}}" stepKey="goToCartPage"/> @@ -80,6 +81,7 @@ <fillField selector="{{StorefrontProductActionSection.quantity}}" userInput="1" stepKey="fillQuantity2"/> <click selector="{{StorefrontProductActionSection.addToCart}}" stepKey="addProductToCart2"/> <waitForPageLoad stepKey="waitForAddToCart2"/> + <waitForElementVisible selector="{{StorefrontMessagesSection.success}}" stepKey="waitForSuccessMessage2"/> <!-- Now we should see the discount because we exceeded $200 --> <amOnPage url="{{CheckoutCartPage.url}}" stepKey="goToCartPage2"/> diff --git a/app/code/Magento/Search/Test/Mftf/Section/AdminGlobalSearchSection.xml b/app/code/Magento/Search/Test/Mftf/Section/AdminGlobalSearchSection.xml new file mode 100644 index 0000000000000..0ba61283548cf --- /dev/null +++ b/app/code/Magento/Search/Test/Mftf/Section/AdminGlobalSearchSection.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> + +<sections xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Page/etc/SectionObject.xsd"> + <section name="AdminGlobalSearchSection"> + <element name="globalSearch" type="button" selector=".search-global-label"/> + <element name="globalSearchActive" type="block" selector=".search-global-field._active"/> + </section> +</sections> diff --git a/app/code/Magento/Search/Test/Mftf/Test/AdminGlobalSearchOnProductPageTest.xml b/app/code/Magento/Search/Test/Mftf/Test/AdminGlobalSearchOnProductPageTest.xml new file mode 100644 index 0000000000000..45a5f53c3e448 --- /dev/null +++ b/app/code/Magento/Search/Test/Mftf/Test/AdminGlobalSearchOnProductPageTest.xml @@ -0,0 +1,65 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> + +<tests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd"> + <test name="AdminGlobalSearchOnProductPageTest"> + <annotations> + <features value="Search"/> + <stories value="Backend global search"/> + <title value="Admin global search on product page test"/> + <description value="Admin search displays settings and content items"/> + <severity value="CRITICAL"/> + <testCaseId value="MC-6421"/> + <group value="Search"/> + </annotations> + <before> + <!-- Login as admin --> + <actionGroup ref="LoginAsAdmin" stepKey="loginAsAdmin"/> + </before> + <after> + <!-- Delete product --> + <actionGroup ref="deleteProductBySku" stepKey="deleteProduct"> + <argument name="sku" value="{{SimpleProduct.sku}}"/> + </actionGroup> + + <!-- Delete category --> + <actionGroup ref="DeleteCategory" stepKey="deleteCreatedNewRootCategory"> + <argument name="categoryEntity" value="_defaultCategory"/> + </actionGroup> + + <!-- Logout --> + <actionGroup ref="logout" stepKey="logout"/> + </after> + + <!-- Create Simple Product --> + <amOnPage url="{{AdminProductIndexPage.url}}" stepKey="adminProductIndexPageAdd"/> + <waitForPageLoad stepKey="waitForProductIndexPageLoad"/> + <actionGroup ref="goToCreateProductPage" stepKey="goToCreateProductPage"> + <argument name="product" value="SimpleProduct"/> + </actionGroup> + <actionGroup ref="fillMainProductForm" stepKey="fillProductForm"> + <argument name="product" value="SimpleProduct"/> + </actionGroup> + + <!-- Create new category for product --> + <actionGroup ref="FillNewProductCategory" stepKey="FillNewProductCategory"> + <argument name="categoryName" value="{{_defaultCategory.name}}"/> + </actionGroup> + + <!-- Save product form --> + <actionGroup ref="saveProductForm" stepKey="saveProductForm"/> + + <!-- Click on the magnifying glass to start searching --> + <click selector="{{AdminGlobalSearchSection.globalSearch}}" stepKey="clickSearchBtn"/> + <waitForElementVisible selector="{{AdminGlobalSearchSection.globalSearchActive}}" stepKey="waitForSearchInputVisible"/> + + <!-- The search input is expanded and active --> + <seeElement selector="{{AdminGlobalSearchSection.globalSearchActive}}" stepKey="seeActiveSearch"/> + </test> +</tests> diff --git a/app/code/Magento/SendFriend/Controller/Product.php b/app/code/Magento/SendFriend/Controller/Product.php index 732bcef8b957a..a184d7d8bff62 100644 --- a/app/code/Magento/SendFriend/Controller/Product.php +++ b/app/code/Magento/SendFriend/Controller/Product.php @@ -61,6 +61,7 @@ public function __construct( /** * Check if module is enabled + * * If allow only for customer - redirect to login page * * @param RequestInterface $request @@ -102,7 +103,7 @@ protected function _initProduct() } try { $product = $this->productRepository->getById($productId); - if (!$product->isVisibleInCatalog()) { + if (!$product->isVisibleInSiteVisibility() || !$product->isVisibleInCatalog()) { return false; } } catch (NoSuchEntityException $noEntityException) { diff --git a/app/code/Magento/Shipping/Test/Mftf/ActionGroup/AdminChangeTableRatesShippingMethodStatusActionGroup.xml b/app/code/Magento/Shipping/Test/Mftf/ActionGroup/AdminChangeTableRatesShippingMethodStatusActionGroup.xml new file mode 100644 index 0000000000000..e506ca3a7662f --- /dev/null +++ b/app/code/Magento/Shipping/Test/Mftf/ActionGroup/AdminChangeTableRatesShippingMethodStatusActionGroup.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> + +<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd"> + <!-- Enable/Disable Table Rates shipping method --> + <actionGroup name="AdminChangeTableRatesShippingMethodStatusActionGroup"> + <arguments> + <argument name="status" type="string" defaultValue="1"/> + </arguments> + <conditionalClick selector="{{AdminShippingMethodTableRatesSection.carriersTableRateTab}}" dependentSelector="{{AdminShippingMethodTableRatesSection.carriersTableRateActive}}" visible="false" stepKey="expandTab"/> + <uncheckOption selector="{{AdminShippingMethodTableRatesSection.enabledUseSystemValue}}" stepKey="uncheckUseSystemValue"/> + <selectOption selector="{{AdminShippingMethodTableRatesSection.carriersTableRateActive}}" userInput="{{status}}" stepKey="changeTableRatesMethodStatus"/> + </actionGroup> +</actionGroups> diff --git a/app/code/Magento/Shipping/Test/Mftf/Data/TableRatesShippingMethodData.xml b/app/code/Magento/Shipping/Test/Mftf/Data/TableRatesShippingMethodData.xml new file mode 100644 index 0000000000000..47ef68cc9d765 --- /dev/null +++ b/app/code/Magento/Shipping/Test/Mftf/Data/TableRatesShippingMethodData.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> + +<entities xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:DataGenerator/etc/dataProfileSchema.xsd"> + <!-- Prices from file "table_rate_30895.csv" --> + <entity name="TableRatesWeightVSDestination" type="shipping_method"> + <data key="condition">Weight vs. Destination</data> + <data key="priceCA">5.00</data> + <data key="price">10.00</data> + <data key="title">Best Way</data> + <data key="methodName">Table Rate</data> + </entity> +</entities> diff --git a/app/code/Magento/Shipping/Test/Mftf/Section/AdminShippingMethodTableRatesSection.xml b/app/code/Magento/Shipping/Test/Mftf/Section/AdminShippingMethodTableRatesSection.xml new file mode 100644 index 0000000000000..3c570201c9970 --- /dev/null +++ b/app/code/Magento/Shipping/Test/Mftf/Section/AdminShippingMethodTableRatesSection.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> + +<sections xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Page/etc/SectionObject.xsd"> + <section name="AdminShippingMethodTableRatesSection"> + <element name="carriersTableRateTab" type="button" selector="#carriers_tablerate-head"/> + <element name="enabledUseSystemValue" type="checkbox" selector="#carriers_tablerate_active_inherit"/> + <element name="carriersTableRateActive" type="select" selector="#carriers_tablerate_active"/> + <element name="condition" type="select" selector="#carriers_tablerate_condition_name"/> + <element name="importFile" type="input" selector="#carriers_tablerate_import"/> + </section> +</sections> diff --git a/app/code/Magento/Shipping/Test/Mftf/Test/TableRatesShippingMethodForDifferentStatesTest.xml b/app/code/Magento/Shipping/Test/Mftf/Test/TableRatesShippingMethodForDifferentStatesTest.xml new file mode 100644 index 0000000000000..5721af7fdb71b --- /dev/null +++ b/app/code/Magento/Shipping/Test/Mftf/Test/TableRatesShippingMethodForDifferentStatesTest.xml @@ -0,0 +1,114 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + /** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +--> + +<tests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd"> + <test name="TableRatesShippingMethodForDifferentStatesTest"> + <annotations> + <features value="Shipping"/> + <stories value="Table Rates"/> + <title value="Table rates shipping method for different states test"/> + <description value="Checkout with Table Rates for different states of the USA"/> + <severity value="CRITICAL"/> + <testCaseId value="MC-13581"/> + <group value="shipping"/> + </annotations> + <before> + <!-- Create product --> + <createData entity="SimpleProduct2" stepKey="createProduct"/> + + <!-- Create customer --> + <createData entity="Simple_US_Customer_CA" stepKey="createCustomer"/> + + <!-- Login as admin --> + <actionGroup ref="LoginAsAdmin" stepKey="loginAsAdmin"/> + </before> + <after> + <!-- Delete product --> + <deleteData createDataKey="createProduct" stepKey="deleteProduct"/> + + <!-- Delete customer --> + <deleteData createDataKey="createCustomer" stepKey="deleteCustomer"/> + + <!-- Log out --> + <actionGroup ref="logout" stepKey="logout"/> + </after> + + <!-- Go to Stores > Configuration > Sales > Shipping Methods --> + <actionGroup ref="AdminOpenShippingMethodsConfigPageActionGroup" stepKey="openShippingMethodConfigPage"/> + + <!-- Switch to Website scope --> + <actionGroup ref="AdminSwitchWebsiteActionGroup" stepKey="AdminSwitchStoreView"> + <argument name="website" value="_defaultWebsite"/> + </actionGroup> + + <!-- Enable Table Rate method and save config --> + <actionGroup ref="AdminChangeTableRatesShippingMethodStatusActionGroup" stepKey="enableTableRatesShippingMethod"/> + <actionGroup ref="AdminSaveConfigActionGroup" stepKey="saveConfig"/> + + <!-- Make sure you have Condition Weight vs. Destination --> + <see selector="{{AdminShippingMethodTableRatesSection.condition}}" userInput="{{TableRatesWeightVSDestination.condition}}" stepKey="seeDefaultCondition"/> + + <!-- Import file and save config --> + <attachFile selector="{{AdminShippingMethodTableRatesSection.importFile}}" userInput="table_rate_30895.csv" stepKey="attachFileForImport"/> + <actionGroup ref="AdminSaveConfigActionGroup" stepKey="saveConfigs"/> + + <!-- Login as customer --> + <actionGroup ref="LoginToStorefrontActionGroup" stepKey="loginAsCustomer"> + <argument name="Customer" value="$$createCustomer$$"/> + </actionGroup> + + <!-- Add product to the shopping cart --> + <actionGroup ref="OpenStoreFrontProductPageActionGroup" stepKey="openProductPage"> + <argument name="productUrlKey" value="$$createProduct.custom_attributes[url_key]$$"/> + </actionGroup> + <actionGroup ref="StorefrontAddProductToCartActionGroup" stepKey="addProductToCart"> + <argument name="product" value="$$createProduct$$"/> + <argument name="productCount" value="1"/> + </actionGroup> + + <!-- Open the shopping cart page --> + <actionGroup ref="StorefrontOpenCartFromMinicartActionGroup" stepKey="openShoppingCart"/> + + <!-- Expand Estimate Shipping and Tax section in Summary --> + <conditionalClick selector="{{CheckoutCartSummarySection.estimateShippingAndTax}}" dependentSelector="{{CheckoutCartSummarySection.country}}" visible="false" stepKey="expandEstimateShippingAndTax"/> + <waitForLoadingMaskToDisappear stepKey="waitForLoadingMask"/> + + <!-- See available Table Rate option --> + <actionGroup ref="StorefrontAssertShippingMethodPresentInCartActionGroup" stepKey="assertShippingMethodLabel"> + <argument name="shippingMethod" value="{{TableRatesWeightVSDestination.title}}"/> + </actionGroup> + <actionGroup ref="StorefrontAssertShippingMethodOptionPresentInCartActionGroup" stepKey="assertShippingMethodOption"> + <argument name="methodName" value="{{TableRatesWeightVSDestination.methodName}}"/> + <argument name="price" value="{{TableRatesWeightVSDestination.priceCA}}"/> + </actionGroup> + + <!-- Change State to New York --> + <selectOption selector="{{CheckoutCartSummarySection.stateProvince}}" userInput="{{US_Address_NY.state}}" stepKey="selectAnotherState"/> + <waitForPageLoad stepKey="waitForShippingMethodLoad"/> + + <!-- See available Table Rate option for another state --> + <actionGroup ref="StorefrontAssertShippingMethodPresentInCartActionGroup" stepKey="assertShippingMethodLabelForAnotherState"> + <argument name="shippingMethod" value="{{TableRatesWeightVSDestination.title}}"/> + </actionGroup> + <actionGroup ref="StorefrontAssertShippingMethodOptionPresentInCartActionGroup" stepKey="assertShippingMethodOptionForAnotherState"> + <argument name="methodName" value="{{TableRatesWeightVSDestination.methodName}}"/> + <argument name="price" value="{{TableRatesWeightVSDestination.price}}"/> + </actionGroup> + + <!-- Rollback config --> + <actionGroup ref="AdminOpenShippingMethodsConfigPageActionGroup" stepKey="openShippingMethodSystemConfigPage"/> + <actionGroup ref="AdminSwitchWebsiteActionGroup" stepKey="AdminSwitchStoreViewToMainWebsite"> + <argument name="website" value="_defaultWebsite"/> + </actionGroup> + <actionGroup ref="AdminChangeTableRatesShippingMethodStatusActionGroup" stepKey="disableTableRatesShippingMethod"> + <argument name="status" value="0"/> + </actionGroup> + <actionGroup ref="AdminSaveConfigActionGroup" stepKey="saveSystemConfig"/> + </test> +</tests> diff --git a/app/code/Magento/Store/Test/Mftf/Data/StoreData.xml b/app/code/Magento/Store/Test/Mftf/Data/StoreData.xml index f32b6dd83a2c6..1a1847bf38308 100644 --- a/app/code/Magento/Store/Test/Mftf/Data/StoreData.xml +++ b/app/code/Magento/Store/Test/Mftf/Data/StoreData.xml @@ -184,4 +184,14 @@ <data key="store_type">store</data> <data key="store_action">add</data> </entity> + + <!-- Store views from file "prepared-for-sample-data.csv"--> + <entity name="secondStoreView" type="store"> + <data key="name">second_storeview</data> + <data key="code">second_storeview</data> + </entity> + <entity name="thirdStoreView" type="store"> + <data key="name">third_store_view</data> + <data key="code">third_store_view</data> + </entity> </entities> \ No newline at end of file diff --git a/app/code/Magento/Swatches/Block/Product/Renderer/Configurable.php b/app/code/Magento/Swatches/Block/Product/Renderer/Configurable.php index 6143b8e659059..0848f566f67bb 100644 --- a/app/code/Magento/Swatches/Block/Product/Renderer/Configurable.php +++ b/app/code/Magento/Swatches/Block/Product/Renderer/Configurable.php @@ -182,6 +182,9 @@ public function getJsonSwatchConfig() $attributeDataArray ); } + if (isset($attributeDataArray['additional_data'])) { + $config[$attributeId]['additional_data'] = $attributeDataArray['additional_data']; + } } return $this->jsonEncoder->encode($config); @@ -189,6 +192,7 @@ public function getJsonSwatchConfig() /** * Get number of swatches from config to show on product listing. + * * Other swatches can be shown after click button 'Show more' * * @return string @@ -228,6 +232,8 @@ public function getProduct() } /** + * Get swatch attributes data. + * * @return array */ protected function getSwatchAttributesData() @@ -236,6 +242,8 @@ protected function getSwatchAttributesData() } /** + * Init isProductHasSwatchAttribute. + * * @deprecated 100.1.5 Method isProductHasSwatchAttribute() is used instead of this. * * @codeCoverageIgnore @@ -364,6 +372,8 @@ protected function getVariationMedia($attributeCode, $optionId) } /** + * Get swatch product image. + * * @param Product $childProduct * @param string $imageType * @return string @@ -384,6 +394,8 @@ protected function getSwatchProductImage(Product $childProduct, $imageType) } /** + * Check if product have image. + * * @param Product $product * @param string $imageType * @return bool @@ -394,6 +406,8 @@ protected function isProductHasImage(Product $product, $imageType) } /** + * Get configurable options ids. + * * @param array $attributeData * @return array * @since 100.0.3 @@ -453,8 +467,8 @@ protected function getRendererTemplate() } /** + * @inheritDoc * @deprecated 100.1.5 Now is used _toHtml() directly - * @return string */ protected function getHtmlOutput() { @@ -462,6 +476,8 @@ protected function getHtmlOutput() } /** + * Get media callback url. + * * @return string */ public function getMediaCallback() diff --git a/app/code/Magento/Swatches/Test/Mftf/Test/StorefrontFilterByImageSwatchTest.xml b/app/code/Magento/Swatches/Test/Mftf/Test/StorefrontFilterByImageSwatchTest.xml index 5347a1a1f870f..b1ae06428c0ab 100644 --- a/app/code/Magento/Swatches/Test/Mftf/Test/StorefrontFilterByImageSwatchTest.xml +++ b/app/code/Magento/Swatches/Test/Mftf/Test/StorefrontFilterByImageSwatchTest.xml @@ -41,6 +41,9 @@ <!-- Select visual swatch --> <selectOption selector="{{AttributePropertiesSection.InputType}}" userInput="swatch_visual" stepKey="selectInputType"/> + <!-- Set Update Product Preview Image to Yes--> + <selectOption selector="{{AttributePropertiesSection.UpdateProductPreviewImage}}" userInput="Yes" stepKey="setUpdateProductPreviewImage"/> + <!-- This hack is because the same <input type="file"> is re-purposed used for all uploads. --> <executeJS function="HTMLInputElement.prototype.click = function() { if(this.type !== 'file') HTMLElement.prototype.click.call(this); };" stepKey="disableClick"/> diff --git a/app/code/Magento/Swatches/view/frontend/web/js/swatch-renderer.js b/app/code/Magento/Swatches/view/frontend/web/js/swatch-renderer.js index b0688f33aaef7..6e028ec53c122 100644 --- a/app/code/Magento/Swatches/view/frontend/web/js/swatch-renderer.js +++ b/app/code/Magento/Swatches/view/frontend/web/js/swatch-renderer.js @@ -713,7 +713,8 @@ define([ $wrapper = $this.parents('.' + $widget.options.classes.attributeOptionsWrapper), $label = $parent.find('.' + $widget.options.classes.attributeSelectedOptionLabelClass), attributeId = $parent.attr('attribute-id'), - $input = $parent.find('.' + $widget.options.classes.attributeInput); + $input = $parent.find('.' + $widget.options.classes.attributeInput), + checkAdditionalData = JSON.parse(this.options.jsonSwatchConfig[attributeId]['additional_data']); if ($widget.inProductList) { $input = $widget.productForm.find( @@ -753,7 +754,10 @@ define([ $widget.options.jsonConfig.optionPrices ]); - $widget._loadMedia(); + if (checkAdditionalData['update_product_preview_image'] === '1') { + $widget._loadMedia(); + } + $input.trigger('change'); }, diff --git a/app/code/Magento/Tax/Test/Mftf/Test/AdminUpdateTaxRuleWithFixedZipUtahTest.xml b/app/code/Magento/Tax/Test/Mftf/Test/AdminUpdateTaxRuleWithFixedZipUtahTest.xml index a96a57cbfec55..9c63a362c7e41 100644 --- a/app/code/Magento/Tax/Test/Mftf/Test/AdminUpdateTaxRuleWithFixedZipUtahTest.xml +++ b/app/code/Magento/Tax/Test/Mftf/Test/AdminUpdateTaxRuleWithFixedZipUtahTest.xml @@ -17,6 +17,9 @@ <severity value="CRITICAL"/> <group value="tax"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-16684"/> + </skip> </annotations> <before> diff --git a/app/code/Magento/Tax/Test/Mftf/Test/CheckCreditMemoTotalsTest.xml b/app/code/Magento/Tax/Test/Mftf/Test/CheckCreditMemoTotalsTest.xml index 83fcfbff6de62..38cc687ff53a4 100644 --- a/app/code/Magento/Tax/Test/Mftf/Test/CheckCreditMemoTotalsTest.xml +++ b/app/code/Magento/Tax/Test/Mftf/Test/CheckCreditMemoTotalsTest.xml @@ -18,6 +18,9 @@ <testCaseId value="MAGETWO-95175"/> <group value="creditMemo"/> <group value="tax"/> + <skip> + <issueId value="MC-17140"/> + </skip> </annotations> <before> <!--Create category and product--> diff --git a/app/code/Magento/Tax/Test/Mftf/Test/StorefrontTaxQuoteCartTest.xml b/app/code/Magento/Tax/Test/Mftf/Test/StorefrontTaxQuoteCartTest.xml index 05ced7e61b3b7..345777f0aa0b0 100644 --- a/app/code/Magento/Tax/Test/Mftf/Test/StorefrontTaxQuoteCartTest.xml +++ b/app/code/Magento/Tax/Test/Mftf/Test/StorefrontTaxQuoteCartTest.xml @@ -17,6 +17,9 @@ <severity value="CRITICAL"/> <testCaseId value="MC-295"/> <group value="Tax"/> + <skip> + <issueId value="MC-16684"/> + </skip> </annotations> <before> <actionGroup ref="LoginAsAdmin" stepKey="loginAsAdmin"/> diff --git a/app/code/Magento/Ui/view/base/web/js/form/form.js b/app/code/Magento/Ui/view/base/web/js/form/form.js index ea6c57f63bdf1..3692108675bc7 100644 --- a/app/code/Magento/Ui/view/base/web/js/form/form.js +++ b/app/code/Magento/Ui/view/base/web/js/form/form.js @@ -339,6 +339,7 @@ define([ */ reset: function () { this.source.trigger('data.reset'); + $('[data-bind*=datepicker]').val(''); }, /** diff --git a/app/code/Magento/UrlRewrite/Test/Mftf/Test/AdminCreateProductWithSeveralWebsitesAndCheckURLRewritesTest.xml b/app/code/Magento/UrlRewrite/Test/Mftf/Test/AdminCreateProductWithSeveralWebsitesAndCheckURLRewritesTest.xml index 83c1e5c0a5e0a..8712edb69e499 100644 --- a/app/code/Magento/UrlRewrite/Test/Mftf/Test/AdminCreateProductWithSeveralWebsitesAndCheckURLRewritesTest.xml +++ b/app/code/Magento/UrlRewrite/Test/Mftf/Test/AdminCreateProductWithSeveralWebsitesAndCheckURLRewritesTest.xml @@ -16,6 +16,9 @@ <severity value="CRITICAL"/> <group value="urlRewrite"/> <group value="mtf_migrated"/> + <skip> + <issueId value="MC-17181"/> + </skip> </annotations> <before> diff --git a/app/code/Magento/Webapi/Model/Rest/Swagger/Generator.php b/app/code/Magento/Webapi/Model/Rest/Swagger/Generator.php index 855f455120d89..847def6e8922c 100644 --- a/app/code/Magento/Webapi/Model/Rest/Swagger/Generator.php +++ b/app/code/Magento/Webapi/Model/Rest/Swagger/Generator.php @@ -41,6 +41,11 @@ class Generator extends AbstractSchemaGenerator /** Array signifier */ const ARRAY_SIGNIFIER = '[0]'; + /** + * Wrapper node for XML requests + */ + private const XML_SCHEMA_PARAMWRAPPER = 'request'; + /** * Swagger factory instance. * @@ -134,7 +139,7 @@ public function __construct( } /** - * {@inheritdoc} + * @inheritdoc */ protected function generateSchema($requestedServiceMetadata, $requestScheme, $requestHost, $endpointUrl) { @@ -193,6 +198,32 @@ protected function getGeneralInfo() ]; } + /** + * List out consumes data type + * + * @return array + */ + private function getConsumableDatatypes() + { + return [ + 'application/json', + 'application/xml', + ]; + } + + /** + * List out produces data type + * + * @return array + */ + private function getProducibleDatatypes() + { + return [ + 'application/json', + 'application/xml', + ]; + } + /** * Generate path info based on method data * @@ -212,6 +243,8 @@ protected function generatePathInfo($methodName, $httpMethodData, $tagName) 'tags' => [$tagName], 'description' => $methodData['documentation'], 'operationId' => $operationId, + 'consumes' => $this->getConsumableDatatypes(), + 'produces' => $this->getProducibleDatatypes(), ]; $parameters = $this->generateMethodParameters($httpMethodData, $operationId); @@ -602,7 +635,7 @@ protected function getDefinitionReference($typeName) /** * Get the CamelCased type name in 'hyphen-separated-lowercase-words' format * - * e.g. test-module5-v1-entity-all-soap-and-rest + * E.g. test-module5-v1-entity-all-soap-and-rest * * @param string $typeName * @return string @@ -842,6 +875,17 @@ private function generateBodySchema($parameterName, $parameterInfo, $description $description ); $bodySchema['type'] = 'object'; + + /* + * Make sure we have a proper XML wrapper for request parameters for the XML format. + */ + if (!isset($bodySchema['xml']) || !is_array($bodySchema['xml'])) { + $bodySchema['xml'] = []; + } + if (!isset($bodySchema['xml']['name']) || empty($bodySchema['xml']['name'])) { + $bodySchema['xml']['name'] = self::XML_SCHEMA_PARAMWRAPPER; + } + return $bodySchema; } diff --git a/app/code/Magento/Webapi/Test/Unit/Model/Rest/Swagger/GeneratorTest.php b/app/code/Magento/Webapi/Test/Unit/Model/Rest/Swagger/GeneratorTest.php index 66b59babb7189..172db875c6c49 100644 --- a/app/code/Magento/Webapi/Test/Unit/Model/Rest/Swagger/GeneratorTest.php +++ b/app/code/Magento/Webapi/Test/Unit/Model/Rest/Swagger/GeneratorTest.php @@ -223,7 +223,7 @@ public function generateDataProvider() ] ], // @codingStandardsIgnoreStart - '{"swagger":"2.0","info":{"version":"","title":""},"host":"magento.host","basePath":"/rest/default","schemes":["http://"],"tags":[{"name":"testModule5AllSoapAndRestV2","description":"AllSoapAndRestInterface"}],"paths":{"/V1/testModule5":{"post":{"tags":["testModule5AllSoapAndRestV2"],"description":"Add new item.","operationId":"' . self::OPERATION_NAME . 'Post","parameters":[{"name":"operationNamePostBody","in":"body","schema":{"required":["item"],"properties":{"item":{"$ref":"#/definitions/test-module5-v2-entity-all-soap-and-rest"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/test-module5-v2-entity-all-soap-and-rest"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}}},"definitions":{"error-response":{"type":"object","properties":{"message":{"type":"string","description":"Error message"},"errors":{"$ref":"#/definitions/error-errors"},"code":{"type":"integer","description":"Error code"},"parameters":{"$ref":"#/definitions/error-parameters"},"trace":{"type":"string","description":"Stack trace"}},"required":["message"]},"error-errors":{"type":"array","description":"Errors list","items":{"$ref":"#/definitions/error-errors-item"}},"error-errors-item":{"type":"object","description":"Error details","properties":{"message":{"type":"string","description":"Error message"},"parameters":{"$ref":"#/definitions/error-parameters"}}},"error-parameters":{"type":"array","description":"Error parameters list","items":{"$ref":"#/definitions/error-parameters-item"}},"error-parameters-item":{"type":"object","description":"Error parameters item","properties":{"resources":{"type":"string","description":"ACL resource"},"fieldName":{"type":"string","description":"Missing or invalid field name"},"fieldValue":{"type":"string","description":"Incorrect field value"}}},"test-module5-v2-entity-all-soap-and-rest":{"type":"object","description":"Some Data Object","properties":{"price":{"type":"integer"}},"required":["price"]}}}' + '{"swagger":"2.0","info":{"version":"","title":""},"host":"magento.host","basePath":"/rest/default","schemes":["http://"],"tags":[{"name":"testModule5AllSoapAndRestV2","description":"AllSoapAndRestInterface"}],"paths":{"/V1/testModule5":{"post":{"tags":["testModule5AllSoapAndRestV2"],"description":"Add new item.","operationId":"operationNamePost","consumes":["application/json","application/xml"],"produces":["application/json","application/xml"],"parameters":[{"name":"operationNamePostBody","in":"body","schema":{"required":["item"],"properties":{"item":{"$ref":"#/definitions/test-module5-v2-entity-all-soap-and-rest"}},"type":"object","xml":{"name":"request"}}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/test-module5-v2-entity-all-soap-and-rest"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}}},"definitions":{"error-response":{"type":"object","properties":{"message":{"type":"string","description":"Error message"},"errors":{"$ref":"#/definitions/error-errors"},"code":{"type":"integer","description":"Error code"},"parameters":{"$ref":"#/definitions/error-parameters"},"trace":{"type":"string","description":"Stack trace"}},"required":["message"]},"error-errors":{"type":"array","description":"Errors list","items":{"$ref":"#/definitions/error-errors-item"}},"error-errors-item":{"type":"object","description":"Error details","properties":{"message":{"type":"string","description":"Error message"},"parameters":{"$ref":"#/definitions/error-parameters"}}},"error-parameters":{"type":"array","description":"Error parameters list","items":{"$ref":"#/definitions/error-parameters-item"}},"error-parameters-item":{"type":"object","description":"Error parameters item","properties":{"resources":{"type":"string","description":"ACL resource"},"fieldName":{"type":"string","description":"Missing or invalid field name"},"fieldValue":{"type":"string","description":"Incorrect field value"}}},"test-module5-v2-entity-all-soap-and-rest":{"type":"object","description":"Some Data Object","properties":{"price":{"type":"integer"}},"required":["price"]}}}' // @codingStandardsIgnoreEnd ], [ @@ -271,7 +271,7 @@ public function generateDataProvider() ] ], // @codingStandardsIgnoreStart - '{"swagger":"2.0","info":{"version":"","title":""},"host":"magento.host","basePath":"/rest/default","schemes":["http://"],"tags":[{"name":"testModule5AllSoapAndRestV2","description":"AllSoapAndRestInterface"}],"paths":{"/V1/testModule5":{"get":{"tags":["testModule5AllSoapAndRestV2"],"description":"Retrieve existing item.","operationId":"' . self::OPERATION_NAME . 'Get","responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/test-module5-v2-entity-all-soap-and-rest"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}}},"definitions":{"error-response":{"type":"object","properties":{"message":{"type":"string","description":"Error message"},"errors":{"$ref":"#/definitions/error-errors"},"code":{"type":"integer","description":"Error code"},"parameters":{"$ref":"#/definitions/error-parameters"},"trace":{"type":"string","description":"Stack trace"}},"required":["message"]},"error-errors":{"type":"array","description":"Errors list","items":{"$ref":"#/definitions/error-errors-item"}},"error-errors-item":{"type":"object","description":"Error details","properties":{"message":{"type":"string","description":"Error message"},"parameters":{"$ref":"#/definitions/error-parameters"}}},"error-parameters":{"type":"array","description":"Error parameters list","items":{"$ref":"#/definitions/error-parameters-item"}},"error-parameters-item":{"type":"object","description":"Error parameters item","properties":{"resources":{"type":"string","description":"ACL resource"},"fieldName":{"type":"string","description":"Missing or invalid field name"},"fieldValue":{"type":"string","description":"Incorrect field value"}}},"test-module5-v2-entity-all-soap-and-rest":{"type":"object","description":"Some Data Object","properties":{"price":{"type":"integer"}},"required":["price"]}}}' + '{"swagger":"2.0","info":{"version":"","title":""},"host":"magento.host","basePath":"/rest/default","schemes":["http://"],"tags":[{"name":"testModule5AllSoapAndRestV2","description":"AllSoapAndRestInterface"}],"paths":{"/V1/testModule5":{"get":{"tags":["testModule5AllSoapAndRestV2"],"description":"Retrieve existing item.","operationId":"operationNameGet","consumes":["application/json","application/xml"],"produces":["application/json","application/xml"],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/test-module5-v2-entity-all-soap-and-rest"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}}},"definitions":{"error-response":{"type":"object","properties":{"message":{"type":"string","description":"Error message"},"errors":{"$ref":"#/definitions/error-errors"},"code":{"type":"integer","description":"Error code"},"parameters":{"$ref":"#/definitions/error-parameters"},"trace":{"type":"string","description":"Stack trace"}},"required":["message"]},"error-errors":{"type":"array","description":"Errors list","items":{"$ref":"#/definitions/error-errors-item"}},"error-errors-item":{"type":"object","description":"Error details","properties":{"message":{"type":"string","description":"Error message"},"parameters":{"$ref":"#/definitions/error-parameters"}}},"error-parameters":{"type":"array","description":"Error parameters list","items":{"$ref":"#/definitions/error-parameters-item"}},"error-parameters-item":{"type":"object","description":"Error parameters item","properties":{"resources":{"type":"string","description":"ACL resource"},"fieldName":{"type":"string","description":"Missing or invalid field name"},"fieldValue":{"type":"string","description":"Incorrect field value"}}},"test-module5-v2-entity-all-soap-and-rest":{"type":"object","description":"Some Data Object","properties":{"price":{"type":"integer"}},"required":["price"]}}}' // @codingStandardsIgnoreEnd ], ]; diff --git a/composer.json b/composer.json index 5936b3506b912..a1323796ed4df 100644 --- a/composer.json +++ b/composer.json @@ -101,6 +101,7 @@ "magento/module-admin-notification": "*", "magento/module-advanced-pricing-import-export": "*", "magento/module-amqp": "*", + "magento/module-amqp-store": "*", "magento/module-analytics": "*", "magento/module-asynchronous-operations": "*", "magento/module-authorization": "*", diff --git a/composer.lock b/composer.lock index d17e9670a1850..5454994ca82db 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "16b51215b2f8bc7726cee946bb5e70a0", + "content-hash": "912e04a44c38c8918799bd01b828fba0", "packages": [ { "name": "braintree/braintree_php", @@ -2169,7 +2169,7 @@ }, { "name": "Gert de Pagter", - "email": "backendtea@gmail.com" + "email": "BackEndTea@gmail.com" } ], "description": "Symfony polyfill for ctype functions", diff --git a/dev/tests/acceptance/tests/_data/prepared-for-sample-data.csv b/dev/tests/acceptance/tests/_data/prepared-for-sample-data.csv new file mode 100644 index 0000000000000..cb4f981717214 --- /dev/null +++ b/dev/tests/acceptance/tests/_data/prepared-for-sample-data.csv @@ -0,0 +1,499 @@ +sku,store_view_code,attribute_set_code,product_type,categories,product_websites,name,description,short_description,weight,product_online,tax_class_name,visibility,price,url_key,additional_attributes,qty,out_of_stock_qty,use_config_min_qty,is_qty_decimal,allow_backorders,use_config_backorders,min_cart_qty,use_config_min_sale_qty,max_cart_qty,use_config_max_sale_qty,is_in_stock,notify_on_stock_below,use_config_notify_stock_qty,manage_stock,use_config_manage_stock,use_config_qty_increments,qty_increments,use_config_enable_qty_inc,enable_qty_increments,is_decimal_divided,deferred_stock_update,use_config_deferred_stock_update,related_skus,upsell_skus,additional_images,custom_options,bundle_price_type,bundle_sku_type,bundle_price_view,bundle_weight_type,bundle_values,bundle_shipment_type,configurable_variations,configurable_variation_labels,associated_skus,brand,can_add_earmold,use_pcm,product_line,product_group,related_earmold_sku,warranty_product_type,extended_warranty_sku,show_default_warranty,show_extended_warranty,infor_product_class,infor_platform,local_private_label,infor_item_group,infor_serialized_item_group,infor_product_group,infor_sales_price_group,ignore_price_options,loss_and_damage_sku +10536515,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Extended Warranty 12 Months new,,,0.001,1,0,"Catalog, Search",133,10536515_Extended-Warranty-12-Months_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,Warranty,,NWY,,,,,,,,,,,, +10536515,second_storeview,Default,simple,,,Extended Warranty 12 Months,,,,,,"Catalog, Search",,10536515_Extended-Warranty-12-Months_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10536515,third_store_view,Default,simple,,,Extended Warranty 12 Months,,,,,,"Catalog, Search",,10536515_Extended-Warranty-12-Months_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10536516,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Extended Warranty 24 Months,,,0.001,1,0,"Catalog, Search",189,10536516_Extended-Warranty-24-Months_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,Warranty,,NWY,,,,,,,,,,,, +10536516,second_storeview,Default,simple,,,Extended Warranty 24 Months,,,,,,"Catalog, Search",,10536516_Extended-Warranty-24-Months_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10536516,third_store_view,Default,simple,,,Extended Warranty 24 Months,,,,,,"Catalog, Search",,10536516_Extended-Warranty-24-Months_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10240175,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,L&D CHARGE LEVEL 1,,,0.001,1,0,"Catalog, Search",150,10240175_LD-CHARGE-LEVEL-1_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,LossDamage,,S03,,,,,,,,,,,, +10240175,second_storeview,Default,simple,,,L&D CHARGE LEVEL 1,,,,,,"Catalog, Search",,10240175_LD-CHARGE-LEVEL-1_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10240175,third_store_view,Default,simple,,,L&D CHARGE LEVEL 1,,,,,,"Catalog, Search",,10240175_LD-CHARGE-LEVEL-1_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10240176,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,L&D CHARGE LEVEL 2,,,0.001,1,0,"Catalog, Search",220,10240176_LD-CHARGE-LEVEL-2_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,LossDamage,,S03,,,,,,,,,,,, +10240176,second_storeview,Default,simple,,,L&D CHARGE LEVEL 2,,,,,,"Catalog, Search",,10240176_LD-CHARGE-LEVEL-2_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10240176,third_store_view,Default,simple,,,L&D CHARGE LEVEL 2,,,,,,"Catalog, Search",,10240176_LD-CHARGE-LEVEL-2_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10825023,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,LICENSE CHARGES UNITY 3 REM,,,0.001,1,0,"Catalog, Search",1100,10825023_LICENSE-CHARGES-UNITY-3-REM_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A99,,,,,,,,,,,, +10825023,second_storeview,Default,simple,,,LICENSE CHARGES UNITY 3 REM,,,,,,"Catalog, Search",,10825023_LICENSE-CHARGES-UNITY-3-REM_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10825023,third_store_view,Default,simple,,,LICENSE CHARGES UNITY 3 REM,,,,,,"Catalog, Search",,10825023_LICENSE-CHARGES-UNITY-3-REM_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10825024,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,LICENSE CHARGES UNITY 3 SM,,,0.001,1,0,"Catalog, Search",1100,10825024_LICENSE-CHARGES-UNITY-3-SM_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A99,,,,,,,,,,,, +10825024,second_storeview,Default,simple,,,LICENSE CHARGES UNITY 3 SM,,,,,,"Catalog, Search",,10825024_LICENSE-CHARGES-UNITY-3-SM_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10825024,third_store_view,Default,simple,,,LICENSE CHARGES UNITY 3 SM,,,,,,"Catalog, Search",,10825024_LICENSE-CHARGES-UNITY-3-SM_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10825022,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,LICENSE CHARGES UNTIY 3 AUD,,,0.001,1,0,"Catalog, Search",1000,10825022_LICENSE-CHARGES-UNTIY-3-AUD_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A99,,,,,,,,,,,, +10825022,second_storeview,Default,simple,,,LICENSE CHARGES UNTIY 3 AUD,,,,,,"Catalog, Search",,10825022_LICENSE-CHARGES-UNTIY-3-AUD_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10825022,third_store_view,Default,simple,,,LICENSE CHARGES UNTIY 3 AUD,,,,,,"Catalog, Search",,10825022_LICENSE-CHARGES-UNTIY-3-AUD_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10601877,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Concha Lock S 45db 10/PACK,,,0.015,1,0,"Catalog, Search",6,10601877_Concha-Lock-S-45db--10PACK_transparent_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A99,,,,,,,,,,,, +10601877,second_storeview,Default,simple,,,Concha Lock S 45db 10/PACK,,,,,,"Catalog, Search",,10601877_Concha-Lock-S-45db--10PACK_transparent_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10601877,third_store_view,Default,simple,,,Concha Lock S 45db 10/PACK,,,,,,"Catalog, Search",,10601877_Concha-Lock-S-45db--10PACK_transparent_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10674949,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Otoform A SoftX,,Otoform softX Deep fit (8 refill w/o tips),500,1,0,"Catalog, Search",49,10674949_Otoform-A-SoftX_pink_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,S03,,,,,,,,,,,, +10674949,second_storeview,Default,simple,,,Otoform A SoftX,,Otoform softX Deep fit (8 refill w/o tips),,,,"Catalog, Search",,10674949_Otoform-A-SoftX_pink_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10674949,third_store_view,Default,simple,,,Otoform A SoftX,,Otoform softX Deep fit (8 refill w/o tips),,,,"Catalog, Search",,10674949_Otoform-A-SoftX_pink_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +7212678,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,EARHOOK SMALL H2030,,,0.35,1,0,"Catalog, Search",6,107212678_EARHOOK-SMALL-H2030_transparent_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,S01,,,,,,,,,,,, +7212678,second_storeview,Default,simple,,,EARHOOK SMALL H2030,,,,,,"Catalog, Search",,207212678_EARHOOK-SMALL-H2030_transparent_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +7212678,third_store_view,Default,simple,,,EARHOOK SMALL H2030,,,,,,"Catalog, Search",,307212678_EARHOOK-SMALL-H2030_transparent_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10296987,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Refill Open Tip 4MM,,10 pieces per Package,0.5,1,0,"Catalog, Search",10,110296987_Refill-Open-Tip-4MM_Open_4_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A13,,,,,,,,,,,, +10296987,second_storeview,Default,simple,,,Refill Open Tip 4MM,,10 pieces per Package,,,,"Catalog, Search",,10296987_Refill-Open-Tip-4MM_Open_4_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10296987,third_store_view,Default,simple,,,Refill Open Tip 4MM,,10 pieces per Package,,,,"Catalog, Search",,10296987_Refill-Open-Tip-4MM_Open_4_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10297179,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,HiPro 2 USB PC Interface,,,230,1,0,"Catalog, Search",1100,10297179_HiPro-2-USB-PC-Interface_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A05,,,,,,,,,,,, +10297179,second_storeview,Default,simple,,,HiPro 2 USB PC Interface,,,,,,"Catalog, Search",,10297179_HiPro-2-USB-PC-Interface_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10297179,third_store_view,Default,simple,,,HiPro 2 USB PC Interface,,,,,,"Catalog, Search",,10297179_HiPro-2-USB-PC-Interface_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10667517,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,ERU HP-Receiver,,,15,1,0,"Catalog, Search",108,10667517_ERU-HP-Receiver_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,ERU,,ITE,,,,,,,,,,,, +10667517,second_storeview,Default,simple,,,ERU HP-Receiver,,,,,,"Catalog, Search",,10667517_ERU-HP-Receiver_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10667517,third_store_view,Default,simple,,,ERU HP-Receiver,,,,,,"Catalog, Search",,10667517_ERU-HP-Receiver_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10942148,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SP 7 px Beige,,"Fits severe to profound hearing loss +small and reliable desiged BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2199,10942148_Motion-SP-7-px-Beige_beige_675_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10942148,second_storeview,Default,simple,,,Motion SP 7 px Beige,,"Fits severe to profound hearing loss +small and reliable desiged BTE with advanced primax Technology",,,,"Catalog, Search",,10942148_Motion-SP-7-px-Beige_beige_675_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10942148,third_store_view,Default,simple,,,Motion SP 7 px Beige,,"Fits severe to profound hearing loss +small and reliable desiged BTE with advanced primax Technology",,,,"Catalog, Search",,10942148_Motion-SP-7-px-Beige_beige_675_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934914,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SX 7 px Silver,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934914_Motion-SX-7-px-Silver_silver_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934914,second_storeview,Default,simple,,,Motion SX 7 px Silver,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934914_Motion-SX-7-px-Silver_silver_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934914,third_store_view,Default,simple,,,Motion SX 7 px Silver,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934914_Motion-SX-7-px-Silver_silver_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934639,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion P 7 px Silver,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934639_Motion-P-7-px-Silver_silver_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934639,second_storeview,Default,simple,,,Motion P 7 px Silver,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934639_Motion-P-7-px-Silver_silver_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934639,third_store_view,Default,simple,,,Motion P 7 px Silver,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934639_Motion-P-7-px-Silver_silver_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10942709,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SP 7 px Dark Granite,,"Fits severe to profound hearing loss +small and reliable desiged BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2199,10942709_Motion-SP-7-px-Dark-Granite_dark-granite_675_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10942709,second_storeview,Default,simple,,,Motion SP 7 px Dark Granite,,"Fits severe to profound hearing loss +small and reliable desiged BTE with advanced primax Technology",,,,"Catalog, Search",,10942709_Motion-SP-7-px-Dark-Granite_dark-granite_675_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10942709,third_store_view,Default,simple,,,Motion SP 7 px Dark Granite,,"Fits severe to profound hearing loss +small and reliable desiged BTE with advanced primax Technology",,,,"Catalog, Search",,10942709_Motion-SP-7-px-Dark-Granite_dark-granite_675_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10942710,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SP 7 px Grey,,"Fits severe to profound hearing loss +small and reliable desiged BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2199,10942710_Motion-SP-7-px-Grey_grey_675_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10942710,second_storeview,Default,simple,,,Motion SP 7 px Grey,,"Fits severe to profound hearing loss +small and reliable desiged BTE with advanced primax Technology",,,,"Catalog, Search",,10942710_Motion-SP-7-px-Grey_grey_675_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10942710,third_store_view,Default,simple,,,Motion SP 7 px Grey,,"Fits severe to profound hearing loss +small and reliable desiged BTE with advanced primax Technology",,,,"Catalog, Search",,10942710_Motion-SP-7-px-Grey_grey_675_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10942711,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SP 7 px Black,,"Fits severe to profound hearing loss +small and reliable desiged BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2199,10942711_Motion-SP-7-px-Black_black_675_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10942711,second_storeview,Default,simple,,,Motion SP 7 px Black,,"Fits severe to profound hearing loss +small and reliable desiged BTE with advanced primax Technology",,,,"Catalog, Search",,10942711_Motion-SP-7-px-Black_black_675_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10942711,third_store_view,Default,simple,,,Motion SP 7 px Black,,"Fits severe to profound hearing loss +small and reliable desiged BTE with advanced primax Technology",,,,"Catalog, Search",,10942711_Motion-SP-7-px-Black_black_675_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10942712,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SP 7 px Dark Brown,,"Fits severe to profound hearing loss +small and reliable desiged BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2199,10942712_Motion-SP-7-px-Dark-Brown_dark-brown_675_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10942712,second_storeview,Default,simple,,,Motion SP 7 px Dark Brown,,"Fits severe to profound hearing loss +small and reliable desiged BTE with advanced primax Technology",,,,"Catalog, Search",,10942712_Motion-SP-7-px-Dark-Brown_dark-brown_675_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10942712,third_store_view,Default,simple,,,Motion SP 7 px Dark Brown,,"Fits severe to profound hearing loss +small and reliable desiged BTE with advanced primax Technology",,,,"Catalog, Search",,10942712_Motion-SP-7-px-Dark-Brown_dark-brown_675_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10942713,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SP 7 px Granite,,"Fits severe to profound hearing loss +small and reliable desiged BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2199,10942713_Motion-SP-7-px-Granite_granite_675_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10942713,second_storeview,Default,simple,,,Motion SP 7 px Granite,,"Fits severe to profound hearing loss +small and reliable desiged BTE with advanced primax Technology",,,,"Catalog, Search",,10942713_Motion-SP-7-px-Granite_granite_675_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10942713,third_store_view,Default,simple,,,Motion SP 7 px Granite,,"Fits severe to profound hearing loss +small and reliable desiged BTE with advanced primax Technology",,,,"Catalog, Search",,10942713_Motion-SP-7-px-Granite_granite_675_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10936002,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SX 7 px Deep Red,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10936002_Motion-SX-7-px-Deep-Red_deep-red_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10936002,second_storeview,Default,simple,,,Motion SX 7 px Deep Red,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10936002_Motion-SX-7-px-Deep-Red_deep-red_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10936002,third_store_view,Default,simple,,,Motion SX 7 px Deep Red,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10936002_Motion-SX-7-px-Deep-Red_deep-red_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934904,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SX 7 px Black,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934904_Motion-SX-7-px-Black_black_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934904,second_storeview,Default,simple,,,Motion SX 7 px Black,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934904_Motion-SX-7-px-Black_black_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934904,third_store_view,Default,simple,,,Motion SX 7 px Black,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934904_Motion-SX-7-px-Black_black_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934905,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SX 7 px Brown,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934905_Motion-SX-7-px-Brown_brown_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934905,second_storeview,Default,simple,,,Motion SX 7 px Brown,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934905_Motion-SX-7-px-Brown_brown_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934905,third_store_view,Default,simple,,,Motion SX 7 px Brown,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934905_Motion-SX-7-px-Brown_brown_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934906,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SX 7 px Dark Granite,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934906_Motion-SX-7-px-Dark-Granite_dark-granite_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934906,second_storeview,Default,simple,,,Motion SX 7 px Dark Granite,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934906_Motion-SX-7-px-Dark-Granite_dark-granite_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934906,third_store_view,Default,simple,,,Motion SX 7 px Dark Granite,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934906_Motion-SX-7-px-Dark-Granite_dark-granite_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934909,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SX 7 px Granite,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934909_Motion-SX-7-px-Granite_granite_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934909,second_storeview,Default,simple,,,Motion SX 7 px Granite,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934909_Motion-SX-7-px-Granite_granite_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934909,third_store_view,Default,simple,,,Motion SX 7 px Granite,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934909_Motion-SX-7-px-Granite_granite_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934908,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SX 7 px Golden Blonde,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934908_Motion-SX-7-px-Golden-Blonde_golden-blonde_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934908,second_storeview,Default,simple,,,Motion SX 7 px Golden Blonde,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934908_Motion-SX-7-px-Golden-Blonde_golden-blonde_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934908,third_store_view,Default,simple,,,Motion SX 7 px Golden Blonde,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934908_Motion-SX-7-px-Golden-Blonde_golden-blonde_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934915,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SX 7 px Spirit,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934915_Motion-SX-7-px-Spirit_spirit_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934915,second_storeview,Default,simple,,,Motion SX 7 px Spirit,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934915_Motion-SX-7-px-Spirit_spirit_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934915,third_store_view,Default,simple,,,Motion SX 7 px Spirit,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934915_Motion-SX-7-px-Spirit_spirit_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934903,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SX 7 px Beige,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934903_Motion-SX-7-px-Beige_beige_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934903,second_storeview,Default,simple,,,Motion SX 7 px Beige,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934903_Motion-SX-7-px-Beige_beige_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934903,third_store_view,Default,simple,,,Motion SX 7 px Beige,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934903_Motion-SX-7-px-Beige_beige_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934910,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SX 7 px Grey,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934910_Motion-SX-7-px-Grey_grey_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934910,second_storeview,Default,simple,,,Motion SX 7 px Grey,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934910_Motion-SX-7-px-Grey_grey_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934910,third_store_view,Default,simple,,,Motion SX 7 px Grey,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934910_Motion-SX-7-px-Grey_grey_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934911,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SX 7 px Elegance,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934911_Motion-SX-7-px-Elegance_elegance_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934911,second_storeview,Default,simple,,,Motion SX 7 px Elegance,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934911_Motion-SX-7-px-Elegance_elegance_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934911,third_store_view,Default,simple,,,Motion SX 7 px Elegance,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934911_Motion-SX-7-px-Elegance_elegance_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934913,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SX 7 px Sandy Brown,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934913_Motion-SX-7-px-Sandy-Brown_dark-blonde_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934913,second_storeview,Default,simple,,,Motion SX 7 px Sandy Brown,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934913_Motion-SX-7-px-Sandy-Brown_dark-blonde_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934913,third_store_view,Default,simple,,,Motion SX 7 px Sandy Brown,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934913_Motion-SX-7-px-Sandy-Brown_dark-blonde_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934375,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion P 7 px Beige,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934375_Motion-P-7-px-Beige_beige_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934375,second_storeview,Default,simple,,,Motion P 7 px Beige,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934375_Motion-P-7-px-Beige_beige_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934375,third_store_view,Default,simple,,,Motion P 7 px Beige,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934375_Motion-P-7-px-Beige_beige_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934912,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SX 7 px Pearl White,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934912_Motion-SX-7-px-Pearl-White_pearl-white_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934912,second_storeview,Default,simple,,,Motion SX 7 px Pearl White,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934912_Motion-SX-7-px-Pearl-White_pearl-white_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934912,third_store_view,Default,simple,,,Motion SX 7 px Pearl White,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934912_Motion-SX-7-px-Pearl-White_pearl-white_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934622,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SA 7 px Pearl White,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934622_Motion-SA-7-px-Pearl-White_pearl-white_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934622,second_storeview,Default,simple,,,Motion SA 7 px Pearl White,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934622_Motion-SA-7-px-Pearl-White_pearl-white_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934622,third_store_view,Default,simple,,,Motion SA 7 px Pearl White,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934622_Motion-SA-7-px-Pearl-White_pearl-white_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934907,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SX 7 px Dark Champagne,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934907_Motion-SX-7-px-Dark-Champagne_dark-champagner_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934907,second_storeview,Default,simple,,,Motion SX 7 px Dark Champagne,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934907_Motion-SX-7-px-Dark-Champagne_dark-champagner_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934907,third_store_view,Default,simple,,,Motion SX 7 px Dark Champagne,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934907_Motion-SX-7-px-Dark-Champagne_dark-champagner_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10296988,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Refill Open Tip 6MM,,10 pieces per Package,0.5,1,0,"Catalog, Search",10,10296988_Refill-Open-Tip-6MM_Open_6_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A13,,,,,,,,,,,, +10296988,second_storeview,Default,simple,,,Refill Open Tip 6MM,,10 pieces per Package,,,,"Catalog, Search",,10296988_Refill-Open-Tip-6MM_Open_6_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10296988,third_store_view,Default,simple,,,Refill Open Tip 6MM,,10 pieces per Package,,,,"Catalog, Search",,10296988_Refill-Open-Tip-6MM_Open_6_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10296989,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Refill Open Tip 8MM,,10 pieces per Package,0.5,1,0,"Catalog, Search",10,10296989_Refill-Open-Tip--8MM_Open_8_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A13,,,,,,,,,,,, +10296989,second_storeview,Default,simple,,,Refill Open Tip 8MM,,10 pieces per Package,,,,"Catalog, Search",,10296989_Refill-Open-Tip--8MM_Open_8_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10296989,third_store_view,Default,simple,,,Refill Open Tip 8MM,,10 pieces per Package,,,,"Catalog, Search",,10296989_Refill-Open-Tip--8MM_Open_8_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934631,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion P 7 px Dark Granite,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934631_Motion-P-7-px-Dark-Granite_dark-granite_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934631,second_storeview,Default,simple,,,Motion P 7 px Dark Granite,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934631_Motion-P-7-px-Dark-Granite_dark-granite_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934631,third_store_view,Default,simple,,,Motion P 7 px Dark Granite,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934631_Motion-P-7-px-Dark-Granite_dark-granite_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934632,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion P 7 px Dark Champagne,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934632_Motion-P-7-px-Dark-Champagne_dark-champagner_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934632,second_storeview,Default,simple,,,Motion P 7 px Dark Champagne,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934632_Motion-P-7-px-Dark-Champagne_dark-champagner_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934632,third_store_view,Default,simple,,,Motion P 7 px Dark Champagne,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934632_Motion-P-7-px-Dark-Champagne_dark-champagner_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934633,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion P 7 px Golden Blonde,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934633_Motion-P-7-px-Golden-Blonde_golden-blonde_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934633,second_storeview,Default,simple,,,Motion P 7 px Golden Blonde,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934633_Motion-P-7-px-Golden-Blonde_golden-blonde_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934633,third_store_view,Default,simple,,,Motion P 7 px Golden Blonde,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934633_Motion-P-7-px-Golden-Blonde_golden-blonde_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934634,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion P 7 px Galactic Blue,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934634_Motion-P-7-px-Galactic-Blue_galactic-blue_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934634,second_storeview,Default,simple,,,Motion P 7 px Galactic Blue,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934634_Motion-P-7-px-Galactic-Blue_galactic-blue_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934634,third_store_view,Default,simple,,,Motion P 7 px Galactic Blue,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934634_Motion-P-7-px-Galactic-Blue_galactic-blue_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934635,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion P 7 px Granite,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934635_Motion-P-7-px-Granite_granite_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934635,second_storeview,Default,simple,,,Motion P 7 px Granite,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934635_Motion-P-7-px-Granite_granite_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934635,third_store_view,Default,simple,,,Motion P 7 px Granite,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934635_Motion-P-7-px-Granite_granite_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934636,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion P 7 px Grey,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934636_Motion-P-7-px-Grey_grey_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934636,second_storeview,Default,simple,,,Motion P 7 px Grey,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934636_Motion-P-7-px-Grey_grey_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934636,third_store_view,Default,simple,,,Motion P 7 px Grey,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934636_Motion-P-7-px-Grey_grey_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934638,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion P 7 px Sandy Brown,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934638_Motion-P-7-px-Sandy-Brown_dark-blonde_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934638,second_storeview,Default,simple,,,Motion P 7 px Sandy Brown,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934638_Motion-P-7-px-Sandy-Brown_dark-blonde_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934638,third_store_view,Default,simple,,,Motion P 7 px Sandy Brown,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934638_Motion-P-7-px-Sandy-Brown_dark-blonde_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934624,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SA 7 px Silver,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934624_Motion-SA-7-px-Silver_silver_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934624,second_storeview,Default,simple,,,Motion SA 7 px Silver,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934624_Motion-SA-7-px-Silver_silver_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934624,third_store_view,Default,simple,,,Motion SA 7 px Silver,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934624_Motion-SA-7-px-Silver_silver_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10939410,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion P 7 px Deep Red,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10939410_Motion-P-7-px-Deep-Red_deep-red_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10939410,second_storeview,Default,simple,,,Motion P 7 px Deep Red,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10939410_Motion-P-7-px-Deep-Red_deep-red_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10939410,third_store_view,Default,simple,,,Motion P 7 px Deep Red,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10939410_Motion-P-7-px-Deep-Red_deep-red_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934581,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion P 7 px Black,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934581_Motion-P-7-px-Black_black_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934581,second_storeview,Default,simple,,,Motion P 7 px Black,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934581_Motion-P-7-px-Black_black_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934581,third_store_view,Default,simple,,,Motion P 7 px Black,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934581_Motion-P-7-px-Black_black_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934582,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion P 7 px Brown,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934582_Motion-P-7-px-Brown_brown_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934582,second_storeview,Default,simple,,,Motion P 7 px Brown,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934582_Motion-P-7-px-Brown_brown_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934582,third_store_view,Default,simple,,,Motion P 7 px Brown,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934582_Motion-P-7-px-Brown_brown_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934585,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion P 7 px Candy Pink,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934585_Motion-P-7-px-Candy-Pink_candy-pink_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934585,second_storeview,Default,simple,,,Motion P 7 px Candy Pink,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934585_Motion-P-7-px-Candy-Pink_candy-pink_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934585,third_store_view,Default,simple,,,Motion P 7 px Candy Pink,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934585_Motion-P-7-px-Candy-Pink_candy-pink_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934637,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion P 7 px Pearl White,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934637_Motion-P-7-px-Pearl-White_pearl-white_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934637,second_storeview,Default,simple,,,Motion P 7 px Pearl White,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934637_Motion-P-7-px-Pearl-White_pearl-white_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934637,third_store_view,Default,simple,,,Motion P 7 px Pearl White,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934637_Motion-P-7-px-Pearl-White_pearl-white_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934611,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SA 7 px Beige,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934611_Motion-SA-7-px-Beige_beige_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934611,second_storeview,Default,simple,,,Motion SA 7 px Beige,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934611_Motion-SA-7-px-Beige_beige_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934611,third_store_view,Default,simple,,,Motion SA 7 px Beige,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934611_Motion-SA-7-px-Beige_beige_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934612,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SA 7 px Black,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934612_Motion-SA-7-px-Black_black_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934612,second_storeview,Default,simple,,,Motion SA 7 px Black,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934612_Motion-SA-7-px-Black_black_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934612,third_store_view,Default,simple,,,Motion SA 7 px Black,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934612_Motion-SA-7-px-Black_black_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934613,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SA 7 px Brown,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934613_Motion-SA-7-px-Brown_brown_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934613,second_storeview,Default,simple,,,Motion SA 7 px Brown,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934613_Motion-SA-7-px-Brown_brown_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934613,third_store_view,Default,simple,,,Motion SA 7 px Brown,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934613_Motion-SA-7-px-Brown_brown_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934614,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SA 7 px Candy Pink,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934614_Motion-SA-7-px-Candy-Pink_candy-pink_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934614,second_storeview,Default,simple,,,Motion SA 7 px Candy Pink,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934614_Motion-SA-7-px-Candy-Pink_candy-pink_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934614,third_store_view,Default,simple,,,Motion SA 7 px Candy Pink,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934614_Motion-SA-7-px-Candy-Pink_candy-pink_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934615,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SA 7 px Dark Granite,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934615_Motion-SA-7-px-Dark-Granite_dark-granite_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934615,second_storeview,Default,simple,,,Motion SA 7 px Dark Granite,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934615_Motion-SA-7-px-Dark-Granite_dark-granite_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934615,third_store_view,Default,simple,,,Motion SA 7 px Dark Granite,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934615_Motion-SA-7-px-Dark-Granite_dark-granite_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934616,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SA 7 px Dark Champagne,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934616_Motion-SA-7-px-Dark-Champagne_dark-champagner_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934616,second_storeview,Default,simple,,,Motion SA 7 px Dark Champagne,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934616_Motion-SA-7-px-Dark-Champagne_dark-champagner_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934616,third_store_view,Default,simple,,,Motion SA 7 px Dark Champagne,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934616_Motion-SA-7-px-Dark-Champagne_dark-champagner_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934617,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SA 7 px Golden Blonde,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",50,1,0,"Catalog, Search",2149,10934617_Motion-SA-7-px-Golden-Blonde_golden-blonde_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934617,second_storeview,Default,simple,,,Motion SA 7 px Golden Blonde,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934617_Motion-SA-7-px-Golden-Blonde_golden-blonde_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934617,third_store_view,Default,simple,,,Motion SA 7 px Golden Blonde,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934617_Motion-SA-7-px-Golden-Blonde_golden-blonde_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934618,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SA 7 px Galactic Blue,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934618_Motion-SA-7-px-Galactic-Blue_galactic-blue_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934618,second_storeview,Default,simple,,,Motion SA 7 px Galactic Blue,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934618_Motion-SA-7-px-Galactic-Blue_galactic-blue_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934618,third_store_view,Default,simple,,,Motion SA 7 px Galactic Blue,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934618_Motion-SA-7-px-Galactic-Blue_galactic-blue_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934619,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SA 7 px Granite,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934619_Motion-SA-7-px-Granite_granite_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934619,second_storeview,Default,simple,,,Motion SA 7 px Granite,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934619_Motion-SA-7-px-Granite_granite_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934619,third_store_view,Default,simple,,,Motion SA 7 px Granite,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934619_Motion-SA-7-px-Granite_granite_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934620,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SA 7 px Grey,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934620_Motion-SA-7-px-Grey_grey_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934620,second_storeview,Default,simple,,,Motion SA 7 px Grey,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934620_Motion-SA-7-px-Grey_grey_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934620,third_store_view,Default,simple,,,Motion SA 7 px Grey,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934620_Motion-SA-7-px-Grey_grey_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10936009,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SA 7 px Deep Red,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10936009_Motion-SA-7-px-Deep-Red_deep-red_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10936009,second_storeview,Default,simple,,,Motion SA 7 px Deep Red,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10936009_Motion-SA-7-px-Deep-Red_deep-red_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10936009,third_store_view,Default,simple,,,Motion SA 7 px Deep Red,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10936009_Motion-SA-7-px-Deep-Red_deep-red_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934625,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SA 7 px Spirit,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934625_Motion-SA-7-px-Spirit_spirit_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934625,second_storeview,Default,simple,,,Motion SA 7 px Spirit,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934625_Motion-SA-7-px-Spirit_spirit_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934625,third_store_view,Default,simple,,,Motion SA 7 px Spirit,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934625_Motion-SA-7-px-Spirit_spirit_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934623,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SA 7 px Dark Blonde,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934623_Motion-SA-7-px-Dark-Blonde_dark-blonde_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934623,second_storeview,Default,simple,,,Motion SA 7 px Dark Blonde,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934623_Motion-SA-7-px-Dark-Blonde_dark-blonde_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934623,third_store_view,Default,simple,,,Motion SA 7 px Dark Blonde,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934623_Motion-SA-7-px-Dark-Blonde_dark-blonde_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934621,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SA 7 px Elegance,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",2149,10934621_Motion-SA-7-px-Elegance_elegance_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934621,second_storeview,Default,simple,,,Motion SA 7 px Elegance,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934621_Motion-SA-7-px-Elegance_elegance_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934621,third_store_view,Default,simple,,,Motion SA 7 px Elegance,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934621_Motion-SA-7-px-Elegance_elegance_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10296990,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Refill Open Tip 10MM,,10 pieces per Package,0.5,1,0,"Catalog, Search",10,10296990_Refill-Open-Tip-10MM_Open_10_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A13,,,,,,,,,,,, +10296990,second_storeview,Default,simple,,,Refill Open Tip 10MM,,10 pieces per Package,,,,"Catalog, Search",,10296990_Refill-Open-Tip-10MM_Open_10_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10296990,third_store_view,Default,simple,,,Refill Open Tip 10MM,,10 pieces per Package,,,,"Catalog, Search",,10296990_Refill-Open-Tip-10MM_Open_10_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10828292,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Thin Tubes Size 1R,,,1,1,0,"Catalog, Search",10,10828292_Thin-Tubes-Size-1R_Right_1_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A13,,,,,,,,,,,, +10828292,second_storeview,Default,simple,,,Thin Tubes Size 1R,,,,,,"Catalog, Search",,10828292_Thin-Tubes-Size-1R_Right_1_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10828292,third_store_view,Default,simple,,,Thin Tubes Size 1R,,,,,,"Catalog, Search",,10828292_Thin-Tubes-Size-1R_Right_1_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10828294,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Thin Tubes Size 2R,,,1,1,0,"Catalog, Search",10,10828294_Thin-Tubes-Size-2R_Right_2_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A13,,,,,,,,,,,, +10828294,second_storeview,Default,simple,,,Thin Tubes Size 2R,,,,,,"Catalog, Search",,10828294_Thin-Tubes-Size-2R_Right_2_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10828294,third_store_view,Default,simple,,,Thin Tubes Size 2R,,,,,,"Catalog, Search",,10828294_Thin-Tubes-Size-2R_Right_2_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10828296,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Thin Tubes Size 3R,,,1,1,0,"Catalog, Search",10,10828296_Thin-Tubes-Size-3R_Right_3_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A13,,,,,,,,,,,, +10828296,second_storeview,Default,simple,,,Thin Tubes Size 3R,,,,,,"Catalog, Search",,10828296_Thin-Tubes-Size-3R_Right_3_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10828296,third_store_view,Default,simple,,,Thin Tubes Size 3R,,,,,,"Catalog, Search",,10828296_Thin-Tubes-Size-3R_Right_3_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10296986,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Refill Closed Tip 8MM,,10 pieces per Package,0.5,1,0,"Catalog, Search",10,10296986_Refill-Closed-Tip-8MM_Closed_8_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A13,,,,,,,,,,,, +10296986,second_storeview,Default,simple,,,Refill Closed Tip 8MM,,10 pieces per Package,,,,"Catalog, Search",,10296986_Refill-Closed-Tip-8MM_Closed_8_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10296986,third_store_view,Default,simple,,,Refill Closed Tip 8MM,,10 pieces per Package,,,,"Catalog, Search",,10296986_Refill-Closed-Tip-8MM_Closed_8_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10296985,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Refill Double Tip 10/12MM,,10 pieces per Package,0.5,1,0,"Catalog, Search",10,10296985_Refill-Double-Tip-1012MM_Double_10_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A13,,,,,,,,,,,, +10296985,second_storeview,Default,simple,,,Refill Double Tip 10/12MM,,10 pieces per Package,,,,"Catalog, Search",,10296985_Refill-Double-Tip-1012MM_Double_10_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10296985,third_store_view,Default,simple,,,Refill Double Tip 10/12MM,,10 pieces per Package,,,,"Catalog, Search",,10296985_Refill-Double-Tip-1012MM_Double_10_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10296984,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Refill Double Tip 8/10MM,,10 pieces per Package,0.5,1,0,"Catalog, Search",10,10296984_Refill-Double-Tip-810MM_Double_8_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A13,,,,,,,,,,,, +10296984,second_storeview,Default,simple,,,Refill Double Tip 8/10MM,,10 pieces per Package,,,,"Catalog, Search",,10296984_Refill-Double-Tip-810MM_Double_8_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10296984,third_store_view,Default,simple,,,Refill Double Tip 8/10MM,,10 pieces per Package,,,,"Catalog, Search",,10296984_Refill-Double-Tip-810MM_Double_8_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10828298,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Thin Tubes Size 4R,,,1,1,0,"Catalog, Search",10,10828298_Thin-Tubes-Size-4R_Right_4_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A13,,,,,,,,,,,, +10828298,second_storeview,Default,simple,,,Thin Tubes Size 4R,,,,,,"Catalog, Search",,10828298_Thin-Tubes-Size-4R_Right_4_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10828298,third_store_view,Default,simple,,,Thin Tubes Size 4R,,,,,,"Catalog, Search",,10828298_Thin-Tubes-Size-4R_Right_4_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10828291,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Thin Tubes Size 1L,,,1,1,0,"Catalog, Search",10,10828291_Thin-Tubes-Size-1L_Left_1_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A13,,,,,,,,,,,, +10828291,second_storeview,Default,simple,,,Thin Tubes Size 1L,,,,,,"Catalog, Search",,10828291_Thin-Tubes-Size-1L_Left_1_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10828291,third_store_view,Default,simple,,,Thin Tubes Size 1L,,,,,,"Catalog, Search",,10828291_Thin-Tubes-Size-1L_Left_1_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10828293,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Thin Tubes Size 2L,,,1,1,0,"Catalog, Search",10,10828293_Thin-Tubes-Size-2L_Left_2_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A13,,,,,,,,,,,, +10828293,second_storeview,Default,simple,,,Thin Tubes Size 2L,,,,,,"Catalog, Search",,10828293_Thin-Tubes-Size-2L_Left_2_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10828293,third_store_view,Default,simple,,,Thin Tubes Size 2L,,,,,,"Catalog, Search",,10828293_Thin-Tubes-Size-2L_Left_2_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10828295,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Thin Tubes Size 3L,,,1,1,0,"Catalog, Search",10,10828295_Thin-Tubes-Size-3L_Left_3_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A13,,,,,,,,,,,, +10828295,second_storeview,Default,simple,,,Thin Tubes Size 3L,,,,,,"Catalog, Search",,10828295_Thin-Tubes-Size-3L_Left_3_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10828295,third_store_view,Default,simple,,,Thin Tubes Size 3L,,,,,,"Catalog, Search",,10828295_Thin-Tubes-Size-3L_Left_3_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10828297,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Thin Tubes Size 4L,,,1,1,0,"Catalog, Search",10,10828297_Thin-Tubes-Size-4L_Left_4_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A13,,,,,,,,,,,, +10828297,second_storeview,Default,simple,,,Thin Tubes Size 4L,,,,,,"Catalog, Search",,10828297_Thin-Tubes-Size-4L_Left_4_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10828297,third_store_view,Default,simple,,,Thin Tubes Size 4L,,,,,,"Catalog, Search",,10828297_Thin-Tubes-Size-4L_Left_4_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10673779,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Semi Open Tip Refill (Siemens),,,3,1,0,"Catalog, Search",10,10673779_Semi-Open-Tip-Refill-Siemens_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A07,,,,,,,,,,,, +10673779,second_storeview,Default,simple,,,Semi Open Tip Refill (Siemens),,,,,,"Catalog, Search",,10673779_Semi-Open-Tip-Refill-Siemens_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10673779,third_store_view,Default,simple,,,Semi Open Tip Refill (Siemens),,,,,,"Catalog, Search",,10673779_Semi-Open-Tip-Refill-Siemens_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10935754,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,HA MOTION S 3PX BG,,,50,1,0,"Catalog, Search",949,10935754_HA-MOTION-S-3PX-BG_beige_312_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,,,,,,,,,,,, +10935754,second_storeview,Default,simple,,,HA MOTION S 3PX BG,,,,,,"Catalog, Search",,10935754_HA-MOTION-S-3PX-BG_beige_312_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10935754,third_store_view,Default,simple,,,HA MOTION S 3PX BG,,,,,,"Catalog, Search",,10935754_HA-MOTION-S-3PX-BG_beige_312_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10296968,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Life Tube Fitting Set,,,1,1,0,"Catalog, Search",199,10296968_Life-Tube-Fitting-Set_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A13,,,,,,,,,,,, +10296968,second_storeview,Default,simple,,,Life Tube Fitting Set,,,,,,"Catalog, Search",,10296968_Life-Tube-Fitting-Set_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10296968,third_store_view,Default,simple,,,Life Tube Fitting Set,,,,,,"Catalog, Search",,10296968_Life-Tube-Fitting-Set_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +7227098,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,EARHOOK W. DAMPER,,,0.015,1,0,"Catalog, Search",6,307227098_EARHOOK-W-DAMPER_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,S01,,,,,,,,,,,, +7227098,second_storeview,Default,simple,,,EARHOOK W. DAMPER,,,,,,"Catalog, Search",,407227098_EARHOOK-W-DAMPER_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +7227098,third_store_view,Default,simple,,,EARHOOK W. DAMPER,,,,,,"Catalog, Search",,907227098_EARHOOK-W-DAMPER_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10824187,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,HiPro Extension Cable,,,100,1,0,"Catalog, Search",19,10824187_HiPro-Extension-Cable_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A05,,,,,,,,,,,, +10824187,second_storeview,Default,simple,,,HiPro Extension Cable,,,,,,"Catalog, Search",,10824187_HiPro-Extension-Cable_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10824187,third_store_view,Default,simple,,,HiPro Extension Cable,,,,,,"Catalog, Search",,10824187_HiPro-Extension-Cable_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10937826,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,NEW concha lock M 55/60db 10/pack,,,25,1,0,"Catalog, Search",6,10937826_NEW-concha-lock-M-5560db-10pack_transparent_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A99,,,,,,,,,,,, +10937826,second_storeview,Default,simple,,,NEW concha lock M 55/60db 10/pack,,,,,,"Catalog, Search",,10937826_NEW-concha-lock-M-5560db-10pack_transparent_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10937826,third_store_view,Default,simple,,,NEW concha lock M 55/60db 10/pack,,,,,,"Catalog, Search",,10937826_NEW-concha-lock-M-5560db-10pack_transparent_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +7784916,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,NOAHLink Cable Right,,,0.015,1,0,"Catalog, Search",75,507784916_NOAHLink-Cable-Right_red_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,StockItem,,A05,,,,,,,,,,,, +7784916,second_storeview,Default,simple,,,NOAHLink Cable Right,,,,,,"Catalog, Search",,707784916_NOAHLink-Cable-Right_red_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +7784916,third_store_view,Default,simple,,,NOAHLink Cable Right,,,,,,"Catalog, Search",,607784916_NOAHLink-Cable-Right_red_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934901,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SX 5 px Silver,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",1459,10934901_Motion-SX-5-px-Silver_silver_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934901,second_storeview,Default,simple,,,Motion SX 5 px Silver,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934901_Motion-SX-5-px-Silver_silver_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934901,third_store_view,Default,simple,,,Motion SX 5 px Silver,,"Fits mild to moderate hearing loss +Comfortable, convenient and rechargeable BTE with advanced primax Technology",,,,"Catalog, Search",,10934901_Motion-SX-5-px-Silver_silver_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934520,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SA 5 px Elegance,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",1459,10934520_Motion-SA-5-px-Elegance_elegance_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934520,second_storeview,Default,simple,,,Motion SA 5 px Elegance,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934520_Motion-SA-5-px-Elegance_elegance_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934520,third_store_view,Default,simple,,,Motion SA 5 px Elegance,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934520_Motion-SA-5-px-Elegance_elegance_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934521,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SA 5 px Pearl White,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",1459,10934521_Motion-SA-5-px-Pearl-White_pearl-white_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934521,second_storeview,Default,simple,,,Motion SA 5 px Pearl White,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934521_Motion-SA-5-px-Pearl-White_pearl-white_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934521,third_store_view,Default,simple,,,Motion SA 5 px Pearl White,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934521_Motion-SA-5-px-Pearl-White_pearl-white_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934522,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SA 5 px Sandy Brown,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",1459,10934522_Motion-SA-5-px-Sandy-Brown_dark-blonde_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934522,second_storeview,Default,simple,,,Motion SA 5 px Sandy Brown,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934522_Motion-SA-5-px-Sandy-Brown_dark-blonde_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934522,third_store_view,Default,simple,,,Motion SA 5 px Sandy Brown,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934522_Motion-SA-5-px-Sandy-Brown_dark-blonde_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934523,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SA 5 px Silver,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",1459,10934523_Motion-SA-5-px-Silver_silver_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934523,second_storeview,Default,simple,,,Motion SA 5 px Silver,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934523_Motion-SA-5-px-Silver_silver_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934523,third_store_view,Default,simple,,,Motion SA 5 px Silver,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934523_Motion-SA-5-px-Silver_silver_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10942714,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SP 5 px Beige,,"Fits severe to profound hearing loss +small and reliable desiged BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",1479,10942714_Motion-SP-5-px-Beige_beige_675_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10942714,second_storeview,Default,simple,,,Motion SP 5 px Beige,,"Fits severe to profound hearing loss +small and reliable desiged BTE with advanced primax Technology",,,,"Catalog, Search",,10942714_Motion-SP-5-px-Beige_beige_675_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10942714,third_store_view,Default,simple,,,Motion SP 5 px Beige,,"Fits severe to profound hearing loss +small and reliable desiged BTE with advanced primax Technology",,,,"Catalog, Search",,10942714_Motion-SP-5-px-Beige_beige_675_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10942723,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SP 5 px Granite,,"Fits severe to profound hearing loss +small and reliable desiged BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",1479,10942723_Motion-SP-5-px-Granite_granite_675_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10942723,second_storeview,Default,simple,,,Motion SP 5 px Granite,,"Fits severe to profound hearing loss +small and reliable desiged BTE with advanced primax Technology",,,,"Catalog, Search",,10942723_Motion-SP-5-px-Granite_granite_675_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10942723,third_store_view,Default,simple,,,Motion SP 5 px Granite,,"Fits severe to profound hearing loss +small and reliable desiged BTE with advanced primax Technology",,,,"Catalog, Search",,10942723_Motion-SP-5-px-Granite_granite_675_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934524,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion SA 5 px Spirit,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",1459,10934524_Motion-SA-5-px-Spirit_spirit_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934524,second_storeview,Default,simple,,,Motion SA 5 px Spirit,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934524_Motion-SA-5-px-Spirit_spirit_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934524,third_store_view,Default,simple,,,Motion SA 5 px Spirit,,"Fits mild to moderate hearing loss +Comfortable, convenient and DAI compatible BTE with advanced primax Technology",,,,"Catalog, Search",,10934524_Motion-SA-5-px-Spirit_spirit_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10939409,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion P 5 px Deep Red,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",1459,10939409_Motion-P-5-px-Deep-Red_deep-red_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10939409,second_storeview,Default,simple,,,Motion P 5 px Deep Red,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10939409_Motion-P-5-px-Deep-Red_deep-red_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10939409,third_store_view,Default,simple,,,Motion P 5 px Deep Red,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10939409_Motion-P-5-px-Deep-Red_deep-red_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934652,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion P 5 px Beige,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",1459,10934652_Motion-P-5-px-Beige_beige_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934652,second_storeview,Default,simple,,,Motion P 5 px Beige,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934652_Motion-P-5-px-Beige_beige_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934652,third_store_view,Default,simple,,,Motion P 5 px Beige,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934652_Motion-P-5-px-Beige_beige_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934653,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion P 5 px Black,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",1459,10934653_Motion-P-5-px-Black_black_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934653,second_storeview,Default,simple,,,Motion P 5 px Black,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934653_Motion-P-5-px-Black_black_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934653,third_store_view,Default,simple,,,Motion P 5 px Black,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934653_Motion-P-5-px-Black_black_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934654,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion P 5 px Brown,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",1459,10934654_Motion-P-5-px-Brown_brown_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934654,second_storeview,Default,simple,,,Motion P 5 px Brown,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934654_Motion-P-5-px-Brown_brown_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934654,third_store_view,Default,simple,,,Motion P 5 px Brown,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934654_Motion-P-5-px-Brown_brown_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934655,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion P 5 px Candy Pink,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",1459,10934655_Motion-P-5-px-Candy-Pink_candy-pink_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934655,second_storeview,Default,simple,,,Motion P 5 px Candy Pink,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934655_Motion-P-5-px-Candy-Pink_candy-pink_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934655,third_store_view,Default,simple,,,Motion P 5 px Candy Pink,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934655_Motion-P-5-px-Candy-Pink_candy-pink_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934656,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion P 5 px Dark Granite,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",1459,10934656_Motion-P-5-px-Dark-Granite_dark-granite_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934656,second_storeview,Default,simple,,,Motion P 5 px Dark Granite,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934656_Motion-P-5-px-Dark-Granite_dark-granite_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934656,third_store_view,Default,simple,,,Motion P 5 px Dark Granite,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934656_Motion-P-5-px-Dark-Granite_dark-granite_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934657,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion P 5 px Dark Champagne,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",1459,10934657_Motion-P-5-px-Dark-Champagne_dark-champagner_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934657,second_storeview,Default,simple,,,Motion P 5 px Dark Champagne,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934657_Motion-P-5-px-Dark-Champagne_dark-champagner_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934657,third_store_view,Default,simple,,,Motion P 5 px Dark Champagne,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934657_Motion-P-5-px-Dark-Champagne_dark-champagner_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934658,,Default,simple,"Default Category/Gear,Default Category/Gear/Defaults",base,Motion P 5 px Golden Blonde,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",5.5,1,0,"Catalog, Search",1459,10934658_Motion-P-5-px-Golden-Blonde_golden-blonde_13_mysignia_usa_english,"color=Black,eco_collection=No,erin_recommends=No,gift_wrapping_available=No,new=No,performance_fabric=No,sale=No",0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,0,1,,,,"name=Patient Reference,type=field,required=0,sku=PR,max_characters=20,price=0.0000,price_type=fixed",,,,,,,,,,,,,,BTE,,BTE,2439523,,,,,,,,,,, +10934658,second_storeview,Default,simple,,,Motion P 5 px Golden Blonde,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934658_Motion-P-5-px-Golden-Blonde_golden-blonde_13_mysignia_usa_english,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, +10934658,third_store_view,Default,simple,,,Motion P 5 px Golden Blonde,,"Fits severe to profound hearing loss +Powerful and small BTE with advanced primax Technology",,,,"Catalog, Search",,10934658_Motion-P-5-px-Golden-Blonde_golden-blonde_13_my_signia_usa_factory_only,,,,,,,,,,,,,,,,,,,,,,,,,,,"name=Patient Reference,type=field",,,,,,,,,,,,,,,,,,,,,,,,,,,, \ No newline at end of file diff --git a/dev/tests/acceptance/tests/_data/table_rate_30895.csv b/dev/tests/acceptance/tests/_data/table_rate_30895.csv new file mode 100644 index 0000000000000..6c4420c937815 --- /dev/null +++ b/dev/tests/acceptance/tests/_data/table_rate_30895.csv @@ -0,0 +1,3 @@ +Country,Region/State,Zip/Postal Code,Weight (and above),Shipping Price +US,CA,*,0,5 +US,*,*,0,10 diff --git a/dev/tests/api-functional/testsuite/Magento/WebapiAsync/Model/AsyncScheduleMultiStoreTest.php b/dev/tests/api-functional/testsuite/Magento/WebapiAsync/Model/AsyncScheduleMultiStoreTest.php new file mode 100644 index 0000000000000..a58bb6b14d069 --- /dev/null +++ b/dev/tests/api-functional/testsuite/Magento/WebapiAsync/Model/AsyncScheduleMultiStoreTest.php @@ -0,0 +1,373 @@ +<?php +/** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +declare(strict_types=1); + +namespace Magento\WebapiAsync\Model; + +use Magento\Catalog\Api\Data\ProductInterface; +use Magento\TestFramework\MessageQueue\PreconditionFailedException; +use Magento\TestFramework\MessageQueue\PublisherConsumerController; +use Magento\TestFramework\MessageQueue\EnvironmentPreconditionException; +use Magento\TestFramework\TestCase\WebapiAbstract; +use Magento\TestFramework\Helper\Bootstrap; +use Magento\Catalog\Model\ResourceModel\Product\Collection; +use Magento\Framework\Phrase; +use Magento\Framework\Registry; +use Magento\Framework\Webapi\Exception; +use Magento\Catalog\Api\ProductRepositoryInterface; +use Magento\Catalog\Api\Data\ProductInterface as Product; +use Magento\Framework\ObjectManagerInterface; +use Magento\Store\Model\Store; +use Magento\Framework\Webapi\Rest\Request; + +/** + * Check async request for multistore product creation service, scheduling bulk + * to rabbitmq running consumers and check async.operation.add consumer check + * if product was created by async requests + * + * @magentoAppIsolation enabled + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ +class AsyncScheduleMultiStoreTest extends WebapiAbstract +{ + const SERVICE_NAME = 'catalogProductRepositoryV1'; + const SERVICE_VERSION = 'V1'; + const REST_RESOURCE_PATH = '/V1/products'; + const ASYNC_RESOURCE_PATH = '/async/V1/products'; + const ASYNC_CONSUMER_NAME = 'async.operations.all'; + + const STORE_CODE_FROM_FIXTURE = 'fixturestore'; + const STORE_NAME_FROM_FIXTURE = 'Fixture Store'; + + const STORE_CODE_ALL = 'all'; + const STORE_CODE_DEFAULT = 'default'; + + private $stores = [ + self::STORE_CODE_DEFAULT, + self::STORE_CODE_ALL, + self::STORE_CODE_FROM_FIXTURE, + ]; + + const KEY_TIER_PRICES = 'tier_prices'; + const KEY_SPECIAL_PRICE = 'special_price'; + const KEY_CATEGORY_LINKS = 'category_links'; + + const BULK_UUID_KEY = 'bulk_uuid'; + + protected $consumers = [ + self::ASYNC_CONSUMER_NAME, + ]; + + /** + * @var string[] + */ + private $skus = []; + + /** + * @var PublisherConsumerController + */ + private $publisherConsumerController; + + /** + * @var ProductRepositoryInterface + */ + private $productRepository; + + /** + * @var ObjectManagerInterface + */ + private $objectManager; + + /** + * @var Registry + */ + private $registry; + + protected function setUp() + { + $this->objectManager = Bootstrap::getObjectManager(); + $this->logFilePath = TESTS_TEMP_DIR . "/MessageQueueTestLog.txt"; + $this->registry = $this->objectManager->get(Registry::class); + + $params = array_merge_recursive( + Bootstrap::getInstance()->getAppInitParams(), + ['MAGE_DIRS' => ['cache' => ['path' => TESTS_TEMP_DIR . '/cache']]] + ); + + /** @var PublisherConsumerController publisherConsumerController */ + $this->publisherConsumerController = $this->objectManager->create( + PublisherConsumerController::class, + [ + 'consumers' => $this->consumers, + 'logFilePath' => $this->logFilePath, + 'appInitParams' => $params, + ] + ); + $this->productRepository = $this->objectManager->create(ProductRepositoryInterface::class); + + try { + $this->publisherConsumerController->initialize(); + } catch (EnvironmentPreconditionException $e) { + $this->markTestSkipped($e->getMessage()); + } catch (PreconditionFailedException $e) { + $this->fail( + $e->getMessage() + ); + } + + parent::setUp(); + } + + /** + * @dataProvider storeProvider + * @magentoApiDataFixture Magento/Store/_files/core_fixturestore.php + */ + public function testAsyncScheduleBulkMultistore($storeCode) + { + $product = $this->getProductData(); + $this->_markTestAsRestOnly(); + + /** @var Store $store */ + $store = $this->objectManager->create(Store::class); + $store->load(self::STORE_CODE_FROM_FIXTURE); + $this->assertEquals( + self::STORE_NAME_FROM_FIXTURE, + $store->getName(), + 'Precondition failed: fixture store was not created.' + ); + + try { + /** @var Product $productModel */ + $productModel = $this->objectManager->create( + Product::class, + ['data' => $product['product']] + ); + $this->productRepository->save($productModel); + } catch (\Exception $e) { + $this->fail("Precondition failed: product was not created."); + } + + $this->asyncScheduleAndTest($product, $storeCode); + $this->clearProducts(); + } + + private function asyncScheduleAndTest($product, $storeCode = null) + { + $sku = $product['product'][Product::SKU]; + $productName = $product['product'][Product::NAME]; + $newProductName = $product['product'][Product::NAME] . $storeCode; + + $this->skus[] = $sku; + + $product['product'][Product::NAME] = $newProductName; + $product['product'][Product::TYPE_ID] = 'virtual'; + + $response = $this->updateProductAsync($product, $sku, $storeCode); + + $this->assertArrayHasKey(self::BULK_UUID_KEY, $response); + $this->assertNotNull($response[self::BULK_UUID_KEY]); + + $this->assertCount(1, $response['request_items']); + $this->assertEquals('accepted', $response['request_items'][0]['status']); + $this->assertFalse($response['errors']); + + //assert one products is created + try { + $this->publisherConsumerController->waitForAsynchronousResult( + [$this, 'assertProductCreation'], + [$product] + ); + } catch (PreconditionFailedException $e) { + $this->fail("Not all products were created"); + } + + $requestData = ['id' => $sku, 'sku' => $sku]; + + foreach ($this->stores as $checkingStore) { + $serviceInfo = [ + 'rest' => [ + 'resourcePath' => self::REST_RESOURCE_PATH . '/' . $sku, + 'httpMethod' => Request::HTTP_METHOD_GET + ] + ]; + $storeResponse = $this->_webApiCall($serviceInfo, $requestData, null, $checkingStore); + if ($checkingStore == $storeCode || $storeCode == self::STORE_CODE_ALL) { + $this->assertEquals( + $newProductName, + $storeResponse[Product::NAME], + sprintf( + 'Product name in %s store is invalid after updating in store %s.', + $checkingStore, + $storeCode + ) + ); + } else { + $this->assertEquals( + $productName, + $storeResponse[Product::NAME], + sprintf( + 'Product name in %s store is invalid after updating in store %s.', + $checkingStore, + $storeCode + ) + ); + } + } + } + + public function tearDown() + { + $this->clearProducts(); + $this->publisherConsumerController->stopConsumers(); + parent::tearDown(); + } + + private function clearProducts() + { + $size = $this->objectManager->create(Collection::class) + ->addAttributeToFilter('sku', ['in' => $this->skus]) + ->load() + ->getSize(); + + if ($size == 0) { + return; + } + + $this->registry->unregister('isSecureArea'); + $this->registry->register('isSecureArea', true); + try { + foreach ($this->skus as $sku) { + $this->productRepository->deleteById($sku); + } + // phpcs:ignore Magento2.Exceptions.ThrowCatch + } catch (\Exception $e) { + throw $e; + //nothing to delete + } + $this->registry->unregister('isSecureArea'); + + $size = $this->objectManager->create(Collection::class) + ->addAttributeToFilter('sku', ['in' => $this->skus]) + ->load() + ->getSize(); + + if ($size > 0) { + //phpcs:ignore Magento2.Exceptions.DirectThrow + throw new Exception(new Phrase("Collection size after clearing the products: %size", ['size' => $size])); + } + $this->skus = []; + } + + /** + * @return array + */ + public function getProductData() + { + $productBuilder = function ($data) { + return array_replace_recursive( + $this->getSimpleProductData(), + $data + ); + }; + + return [ + 'product' => + $productBuilder( + [ + ProductInterface::TYPE_ID => 'simple', + ProductInterface::SKU => 'multistore-sku-test-1', + ProductInterface::NAME => 'Test Name ', + ] + ), + ]; + } + + public function storeProvider() + { + $dataSets = []; + foreach ($this->stores as $store) { + $dataSets[$store] = [$store]; + } + return $dataSets; + } + + /** + * Get Simple Product Data + * + * @param array $productData + * @return array + */ + private function getSimpleProductData($productData = []) + { + return [ + ProductInterface::SKU => isset($productData[ProductInterface::SKU]) + ? $productData[ProductInterface::SKU] : uniqid('sku-', true), + ProductInterface::NAME => isset($productData[ProductInterface::NAME]) + ? $productData[ProductInterface::NAME] : uniqid('sku-', true), + ProductInterface::VISIBILITY => 4, + ProductInterface::TYPE_ID => 'simple', + ProductInterface::PRICE => 3.62, + ProductInterface::STATUS => 1, + ProductInterface::TYPE_ID => 'simple', + ProductInterface::ATTRIBUTE_SET_ID => 4, + ]; + } + + /** + * @param $requestData + * @param string|null $storeCode + * @return mixed + */ + private function updateProductAsync($requestData, $sku, $storeCode = null) + { + $serviceInfo = [ + 'rest' => [ + 'resourcePath' => self::ASYNC_RESOURCE_PATH . '/' . $sku, + 'httpMethod' => Request::HTTP_METHOD_PUT, + ], + ]; + + return $this->_webApiCall($serviceInfo, $requestData, null, $storeCode); + } + + public function assertProductCreation($product) + { + $sku = $product['product'][Product::SKU]; + $collection = $this->objectManager->create(Collection::class) + ->addAttributeToFilter(Product::SKU, ['eq' => $sku]) + ->addAttributeToFilter(Product::TYPE_ID, ['eq' => 'virtual']) + ->load(); + $size = $collection->getSize(); + + return $size > 0; + } + + /** + * Remove test store + * //phpcs:disable + */ + public static function tearDownAfterClass() + { + parent::tearDownAfterClass(); + //phpcs:enable + /** @var Registry $registry */ + $registry = Bootstrap::getObjectManager()->get(Registry::class); + + $registry->unregister('isSecureArea'); + $registry->register('isSecureArea', true); + + /** @var Store $store*/ + $store = Bootstrap::getObjectManager()->create(Store::class); + $store->load('fixturestore'); + if ($store->getId()) { + $store->delete(); + } + + $registry->unregister('isSecureArea'); + $registry->register('isSecureArea', false); + } +} diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/UrlTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/UrlTest.php index f9075a58c39ef..4cf059d4bf692 100644 --- a/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/UrlTest.php +++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/UrlTest.php @@ -42,6 +42,46 @@ public function testGetUrlInStore() $this->assertStringEndsWith('simple-product.html', $this->_model->getUrlInStore($product)); } + /** + * @magentoDataFixture Magento/Store/_files/second_store.php + * @magentoConfigFixture default_store web/unsecure/base_url http://sample.com/ + * @magentoConfigFixture default_store web/unsecure/base_link_url http://sample.com/ + * @magentoConfigFixture fixturestore_store web/unsecure/base_url http://sample-second.com/ + * @magentoConfigFixture fixturestore_store web/unsecure/base_link_url http://sample-second.com/ + * @magentoDataFixture Magento/Catalog/_files/product_simple_multistore.php + * @dataProvider getUrlsWithSecondStoreProvider + * @magentoAppArea adminhtml + */ + public function testGetUrlInStoreWithSecondStore($storeCode, $expectedProductUrl) + { + $repository = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create( + \Magento\Catalog\Model\ProductRepository::class + ); + /** @var \Magento\Store\Model\Store $store */ + $store = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() + ->create(\Magento\Store\Model\Store::class); + $store->load($storeCode, 'code'); + /** @var \Magento\Store\Model\Store $store */ + + $product = $repository->get('simple'); + + $this->assertEquals( + $expectedProductUrl, + $this->_model->getUrlInStore($product, ['_scope' => $store->getId(), '_nosid' => true]) + ); + } + + /** + * @return array + */ + public function getUrlsWithSecondStoreProvider() + { + return [ + 'case1' => ['fixturestore', 'http://sample-second.com/index.php/simple-product-one.html'], + 'case2' => ['default', 'http://sample.com/index.php/simple-product-one.html'] + ]; + } + public function testGetProductUrl() { $repository = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create( diff --git a/dev/tests/integration/testsuite/Magento/CatalogSearch/Model/Search/AttributeSearchWeightTest.php b/dev/tests/integration/testsuite/Magento/CatalogSearch/Model/Search/AttributeSearchWeightTest.php new file mode 100644 index 0000000000000..775210669abd8 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/CatalogSearch/Model/Search/AttributeSearchWeightTest.php @@ -0,0 +1,179 @@ +<?php +/** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +declare(strict_types=1); + +namespace Magento\CatalogSearch\Model\Search; + +use Magento\Catalog\Api\ProductRepositoryInterface; +use Magento\Catalog\Model\Product; +use Magento\Catalog\Model\ResourceModel\Eav\Attribute; +use Magento\Eav\Api\AttributeRepositoryInterface; +use Magento\Elasticsearch\SearchAdapter\ConnectionManager; +use Magento\Elasticsearch6\Model\Client\Elasticsearch as ElasticsearchClient; +use Magento\Framework\Exception\NoSuchEntityException; +use Magento\Framework\Exception\StateException; +use Magento\Framework\Search\Request\Builder; +use Magento\Framework\Search\Request\Config as RequestConfig; +use Magento\Framework\Search\Response\QueryResponse; +use Magento\Framework\Search\SearchEngineInterface; +use Magento\Indexer\Model\Indexer; +use Magento\TestFramework\Helper\Bootstrap; +use Magento\TestFramework\Helper\CacheCleaner; +use Magento\TestFramework\ObjectManager; +use PHPUnit\Framework\TestCase; + +/** + * Test for name over sku search weight of product attributes + * + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + * @magentoAppIsolation enabled + * @magentoDbIsolation enabled + */ +class AttributeSearchWeightTest extends TestCase +{ + + /** @var $objectManager ObjectManager */ + private $objectManager; + + /** + * @var ConnectionManager + */ + private $connectionManager; + + /** + * @var ElasticsearchClient + */ + private $client; + + /** + * @var ProductRepositoryInterface + */ + private $productRepository; + + protected function setUp() + { + $this->objectManager = Bootstrap::getObjectManager(); + $this->connectionManager = $this->objectManager->create(ConnectionManager::class); + $this->client = $this->connectionManager->getConnection(); + $this->productRepository = $this->objectManager->create(ProductRepositoryInterface::class); + } + + /** + * @param string $attributeName + * @param int $searchWeight + * @throws NoSuchEntityException + * @throws StateException + */ + private function setAttributeSearchWeight(string $attributeName, int $searchWeight) + { + /** @var AttributeRepositoryInterface $attributeRepository */ + $attributeRepository = $this->objectManager->create(AttributeRepositoryInterface::class); + + /** @var Attribute $attribute */ + $attribute = $attributeRepository->get('catalog_product', $attributeName); + + if ($attribute) { + $attribute->setSearchWeight($searchWeight); + $attributeRepository->save($attribute); + } + } + + /** + * @throws \Throwable + */ + private function reindex() + { + CacheCleaner::cleanAll(); + + /** @var Indexer $indexer */ + $indexer = $this->objectManager->create(Indexer::class); + $indexer->load('catalogsearch_fulltext'); + $indexer->reindexAll(); + } + + /** + * @param string $query + * @return array + * @throws NoSuchEntityException + */ + private function findProducts(string $query): array + { + $config = $this->objectManager->create(RequestConfig::class); + + /** @var Builder $requestBuilder */ + $requestBuilder = $this->objectManager->create( + Builder::class, + ['config' => $config] + ); + $requestBuilder->bind('search_term', $query); + $requestBuilder->setRequestName('quick_search_container'); + + /** @var QueryResponse $searchResult */ + $searchResults = $this->objectManager->create(SearchEngineInterface::class) + ->search($requestBuilder->create()); + + $products = []; + foreach ($searchResults as $searchResult) { + $products [] = $this->productRepository->getById($searchResult->getId()); + } + + return $products; + } + + /** + * @dataProvider skuOverNameAttributeSearchWeightDataProvider + * @magentoConfigFixture default/catalog/search/engine elasticsearch6 + * @magentoConfigFixture current_store catalog/search/elasticsearch_index_prefix composite_product_search + * @magentoDataFixture Magento/CatalogSearch/_files/products_for_sku_search_weight_score.php + * @param string $searchQuery + * @param int $skuSearchWeight + * @param int $nameSearchWeight + * @param string $firstMatchProductName + * @param string $secondMatchProductName + * @throws NoSuchEntityException + * @throws \Throwable + */ + public function testSkuOverNameAttributeSearchWeight( + string $searchQuery, + int $skuSearchWeight, + int $nameSearchWeight, + string $firstMatchProductName, + string $secondMatchProductName + ) { + $this->setAttributeSearchWeight('sku', $skuSearchWeight); + $this->setAttributeSearchWeight('name', $nameSearchWeight); + $this->reindex(); + + /** @var Product $products [] */ + $products = $this->findProducts($searchQuery); + + $this->assertCount( + 2, + $products, + 'Expected to find 2 products, found ' . count($products) . '.' + ); + + $this->assertEquals( + $firstMatchProductName, + $products[0]->getData('name'), + 'Products order is not as expected.' + ); + $this->assertEquals( + $secondMatchProductName, + $products[1]->getData('name'), + 'Products order is not as expected.' + ); + } + + public function skuOverNameAttributeSearchWeightDataProvider(): array + { + return [ + ['1-2-3-4', 10, 5, 'test', '1-2-3-4'], + ['1-2-3-4', 5, 10, '1-2-3-4', 'test'], + ]; + } +} diff --git a/dev/tests/integration/testsuite/Magento/CatalogSearch/_files/products_for_sku_search_weight_score.php b/dev/tests/integration/testsuite/Magento/CatalogSearch/_files/products_for_sku_search_weight_score.php new file mode 100644 index 0000000000000..96d5c256dc727 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/CatalogSearch/_files/products_for_sku_search_weight_score.php @@ -0,0 +1,54 @@ +<?php +/** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +use Magento\Catalog\Api\ProductRepositoryInterface; +use Magento\Catalog\Model\Product; +use Magento\Catalog\Model\Product\Attribute\Source\Status; +use Magento\Catalog\Model\Product\Type; +use Magento\Catalog\Model\Product\Visibility; +use Magento\TestFramework\Helper\Bootstrap; + +/** @var ProductRepositoryInterface $productRepository */ +$productRepository = Bootstrap::getObjectManager()->create(ProductRepositoryInterface::class); +$product = Bootstrap::getObjectManager()->create(Product::class); +$product->setTypeId(Type::TYPE_SIMPLE) + ->setAttributeSetId(4) + ->setWebsiteIds([1]) + ->setName('1-2-3-4') + ->setSku('testsku') + ->setPrice(10) + ->setTaxClassId(0) + ->setVisibility(Visibility::VISIBILITY_BOTH) + ->setStatus(Status::STATUS_ENABLED) + ->setStockData( + [ + 'use_config_manage_stock' => 1, + 'qty' => 100, + 'is_qty_decimal' => 0, + 'is_in_stock' => 1, + ] + ); +$productRepository->save($product); + +$product = Bootstrap::getObjectManager()->create(Product::class); +$product->setTypeId(Type::TYPE_SIMPLE) + ->setAttributeSetId(4) + ->setWebsiteIds([1]) + ->setName('test') + ->setSku('1-2-3-4') + ->setPrice(10) + ->setTaxClassId(0) + ->setVisibility(Visibility::VISIBILITY_BOTH) + ->setStatus(Status::STATUS_ENABLED) + ->setStockData( + [ + 'use_config_manage_stock' => 1, + 'qty' => 100, + 'is_qty_decimal' => 0, + 'is_in_stock' => 1, + ] + ); +$productRepository->save($product); diff --git a/dev/tests/integration/testsuite/Magento/Checkout/Model/ShippingInformationManagementTest.php b/dev/tests/integration/testsuite/Magento/Checkout/Model/ShippingInformationManagementTest.php new file mode 100644 index 0000000000000..369919437526c --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Checkout/Model/ShippingInformationManagementTest.php @@ -0,0 +1,142 @@ +<?php +/** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Checkout\Model; + +use Magento\TestFramework\Helper\Bootstrap; +use Magento\Checkout\Api\Data\ShippingInformationInterface; +use Magento\Checkout\Api\PaymentInformationManagementInterface; +use Magento\Checkout\Api\ShippingInformationManagementInterface; +use Magento\Customer\Api\CustomerRepositoryInterface; +use Magento\Quote\Api\CartItemRepositoryInterface; +use Magento\Quote\Api\CartManagementInterface; +use Magento\Quote\Api\Data\AddressInterfaceFactory; +use Magento\Quote\Api\Data\CartItemInterface; +use Magento\Quote\Api\Data\PaymentInterface; +use Magento\Quote\Api\ShipmentEstimationInterface; +use Magento\Sales\Api\InvoiceOrderInterface; + +/** + * Shipping information managment test. + */ +class ShippingInformationManagementTest extends \PHPUnit\Framework\TestCase +{ + /** @var CartManagementInterface */ + private $cartManagement; + + /** @var CartItemRepositoryInterface */ + private $cartItemRepository; + + /** @var CartItemInterface */ + private $cartItem; + + /** @var ShippingInformationManagementInterface */ + private $shippingInformationManagement; + + /** @var ShippingInformationInterface */ + private $shippingInformation; + + /** @var CustomerRepositoryInterface */ + private $customerRepository; + + /** @var AddressInterfaceFactory */ + private $apiAddressFactory; + + /** @var ShipmentEstimationInterface */ + private $shipmentEstimation; + + /** @var PaymentInformationManagementInterface */ + private $paymentInformationManagement; + + /** @var PaymentInterface */ + private $payment; + + /** @var InvoiceOrderInterface */ + private $invoiceOrder; + + public function setUp() + { + $objectManager = Bootstrap::getObjectManager(); + + $this->cartManagement = $objectManager->create(CartManagementInterface::class); + $this->cartItemRepository = $objectManager->create(CartItemRepositoryInterface::class); + $this->cartItem = $objectManager->create(CartItemInterface::class); + $this->shippingInformationManagement = $objectManager->create(ShippingInformationManagementInterface::class); + $this->shippingInformation = $objectManager->create(ShippingInformationInterface::class); + $this->customerRepository = $objectManager->create(CustomerRepositoryInterface::class); + $this->apiAddressFactory = $objectManager->create(AddressInterfaceFactory::class); + $this->shipmentEstimation = $objectManager->create(ShipmentEstimationInterface::class); + $this->paymentInformationManagement = $objectManager->create(PaymentInformationManagementInterface::class); + $this->payment = $objectManager->create(PaymentInterface::class); + $this->invoiceOrder = $objectManager->create(InvoiceOrderInterface::class); + } + + /** + * @magentoDataFixture Magento/Customer/_files/customer.php + * @magentoDataFixture Magento/Customer/_files/customer_address.php + * @magentoDataFixture Magento/Catalog/_files/product_virtual_in_stock.php + */ + public function testQuoteApiWithOnlyVirtualProducts() + { + $customer = $this->customerRepository->getById(1); + + // Create empty quote + $quoteId = $this->cartManagement->createEmptyCartForCustomer($customer->getId()); + + $cartItem = $this->cartItem + ->setSku('virtual-product') + ->setQty(1) + ->setQuoteId($quoteId); + + // Add item to cart + $this->cartItemRepository->save($cartItem); + + $billingAddress = $shippingAddress = null; + foreach ($customer->getAddresses() as $address) { + $billingAddress = $address; + $shippingAddress = $address; + break; + } + + /** @var \Magento\Quote\Model\Quote\Address $apiBillingAddress */ + $apiBillingAddress = $this->apiAddressFactory->create(); + $apiBillingAddress->setRegion($billingAddress->getRegion()) + ->setRegionId($billingAddress->getRegionId()) + ->setCountryId($billingAddress->getCountryId()) + ->setStreet($billingAddress->getStreet()) + ->setPostcode($billingAddress->getPostcode()) + ->setCity($billingAddress->getCity()) + ->setFirstname($billingAddress->getFirstname()) + ->setLastname($billingAddress->getLastname()) + ->setEmail($customer->getEmail()) + ->setTelephone($billingAddress->getTelephone()); + + /** @var \Magento\Quote\Model\Quote\Address $apiShippingAddress */ + $apiShippingAddress = $this->apiAddressFactory->create(); + $apiShippingAddress->setRegion($shippingAddress->getRegion()) + ->setRegionId($shippingAddress->getRegionId()) + ->setCountryId($shippingAddress->getCountryId()) + ->setStreet($shippingAddress->getStreet()) + ->setPostcode($shippingAddress->getPostcode()) + ->setCity($shippingAddress->getCity()) + ->setFirstname($shippingAddress->getFirstname()) + ->setLastname($shippingAddress->getLastname()) + ->setEmail($customer->getEmail()) + ->setTelephone($shippingAddress->getTelephone()); + + // Estimate shipping + $this->shipmentEstimation->estimateByExtendedAddress($quoteId, $apiShippingAddress); + + $addressInformation = $this->shippingInformation + ->setBillingAddress($apiBillingAddress) + ->setShippingAddress($apiShippingAddress) + ->setShippingCarrierCode('flatrate') + ->setShippingMethodCode('flatrate'); + + // Set address information on quote + $this->shippingInformationManagement->saveAddressInformation($quoteId, $addressInformation); + } +} diff --git a/dev/tests/integration/testsuite/Magento/Customer/Controller/AccountTest.php b/dev/tests/integration/testsuite/Magento/Customer/Controller/AccountTest.php index 10b632c002475..898d3ff400b38 100644 --- a/dev/tests/integration/testsuite/Magento/Customer/Controller/AccountTest.php +++ b/dev/tests/integration/testsuite/Magento/Customer/Controller/AccountTest.php @@ -15,17 +15,17 @@ use Magento\Framework\App\Config\ScopeConfigInterface; use Magento\Framework\App\Config\Value; use Magento\Framework\App\Http; +use Magento\Framework\App\Request\Http as HttpRequest; use Magento\Framework\Data\Form\FormKey; use Magento\Framework\Message\MessageInterface; +use Magento\Framework\Serialize\Serializer\Json; +use Magento\Framework\Stdlib\CookieManagerInterface; use Magento\TestFramework\Helper\Bootstrap; +use Magento\TestFramework\Mail\Template\TransportBuilderMock; use Magento\TestFramework\Request; use Magento\TestFramework\Response; -use Zend\Stdlib\Parameters; -use Magento\Framework\App\Request\Http as HttpRequest; -use Magento\TestFramework\Mail\Template\TransportBuilderMock; -use Magento\Framework\Serialize\Serializer\Json; -use Magento\Framework\Stdlib\CookieManagerInterface; use Magento\Theme\Controller\Result\MessagePlugin; +use Zend\Stdlib\Parameters; /** * @SuppressWarnings(PHPMD.CouplingBetweenObjects) @@ -169,6 +169,7 @@ public function testCreatepasswordActionWithDirectLink() $token = Bootstrap::getObjectManager()->get(\Magento\Framework\Math\Random::class) ->getUniqueHash(); $customer->changeResetPasswordLinkToken($token); + $customer->setData('confirmation', 'confirmation'); $customer->save(); $this->getRequest()->setParam('token', $token); @@ -187,6 +188,7 @@ public function testCreatepasswordActionWithDirectLink() $session = Bootstrap::getObjectManager()->get(Session::class); $this->assertEquals($token, $session->getRpToken()); $this->assertNotContains($token, $response->getHeader('Location')->getFieldValue()); + $this->assertCustomerConfirmationEquals(1, null); } /** @@ -201,6 +203,7 @@ public function testCreatepasswordActionWithSession() $token = Bootstrap::getObjectManager()->get(\Magento\Framework\Math\Random::class) ->getUniqueHash(); $customer->changeResetPasswordLinkToken($token); + $customer->setData('confirmation', 'confirmation'); $customer->save(); /** @var \Magento\Customer\Model\Session $customer */ @@ -213,6 +216,7 @@ public function testCreatepasswordActionWithSession() $response = $this->getResponse(); $text = $response->getBody(); $this->assertTrue((bool)preg_match('/' . $token . '/m', $text)); + $this->assertCustomerConfirmationEquals(1, null); } /** @@ -227,6 +231,7 @@ public function testCreatepasswordActionInvalidToken() $token = Bootstrap::getObjectManager()->get(\Magento\Framework\Math\Random::class) ->getUniqueHash(); $customer->changeResetPasswordLinkToken($token); + $customer->setData('confirmation', 'confirmation'); $customer->save(); $this->getRequest()->setParam('token', 'INVALIDTOKEN'); @@ -238,6 +243,19 @@ public function testCreatepasswordActionInvalidToken() $response = $this->getResponse(); $this->assertEquals(302, $response->getHttpResponseCode()); $this->assertContains('customer/account/forgotpassword', $response->getHeader('Location')->getFieldValue()); + $this->assertCustomerConfirmationEquals(1, 'confirmation'); + } + + /** + * @param int $customerId + * @param string|null $confirmation + */ + private function assertCustomerConfirmationEquals(int $customerId, string $confirmation = null) + { + /** @var \Magento\Customer\Model\Customer $customer */ + $customer = Bootstrap::getObjectManager() + ->create(\Magento\Customer\Model\Customer::class)->load($customerId); + $this->assertEquals($confirmation, $customer->getConfirmation()); } /** @@ -297,11 +315,13 @@ public function testWithConfirmCreatePostAction() $this->dispatch('customer/account/createPost'); $this->assertRedirect($this->stringContains('customer/account/index/')); $this->assertSessionMessages( - $this->equalTo([ - 'You must confirm your account. Please check your email for the confirmation link or ' + $this->equalTo( + [ + 'You must confirm your account. Please check your email for the confirmation link or ' . '<a href="http://localhost/index.php/customer/account/confirmation/' . '?email=test2%40email.com">click here</a> for a new link.' - ]), + ] + ), MessageInterface::TYPE_SUCCESS ); } @@ -315,10 +335,14 @@ public function testExistingEmailCreatePostAction() $this->dispatch('customer/account/createPost'); $this->assertRedirect($this->stringContains('customer/account/create/')); $this->assertSessionMessages( - $this->equalTo(['There is already an account with this email address. ' . - 'If you are sure that it is your email address, ' . - '<a href="http://localhost/index.php/customer/account/forgotpassword/">click here</a>' . - ' to get your password and access your account.', ]), + $this->equalTo( + [ + 'There is already an account with this email address. ' . + 'If you are sure that it is your email address, ' . + '<a href="http://localhost/index.php/customer/account/forgotpassword/">click here</a>' . + ' to get your password and access your account.', + ] + ), MessageInterface::TYPE_ERROR ); } @@ -330,7 +354,11 @@ public function testInactiveUserConfirmationAction() { $this->getRequest() ->setMethod('POST') - ->setPostValue(['email' => 'customer@needAconfirmation.com']); + ->setPostValue( + [ + 'email' => 'customer@needAconfirmation.com', + ] + ); $this->dispatch('customer/account/confirmation'); $this->assertRedirect($this->stringContains('customer/account/index')); @@ -347,14 +375,20 @@ public function testActiveUserConfirmationAction() { $this->getRequest() ->setMethod('POST') - ->setPostValue([ - 'email' => 'customer@example.com', - ]); + ->setPostValue( + [ + 'email' => 'customer@example.com', + ] + ); $this->dispatch('customer/account/confirmation'); $this->assertRedirect($this->stringContains('customer/account/index')); $this->assertSessionMessages( - $this->equalTo(['This email does not require confirmation.']), + $this->equalTo( + [ + 'This email does not require confirmation.', + ] + ), MessageInterface::TYPE_SUCCESS ); } @@ -395,9 +429,11 @@ public function testForgotPasswordPostWithBadEmailAction() { $this->getRequest()->setMethod(HttpRequest::METHOD_POST); $this->getRequest() - ->setPostValue([ - 'email' => 'bad@email', - ]); + ->setPostValue( + [ + 'email' => 'bad@email', + ] + ); $this->dispatch('customer/account/forgotPasswordPost'); $this->assertRedirect($this->stringContains('customer/account/forgotpassword')); @@ -416,10 +452,12 @@ public function testResetPasswordPostNoTokenAction() ->setParam('id', 1) ->setParam('token', '8ed8677e6c79e68b94e61658bd756ea5') ->setMethod('POST') - ->setPostValue([ - 'password' => 'new-password', - 'password_confirmation' => 'new-password', - ]); + ->setPostValue( + [ + 'password' => 'new-password', + 'password_confirmation' => 'new-password', + ] + ); $this->dispatch('customer/account/resetPasswordPost'); $this->assertRedirect($this->stringContains('customer/account/')); @@ -439,10 +477,12 @@ public function testResetPasswordPostAction() ->setQueryValue('id', 1) ->setQueryValue('token', '8ed8677e6c79e68b94e61658bd756ea5') ->setMethod('POST') - ->setPostValue([ - 'password' => 'new-Password1', - 'password_confirmation' => 'new-Password1', - ]); + ->setPostValue( + [ + 'password' => 'new-Password1', + 'password_confirmation' => 'new-Password1', + ] + ); $this->dispatch('customer/account/resetPasswordPost'); $this->assertRedirect($this->stringContains('customer/account/login')); @@ -465,8 +505,11 @@ public function testEditAction() $this->assertEquals(200, $this->getResponse()->getHttpResponseCode(), $body); $this->assertContains('<div class="field field-name-firstname required">', $body); // Verify the password check box is not checked - $this->assertContains('<input type="checkbox" name="change_password" id="change-password" ' - . 'data-role="change-password" value="1" title="Change Password" class="checkbox" />', $body); + $this->assertContains( + '<input type="checkbox" name="change_password" id="change-password" ' + . 'data-role="change-password" value="1" title="Change Password" class="checkbox" />', + $body + ); } /** @@ -510,14 +553,16 @@ public function testEditPostAction() $this->login(1); $this->getRequest() ->setMethod('POST') - ->setPostValue([ - 'form_key' => $this->_objectManager->get(FormKey::class)->getFormKey(), - 'firstname' => 'John', - 'lastname' => 'Doe', - 'email' => 'johndoe@email.com', - 'change_email' => 1, - 'current_password' => 'password' - ]); + ->setPostValue( + [ + 'form_key' => $this->_objectManager->get(FormKey::class)->getFormKey(), + 'firstname' => 'John', + 'lastname' => 'Doe', + 'email' => 'johndoe@email.com', + 'change_email' => 1, + 'current_password' => 'password' + ] + ); $this->dispatch('customer/account/editPost'); @@ -648,16 +693,18 @@ public function testWrongConfirmationEditPostAction() $this->login(1); $this->getRequest() ->setMethod('POST') - ->setPostValue([ - 'form_key' => $this->_objectManager->get(FormKey::class)->getFormKey(), - 'firstname' => 'John', - 'lastname' => 'Doe', - 'email' => 'johndoe@email.com', - 'change_password' => 1, - 'current_password' => 'password', - 'password' => 'new-password', - 'password_confirmation' => 'new-password-no-match', - ]); + ->setPostValue( + [ + 'form_key' => $this->_objectManager->get(FormKey::class)->getFormKey(), + 'firstname' => 'John', + 'lastname' => 'Doe', + 'email' => 'johndoe@email.com', + 'change_password' => 1, + 'current_password' => 'password', + 'password' => 'new-password', + 'password_confirmation' => 'new-password-no-match', + ] + ); $this->dispatch('customer/account/editPost'); @@ -841,13 +888,15 @@ private function getCustomerByEmail($email) */ private function prepareRequest() { - $post = new Parameters([ - 'form_key' => $this->_objectManager->get(FormKey::class)->getFormKey(), - 'login' => [ - 'username' => 'customer@example.com', - 'password' => 'password' + $post = new Parameters( + [ + 'form_key' => $this->_objectManager->get(FormKey::class)->getFormKey(), + 'login' => [ + 'username' => 'customer@example.com', + 'password' => 'password' + ] ] - ]); + ); $request = $this->getRequest(); $formKey = $this->_objectManager->get(FormKey::class); $request->setParam('form_key', $formKey->getFormKey()); @@ -913,6 +962,7 @@ private function getConfirmationUrlFromMessageContent(string $content): string if (preg_match('<a\s*href="(?<url>.*?)".*>', $content, $matches)) { $confirmationUrl = $matches['url']; $confirmationUrl = str_replace('http://localhost/index.php/', '', $confirmationUrl); + // phpcs:ignore Magento2.Functions.DiscouragedFunction $confirmationUrl = html_entity_decode($confirmationUrl); } diff --git a/dev/tests/integration/testsuite/Magento/Customer/Model/ResourceModel/Grid/CollectionReindexOnAccountLockTest.php b/dev/tests/integration/testsuite/Magento/Customer/Model/ResourceModel/Grid/CollectionReindexOnAccountLockTest.php new file mode 100644 index 0000000000000..a665046ceef0d --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Customer/Model/ResourceModel/Grid/CollectionReindexOnAccountLockTest.php @@ -0,0 +1,89 @@ +<?php +/** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Customer\Model\ResourceModel\Grid; + +use Magento\Customer\Api\AccountManagementInterface; +use Magento\Customer\Model\CustomerRegistry; +use Magento\Framework\Exception\InvalidEmailOrPasswordException; +use Magento\Framework\Exception\NoSuchEntityException; +use Magento\TestFramework\Helper\Bootstrap; +use Magento\TestFramework\Indexer\TestCase; +use Magento\Tests\NamingConvention\true\mixed; + +/** + * Test if customer account lock on too many failed authentication attempts triggers customer grid reindex + * + * @SuppressWarnings(PHPMD) + */ +class CollectionReindexOnAccountLockTest extends TestCase +{ + /** + * Trigger customer account lock by making 10 failed authentication attempts + */ + private function lockCustomerAccountWithInvalidAuthentications() + { + /** @var AccountManagementInterface */ + $accountManagement = Bootstrap::getObjectManager()->create(AccountManagementInterface::class); + + for ($i = 0; $i < 10; $i++) { + try { + $accountManagement->authenticate('customer@example.com', 'wrongPassword'); + // phpcs:ignore Magento2.CodeAnalysis.EmptyBlock + } catch (InvalidEmailOrPasswordException $e) { + } + } + } + + /** + * @return mixed + * @throws NoSuchEntityException + */ + private function getCustomerLockExpire(): ?string + { + /** @var CustomerRegistry $customerRegistry */ + $customerRegistry = Bootstrap::getObjectManager()->create(CustomerRegistry::class); + $customerModel = $customerRegistry->retrieve(1); + $this->assertNotEmpty($customerModel); + + return $customerModel->getData('lock_expires'); + } + + /** + * @return mixed + */ + private function getCustomerGridLockExpire(): ?string + { + /** @var Collection */ + $gridCustomerCollection = Bootstrap::getObjectManager()->create(Collection::class); + $gridCustomerItem = $gridCustomerCollection->getItemById(1); + $this->assertNotEmpty($gridCustomerItem); + + return $gridCustomerItem->getData('lock_expires'); + } + + /** + * Test if customer account lock on too many failed authentication attempts triggers customer grid reindex + * + * @magentoDataFixture Magento/Customer/_files/customer.php + * @magentoAppIsolation enabled + * @magentoDbIsolation disabled + */ + public function testCustomerAccountReindexOnLock() + { + $this->assertSame( + $this->getCustomerGridLockExpire(), + $this->getCustomerLockExpire() + ); + + $this->lockCustomerAccountWithInvalidAuthentications(); + + $this->assertSame( + $this->getCustomerGridLockExpire(), + $this->getCustomerLockExpire() + ); + } +} diff --git a/dev/tests/integration/testsuite/Magento/Sales/Block/Adminhtml/Order/Create/Form/AddressTest.php b/dev/tests/integration/testsuite/Magento/Sales/Block/Adminhtml/Order/Create/Form/AddressTest.php index f5a22ec19ccf3..b908e870cbdd0 100644 --- a/dev/tests/integration/testsuite/Magento/Sales/Block/Adminhtml/Order/Create/Form/AddressTest.php +++ b/dev/tests/integration/testsuite/Magento/Sales/Block/Adminhtml/Order/Create/Form/AddressTest.php @@ -122,6 +122,10 @@ public function testGetAddressCollectionJson() 'postcode' => '90230', 'telephone' => '3468676', 'vat_id' => false, + 'prefix' => false, + 'middlename' => false, + 'suffix' => false, + 'fax' => false ], $addresses[1]->getId() => [ 'telephone' => '845454465', @@ -135,6 +139,10 @@ public function testGetAddressCollectionJson() 'region' => false, 'region_id' => 0, 'vat_id' => false, + 'prefix' => false, + 'middlename' => false, + 'suffix' => false, + 'fax' => false ] ]; diff --git a/dev/tests/integration/testsuite/Magento/SendFriend/Controller/SendmailTest.php b/dev/tests/integration/testsuite/Magento/SendFriend/Controller/SendmailTest.php index a075398e9cdb7..f5851a55d760a 100644 --- a/dev/tests/integration/testsuite/Magento/SendFriend/Controller/SendmailTest.php +++ b/dev/tests/integration/testsuite/Magento/SendFriend/Controller/SendmailTest.php @@ -85,6 +85,24 @@ public function testSendActionAsGuestWithInvalidData() ); } + /** + * Share the product invisible in catalog to friend as guest customer + * + * @magentoDbIsolation enabled + * @magentoAppIsolation enabled + * @magentoConfigFixture default_store sendfriend/email/enabled 1 + * @magentoConfigFixture default_store sendfriend/email/allow_guest 1 + * @magentoDataFixture Magento/Catalog/_files/simple_products_not_visible_individually.php + */ + public function testSendInvisibleProduct() + { + $product = $this->getInvisibleProduct(); + $this->prepareRequestData(); + + $this->dispatch('sendfriend/product/sendmail/id/' . $product->getId()); + $this->assert404NotFound(); + } + /** * @return ProductInterface */ @@ -93,6 +111,14 @@ private function getProduct() return $this->_objectManager->get(ProductRepositoryInterface::class)->get('custom-design-simple-product'); } + /** + * @return ProductInterface + */ + private function getInvisibleProduct() + { + return $this->_objectManager->get(ProductRepositoryInterface::class)->get('simple_not_visible_1'); + } + /** * Login the user * diff --git a/lib/internal/Magento/Framework/App/Cache/FlushCacheByTags.php b/lib/internal/Magento/Framework/App/Cache/FlushCacheByTags.php index e2392b198492b..8f8dfd3baf1b6 100644 --- a/lib/internal/Magento/Framework/App/Cache/FlushCacheByTags.php +++ b/lib/internal/Magento/Framework/App/Cache/FlushCacheByTags.php @@ -1,18 +1,24 @@ <?php /** - * * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types=1); + namespace Magento\Framework\App\Cache; +use Magento\Framework\App\Cache\Tag\Resolver; +use Magento\Framework\App\Cache\Type\FrontendPool; +use Magento\Framework\Model\AbstractModel; +use Magento\Framework\Model\ResourceModel\AbstractResource; + /** * Automatic cache cleaner plugin */ class FlushCacheByTags { /** - * @var Type\FrontendPool + * @var FrontendPool */ private $cachePool; @@ -27,23 +33,21 @@ class FlushCacheByTags private $cacheState; /** - * @var Tag\Resolver + * @var Resolver */ private $tagResolver; /** - * FlushCacheByTags constructor. - * - * @param Type\FrontendPool $cachePool + * @param FrontendPool $cachePool * @param StateInterface $cacheState - * @param array $cacheList - * @param Tag\Resolver $tagResolver + * @param string[] $cacheList + * @param Resolver $tagResolver */ public function __construct( - \Magento\Framework\App\Cache\Type\FrontendPool $cachePool, - \Magento\Framework\App\Cache\StateInterface $cacheState, + FrontendPool $cachePool, + StateInterface $cacheState, array $cacheList, - \Magento\Framework\App\Cache\Tag\Resolver $tagResolver + Resolver $tagResolver ) { $this->cachePool = $cachePool; $this->cacheState = $cacheState; @@ -54,17 +58,14 @@ public function __construct( /** * Clean cache on save object * - * @param \Magento\Framework\Model\ResourceModel\AbstractResource $subject + * @param AbstractResource $subject * @param \Closure $proceed - * @param \Magento\Framework\Model\AbstractModel $object - * @return \Magento\Framework\Model\ResourceModel\AbstractResource + * @param AbstractModel $object + * @return AbstractResource * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ - public function aroundSave( - \Magento\Framework\Model\ResourceModel\AbstractResource $subject, - \Closure $proceed, - \Magento\Framework\Model\AbstractModel $object - ) { + public function aroundSave(AbstractResource $subject, \Closure $proceed, AbstractModel $object): AbstractResource + { $result = $proceed($object); $tags = $this->tagResolver->getTags($object); $this->cleanCacheByTags($tags); @@ -75,39 +76,37 @@ public function aroundSave( /** * Clean cache on delete object * - * @param \Magento\Framework\Model\ResourceModel\AbstractResource $subject + * @param AbstractResource $subject * @param \Closure $proceed - * @param \Magento\Framework\Model\AbstractModel $object - * @return \Magento\Framework\Model\ResourceModel\AbstractResource + * @param AbstractModel $object + * @return AbstractResource * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ - public function aroundDelete( - \Magento\Framework\Model\ResourceModel\AbstractResource $subject, - \Closure $proceed, - \Magento\Framework\Model\AbstractModel $object - ) { + public function aroundDelete(AbstractResource $subject, \Closure $proceed, AbstractModel $object): AbstractResource + { $tags = $this->tagResolver->getTags($object); $result = $proceed($object); $this->cleanCacheByTags($tags); + return $result; } /** * Clean cache by tags * - * @param string[] $tags + * @param string[] $tags * @return void */ - private function cleanCacheByTags($tags) + private function cleanCacheByTags(array $tags): void { - if (empty($tags)) { + if (!$tags) { return; } foreach ($this->cacheList as $cacheType) { if ($this->cacheState->isEnabled($cacheType)) { $this->cachePool->get($cacheType)->clean( - \Zend_Cache::CLEANING_MODE_MATCHING_TAG, - array_unique($tags) + \Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG, + \array_unique($tags) ); } } diff --git a/lib/internal/Magento/Framework/App/Test/Unit/Cache/FlushCacheByTagsTest.php b/lib/internal/Magento/Framework/App/Test/Unit/Cache/FlushCacheByTagsTest.php index e05399cd0bfcb..60dba582177eb 100644 --- a/lib/internal/Magento/Framework/App/Test/Unit/Cache/FlushCacheByTagsTest.php +++ b/lib/internal/Magento/Framework/App/Test/Unit/Cache/FlushCacheByTagsTest.php @@ -3,9 +3,20 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types=1); namespace Magento\Framework\App\Test\Unit\Cache; +use Magento\Framework\App\Cache\FlushCacheByTags; +use Magento\Framework\App\Cache\StateInterface; +use Magento\Framework\App\Cache\Tag\Resolver; +use Magento\Framework\App\Cache\Type\FrontendPool; +use Magento\Framework\Model\AbstractModel; +use Magento\Framework\Model\ResourceModel\AbstractResource; + +/** + * Unit tests for the \Magento\Framework\App\Cache\FlushCacheByTags class. + */ class FlushCacheByTagsTest extends \PHPUnit\Framework\TestCase { /** @@ -28,13 +39,16 @@ class FlushCacheByTagsTest extends \PHPUnit\Framework\TestCase */ private $plugin; + /** + * @inheritdoc + */ protected function setUp() { - $this->cacheState = $this->getMockForAbstractClass(\Magento\Framework\App\Cache\StateInterface::class); - $this->frontendPool = $this->createMock(\Magento\Framework\App\Cache\Type\FrontendPool::class); - $this->tagResolver = $this->createMock(\Magento\Framework\App\Cache\Tag\Resolver::class); + $this->cacheState = $this->getMockForAbstractClass(StateInterface::class); + $this->frontendPool = $this->createMock(FrontendPool::class); + $this->tagResolver = $this->createMock(Resolver::class); - $this->plugin = new \Magento\Framework\App\Cache\FlushCacheByTags( + $this->plugin = new FlushCacheByTags( $this->frontendPool, $this->cacheState, ['test'], @@ -42,14 +56,19 @@ protected function setUp() ); } - public function testAroundSave() + /** + * @return void + */ + public function testAroundSave(): void { - $resource = $this->getMockBuilder(\Magento\Framework\Model\ResourceModel\AbstractResource::class) + $resource = $this->getMockBuilder(AbstractResource::class) ->disableOriginalConstructor() ->getMockForAbstractClass(); - $model = $this->getMockBuilder(\Magento\Framework\Model\AbstractModel::class) + $model = $this->getMockBuilder(AbstractModel::class) ->disableOriginalConstructor() ->getMockForAbstractClass(); + $this->tagResolver->expects($this->atLeastOnce())->method('getTags')->with($model)->willReturn([]); + $result = $this->plugin->aroundSave( $resource, function () use ($resource) { @@ -57,17 +76,23 @@ function () use ($resource) { }, $model ); + $this->assertSame($resource, $result); } - public function testAroundDelete() + /** + * @return void + */ + public function testAroundDelete(): void { - $resource = $this->getMockBuilder(\Magento\Framework\Model\ResourceModel\AbstractResource::class) + $resource = $this->getMockBuilder(AbstractResource::class) ->disableOriginalConstructor() ->getMockForAbstractClass(); - $model = $this->getMockBuilder(\Magento\Framework\Model\AbstractModel::class) + $model = $this->getMockBuilder(AbstractModel::class) ->disableOriginalConstructor() ->getMockForAbstractClass(); + $this->tagResolver->expects($this->atLeastOnce())->method('getTags')->with($model)->willReturn([]); + $result = $this->plugin->aroundDelete( $resource, function () use ($resource) { @@ -75,25 +100,7 @@ function () use ($resource) { }, $model ); - $this->assertSame($resource, $result); - } - public function testAroundSaveWithInterface() - { - $resource = $this->getMockBuilder(\Magento\Framework\Model\ResourceModel\AbstractResource::class) - - ->disableOriginalConstructor() - ->getMockForAbstractClass(); - $model = $this->getMockBuilder(\Magento\Framework\Model\AbstractModel::class) - ->disableOriginalConstructor() - ->getMockForAbstractClass(); - $result = $this->plugin->aroundSave( - $resource, - function () use ($resource) { - return $resource; - }, - $model - ); $this->assertSame($resource, $result); } } diff --git a/lib/web/css/docs/source/_icons.less b/lib/web/css/docs/source/_icons.less index b3d14f5e1fd77..367e05ff5888e 100644 --- a/lib/web/css/docs/source/_icons.less +++ b/lib/web/css/docs/source/_icons.less @@ -256,7 +256,7 @@ // <td>@icon-sprite__grid</td> // <td class="vars_value">26px</td> // <td class="vars_value">'' | false | value</td> -// <td>The size of the grid (in pixels) that the individal images are placed on</td> +// <td>The size of the grid (in pixels) that the individual images are placed on</td> // </tr> // <tr> // <th>@_icon-sprite-position</th> diff --git a/lib/web/mage/menu.js b/lib/web/mage/menu.js index 70501e5cac0c6..b1875947cd54e 100644 --- a/lib/web/mage/menu.js +++ b/lib/web/mage/menu.js @@ -462,7 +462,7 @@ define([ this.categoryLink = $('<a>') .attr('href', categoryUrl) - .text($.mage.__('All ') + category); + .text($.mage.__('All %1').replace('%1', category)); this.categoryParent = $('<li>') .addClass('ui-menu-item all-category') From 844427e78e0551721b1a163f514d887b30ec5fb9 Mon Sep 17 00:00:00 2001 From: Maria Kovdrysh <kovdrysh@adobe.com> Date: Wed, 12 Jun 2019 12:07:24 -0500 Subject: [PATCH 29/36] MC-13210: Register customer with image upload Change files after resolved conflict --- .../StorefrontAddBundleDynamicProductToShoppingCartTest.xml | 2 +- .../Mftf/Test/StorefrontAddGroupedProductToShoppingCartTest.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddBundleDynamicProductToShoppingCartTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddBundleDynamicProductToShoppingCartTest.xml index 78da50a44d1f1..071311b78b3fa 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddBundleDynamicProductToShoppingCartTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddBundleDynamicProductToShoppingCartTest.xml @@ -19,7 +19,7 @@ <before> <magentoCLI command="config:set {{EnableFlatRateConfigData.path}} {{EnableFlatRateConfigData.value}}" stepKey="enableFlatRate"/> - <magentoCLI command="config:set {{EnableFlatRateDefaultPrice.path}} {{EnableFlatRateDefaultPrice.value}}" stepKey="enableFlatRateDefaultPrice"/> + <magentoCLI command="config:set {{EnableFlatRateDefaultPriceConfigData.path}} {{EnableFlatRateDefaultPriceConfigData.value}}" stepKey="enableFlatRateDefaultPrice"/> <createData entity="SimpleSubCategory" stepKey="createSubCategory"/> <!--Create simple product--> <createData entity="SimpleProduct2" stepKey="simpleProduct1"> diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddGroupedProductToShoppingCartTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddGroupedProductToShoppingCartTest.xml index c555a9250dd6d..247fab27143b8 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddGroupedProductToShoppingCartTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontAddGroupedProductToShoppingCartTest.xml @@ -22,7 +22,7 @@ <before> <magentoCLI command="config:set {{EnableFlatRateConfigData.path}} {{EnableFlatRateConfigData.value}}" stepKey="enableFlatRate"/> - <magentoCLI command="config:set {{EnableFlatRateDefaultPrice.path}} {{EnableFlatRateDefaultPrice.value}}" stepKey="enableFlatRateDefaultPrice"/> + <magentoCLI command="config:set {{EnableFlatRateDefaultPriceConfigData.path}} {{EnableFlatRateDefaultPriceConfigData.value}}" stepKey="enableFlatRateDefaultPrice"/> <!--Create Grouped product with three simple product --> <createData entity="ApiProductWithDescription" stepKey="simple1" before="simple2"> <field key="price">100.00</field> From 70b1d00031b3bbd23b25b53a2154d76d1bc4b4b8 Mon Sep 17 00:00:00 2001 From: Maria Kovdrysh <kovdrysh@adobe.com> Date: Wed, 12 Jun 2019 13:25:34 -0500 Subject: [PATCH 30/36] MC-11681: Scrub secure data from User Creation logs --- .../Magento/Ui/Test/Mftf/Section/AdminDataGridFilterSection.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/code/Magento/Ui/Test/Mftf/Section/AdminDataGridFilterSection.xml b/app/code/Magento/Ui/Test/Mftf/Section/AdminDataGridFilterSection.xml index fe69e60160d2c..ad8182c62ae68 100644 --- a/app/code/Magento/Ui/Test/Mftf/Section/AdminDataGridFilterSection.xml +++ b/app/code/Magento/Ui/Test/Mftf/Section/AdminDataGridFilterSection.xml @@ -12,7 +12,7 @@ <element name="filterForm" type="block" selector="[data-part='filter-form']" /> <element name="filterExpand" type="button" selector="//div[@class='admin__data-grid-header'][(not(ancestor::*[@class='sticky-header']) and not(contains(@style,'visibility: hidden'))) or (ancestor::*[@class='sticky-header' and not(contains(@style,'display: none'))])]//button[@data-action='grid-filter-expand']" /> <element name="inputFieldByNameAttr" type="input" selector="//*[@data-part='filter-form']//input[@name='{{inputNameAttr}}']" parameterized="true" /> - <element name="inputFieldByNameAttrInGrid" type="input" selector="//*[@data-role='filter-form']//input[@name='{{inputNameAttr}}']" parameterized="true" timeout="30" /> + <element name="inputFieldByNameAttrInGrid" type="input" selector="//*[@data-role='filter-form']//input[@name='{{inputNameAttr}}']" parameterized="true"/> <element name="apply" type="button" selector="//*[@data-part='filter-form']//button[@data-action='grid-filter-apply']" /> <element name="clear" type="button" selector=".admin__data-grid-header [data-action='grid-filter-reset']" /> </section> From 58bfa3e6ccde7ed147121e73b25a02e5d06017b9 Mon Sep 17 00:00:00 2001 From: Soumya Unnikrishnan <sunnikri@adobe.com> Date: Wed, 12 Jun 2019 14:03:20 -0500 Subject: [PATCH 31/36] MQE-1573: Bump MFTF version in Magento and deliver all related changes to new version --- composer.json | 2 +- composer.lock | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/composer.json b/composer.json index a1323796ed4df..80d357695eb57 100644 --- a/composer.json +++ b/composer.json @@ -86,7 +86,7 @@ "friendsofphp/php-cs-fixer": "~2.13.0", "lusitanian/oauth": "~0.8.10", "magento/magento-coding-standard": "~1.0.0", - "magento/magento2-functional-testing-framework": "~2.4.0", + "magento/magento2-functional-testing-framework": "~2.4.1", "pdepend/pdepend": "2.5.2", "phpmd/phpmd": "@stable", "phpunit/phpunit": "~6.5.0", diff --git a/composer.lock b/composer.lock index 5454994ca82db..2cdd7c80cf280 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "912e04a44c38c8918799bd01b828fba0", + "content-hash": "ddcaab80336d44c861e6763148e5f071", "packages": [ { "name": "braintree/braintree_php", @@ -2169,7 +2169,7 @@ }, { "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" + "email": "backendtea@gmail.com" } ], "description": "Symfony polyfill for ctype functions", @@ -6699,16 +6699,16 @@ }, { "name": "magento/magento2-functional-testing-framework", - "version": "2.4.0", + "version": "2.4.1", "source": { "type": "git", "url": "https://github.com/magento/magento2-functional-testing-framework.git", - "reference": "ef534dbcb3aeea68f9254dfd018165c546ad2edb" + "reference": "9b5de03fe069d4a36c911112c30b824ff4e80c3a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/magento/magento2-functional-testing-framework/zipball/ef534dbcb3aeea68f9254dfd018165c546ad2edb", - "reference": "ef534dbcb3aeea68f9254dfd018165c546ad2edb", + "url": "https://api.github.com/repos/magento/magento2-functional-testing-framework/zipball/9b5de03fe069d4a36c911112c30b824ff4e80c3a", + "reference": "9b5de03fe069d4a36c911112c30b824ff4e80c3a", "shasum": "" }, "require": { @@ -6768,10 +6768,10 @@ "magento", "testing" ], - "time": "2019-04-29T20:56:26+00:00" + "time": "2019-06-10T17:57:40+00:00" }, { - "name": "mikey179/vfsStream", + "name": "mikey179/vfsstream", "version": "v1.6.5", "source": { "type": "git", From 588583493f9e22b3ce6af999e86f0add8296115e Mon Sep 17 00:00:00 2001 From: Maria Kovdrysh <kovdrysh@adobe.com> Date: Thu, 13 Jun 2019 09:10:36 -0500 Subject: [PATCH 32/36] MC-13097: Logging during checkout for Customer without addresses in address book --- .../Mftf/Test/StorefrontCustomerLoginDuringCheckoutTest.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontCustomerLoginDuringCheckoutTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontCustomerLoginDuringCheckoutTest.xml index dc47b9abde545..3a0ba2302a6dc 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontCustomerLoginDuringCheckoutTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontCustomerLoginDuringCheckoutTest.xml @@ -64,6 +64,9 @@ <argument name="customer" value="CustomerEntityOne"/> </actionGroup> + <!-- Block with email is disappeared --> + <dontSeeElement selector="{{CheckoutShippingSection.email}}" stepKey="dontSeeEmailBlock"/> + <!-- Shipping form is pre-filed with first name and last name --> <seeInField selector="{{CheckoutShippingSection.firstName}}" userInput="{{CustomerEntityOne.firstname}}" stepKey="seeCustomerFirstNameInField"/> <seeInField selector="{{CheckoutShippingSection.lastName}}" userInput="{{CustomerEntityOne.lastname}}" stepKey="seeCustomerLastNameInField"/> From 1d8fbab3b8c92e9376051df95acb75a236b83e17 Mon Sep 17 00:00:00 2001 From: Maria Kovdrysh <kovdrysh@adobe.com> Date: Thu, 13 Jun 2019 12:06:00 -0500 Subject: [PATCH 33/36] MC-13212: Apply Promo Code during Checkout for physical product --- .../Mftf/Section/CheckoutPaymentSection.xml | 2 ++ ...efrontApplyPromoCodeDuringCheckoutTest.xml | 22 ++++++++++++++----- .../Test/Mftf/Section/DiscountSection.xml | 1 + 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/app/code/Magento/Checkout/Test/Mftf/Section/CheckoutPaymentSection.xml b/app/code/Magento/Checkout/Test/Mftf/Section/CheckoutPaymentSection.xml index 463043ec1fb1a..e1c2a3b1550f1 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Section/CheckoutPaymentSection.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Section/CheckoutPaymentSection.xml @@ -57,5 +57,7 @@ <element name="noQuotes" type="text" selector=".no-quotes-block"/> <element name="paymentMethodByName" type="text" selector="//*[@id='checkout-payment-method-load']//*[contains(@class, 'payment-group')]//label[normalize-space(.)='{{var1}}']" parameterized="true"/> <element name="billingAddressSelectShared" type="select" selector=".checkout-billing-address select[name='billing_address_id']"/> + <element name="discount" type="block" selector="tr.totals.discount"/> + <element name="discountPrice" type="text" selector=".discount .price"/> </section> </sections> diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontApplyPromoCodeDuringCheckoutTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontApplyPromoCodeDuringCheckoutTest.xml index 707c2dfbca379..65f7648a91345 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontApplyPromoCodeDuringCheckoutTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontApplyPromoCodeDuringCheckoutTest.xml @@ -41,35 +41,45 @@ <actionGroup ref="logout" stepKey="logout"/> </after> - <!-- Add simple product to cart --> + <!-- Go to Storefront as Guest and add simple product to cart --> <actionGroup ref="AddSimpleProductToCart" stepKey="addProductToCart"> <argument name="product" value="$$createProduct$$"/> </actionGroup> - <!-- Navigate to checkout --> + <!-- Go to Checkout --> <actionGroup ref="GoToCheckoutFromMinicartActionGroup" stepKey="goToCheckoutFromMinicart"/> - <!-- Fill shipping address --> + <!-- Fill all required fields with valid data and select Flat Rate, price = 5, shipping --> <actionGroup ref="GuestCheckoutFillingShippingSectionActionGroup" stepKey="guestCheckoutFillingShipping"> <argument name="shippingMethod" value="Flat Rate"/> </actionGroup> - <!-- Apply discount to order --> + <!-- Click Apply Discount Code: section is expanded. Input promo code, apply and see success message --> <actionGroup ref="StorefrontApplyDiscountCodeActionGroup" stepKey="applyCoupon"> <argument name="discountCode" value="$$createCouponForCartPriceRule.code$$"/> </actionGroup> + <!-- Apply button is disappeared --> + <dontSeeElement selector="{{DiscountSection.ApplyCodeBtn}}" stepKey="dontSeeApplyButton"/> + + <!-- Cancel coupon button is appeared --> + <seeElement selector="{{DiscountSection.cancelCouponBtn}}" stepKey="seeCancelCouponButton"/> + + <!-- Order summary contains information about applied code --> + <seeElement selector="{{CheckoutPaymentSection.discount}}" stepKey="seeDiscountCouponInSummaryBlock"/> + <see selector="{{CheckoutPaymentSection.discountPrice}}" userInput="-$5.00" stepKey="seeDiscountPrice"/> + <!-- Select payment solution --> <actionGroup ref="CheckoutSelectCheckMoneyOrderPaymentActionGroup" stepKey="clickCheckMoneyOrderPayment"/> - <!-- Place Order --> + <!-- Place Order: order is successfully placed --> <actionGroup ref="ClickPlaceOrderActionGroup" stepKey="clickPlaceOrder"/> <grabTextFrom selector="{{CheckoutSuccessMainSection.orderNumber}}" stepKey="grabOrderNumber"/> <!-- Login as admin --> <actionGroup ref="LoginAsAdmin" stepKey="loginAsAdmin"/> - <!-- Check total in created order --> + <!-- Verify total on order page --> <actionGroup ref="filterOrderGridById" stepKey="filterOrderById"> <argument name="orderId" value="$grabOrderNumber"/> </actionGroup> diff --git a/app/code/Magento/SalesRule/Test/Mftf/Section/DiscountSection.xml b/app/code/Magento/SalesRule/Test/Mftf/Section/DiscountSection.xml index 3639e295d2f11..c52186e3342c6 100644 --- a/app/code/Magento/SalesRule/Test/Mftf/Section/DiscountSection.xml +++ b/app/code/Magento/SalesRule/Test/Mftf/Section/DiscountSection.xml @@ -14,5 +14,6 @@ <element name="ApplyCodeBtn" type="button" selector="//span[text()='Apply Discount']"/> <element name="CancelCoupon" type="button" selector="//button[@value='Cancel Coupon']"/> <element name="DiscountVerificationMsg" type="button" selector="//div[contains(@class, 'discount-code _active')]//div[@data-role='checkout-messages']/div/div"/> + <element name="cancelCouponBtn" type="button" selector="#discount-form .action-cancel"/> </section> </sections> From f194e480a9c7254bb233ff7014d7247d9801d2ea Mon Sep 17 00:00:00 2001 From: Maria Kovdrysh <kovdrysh@adobe.com> Date: Thu, 13 Jun 2019 12:23:35 -0500 Subject: [PATCH 34/36] MC-13212: Apply Promo Code during Checkout for physical product --- .../Mftf/Test/StorefrontApplyPromoCodeDuringCheckoutTest.xml | 2 +- .../Magento/SalesRule/Test/Mftf/Section/DiscountSection.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontApplyPromoCodeDuringCheckoutTest.xml b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontApplyPromoCodeDuringCheckoutTest.xml index 65f7648a91345..bdfdfceab53f9 100644 --- a/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontApplyPromoCodeDuringCheckoutTest.xml +++ b/app/code/Magento/Checkout/Test/Mftf/Test/StorefrontApplyPromoCodeDuringCheckoutTest.xml @@ -63,7 +63,7 @@ <dontSeeElement selector="{{DiscountSection.ApplyCodeBtn}}" stepKey="dontSeeApplyButton"/> <!-- Cancel coupon button is appeared --> - <seeElement selector="{{DiscountSection.cancelCouponBtn}}" stepKey="seeCancelCouponButton"/> + <seeElement selector="{{DiscountSection.CancelCouponBtn}}" stepKey="seeCancelCouponButton"/> <!-- Order summary contains information about applied code --> <seeElement selector="{{CheckoutPaymentSection.discount}}" stepKey="seeDiscountCouponInSummaryBlock"/> diff --git a/app/code/Magento/SalesRule/Test/Mftf/Section/DiscountSection.xml b/app/code/Magento/SalesRule/Test/Mftf/Section/DiscountSection.xml index c52186e3342c6..45dce325f3cb8 100644 --- a/app/code/Magento/SalesRule/Test/Mftf/Section/DiscountSection.xml +++ b/app/code/Magento/SalesRule/Test/Mftf/Section/DiscountSection.xml @@ -13,7 +13,7 @@ <element name="DiscountInput" type="input" selector="#discount-code"/> <element name="ApplyCodeBtn" type="button" selector="//span[text()='Apply Discount']"/> <element name="CancelCoupon" type="button" selector="//button[@value='Cancel Coupon']"/> - <element name="DiscountVerificationMsg" type="button" selector="//div[contains(@class, 'discount-code _active')]//div[@data-role='checkout-messages']/div/div"/> - <element name="cancelCouponBtn" type="button" selector="#discount-form .action-cancel"/> + <element name="DiscountVerificationMsg" type="button" selector=".message-success div"/> + <element name="CancelCouponBtn" type="button" selector="#discount-form .action-cancel"/> </section> </sections> From f6078a232aac255a033584189358c5f1d7f1d813 Mon Sep 17 00:00:00 2001 From: Mila Lesechko <llesechk@adobe.com> Date: Fri, 14 Jun 2019 09:33:59 -0500 Subject: [PATCH 35/36] MC-13212: Apply Promo Code during Checkout for physical product fixed MC-225, MC-230 (Added delete Bundle product) --- .../Bundle/Test/Mftf/Test/AdminProductBundleCreationTest.xml | 2 ++ .../Test/Mftf/Test/StorefrontBundleProductDetailsTest.xml | 2 ++ 2 files changed, 4 insertions(+) diff --git a/app/code/Magento/Bundle/Test/Mftf/Test/AdminProductBundleCreationTest.xml b/app/code/Magento/Bundle/Test/Mftf/Test/AdminProductBundleCreationTest.xml index f87897bd579a3..1f46e1fc9f0b1 100644 --- a/app/code/Magento/Bundle/Test/Mftf/Test/AdminProductBundleCreationTest.xml +++ b/app/code/Magento/Bundle/Test/Mftf/Test/AdminProductBundleCreationTest.xml @@ -31,6 +31,8 @@ <deleteData createDataKey="createPreReqCategory" stepKey="deletePreReqCategory"/> <deleteData createDataKey="simpleProduct1" stepKey="deleteSimpleProduct1"/> <deleteData createDataKey="simpleProduct2" stepKey="deleteSimpleProduct2"/> + <actionGroup ref="AdminOpenProductIndexPageActionGroup" stepKey="navigateToProductIndexPage"/> + <actionGroup ref="deleteProductsIfTheyExist" stepKey="deleteAllProducts"/> <actionGroup ref="logout" stepKey="logout"/> </after> <!-- go to bundle product creation page--> diff --git a/app/code/Magento/Bundle/Test/Mftf/Test/StorefrontBundleProductDetailsTest.xml b/app/code/Magento/Bundle/Test/Mftf/Test/StorefrontBundleProductDetailsTest.xml index 285503465a011..d7394b2dbf32e 100644 --- a/app/code/Magento/Bundle/Test/Mftf/Test/StorefrontBundleProductDetailsTest.xml +++ b/app/code/Magento/Bundle/Test/Mftf/Test/StorefrontBundleProductDetailsTest.xml @@ -32,6 +32,8 @@ <deleteData createDataKey="createPreReqCategory" stepKey="deletePreReqCategory"/> <deleteData createDataKey="simpleProduct1" stepKey="deleteSimpleProduct1"/> <deleteData createDataKey="simpleProduct2" stepKey="deleteSimpleProduct2"/> + <actionGroup ref="AdminOpenProductIndexPageActionGroup" stepKey="navigateToProductIndexPage"/> + <actionGroup ref="deleteProductsIfTheyExist" stepKey="deleteAllProducts"/> <actionGroup ref="logout" stepKey="logout"/> </after> <!-- go to bundle product creation page--> From f82af34cc81167e680ebe9c819f8b38745a86651 Mon Sep 17 00:00:00 2001 From: Ievgen Shakhsuvarov <ishakhsuvarov@magento.com> Date: Tue, 18 Jun 2019 14:34:37 -0500 Subject: [PATCH 36/36] Add MSI integration tests to Jenkins CI --- .../DynamicBundlePriceCalculatorWithDimensionTest.php | 6 +----- .../Magento/Test/Php/_files/phpcpd/blacklist/common.txt | 1 + 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/dev/tests/integration/testsuite/Magento/Bundle/Model/Product/DynamicBundlePriceCalculatorWithDimensionTest.php b/dev/tests/integration/testsuite/Magento/Bundle/Model/Product/DynamicBundlePriceCalculatorWithDimensionTest.php index 2123968d64892..b008fe4003c39 100644 --- a/dev/tests/integration/testsuite/Magento/Bundle/Model/Product/DynamicBundlePriceCalculatorWithDimensionTest.php +++ b/dev/tests/integration/testsuite/Magento/Bundle/Model/Product/DynamicBundlePriceCalculatorWithDimensionTest.php @@ -9,9 +9,9 @@ /** * @magentoDbIsolation disabled + * @magentoAppIsolation enabled * @magentoIndexerDimensionMode catalog_product_price website_and_customer_group * @group indexer_dimension - * @magentoAppArea frontend */ class DynamicBundlePriceCalculatorWithDimensionTest extends BundlePriceAbstract { @@ -19,9 +19,7 @@ class DynamicBundlePriceCalculatorWithDimensionTest extends BundlePriceAbstract * @param array $strategyModifiers * @param array $expectedResults * @dataProvider getTestCases - * @magentoAppIsolation enabled * @magentoDataFixture Magento/Bundle/_files/PriceCalculator/dynamic_bundle_product.php - * @magentoDbIsolation disabled */ public function testPriceForDynamicBundle(array $strategyModifiers, array $expectedResults) { @@ -57,10 +55,8 @@ public function testPriceForDynamicBundle(array $strategyModifiers, array $expec * @param array $strategyModifiers * @param array $expectedResults * @dataProvider getTestCases - * @magentoAppIsolation enabled * @magentoConfigFixture current_store catalog/price/scope 1 * @magentoDataFixture Magento/Bundle/_files/PriceCalculator/dynamic_bundle_product.php - * @magentoDbIsolation disabled */ public function testPriceForDynamicBundleInWebsiteScope(array $strategyModifiers, array $expectedResults) { diff --git a/dev/tests/static/testsuite/Magento/Test/Php/_files/phpcpd/blacklist/common.txt b/dev/tests/static/testsuite/Magento/Test/Php/_files/phpcpd/blacklist/common.txt index 055a3faf70be7..e59cd0983da17 100644 --- a/dev/tests/static/testsuite/Magento/Test/Php/_files/phpcpd/blacklist/common.txt +++ b/dev/tests/static/testsuite/Magento/Test/Php/_files/phpcpd/blacklist/common.txt @@ -215,3 +215,4 @@ Magento/Elasticsearch/Model/Adapter/FieldMapper/Product/FieldProvider/FieldName/ Magento/Elasticsearch6/Model/Client Magento/Config/App/Config/Type Magento/InventoryReservationCli/Test/Integration +Magento/InventoryAdminUi/Controller/Adminhtml