267 lines
8.9 KiB
PHP
Executable File
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;
|
|
}
|
|
}
|