magento2-docker/dev/tests/api-functional/testsuite/Magento/Quote/Api/GuestCartAddingItemsTest.php

221 lines
7.7 KiB
PHP
Executable File

<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);
namespace Magento\Quote\Api;
use Magento\Catalog\Model\Product;
use Magento\Catalog\Model\Product\Option;
use Magento\Catalog\Model\ResourceModel\Product as ProductResource;
use Magento\Framework\Webapi\Rest\Request;
use Magento\Quote\Model\Quote;
use Magento\TestFramework\Helper\Bootstrap;
use Magento\TestFramework\TestCase\WebapiAbstract;
/**
* Class for testing adding and deleting items flow.
*/
class GuestCartAddingItemsTest extends WebapiAbstract
{
private const SERVICE_VERSION = 'V1';
private const SERVICE_NAME = 'quoteGuestCartManagementV1';
private const RESOURCE_PATH = '/V1/guest-carts/';
/**
* @var \Magento\TestFramework\ObjectManager
*/
protected $objectManager;
/**
* @var ProductResource|mixed
*/
private mixed $productResource;
protected function setUp(): void
{
$this->objectManager = Bootstrap::getObjectManager();
$this->productResource = $this->objectManager->get(ProductResource::class);
}
/**
* Test add to product with custom option and test with updating custom options.
*
* @magentoApiDataFixture Magento/Catalog/_files/product_simple_with_custom_options.php
* @return void
*/
public function testAddtoCartWithCustomOptionsForCreatingQuoteFromEmptyCart()
{
$this->_markTestAsRestOnly();
$productId = $this->productResource->getIdBySku('simple_with_custom_options');
$product = $this->objectManager->create(Product::class)->load($productId);
$customOptionCollection = $this->objectManager->get(Option::class)
->getProductOptionCollection($product);
$customOptions = [];
foreach ($customOptionCollection as $option) {
$customOptions [] = [
'option_id' => $option->getId(),
'option_value' => $option->getType() !== 'field'
? current($option->getValues())->getOptionTypeId()
: 'test'
];
}
// Creating empty cart
$serviceInfoForCreatingEmptyCart = [
'rest' => [
'resourcePath' => self::RESOURCE_PATH,
'httpMethod' => Request::HTTP_METHOD_POST,
]
];
$quoteId = $this->_webApiCall($serviceInfoForCreatingEmptyCart);
// Adding item to the cart
$serviceInfoForAddingProduct = [
'rest' => [
'resourcePath' => self::RESOURCE_PATH . $quoteId . '/items',
'httpMethod' => Request::HTTP_METHOD_POST,
]
];
$requestData = [
'cartItem' => [
'quote_id' => $quoteId,
'sku' => 'simple_with_custom_options',
'qty' => 1,
'product_option' => [
'extension_attributes' => [
'custom_options' => $customOptions
]
]
]
];
$item = $this->_webApiCall($serviceInfoForAddingProduct, $requestData);
$this->assertNotEmpty($item);
foreach ($customOptionCollection as $option) {
$customOptions [] = [
'option_id' => $option->getId(),
'option_value' => $option->getType() != 'field'
? current(array_reverse($option->getValues()))->getOptionTypeId()
: 'test2'
];
}
$requestData = [
'cartItem' => [
'quote_id' => $quoteId,
'sku' => 'simple_with_custom_options',
'qty' => 1,
'product_option' => [
'extension_attributes' => [
'custom_options' => $customOptions
]
]
]
];
// Update the item for the cart
$serviceInfoForUpdateProduct = [
'rest' => [
'resourcePath' => self::RESOURCE_PATH . $quoteId . '/items/' . $item['item_id'],
'httpMethod' => Request::HTTP_METHOD_PUT,
]
];
$item = $this->_webApiCall($serviceInfoForUpdateProduct, $requestData);
$this->assertNotEmpty($item);
}
/**
* Test price for cart after deleting and adding product to.
*
* @magentoApiDataFixture Magento/Catalog/_files/product_without_options_with_stock_data.php
* @return void
*/
public function testPriceForCreatingQuoteFromEmptyCart()
{
// Creating empty cart
$serviceInfoForCreatingEmptyCart = [
'rest' => [
'resourcePath' => self::RESOURCE_PATH,
'httpMethod' => Request::HTTP_METHOD_POST,
],
'soap' => [
'service' => self::SERVICE_NAME,
'serviceVersion' => self::SERVICE_VERSION,
'operation' => self::SERVICE_NAME . 'CreateEmptyCart',
],
];
$quoteId = $this->_webApiCall($serviceInfoForCreatingEmptyCart);
// Adding item to the cart
$serviceInfoForAddingProduct = [
'rest' => [
'resourcePath' => self::RESOURCE_PATH . $quoteId . '/items',
'httpMethod' => Request::HTTP_METHOD_POST,
],
'soap' => [
'service' => GuestCartItemRepositoryTest::SERVICE_NAME,
'serviceVersion' => self::SERVICE_VERSION,
'operation' => GuestCartItemRepositoryTest::SERVICE_NAME . 'Save',
],
];
$requestData = [
'cartItem' => [
'quote_id' => $quoteId,
'sku' => 'simple',
'qty' => 1
]
];
$item = $this->_webApiCall($serviceInfoForAddingProduct, $requestData);
$this->assertNotEmpty($item);
// Delete the item for the cart
$serviceInfoForDeleteProduct = [
'rest' => [
'resourcePath' => self::RESOURCE_PATH . $quoteId . '/items/' . $item['item_id'],
'httpMethod' => Request::HTTP_METHOD_DELETE,
],
'soap' => [
'service' => GuestCartItemRepositoryTest::SERVICE_NAME,
'serviceVersion' => self::SERVICE_VERSION,
'operation' => GuestCartItemRepositoryTest::SERVICE_NAME . 'deleteById',
],
];
$response = (TESTS_WEB_API_ADAPTER == self::ADAPTER_SOAP) ?
$this->_webApiCall($serviceInfoForDeleteProduct, ['cartId' => $quoteId, 'itemId' => $item['item_id']])
: $this->_webApiCall($serviceInfoForDeleteProduct);
$this->assertTrue($response);
// Add one more item and check price for this item
$serviceInfoForAddingProduct = [
'rest' => [
'resourcePath' => self::RESOURCE_PATH . $quoteId . '/items',
'httpMethod' => Request::HTTP_METHOD_POST,
],
'soap' => [
'service' => GuestCartItemRepositoryTest::SERVICE_NAME,
'serviceVersion' => self::SERVICE_VERSION,
'operation' => GuestCartItemRepositoryTest::SERVICE_NAME . 'Save',
],
];
$requestData = [
'cartItem' => [
'quote_id' => $quoteId,
'sku' => 'simple',
'qty' => 1
]
];
$item = $this->_webApiCall($serviceInfoForAddingProduct, $requestData);
$this->assertNotEmpty($item);
$this->assertEquals($item['price'], 10);
/** @var Quote $quote */
$quote = $this->objectManager->create(Quote::class);
$quote->load($quoteId);
$quote->delete();
}
}