commerce-8.x-2.8/modules/cart/tests/src/Kernel/OrderItemMatcherTest.php
modules/cart/tests/src/Kernel/OrderItemMatcherTest.php
<?php
namespace Drupal\Tests\commerce_cart\Kernel;
use Drupal\commerce_order\Entity\OrderItem;
use Drupal\commerce_order\Entity\OrderItemType;
use Drupal\commerce_price\Price;
use Drupal\commerce_product\Entity\ProductVariation;
use Drupal\Tests\commerce\Kernel\CommerceKernelTestBase;
/**
* Tests the order item matcher.
*
* @coversDefaultClass \Drupal\commerce_cart\OrderItemMatcher
* @group commerce
*/
class OrderItemMatcherTest extends CommerceKernelTestBase {
use CartManagerTestTrait;
/**
* The order item matcher.
*
* @var \Drupal\commerce_cart\OrderItemMatcher
*/
protected $orderItemMatcher;
/**
* A product variation.
*
* @var \Drupal\commerce_product\Entity\ProductVariation
*/
protected $variation1;
/**
* A product variation.
*
* @var \Drupal\commerce_product\Entity\ProductVariation
*/
protected $variation2;
/**
* Modules to enable.
*
* @var array
*/
public static $modules = [
'entity_reference_revisions',
'path',
'profile',
'state_machine',
'commerce_product',
'commerce_order',
'extra_order_item_field',
];
/**
* {@inheritdoc}
*/
protected function setUp() {
parent::setUp();
$this->installEntitySchema('commerce_order');
$this->installConfig(['commerce_order']);
$this->installConfig(['commerce_product']);
$this->installConfig(['extra_order_item_field']);
OrderItemType::create([
'id' => 'test',
'label' => 'Test',
'orderType' => 'default',
])->save();
$this->variation1 = ProductVariation::create([
'type' => 'default',
'sku' => strtolower($this->randomMachineName()),
'title' => $this->randomString(),
'price' => new Price('1.00', 'USD'),
'status' => 1,
]);
$this->variation2 = ProductVariation::create([
'type' => 'default',
'sku' => strtolower($this->randomMachineName()),
'title' => $this->randomString(),
'price' => new Price('2.00', 'USD'),
'status' => 1,
]);
$this->installCommerceCart();
$this->orderItemMatcher = $this->container->get('commerce_cart.order_item_matcher');
}
/**
* Tests the order item matcher.
*
* @covers ::matchAll
* @covers ::match
*/
public function testOrderItemMatcher() {
$order_item1 = OrderItem::create([
'type' => 'default',
'quantity' => 2,
'unit_price' => new Price('12.00', 'USD'),
'purchased_entity' => $this->variation1,
]);
$order_item1->save();
$order_item2 = OrderItem::create([
'type' => 'default',
'quantity' => 6,
'unit_price' => new Price('12.00', 'USD'),
'purchased_entity' => $this->variation1,
]);
$order_item2->save();
$order_item3 = OrderItem::create([
'type' => 'default',
'quantity' => 6,
'unit_price' => new Price('12.00', 'USD'),
'purchased_entity' => $this->variation2,
]);
$order_item3->save();
// Order item should match just the second item.
$matches = $this->orderItemMatcher->matchAll($order_item1, [
$order_item2,
$order_item3,
]);
$this->assertNotEmpty($matches);
$this->assertEquals($matches, [$order_item2]);
// First matching item should be returned.
$match = $this->orderItemMatcher->match($order_item1, [
$order_item2,
$order_item3,
]);
$this->assertNotEmpty($match);
$this->assertEquals($match, $order_item2);
// Third order item should not match first two items.
$matches = $this->orderItemMatcher->matchAll($order_item3, [
$order_item1,
$order_item2,
]);
$this->assertEmpty($matches);
// If first item doesn't match, the second should be returned.
$match = $this->orderItemMatcher->match($order_item1, [
$order_item3,
$order_item2,
]);
$this->assertNotEmpty($match);
$this->assertEquals($match, $order_item2);
// Order item with same purchased entity, different type does not match.
$order_item4 = OrderItem::create([
'type' => 'test',
'quantity' => 2,
'unit_price' => new Price('1.00', 'USD'),
'purchased_entity' => $this->variation1,
]);
$order_item4->save();
$matches = $this->orderItemMatcher->matchAll($order_item4, [
$order_item1,
$order_item2,
$order_item3,
]);
$this->assertEmpty($matches);
}
/**
* Tests that order items without purchased entities are not matched.
*/
public function testNoPurchasedEntity() {
$order_item = OrderItem::create([
'type' => 'default',
'quantity' => 2,
'unit_price' => new Price('12.00', 'USD'),
]);
$order_item->save();
$order_item2 = OrderItem::create([
'type' => 'default',
'quantity' => 3,
'unit_price' => new Price('1.00', 'USD'),
]);
$order_item2->save();
$match = $this->orderItemMatcher->match($order_item, [$order_item2]);
$this->assertEmpty($match);
}
/**
* Tests that order items with custom fields are matched properly.
*/
public function testCustomField() {
// Show field_custom_text on the add to cart form.
$form_display = \Drupal::entityTypeManager()
->getStorage('entity_form_display')
->load('commerce_order_item.default.add_to_cart');
$this->assertNotEmpty($form_display);
$form_display->setComponent('field_custom_text', [
'type' => 'string_textfield',
]);
$form_display->save();
$order_item1 = OrderItem::create([
'type' => 'default',
'quantity' => 2,
'unit_price' => new Price('12.00', 'USD'),
'purchased_entity' => $this->variation1,
'field_custom_text' => 'Blue',
]);
$order_item1->save();
$order_item2 = OrderItem::create([
'type' => 'default',
'quantity' => 6,
'unit_price' => new Price('12.00', 'USD'),
'purchased_entity' => $this->variation1,
'field_custom_text' => 'Red',
]);
$order_item2->save();
$order_item3 = OrderItem::create([
'type' => 'default',
'quantity' => 4,
'unit_price' => new Price('12.00', 'USD'),
'purchased_entity' => $this->variation1,
'field_custom_text' => 'Blue',
]);
$order_item3->save();
// Same purchased entity, different custom text, no match.
$matches = $this->orderItemMatcher->matchAll($order_item1, [$order_item2]);
$this->assertEmpty($matches);
// Same purchased entity, same custom text.
$match = $this->orderItemMatcher->match($order_item1, [
$order_item2,
$order_item3,
]);
$this->assertNotEmpty($match);
$this->assertEquals($match, $order_item3);
// Item with missing custom text does not match.
$order_item4 = OrderItem::create([
'type' => 'default',
'quantity' => 5,
'unit_price' => new Price('12.00', 'USD'),
'purchased_entity' => $this->variation1,
]);
$order_item4->save();
$matches = $this->orderItemMatcher->matchAll($order_item4, [
$order_item1,
$order_item2,
$order_item3,
]);
$this->assertEmpty($matches);
}
}
