magento2-docker/dev/tests/integration/testsuite/Magento/Checkout/Controller/Cart/AddTest.php

232 lines
7.6 KiB
PHP

<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);
namespace Magento\Checkout\Controller\Cart;
use Laminas\Stdlib\Parameters;
use Magento\Catalog\Api\ProductRepositoryInterface;
use Magento\Checkout\Model\SessionFactory as CheckoutSessionFactory;
use Magento\Framework\App\Request\Http as HttpRequest;
use Magento\Framework\Escaper;
use Magento\Framework\Message\MessageInterface;
use Magento\Framework\Serialize\SerializerInterface;
use Magento\TestFramework\Store\ExecuteInStoreContext;
use Magento\TestFramework\TestCase\AbstractController;
/**
* Class add product to cart controller.
*
* @see \Magento\Checkout\Controller\Cart\Add
* @magentoAppArea frontend
* @magentoDbIsolation enabled
*/
class AddTest extends AbstractController
{
/** @var SerializerInterface */
private $json;
/** @var CheckoutSessionFactory */
private $checkoutSessionFactory;
/** @var ProductRepositoryInterface */
private $productRepository;
/** @var ExecuteInStoreContext */
private $executeInStoreContext;
/** @var Escaper */
private $escaper;
/**
* @inheritdoc
*/
protected function setUp(): void
{
parent::setUp();
$this->json = $this->_objectManager->get(SerializerInterface::class);
$this->checkoutSessionFactory = $this->_objectManager->get(CheckoutSessionFactory::class);
$this->productRepository = $this->_objectManager->get(ProductRepositoryInterface::class);
$this->productRepository->cleanCache();
$this->executeInStoreContext = $this->_objectManager->get(ExecuteInStoreContext::class);
$this->escaper = $this->_objectManager->get(Escaper::class);
}
/**
* Test with simple product and activated redirect to cart
*
* @magentoDataFixture Magento/Catalog/_files/products.php
* @magentoConfigFixture current_store checkout/cart/redirect_to_cart 1
*
* @return void
*/
public function testMessageAtAddToCartWithRedirect(): void
{
$this->prepareReferer();
$checkoutSession = $this->checkoutSessionFactory->create();
$postData = [
'qty' => '1',
'product' => '1',
'custom_price' => 1,
'isAjax' => 1,
];
$this->dispatchAddToCartRequest($postData);
$this->assertEquals(
$this->json->serialize(['backUrl' => 'http://localhost/checkout/cart/']),
$this->getResponse()->getBody()
);
$this->assertSessionMessages(
$this->containsEqual((string)__('You added %1 to your shopping cart.', 'Simple Product')),
MessageInterface::TYPE_SUCCESS
);
$this->assertCount(1, $checkoutSession->getQuote()->getItemsCollection());
}
/**
* Test with simple product and deactivated redirect to cart
*
* @magentoDataFixture Magento/Catalog/_files/products.php
* @magentoConfigFixture current_store checkout/cart/redirect_to_cart 0
*
* @return void
*/
public function testMessageAtAddToCartWithoutRedirect(): void
{
$this->prepareReferer();
$checkoutSession = $this->checkoutSessionFactory->create();
$postData = [
'qty' => '1',
'product' => '1',
'custom_price' => 1,
'isAjax' => 1,
];
$this->dispatchAddToCartRequest($postData);
$this->assertFalse($this->getResponse()->isRedirect());
$this->assertEquals('[]', $this->getResponse()->getBody());
$message = (string)__(
'You added %1 to your <a href="%2">shopping cart</a>.',
'Simple Product',
'http://localhost/checkout/cart/'
);
$this->assertSessionMessages(
$this->containsEqual("\n" . $message),
MessageInterface::TYPE_SUCCESS
);
$this->assertCount(1, $checkoutSession->getQuote()->getItemsCollection());
}
/**
* @dataProvider wrongParamsDataProvider
*
* @param array $params
* @return void
*/
public function testWithWrongParams(array $params): void
{
$this->prepareReferer();
$this->dispatchAddToCartRequest($params);
$this->assertRedirect($this->stringContains('http://localhost/test'));
}
/**
* @return array
*/
public function wrongParamsDataProvider(): array
{
return [
'empty_params' => ['params' => []],
'with_not_existing_product_id' => ['params' => ['product' => 989]],
];
}
/**
* @magentoDataFixture Magento/Catalog/_files/product_simple_duplicated.php
* @magentoDataFixture Magento/Store/_files/second_website_with_two_stores.php
*
* @return void
*/
public function testAddProductFromUnavailableWebsite(): void
{
$this->prepareReferer();
$product = $this->productRepository->get('simple-1');
$postData = ['product' => $product->getId()];
$this->executeInStoreContext->execute('fixture_second_store', [$this, 'dispatchAddToCartRequest'], $postData);
$this->assertRedirect($this->stringContains('http://localhost/test'));
$message = $this->escaper->escapeHtml(
(string)__('The product wasn\'t found. Verify the product and try again.')
);
$this->assertSessionMessages($this->containsEqual($message), MessageInterface::TYPE_ERROR);
}
/**
* @magentoDataFixture Magento/Catalog/_files/product_simple_duplicated.php
*
* @return void
*/
public function testAddProductWithUnavailableQty(): void
{
$product = $this->productRepository->get('simple-1');
$postData = ['product' => $product->getId(), 'qty' => '1000'];
$this->dispatchAddToCartRequest($postData);
$message = (string)__('The requested qty is not available');
$this->assertSessionMessages($this->containsEqual($message), MessageInterface::TYPE_ERROR);
$this->assertRedirect($this->stringContains($product->getProductUrl()));
}
/**
* @magentoDataFixture Magento/Catalog/_files/products_related_multiple.php
*
* @return void
*/
public function testAddProductWithRelated(): void
{
$this->prepareReferer();
$checkoutSession = $this->checkoutSessionFactory->create();
$product = $this->productRepository->get('simple_with_cross');
$params = [
'product' => $product->getId(),
'related_product' => implode(',', $product->getRelatedProductIds()),
];
$this->dispatchAddToCartRequest($params);
$this->assertCount(3, $checkoutSession->getQuote()->getItemsCollection());
$message = (string)__(
'You added %1 to your <a href="%2">shopping cart</a>.',
$product->getName(),
'http://localhost/checkout/cart/'
);
$this->assertSessionMessages(
$this->containsEqual("\n" . $message),
MessageInterface::TYPE_SUCCESS
);
}
/**
* Dispatch add product to cart request.
*
* @param array $postData
* @return void
*/
public function dispatchAddToCartRequest(array $postData = []): void
{
$this->getRequest()->setPostValue($postData);
$this->getRequest()->setMethod(HttpRequest::METHOD_POST);
$this->dispatch('checkout/cart/add');
}
/**
* Prepare referer to test.
*
* @return void
*/
private function prepareReferer(): void
{
$parameters = $this->_objectManager->create(Parameters::class);
$parameters->set('HTTP_REFERER', 'http://localhost/test');
$this->getRequest()->setServer($parameters);
}
}