View source
<?php
namespace Drupal\Tests\commerce_order\Kernel\Entity;
use Drupal\commerce_order\Adjustment;
use Drupal\commerce_order\Entity\Order;
use Drupal\commerce_order\Entity\OrderItem;
use Drupal\commerce_price\Exception\CurrencyMismatchException;
use Drupal\commerce_price\Price;
use Drupal\profile\Entity\Profile;
use Drupal\Tests\commerce_order\Kernel\OrderKernelTestBase;
use Drupal\user\UserInterface;
class OrderTest extends OrderKernelTestBase {
protected $user;
public static $modules = [
'commerce_order_test',
];
protected function setUp() : void {
parent::setUp();
$user = $this
->createUser();
$this->user = $this
->reloadEntity($user);
}
public function testOrder() {
$profile = Profile::create([
'type' => 'customer',
'address' => [
'country_code' => 'US',
'postal_code' => '53177',
'locality' => 'Milwaukee',
'address_line1' => 'Pabst Blue Ribbon Dr',
'administrative_area' => 'WI',
'given_name' => 'Frederick',
'family_name' => 'Pabst',
],
]);
$profile
->save();
$profile = $this
->reloadEntity($profile);
$order_item = OrderItem::create([
'type' => 'test',
'quantity' => '1',
'unit_price' => new Price('2.00', 'USD'),
]);
$order_item
->save();
$order_item = $this
->reloadEntity($order_item);
$another_order_item = OrderItem::create([
'type' => 'test',
'quantity' => '2',
'unit_price' => new Price('3.00', 'USD'),
]);
$another_order_item
->save();
$another_order_item = $this
->reloadEntity($another_order_item);
$order = Order::create([
'type' => 'default',
'state' => 'completed',
'store_id' => $this->store
->id(),
]);
$order
->save();
$order
->setOrderNumber(7);
$this
->assertEquals(7, $order
->getOrderNumber());
$this
->assertFalse($order
->isPaid());
$order
->setStore($this->store);
$this
->assertEquals($this->store, $order
->getStore());
$this
->assertEquals($this->store
->id(), $order
->getStoreId());
$order
->setStoreId(0);
$this
->assertEquals(NULL, $order
->getStore());
$order
->setStoreId($this->store
->id());
$this
->assertEquals($this->store, $order
->getStore());
$this
->assertEquals($this->store
->id(), $order
->getStoreId());
$this
->assertInstanceOf(UserInterface::class, $order
->getCustomer());
$this
->assertTrue($order
->getCustomer()
->isAnonymous());
$this
->assertEquals(0, $order
->getCustomerId());
$order
->setCustomer($this->user);
$this
->assertEquals($this->user, $order
->getCustomer());
$this
->assertEquals($this->user
->id(), $order
->getCustomerId());
$this
->assertTrue($order
->getCustomer()
->isAuthenticated());
$order
->setCustomerId(888);
$this
->assertInstanceOf(UserInterface::class, $order
->getCustomer());
$this
->assertTrue($order
->getCustomer()
->isAnonymous());
$this
->assertEquals(888, $order
->getCustomerId());
$order
->setCustomerId($this->user
->id());
$this
->assertEquals($this->user, $order
->getCustomer());
$this
->assertEquals($this->user
->id(), $order
->getCustomerId());
$order
->setEmail('commerce@example.com');
$this
->assertEquals('commerce@example.com', $order
->getEmail());
$order
->setIpAddress('127.0.0.2');
$this
->assertEquals('127.0.0.2', $order
->getIpAddress());
$order
->setBillingProfile($profile);
$this
->assertEquals($profile, $order
->getBillingProfile());
$profiles = $order
->collectProfiles();
$this
->assertCount(1, $profiles);
$this
->assertArrayHasKey('billing', $profiles);
$this
->assertEquals($profile, $profiles['billing']);
$order
->setItems([
$order_item,
$another_order_item,
]);
$this
->assertEquals([
$order_item,
$another_order_item,
], $order
->getItems());
$this
->assertNotEmpty($order
->hasItems());
$order
->removeItem($another_order_item);
$this
->assertEquals([
$order_item,
], $order
->getItems());
$this
->assertNotEmpty($order
->hasItem($order_item));
$this
->assertEmpty($order
->hasItem($another_order_item));
$order
->addItem($another_order_item);
$this
->assertEquals([
$order_item,
$another_order_item,
], $order
->getItems());
$this
->assertNotEmpty($order
->hasItem($another_order_item));
$this
->assertEquals(new Price('8.00', 'USD'), $order
->getTotalPrice());
$adjustments = [];
$adjustments[] = new Adjustment([
'type' => 'custom',
'label' => '10% off',
'amount' => new Price('-1.00', 'USD'),
]);
$adjustments[] = new Adjustment([
'type' => 'fee',
'label' => 'Handling fee',
'amount' => new Price('10.00', 'USD'),
'locked' => TRUE,
]);
$order
->addAdjustment($adjustments[0]);
$order
->addAdjustment($adjustments[1]);
$this
->assertEquals($adjustments, $order
->getAdjustments());
$this
->assertEquals($adjustments, $order
->getAdjustments([
'custom',
'fee',
]));
$this
->assertEquals([
$adjustments[0],
], $order
->getAdjustments([
'custom',
]));
$this
->assertEquals([
$adjustments[1],
], $order
->getAdjustments([
'fee',
]));
$order
->removeAdjustment($adjustments[0]);
$this
->assertEquals(new Price('8.00', 'USD'), $order
->getSubtotalPrice());
$this
->assertEquals(new Price('18.00', 'USD'), $order
->getTotalPrice());
$this
->assertEquals([
$adjustments[1],
], $order
->getAdjustments());
$order
->setAdjustments($adjustments);
$this
->assertEquals($adjustments, $order
->getAdjustments());
$this
->assertEquals(new Price('17.00', 'USD'), $order
->getTotalPrice());
$order
->addAdjustment(new Adjustment([
'type' => 'fee',
'label' => 'Random fee',
'amount' => new Price('10.00', 'USD'),
]));
$order
->clearAdjustments();
$this
->assertEquals($adjustments, $order
->getAdjustments());
$this
->assertEquals($adjustments, $order
->collectAdjustments());
$this
->assertEquals($adjustments, $order
->collectAdjustments([
'custom',
'fee',
]));
$this
->assertEquals([
$adjustments[0],
], $order
->collectAdjustments([
'custom',
]));
$this
->assertEquals([
$adjustments[1],
], $order
->collectAdjustments([
'fee',
]));
$this
->assertEquals(new Price('0', 'USD'), $order
->getTotalPaid());
$this
->assertEquals(new Price('17.00', 'USD'), $order
->getBalance());
$this
->assertFalse($order
->isPaid());
$order
->setTotalPaid(new Price('7.00', 'USD'));
$this
->assertEquals(new Price('7.00', 'USD'), $order
->getTotalPaid());
$this
->assertEquals(new Price('10.00', 'USD'), $order
->getBalance());
$this
->assertFalse($order
->isPaid());
$order
->setTotalPaid(new Price('17.00', 'USD'));
$this
->assertEquals(new Price('17.00', 'USD'), $order
->getTotalPaid());
$this
->assertEquals(new Price('0', 'USD'), $order
->getBalance());
$this
->assertTrue($order
->isPaid());
$order
->setTotalPaid(new Price('27.00', 'USD'));
$this
->assertEquals(new Price('27.00', 'USD'), $order
->getTotalPaid());
$this
->assertEquals(new Price('-10.00', 'USD'), $order
->getBalance());
$this
->assertTrue($order
->isPaid());
$this
->assertEquals('completed', $order
->getState()
->getId());
$order
->addAdjustment(new Adjustment([
'type' => 'custom',
'label' => '100% off',
'amount' => new Price('-17.00', 'USD'),
]));
$order
->setTotalPaid(new Price('0', 'USD'));
$this
->assertTrue($order
->getTotalPrice()
->isZero());
$this
->assertTrue($order
->isPaid());
$order
->set('state', 'draft');
$this
->assertFalse($order
->isPaid());
$order
->setRefreshState(Order::REFRESH_ON_SAVE);
$this
->assertEquals(Order::REFRESH_ON_SAVE, $order
->getRefreshState());
$this
->assertEquals('default', $order
->getData('test', 'default'));
$order
->setData('test', 'value');
$this
->assertEquals('value', $order
->getData('test', 'default'));
$order
->unsetData('test');
$this
->assertNull($order
->getData('test'));
$this
->assertEquals('default', $order
->getData('test', 'default'));
$this
->assertFalse($order
->isLocked());
$order
->lock();
$this
->assertTrue($order
->isLocked());
$order
->unlock();
$this
->assertFalse($order
->isLocked());
$order
->setCreatedTime(635879700);
$this
->assertEquals(635879700, $order
->getCreatedTime());
$order
->setPlacedTime(635879800);
$this
->assertEquals(635879800, $order
->getPlacedTime());
$order
->setCompletedTime(635879900);
$this
->assertEquals(635879900, $order
->getCompletedTime());
$date = $order
->getCalculationDate();
$this
->assertEquals($order
->getPlacedTime(), $date
->format('U'));
$order
->set('placed', NULL);
$date = $order
->getCalculationDate();
$this
->assertEquals(\Drupal::time()
->getRequestTime(), $date
->format('U'));
}
public function testPreSave() {
$profile = Profile::create([
'type' => 'customer',
'uid' => $this->user
->id(),
'address' => [
'country_code' => 'US',
'postal_code' => '53177',
'locality' => 'Milwaukee',
'address_line1' => 'Pabst Blue Ribbon Dr',
'administrative_area' => 'WI',
'given_name' => 'Frederick',
'family_name' => 'Pabst',
],
]);
$profile
->save();
$profile = $this
->reloadEntity($profile);
$order = Order::create([
'type' => 'default',
'store_id' => $this->store
->id(),
'uid' => '888',
'billing_profile' => $profile,
'state' => 'completed',
]);
$order
->save();
$this
->assertEquals(0, $order
->getCustomerId());
$order
->save();
$this
->assertEquals(0, $order
->getBillingProfile()
->getOwnerId());
$this
->assertEquals($profile
->id(), $order
->getBillingProfile()
->id());
$order_item = OrderItem::create([
'type' => 'test',
'quantity' => '1',
'unit_price' => new Price('2.00', 'USD'),
]);
$order_item
->save();
$order_item = $this
->reloadEntity($order_item);
$another_order_item = OrderItem::create([
'type' => 'test',
'quantity' => '2',
'unit_price' => new Price('3.00', 'USD'),
]);
$another_order_item
->save();
$another_order_item = $this
->reloadEntity($another_order_item);
$order
->setItems([
$order_item,
$another_order_item,
]);
$this
->assertCount(2, $order
->get('order_items'));
$another_order_item
->delete();
$order
->save();
$this
->reloadEntity($order);
$this
->assertCount(1, $order
->get('order_items'));
}
public function testOrderEmail() {
$customer = $this
->createUser([
'mail' => 'test@example.com',
]);
$order_with_customer = Order::create([
'type' => 'default',
'state' => 'completed',
'uid' => $customer,
]);
$order_with_customer
->save();
$this
->assertEquals($customer
->getEmail(), $order_with_customer
->getEmail());
$order_without_customer = Order::create([
'type' => 'default',
'state' => 'completed',
]);
$order_without_customer
->save();
$this
->assertEquals('', $order_without_customer
->getEmail());
$order_without_customer
->setCustomer($customer);
$order_without_customer
->save();
$this
->assertEquals($customer
->getEmail(), $order_without_customer
->getEmail());
}
public function testHandlingLegacyOrderItemAdjustments() {
$order_item = OrderItem::create([
'type' => 'test',
'quantity' => '2',
'unit_price' => new Price('10.00', 'USD'),
'adjustments' => [
new Adjustment([
'type' => 'custom',
'label' => '10% off',
'amount' => new Price('-1.00', 'USD'),
'percentage' => '0.1',
]),
new Adjustment([
'type' => 'fee',
'label' => 'Random fee',
'amount' => new Price('2.00', 'USD'),
]),
],
'uses_legacy_adjustments' => TRUE,
]);
$order_item
->save();
$order = Order::create([
'type' => 'default',
'order_items' => [
$order_item,
],
'state' => 'draft',
]);
$adjustments = $order
->collectAdjustments();
$this
->assertCount(2, $adjustments);
$this
->assertEquals('-2.00', $adjustments[0]
->getAmount()
->getNumber());
$this
->assertEquals('4.00', $adjustments[1]
->getAmount()
->getNumber());
$order
->clearAdjustments();
$order_items = $order
->getItems();
$order_item = reset($order_items);
$adjustments = $order_item
->getAdjustments();
$this
->assertFalse($order_item
->usesLegacyAdjustments());
$this
->assertCount(1, $adjustments);
$this
->assertEquals('-2.00', $adjustments[0]
->getAmount()
->getNumber());
$this
->assertEquals($adjustments, $order
->collectAdjustments());
}
public function testTotalCalculation() {
$order = Order::create([
'type' => 'default',
'state' => 'completed',
]);
$order
->save();
$order_item = OrderItem::create([
'type' => 'test',
'quantity' => '2',
'unit_price' => new Price('2.00', 'USD'),
]);
$order_item
->save();
$order_item = $this
->reloadEntity($order_item);
$another_order_item = OrderItem::create([
'type' => 'test',
'quantity' => '1',
'unit_price' => new Price('3.00', 'USD'),
]);
$another_order_item
->save();
$another_order_item = $this
->reloadEntity($another_order_item);
$adjustments = [];
$adjustments[0] = new Adjustment([
'type' => 'tax',
'label' => 'Tax',
'amount' => new Price('100.00', 'USD'),
'included' => TRUE,
]);
$adjustments[1] = new Adjustment([
'type' => 'tax',
'label' => 'Tax',
'amount' => new Price('2.121', 'USD'),
'source_id' => 'us_sales_tax',
]);
$adjustments[2] = new Adjustment([
'type' => 'tax',
'label' => 'Tax',
'amount' => new Price('5.344', 'USD'),
'source_id' => 'us_sales_tax',
]);
$order
->addAdjustment($adjustments[0]);
$order_item
->addAdjustment($adjustments[1]);
$another_order_item
->addAdjustment($adjustments[2]);
$order
->setItems([
$order_item,
$another_order_item,
]);
$order
->save();
$order = $this
->reloadEntity($order);
$collected_adjustments = $order
->collectAdjustments();
$this
->assertCount(3, $collected_adjustments);
$this
->assertEquals($adjustments[1], $collected_adjustments[0]);
$this
->assertEquals($adjustments[2], $collected_adjustments[1]);
$this
->assertEquals($adjustments[0], $collected_adjustments[2]);
$this
->assertEquals(new Price('14.47', 'USD'), $order
->getTotalPrice());
$order
->addAdjustment($adjustments[1]);
$order_item
->delete();
$another_order_item
->delete();
$order
->recalculateTotalPrice();
$this
->assertNull($order
->getTotalPrice());
}
public function testTimestamps() {
$order_item = OrderItem::create([
'type' => 'test',
'quantity' => '2',
'unit_price' => new Price('2.00', 'USD'),
]);
$order_item
->save();
$order = Order::create([
'type' => 'default',
'store_id' => $this->store
->id(),
'order_items' => [
$order_item,
],
'state' => 'draft',
]);
$order
->save();
$order = $this
->reloadEntity($order);
$this
->assertNull($order
->getPlacedTime());
$this
->assertNull($order
->getCompletedTime());
$order
->getState()
->applyTransitionById('place');
$order
->save();
$this
->assertEquals($order
->getPlacedTime(), \Drupal::time()
->getRequestTime());
$this
->assertEquals($order
->getCompletedTime(), \Drupal::time()
->getRequestTime());
}
public function testMultipleCurrencies() {
$currency_importer = $this->container
->get('commerce_price.currency_importer');
$currency_importer
->import('EUR');
$usd_order_item = OrderItem::create([
'type' => 'test',
'quantity' => '1',
'unit_price' => new Price('2.00', 'USD'),
]);
$usd_order_item
->save();
$eur_order_item = OrderItem::create([
'type' => 'test',
'quantity' => '1',
'unit_price' => new Price('3.00', 'EUR'),
]);
$eur_order_item
->save();
$order = Order::create([
'type' => 'default',
'state' => 'completed',
]);
$order
->save();
$this
->assertNull($order
->getTotalPrice());
$order
->addItem($usd_order_item);
$this
->assertEquals($usd_order_item
->getTotalPrice(), $order
->getTotalPrice());
$order
->removeItem($usd_order_item);
$order
->addItem($eur_order_item);
$this
->assertEquals($eur_order_item
->getTotalPrice(), $order
->getTotalPrice());
$currency_mismatch = FALSE;
try {
$order
->addItem($usd_order_item);
} catch (CurrencyMismatchException $e) {
$currency_mismatch = TRUE;
}
$this
->assertTrue($currency_mismatch);
}
public function testPaidEvent() {
$order_item = OrderItem::create([
'type' => 'test',
'quantity' => '2',
'unit_price' => new Price('10.00', 'USD'),
]);
$order_item
->save();
$order = Order::create([
'type' => 'default',
'store_id' => $this->store
->id(),
'order_items' => [
$order_item,
],
'state' => 'draft',
]);
$order
->save();
$this
->assertNull($order
->getData('order_test_called'));
$order
->setTotalPaid(new Price('20.00', 'USD'));
$order
->save();
$this
->assertEquals(1, $order
->getData('order_test_called'));
$order
->setTotalPaid(new Price('10.00', 'USD'));
$order
->save();
$order
->setTotalPaid(new Price('20.00', 'USD'));
$order
->save();
$this
->assertEquals(1, $order
->getData('order_test_called'));
$another_order = Order::create([
'type' => 'default',
'store_id' => $this->store
->id(),
'order_items' => [
$order_item,
],
'total_paid' => new Price('20.00', 'USD'),
'state' => 'draft',
]);
$another_order
->save();
$this
->assertEquals(1, $another_order
->getData('order_test_called'));
}
}