View source
<?php
namespace Drupal\Tests\commerce_recurring\Kernel;
use Drupal\commerce_order\Entity\Order;
use Drupal\commerce_order\Entity\OrderType;
use Drupal\commerce_payment\Entity\PaymentGateway;
use Drupal\commerce_payment\Entity\PaymentMethod;
use Drupal\commerce_recurring\Entity\Subscription;
class SubscriptionLifecycleTest extends RecurringKernelTestBase {
protected function setUp() : void {
parent::setUp();
$order_type = OrderType::load('default');
$order_type
->setWorkflowId('order_default_validation');
$order_type
->save();
}
public function testLifecycle() {
$initial_order = $this
->createInitialOrder();
$initial_order
->getState()
->applyTransitionById('place');
$initial_order
->save();
$subscriptions = Subscription::loadMultiple();
$this
->assertCount(0, $subscriptions);
$initial_order
->set('state', 'draft');
$initial_order
->set('payment_method', $this->paymentMethod);
$initial_order
->save();
$initial_order
->getState()
->applyTransitionById('place');
$initial_order
->save();
$subscriptions = Subscription::loadMultiple();
$this
->assertCount(1, $subscriptions);
$subscription = reset($subscriptions);
$this
->assertEquals('active', $subscription
->getState()
->getId());
$this
->assertEquals($this->store
->id(), $subscription
->getStoreId());
$this
->assertEquals($this->billingSchedule
->id(), $subscription
->getBillingSchedule()
->id());
$this
->assertEquals($this->user
->id(), $subscription
->getCustomerId());
$this
->assertEquals($this->paymentMethod
->id(), $subscription
->getPaymentMethod()
->id());
$this
->assertEquals($this->variation
->id(), $subscription
->getPurchasedEntityId());
$this
->assertEquals($this->variation
->getOrderItemTitle(), $subscription
->getTitle());
$this
->assertEquals('3', $subscription
->getQuantity());
$this
->assertEquals($this->variation
->getPrice(), $subscription
->getUnitPrice());
$this
->assertEquals($initial_order
->id(), $subscription
->getInitialOrderId());
$orders = $subscription
->getOrders();
$this
->assertCount(1, $orders);
$order = reset($orders);
$this
->assertFalse($order
->getTotalPrice()
->isZero());
$this
->assertEquals('recurring', $order
->bundle());
$order_items = $order
->getItems();
$this
->assertCount(1, $order_items);
$order_item = reset($order_items);
$this
->assertEquals($subscription
->id(), $order_item
->get('subscription')->target_id);
$initial_order
->getState()
->applyTransitionById('cancel');
$initial_order
->save();
$subscription = $this
->reloadEntity($subscription);
$this
->assertEquals('canceled', $subscription
->getState()
->getId());
}
public function testLifecycleWithTrial() {
$this
->rewindTime(strtotime('2021-01-01 00:00'));
$initial_order = $this
->createInitialOrder(TRUE);
$initial_order
->getState()
->applyTransitionById('place');
$initial_order
->save();
$subscriptions = Subscription::loadMultiple();
$this
->assertCount(1, $subscriptions);
$subscription = reset($subscriptions);
$this
->assertEquals('trial', $subscription
->getState()
->getId());
$this
->assertEquals($this->store
->id(), $subscription
->getStoreId());
$this
->assertEquals($this->billingSchedule
->id(), $subscription
->getBillingSchedule()
->id());
$this
->assertEquals($this->user
->id(), $subscription
->getCustomerId());
$this
->assertNull($subscription
->getPaymentMethod());
$this
->assertEquals($this->variation
->id(), $subscription
->getPurchasedEntityId());
$this
->assertEquals($this->variation
->getOrderItemTitle(), $subscription
->getTitle());
$this
->assertEquals('3', $subscription
->getQuantity());
$this
->assertEquals($this->variation
->getPrice(), $subscription
->getUnitPrice());
$this
->assertEquals($initial_order
->id(), $subscription
->getInitialOrderId());
$this
->assertNotEmpty($subscription
->getTrialStartTime());
$this
->assertNotEmpty($subscription
->getTrialEndTime());
$this
->assertEquals(864000, $subscription
->getTrialEndTime() - $subscription
->getTrialStartTime());
$orders = $subscription
->getOrders();
$this
->assertCount(1, $orders);
$order = reset($orders);
$this
->assertEquals('recurring', $order
->bundle());
$this
->assertTrue($order
->getTotalPrice()
->isZero());
$order_items = $order
->getItems();
$this
->assertCount(1, $order_items);
$order_item = reset($order_items);
$this
->assertEquals($subscription
->id(), $order_item
->get('subscription')->target_id);
$initial_order
->getState()
->applyTransitionById('cancel');
$initial_order
->save();
$subscription = $this
->reloadEntity($subscription);
$this
->assertEquals('canceled', $subscription
->getState()
->getId());
}
public function testSubscriptionUpdates() {
$initial_order = $this
->createInitialOrder();
$initial_order
->set('payment_method', $this->paymentMethod);
$initial_order
->getState()
->applyTransitionById('place');
$initial_order
->save();
$subscription = Subscription::load(1);
$this
->assertEquals('active', $subscription
->getState()
->getId());
$recurring_order = Order::load(2);
$this
->assertEquals('recurring', $recurring_order
->bundle());
$this
->assertEquals($recurring_order
->id(), $subscription
->getCurrentOrder()
->id());
$new_payment_gateway = PaymentGateway::create([
'id' => 'example_2',
'label' => 'Example 2',
'plugin' => 'example_onsite',
]);
$new_payment_gateway
->save();
$new_payment_method = PaymentMethod::create([
'type' => 'credit_card',
'payment_gateway' => $new_payment_gateway,
'card_type' => 'visa',
'uid' => $this->user
->id(),
]);
$new_payment_method
->save();
$subscription
->setPaymentMethod($new_payment_method);
$subscription
->save();
$recurring_order = $this
->reloadEntity($recurring_order);
$this
->assertEquals($new_payment_method
->id(), $subscription
->getPaymentMethodId());
$this
->assertEquals($new_payment_method
->id(), $recurring_order
->get('payment_method')->target_id);
$this
->assertEquals($new_payment_gateway
->id(), $recurring_order
->get('payment_gateway')->target_id);
}
public function testSubscriptionDelete() {
$initial_order = $this
->createInitialOrder();
$initial_order
->getState()
->applyTransitionById('place');
$initial_order
->save();
$subscriptions = Subscription::loadMultiple();
$this
->assertCount(0, $subscriptions);
$initial_order
->set('state', 'draft');
$initial_order
->set('payment_method', $this->paymentMethod);
$initial_order
->save();
$initial_order
->getState()
->applyTransitionById('place');
$initial_order
->save();
$subscriptions = Subscription::loadMultiple();
$this
->assertCount(1, $subscriptions);
$subscription = reset($subscriptions);
$orders = $subscription
->getOrders();
$this
->assertCount(1, $orders);
$order = reset($orders);
$this
->assertEquals('recurring', $order
->bundle());
$order_items = $order
->getItems();
$this
->assertCount(1, $order_items);
$order_item = reset($order_items);
$this
->assertEquals($subscription
->id(), $order_item
->get('subscription')->target_id);
$subscription
->delete();
$subscription = $this
->reloadEntity($subscription);
$order_item = $this
->reloadEntity($order_item);
$order = $this
->reloadEntity($order);
$this
->assertNull($subscription);
$this
->assertNull($order_item);
$this
->assertNull($order);
}
}