Skip to content

Commit

Permalink
ENGCOM-7679: Fix Downloadable product after refund #28413
Browse files Browse the repository at this point in the history
  • Loading branch information
sidolov committed Aug 31, 2020
2 parents 1cff238 + ed6c29f commit b93a17d
Show file tree
Hide file tree
Showing 8 changed files with 303 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -58,9 +58,9 @@
<argument name="categoryName" value="$$categoryN.name$$, $$categoryM.name$$"/>
</actionGroup>

<wait stepKey="waitBeforeRunCronIndex" time="30"/>
<wait stepKey="waitBeforeRunCronIndex" time="60"/>
<magentoCLI stepKey="runCronIndex" command="cron:run --group=index"/>
<wait stepKey="waitAfterRunCronIndex" time="60"/>
<wait stepKey="waitAfterRunCronIndex" time="120"/>
</before>
<after>
<!-- Change "Category Products" and "Product Categories" indexers to "Update on Save" mode -->
Expand Down Expand Up @@ -108,6 +108,8 @@
<argument name="categoryName" value="$$categoryK.name$$"/>
</actionGroup>

<wait stepKey="waitAfterAssignCategoryK" time="60"/>

<!-- Unassign category M from Product B -->
<actionGroup ref="AdminProductPageOpenByIdActionGroup" stepKey="amOnEditCategoryPageB">
<argument name="productId" value="$$productB.id$$"/>
Expand Down Expand Up @@ -147,8 +149,9 @@
<see userInput="$$productC.name$$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="seeProductInCategoryN"/>

<!-- Run cron -->
<wait stepKey="waitBeforeRunMagentoCron" time="30"/>
<wait stepKey="waitBeforeRunMagentoCron" time="60"/>
<magentoCLI stepKey="runMagentoCron" command="cron:run --group=index"/>

<wait stepKey="waitAfterRunMagentoCron" time="90"/>

<!-- Open categories K, L, M, N on Storefront in order to make sure that new assigments are applied -->
Expand Down Expand Up @@ -213,8 +216,9 @@
<see userInput="$$productC.name$$" selector="{{StorefrontCategoryMainSection.productName}}" stepKey="productCOnCategoryN"/>

<!-- Run Cron once to reindex product changes -->
<wait stepKey="waitBeforeRunCronIndexAfterProductAssignToCategory" time="30"/>
<wait stepKey="waitBeforeRunCronIndexAfterProductAssignToCategory" time="60"/>
<magentoCLI stepKey="runCronIndexAfterProductAssignToCategory" command="cron:run --group=index"/>

<wait stepKey="waitAfterRunCronIndexAfterProductAssignToCategory" time="90"/>

<!-- Open categories K, L, M, N on Storefront in order to make sure that new assigments are applied -->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,6 @@
</arguments>
<fillField userInput="{{productName}}" selector="{{AdminCustomerWishlistSection.productName}}" stepKey="fillProductNameField"/>
<click selector="{{AdminCustomerWishlistSection.searchButton}}" stepKey="clickSearchButton"/>
<waitForPageLoad stepKey="waitForGridLoading"/>
<waitForAjaxLoad time="60" stepKey="waitForLoading"/>
</actionGroup>
</actionGroups>
17 changes: 17 additions & 0 deletions app/code/Magento/Downloadable/Observer/SetLinkStatusObserver.php
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ public function execute(\Magento\Framework\Event\Observer $observer)
'payment_pending' => \Magento\Downloadable\Model\Link\Purchased\Item::LINK_STATUS_PENDING_PAYMENT,
'payment_review' => \Magento\Downloadable\Model\Link\Purchased\Item::LINK_STATUS_PAYMENT_REVIEW,
];
$expiredOrderItemIds = [];

$downloadableItemsStatuses = [];
$orderItemStatusToEnable = $this->_scopeConfig->getValue(
Expand Down Expand Up @@ -114,6 +115,10 @@ public function execute(\Magento\Framework\Event\Observer $observer)
if (in_array($item->getStatusId(), $availableStatuses)) {
$downloadableItemsStatuses[$item->getId()] = $linkStatuses['avail'];
}

if ($item->getQtyOrdered() - $item->getQtyRefunded() == 0) {
$expiredOrderItemIds[] = $item->getId();
}
}
}
}
Expand Down Expand Up @@ -141,10 +146,22 @@ public function execute(\Magento\Framework\Event\Observer $observer)
}
}

