You are here

public function CartExpirationTest::testExpiration in Commerce Core 8.2

Tests expiration (cron and queue worker).

File

modules/cart/tests/src/Kernel/CartExpirationTest.php, line 44

Class

CartExpirationTest
Tests cart expiration.

Namespace

Drupal\Tests\commerce_cart\Kernel

Code

public function testExpiration() {
  $order_type = OrderType::load('default');
  $time = $this->container
    ->get('datetime.time');
  $four_days_ago = $time
    ->getRequestTime() - 86400 * 4;
  $two_days_ago = $time
    ->getRequestTime() - 86400 * 2;

  /** @var \Drupal\commerce_order\Entity\OrderInterface $cart1 */
  $cart1 = Order::create([
    'type' => $order_type
      ->id(),
    'store_id' => $this->store
      ->id(),
    'uid' => $this
      ->createUser()
      ->id(),
    'cart' => TRUE,
    'created' => $four_days_ago,
    'changed' => $four_days_ago,
  ]);
  $cart1
    ->save();
  $cart2 = Order::create([
    'type' => $order_type
      ->id(),
    'store_id' => $this->store
      ->id(),
    'uid' => $this
      ->createUser()
      ->id(),
    'cart' => TRUE,
    'created' => $four_days_ago,
    'changed' => $four_days_ago,
  ]);
  $cart2
    ->save();
  $cart3 = Order::create([
    'type' => $order_type
      ->id(),
    'store_id' => $this->store
      ->id(),
    'uid' => $this
      ->createUser()
      ->id(),
    'cart' => TRUE,
    'created' => $two_days_ago,
    'changed' => $two_days_ago,
  ]);
  $cart3
    ->save();
  $cart4 = Order::create([
    'type' => $order_type
      ->id(),
    'store_id' => $this->store
      ->id(),
    'uid' => $this
      ->createUser()
      ->id(),
    'cart' => TRUE,
  ]);
  $cart4
    ->save();

  // Setting the `changed` attribute doesn't work in save.
  $count = Database::getConnection()
    ->update('commerce_order')
    ->fields([
    'changed' => $four_days_ago,
  ])
    ->condition('order_id', [
    $cart1
      ->id(),
    $cart2
      ->id(),
  ], 'IN')
    ->execute();
  $this
    ->assertEquals(2, $count);

  // By default, cart expiration is disabled.
  // Confirm that no orders are queued.
  $this->container
    ->get('commerce_cart.cron')
    ->run();
  $this
    ->assertEquals(0, \Drupal::queue('commerce_cart_expiration')
    ->numberOfItems());

  // Set expiration to 3 days.
  $order_type
    ->setThirdPartySetting('commerce_cart', 'cart_expiration', [
    'unit' => 'day',
    'number' => 3,
  ]);
  $order_type
    ->save();

  // Confirm that cron has queued IDs.
  $this->container
    ->get('commerce_cart.cron')
    ->run();
  $this
    ->assertEquals(1, \Drupal::queue('commerce_cart_expiration')
    ->numberOfItems());

  // Disable cart expiration.
  $order_type
    ->setThirdPartySetting('commerce_cart', 'cart_expiration', []);
  $order_type
    ->save();

  // Confirm that $cart1 and $cart2 were not deleted.
  $this->container
    ->get('cron')
    ->run();
  $this->orderStorage
    ->resetCache();
  $orders = $this->orderStorage
    ->getQuery()
    ->accessCheck(FALSE)
    ->execute();
  $this
    ->assertEquals(4, count($orders));
  $this
    ->assertNotNull($this
    ->reloadEntity($cart1));
  $this
    ->assertNotNull($this
    ->reloadEntity($cart2));

  // Re-enable cart expiration.
  $order_type
    ->setThirdPartySetting('commerce_cart', 'cart_expiration', [
    'unit' => 'day',
    'number' => 3,
  ]);
  $order_type
    ->save();
  $this->container
    ->get('commerce_cart.cron')
    ->run();
  $this
    ->assertEquals(1, \Drupal::queue('commerce_cart_expiration')
    ->numberOfItems());

  // Confirm that $cart1 and $cart2 were deleted.
  $this->container
    ->get('cron')
    ->run();
  $this->orderStorage
    ->resetCache();
  $orders = $this->orderStorage
    ->getQuery()
    ->accessCheck(FALSE)
    ->execute();
  $this
    ->assertEquals(2, count($orders));
  $this
    ->assertNull($this
    ->reloadEntity($cart1));
  $this
    ->assertNull($this
    ->reloadEntity($cart2));
}