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 shopping cart.', '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 shopping cart.', $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); } }