if ($expiredOrderItemIds) {
$linkPurchased = $this->_createItemsCollection()->addFieldToFilter(
'order_item_id',
['in' => $expiredOrderItemIds]
);
foreach ($linkPurchased as $link) {
$link->setStatus(\Magento\Downloadable\Model\Link\Purchased\Item::LINK_STATUS_EXPIRED)->save();
}
}

return $this;
}

/**
* Returns purchased item collection
*
* @return \Magento\Downloadable\Model\ResourceModel\Link\Purchased\Item\Collection
*/
protected function _createItemsCollection()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?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="StorefrontNotAssertDownloadableProductLinkInCustomerAccountActionGroup">
<annotations>
<description>Goes to the Storefront Customer Dashboard page. Clicks on 'My Downloadable Products'. Validates that the provided Downloadable Product is present and Downloadable link not exist.</description>
</annotations>
<arguments>
<argument name="product"/>
</arguments>

<amOnPage url="{{StorefrontCustomerDashboardPage.url}}" stepKey="goToMyAccountPage"/>
<click selector="{{StorefrontCustomerSidebarSection.sidebarTab('My Downloadable Products')}}" stepKey="clickDownloadableProducts"/>
<waitForPageLoad stepKey="waitForDownloadableProductsPageLoad"/>
<seeElement selector="{{StorefrontCustomerDownloadableProductsSection.productName(product.name)}}" stepKey="seeStorefrontDownloadableProductsProductName"/>
<dontSeeElement selector="{{StorefrontCustomerDownloadableProductsSection.downloadableLink}}" stepKey="dontSeeStorefrontMyDownloadableProductsLink"/>

</actionGroup>
</actionGroups>
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,6 @@
xsi:noNamespaceSchemaLocation="urn:magento:mftf:Page/etc/SectionObject.xsd">
<section name="StorefrontCustomerDownloadableProductsSection">
<element name="productName" type="text" selector="//table[@id='my-downloadable-products-table']//strong[contains(@class, 'product-name') and normalize-space(.)='{{productName}}']" parameterized="true"/>
<element name="downloadableLink" type="button" selector="//table[@id='my-downloadable-products-table']//a[contains(@class, 'download')]"/>
</section>
</sections>
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
<?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="StorefrontAccountDownloadableProductLinkAfterPartialRefundTest">
<annotations>
<features value="Catalog"/>
<stories value="Customer Account Downloadable Products Link"/>
<title value="My Account Downloadable Product Link after Partially Refunded"/>
<description value="Verify that Downloadable product is not available in My Download Products tab after it has been partially refunded."/>
<severity value="CRITICAL"/>
<testCaseId value="MC-35198"/>
<group value="Downloadable"/>
</annotations>

<before>
<magentoCLI stepKey="addDownloadableDomain" command="downloadable:domains:add example.com static.magento.com"/>
<magentoCLI command="config:set {{EnableFlatRateConfigData.path}} {{EnableFlatRateConfigData.value}}" stepKey="enableFlatRate"/>

<createData entity="ApiCategory" stepKey="createCategory"/>
<createData entity="ApiSimpleProduct" stepKey="createSimpleProduct">
<requiredEntity createDataKey="createCategory"/>
</createData>
<createData entity="ApiDownloadableProduct" stepKey="createDownloadableProduct"/>
<createData entity="downloadableLink1" stepKey="addDownloadableLink1">
<requiredEntity createDataKey="createDownloadableProduct"/>
</createData>

<magentoCLI command="indexer:reindex" stepKey="reindex"/>
<magentoCLI command="cache:flush" stepKey="flushCache"/>

<createData entity="Simple_US_Customer_Multiple_Addresses" stepKey="createCustomer"/>
<actionGroup ref="LoginToStorefrontActionGroup" stepKey="signIn">
<argument name="Customer" value="$$createCustomer$$"/>
</actionGroup>
</before>

<after>
<actionGroup ref="AdminLogoutActionGroup" stepKey="logoutFromAdmin"/>
<actionGroup ref="StorefrontCustomerLogoutActionGroup" stepKey="customerLogout"/>

<deleteData createDataKey="createCustomer" stepKey="deleteCustomer"/>
<deleteData createDataKey="createCategory" stepKey="deleteCategory"/>
<deleteData createDataKey="createSimpleProduct" stepKey="deleteSimpleProduct"/>
<deleteData createDataKey="createDownloadableProduct" stepKey="deleteDownloadableProduct"/>

