128 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			128 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
<?php
 | 
						|
/**
 | 
						|
 * Copyright © Magento, Inc. All rights reserved.
 | 
						|
 * See COPYING.txt for license details.
 | 
						|
 */
 | 
						|
declare(strict_types=1);
 | 
						|
 | 
						|
namespace Magento\Checkout\Controller\Cart;
 | 
						|
 | 
						|
use Magento\Catalog\Api\Data\ProductInterface;
 | 
						|
use Magento\Catalog\Api\ProductRepositoryInterface;
 | 
						|
use Magento\Checkout\Model\Session as CheckoutSession;
 | 
						|
use Magento\Framework\App\Request\Http as HttpRequest;
 | 
						|
use Magento\Framework\Data\Form\FormKey;
 | 
						|
use Magento\Framework\Message\MessageInterface;
 | 
						|
use Magento\Quote\Model\Quote\Item as QuoteItem;
 | 
						|
use Magento\TestFramework\TestCase\AbstractController;
 | 
						|
 | 
						|
/**
 | 
						|
 * Integration tests for \Magento\Checkout\Controller\Cart\UpdateItemOptions class.
 | 
						|
 */
 | 
						|
class UpdateItemOptionsTest extends AbstractController
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * @var FormKey
 | 
						|
     */
 | 
						|
    private $formKey;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var CheckoutSession
 | 
						|
     */
 | 
						|
    private $checkoutSession;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var ProductRepositoryInterface
 | 
						|
     */
 | 
						|
    private $productRepository;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @inheritDoc
 | 
						|
     */
 | 
						|
    protected function setUp(): void
 | 
						|
    {
 | 
						|
        parent::setUp();
 | 
						|
        $this->formKey = $this->_objectManager->get(FormKey::class);
 | 
						|
        $this->checkoutSession = $this->_objectManager->get(CheckoutSession::class);
 | 
						|
        $this->productRepository = $this->_objectManager->get(ProductRepositoryInterface::class);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Tests that product is successfully updated in the shopping cart.
 | 
						|
     *
 | 
						|
     * @magentoAppArea frontend
 | 
						|
     * @magentoDataFixture Magento/Checkout/_files/quote_with_simple_product.php
 | 
						|
     */
 | 
						|
    public function testUpdateProductOptionsInQuote()
 | 
						|
    {
 | 
						|
        $product = $this->productRepository->get('simple');
 | 
						|
        $quoteItem = $this->checkoutSession->getQuote()->getItemByProduct($product);
 | 
						|
        $postData = $this->preparePostData($product, $quoteItem);
 | 
						|
        $this->dispatchUpdateItemOptionsRequest($postData);
 | 
						|
        $this->assertTrue($this->getResponse()->isRedirect());
 | 
						|
        $this->assertRedirect($this->stringContains('/checkout/cart/'));
 | 
						|
        $message = (string)__(
 | 
						|
            '%1 was updated in your shopping cart.',
 | 
						|
            $product->getName()
 | 
						|
        );
 | 
						|
        $this->assertSessionMessages(
 | 
						|
            $this->containsEqual($message),
 | 
						|
            MessageInterface::TYPE_SUCCESS
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Tests that product can't be updated with an empty shopping cart.
 | 
						|
     *
 | 
						|
     * @magentoAppArea frontend
 | 
						|
     * @magentoDataFixture Magento/Checkout/_files/quote_with_simple_product.php
 | 
						|
     */
 | 
						|
    public function testUpdateProductOptionsWithEmptyQuote()
 | 
						|
    {
 | 
						|
        $product = $this->productRepository->get('simple');
 | 
						|
        $quoteItem = $this->checkoutSession->getQuote()->getItemByProduct($product);
 | 
						|
        $postData = $this->preparePostData($product, $quoteItem);
 | 
						|
        $this->checkoutSession->clearQuote();
 | 
						|
        $this->dispatchUpdateItemOptionsRequest($postData);
 | 
						|
        $this->assertTrue($this->getResponse()->isRedirect());
 | 
						|
        $this->assertRedirect($this->stringContains('/checkout/cart/'));
 | 
						|
        $message = (string)__('The quote item isn't found. Verify the item and try again.');
 | 
						|
        $this->assertSessionMessages(
 | 
						|
            $this->containsEqual($message),
 | 
						|
            MessageInterface::TYPE_ERROR
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Prepare post data for the request.
 | 
						|
     *
 | 
						|
     * @param ProductInterface $product
 | 
						|
     * @param QuoteItem|bool $quoteItem
 | 
						|
     * @return array
 | 
						|
     */
 | 
						|
    private function preparePostData(ProductInterface $product, $quoteItem): array
 | 
						|
    {
 | 
						|
        return [
 | 
						|
            'product' => $product->getId(),
 | 
						|
            'selected_configurable_option' => '',
 | 
						|
            'related_product' => '',
 | 
						|
            'item' => $quoteItem->getId(),
 | 
						|
            'form_key' => $this->formKey->getFormKey(),
 | 
						|
            'qty' => '2',
 | 
						|
        ];
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Perform request for updating product options in a quote item.
 | 
						|
     *
 | 
						|
     * @param array $postData
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    private function dispatchUpdateItemOptionsRequest(array $postData): void
 | 
						|
    {
 | 
						|
        $this->getRequest()->setPostValue($postData);
 | 
						|
        $this->getRequest()->setMethod(HttpRequest::METHOD_POST);
 | 
						|
        $this->dispatch('checkout/cart/updateItemOptions/id/' . $postData['item']);
 | 
						|
    }
 | 
						|
}
 |