magento2-docker/dev/tests/integration/testsuite/Magento/InstantPurchase/Model/PlaceOrderTest.php

267 lines
8.9 KiB
PHP
Executable File

<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\InstantPurchase\Model;
use Magento\Catalog\Api\Data\ProductCustomOptionInterface;
use Magento\Catalog\Api\ProductRepositoryInterface;
use Magento\Catalog\Model\Product;
use Magento\Customer\Api\CustomerRepositoryInterface;
use Magento\Customer\Model\Customer;
use Magento\Framework\ObjectManagerInterface;
use Magento\Store\Api\StoreRepositoryInterface;
use Magento\Store\Model\Store;
use PHPUnit\Framework\TestCase;
use Magento\TestFramework\Helper\Bootstrap;
/**
* @magentoAppIsolation enabled
* @magentoDbIsolation enabled
*/
class PlaceOrderTest extends TestCase
{
/**
* @var ObjectManagerInterface
*/
private $objectManager;
protected function setUp(): void
{
$this->objectManager = Bootstrap::getObjectManager();
}
/**
* @magentoDataFixture Magento/Customer/_files/customer.php
* @magentoDataFixture Magento/Customer/_files/customer_address.php
* @magentoDataFixture Magento/InstantPurchase/_files/fake_payment_token.php
* @magentoDataFixture Magento/Catalog/_files/product_simple.php
*/
public function testPlaceOrderForSimpleProduct()
{
$this->invokeTestProductPlacement(
'simple',
[],
'Simple Product Ordered.'
);
}
/**
* @magentoDataFixture Magento/Customer/_files/customer.php
* @magentoDataFixture Magento/Customer/_files/customer_address.php
* @magentoDataFixture Magento/InstantPurchase/_files/fake_payment_token.php
* @magentoDataFixture Magento/ConfigurableProduct/_files/product_configurable.php
*/
public function testPlaceOrderForConfigurableProduct()
{
$configurable = $this->getFixtureProduct('configurable');
$simple = $this->getFixtureProduct('simple_10');
$configurableAttributes = $configurable->getTypeInstance()->getConfigurableAttributes($configurable);
$selectedOptions = [];
foreach ($configurableAttributes as $configurableAttribute) {
$configurableAttributeId = $configurableAttribute->getData('attribute_id');
$configurableAttributeCode = $configurableAttribute->getProductAttribute()->getData('attribute_code');
$configurableAttributeValueInSimple = $simple->getCustomAttribute($configurableAttributeCode)->getValue();
$selectedOptions[$configurableAttributeId] = $configurableAttributeValueInSimple;
}
$this->invokeTestProductPlacement(
$configurable->getSku(),
[
'super_attribute' => $selectedOptions,
],
'Configurable Product Ordered.'
);
}
/**
* @magentoDataFixture Magento/Customer/_files/customer.php
* @magentoDataFixture Magento/Customer/_files/customer_address.php
* @magentoDataFixture Magento/InstantPurchase/_files/fake_payment_token.php
* @magentoDataFixture Magento/GroupedProduct/_files/product_grouped.php
*/
public function testPlaceOrderForGroupedProduct()
{
$grouped = $this->getFixtureProduct('grouped-product');
$selectedQuantities = [];
foreach ($grouped->getTypeInstance()->getAssociatedProductIds($grouped) as $associatedProductId) {
$selectedQuantities[$associatedProductId] = rand(1, 3);
}
$this->invokeTestProductPlacement(
$grouped->getSku(),
[
'super_group' => $selectedQuantities,
],
'Grouped Product Ordered.'
);
}
/**
* @magentoDataFixture Magento/Customer/_files/customer.php
* @magentoDataFixture Magento/Customer/_files/customer_address.php
* @magentoDataFixture Magento/InstantPurchase/_files/fake_payment_token.php
* @magentoDataFixture Magento/Downloadable/_files/product_downloadable.php
*/
public function testPlaceOrderForDownloadableProduct()
{
$downloadable = $this->getFixtureProduct('downloadable-product');
$selectedLinks = [];
foreach ($downloadable->getTypeInstance()->getLinks($downloadable) as $link) {
$selectedLinks[] = $link->getId();
}
$this->invokeTestProductPlacement(
$downloadable->getSku(),
[
'links' => $selectedLinks
],
'Downloadable Product Ordered.'
);
}
/**
* @magentoDataFixture Magento/Customer/_files/customer.php
* @magentoDataFixture Magento/Customer/_files/customer_address.php
* @magentoDataFixture Magento/InstantPurchase/_files/fake_payment_token.php
* @magentoDataFixture Magento/Catalog/_files/product_virtual.php
*/
public function testPlaceOrderForVirtualProduct()
{
$this->invokeTestProductPlacement(
'virtual-product',
[],
'Virtual Product Ordered.'
);
}
/**
* Run system under test.
*
* @param $productSku
* @param array $productRequest
* @param string $expectedResult
* @return int order identifier
*/
private function invokeTestProductPlacement($productSku, array $productRequest, string $expectedResult): int
{
/** @var PlaceOrder $model */
$model = $this->objectManager->create(PlaceOrder::class);
$store = $this->getFixtureStore();
$customer = $this->getFixtureCustomer();
$instantPurchaseOption = $this->createInstantPurchaseOptionFromFixture();
$product = $this->getFixtureProduct($productSku);
$orderId = $model->placeOrder(
$store,
$customer,
$instantPurchaseOption,
$product,
array_merge(
[
'qty' => '1',
'options' => $this->createProductOptionsRequest($product)
],
$productRequest
)
);
$this->assertNotEmpty($orderId, $expectedResult);
return $orderId;
}
/**
* Returns Store created by fixture.
*
* @return Store
*/
private function getFixtureStore(): Store
{
$repository = $this->objectManager->create(StoreRepositoryInterface::class);
$store = $repository->get('default');
return $store;
}
/**
* Returns Customer created by fixture.
*
* @return Customer
*/
private function getFixtureCustomer(): Customer
{
$repository = $this->objectManager->create(CustomerRepositoryInterface::class);
$customerData = $repository->getById(1);
$customer = $this->objectManager->create(Customer::class);
$customer->updateData($customerData);
return $customer;
}
/**
* Returns Product created by fixture.
*
* @param string $sku
* @return Product
*/
private function getFixtureProduct(string $sku): Product
{
$repository = $this->objectManager->create(ProductRepositoryInterface::class);
$product = $repository->get($sku, false, $this->getFixtureStore()->getId());
$product->setData('salable', true);
return $product;
}
/**
* Creates instant purchase option based on data from fixture.
*
* @return InstantPurchaseOption
*/
private function createInstantPurchaseOptionFromFixture(): InstantPurchaseOption
{
$factory = $this->objectManager->get(InstantPurchaseOptionLoadingFactory::class);
$fixtureCustomer = $this->getFixtureCustomer();
$option = $factory->create(
$fixtureCustomer->getId(),
'fakePublicHash', // @see Magento/InstantPurchase/_files/fake_payment_token.php
$fixtureCustomer->getDefaultShippingAddress()->getId(),
$fixtureCustomer->getDefaultBillingAddress()->getId(),
'instant-purchase',
'cheapest'
);
return $option;
}
/**
* Creates custom options selection product request data.
*
* @param Product $product
* @return array
*/
private function createProductOptionsRequest(Product $product): array
{
$options = [];
/** @var Product\Option $option */
foreach ($product->getOptions() as $option) {
switch ($option->getGroupByType()) {
case ProductCustomOptionInterface::OPTION_GROUP_DATE:
$value = [
'year' => date('Y'),
'month' => date('n'),
'day' => date('j'),
'hour' => date('G'),
'minute' => date('i')
];
break;
case ProductCustomOptionInterface::OPTION_GROUP_SELECT:
$value = key($option->getValues());
break;
default:
$value = 'test';
break;
}
$options[$option->getId()] = $value;
}
return $options;
}
}