<magentoCLI stepKey="removeDownloadableDomain" command="downloadable:domains:remove example.com static.magento.com"/>
<magentoCLI command="config:set {{EnableFlatRateConfigData.path}} {{EnableFlatRateConfigData.value}}" stepKey="enableFlatRate"/>
<magentoCLI command="indexer:reindex" stepKey="reindex"/>
<magentoCLI command="cache:flush" stepKey="flushCache"/>
</after>

<actionGroup ref="StorefrontAddSimpleProductToShoppingCartActionGroup" stepKey="addSimpleProductToCart">
<argument name="product" value="$$createSimpleProduct$$"/>
</actionGroup>

<amOnPage url="{{StorefrontProductPage.url($$createDownloadableProduct.custom_attributes[url_key]$$)}}" stepKey="OpenStoreFrontProductPage"/>
<waitForPageLoad stepKey="waitForPageToLoad"/>

<actionGroup ref="StorefrontAddToCartCustomOptionsProductPageActionGroup" stepKey="addToTheCart">
<argument name="productName" value="$$createDownloadableProduct.name$$"/>
</actionGroup>

<actionGroup ref="ClickViewAndEditCartFromMiniCartActionGroup" stepKey="goToShoppingCartFromMinicart"/>
<click selector="{{CheckoutCartSummarySection.proceedToCheckout}}" stepKey="clickProceedToCheckout"/>
<waitForPageLoad stepKey="waitForProceedToCheckout"/>
<waitForElementVisible selector="{{CheckoutShippingSection.shipHereButton(UK_Not_Default_Address.street[0])}}" stepKey="waitForShipHereVisible"/>
<click selector="{{CheckoutShippingSection.shipHereButton(UK_Not_Default_Address.street[0])}}" stepKey="clickShipHere"/>
<click selector="{{CheckoutShippingGuestInfoSection.next}}" stepKey="clickNext"/>
<waitForPageLoad stepKey="waitForShipmentPageLoad"/>
<checkOption selector="{{CheckoutPaymentSection.billingAddressNotSameCheckbox}}" stepKey="selectPaymentSolution"/>
<waitForElement selector="{{CheckoutPaymentSection.paymentSectionTitle}}" stepKey="waitForPaymentSectionLoaded"/>
<click selector="{{CheckoutPaymentSection.placeOrder}}" stepKey="clickPlaceOrderButton"/>
<seeElement selector="{{CheckoutSuccessMainSection.success}}" stepKey="orderIsSuccessfullyPlaced"/>
<grabTextFrom selector="{{CheckoutSuccessMainSection.orderNumber22}}" stepKey="grabOrderNumber"/>

<actionGroup ref="AdminLoginActionGroup" stepKey="LoginAsAdmin"/>

<amOnPage url="{{AdminOrdersPage.url}}" stepKey="onOrdersPage"/>
<actionGroup ref="SearchAdminDataGridByKeywordActionGroup" stepKey="searchOrder">
<argument name="keyword" value="$grabOrderNumber"/>
</actionGroup>
<actionGroup ref="AdminOrderGridClickFirstRowActionGroup" stepKey="clickOrderRow"/>

<actionGroup ref="AdminCreateInvoiceActionGroup" stepKey="createCreditMemo"/>

<actionGroup ref="OpenOrderByIdActionGroup" stepKey="openOrder">
<argument name="orderId" value="{$grabOrderNumber}"/>
</actionGroup>

<actionGroup ref="AdminOpenAndFillCreditMemoRefundActionGroup" stepKey="fillCreditMemoRefund">
<argument name="itemQtyToRefund" value="0"/>
<argument name="rowNumber" value="1"/>
</actionGroup>

<click selector="{{AdminCreditMemoTotalSection.submitRefundOffline}}" stepKey="clickRefundOffline"/>
<waitForPageLoad stepKey="waitForResultPage"/>

<actionGroup ref="StorefrontNotAssertDownloadableProductLinkInCustomerAccountActionGroup" stepKey="dontSeeStorefrontMyAccountDownloadableProductsLink">
<argument name="product" value="$$createDownloadableProduct$$"/>
</actionGroup>

</test>
</tests>
Loading

0 comments on commit b93a17d

Please sign in to comment.