contacts_events-8.x-1.x-dev/tests/src/Kernel/BookingStateTransitionTest.php

tests/src/Kernel/BookingStateTransitionTest.php
<?php

namespace Drupal\Tests\contacts_events\Kernel;

use Drupal\commerce_order\Entity\Order;
use Drupal\commerce_order\Entity\OrderItem;
use Drupal\commerce_payment\Entity\Payment;
use Drupal\commerce_price\Price;

/**
 * Test the booking process transition events.
 *
 * @group contacts_events
 */
class BookingStateTransitionTest extends EventTransitionTestBase {

  /**
   * Test checks order item transitions for the process of placing an order.
   *
   * @dataProvider dataOnOrderPlaced
   */
  public function testOrderPlacedTransitions($ticket_state_before, $order_status_paid, $ticket_state_after, $transition, $additional, array $payment_values = []) {
    /** @var \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager */
    $entity_type_manager = $this->container->get('entity_type.manager');
    $order_storage = $entity_type_manager->getStorage('commerce_order');
    $order_item_storage = $entity_type_manager->getStorage('commerce_order_item');

    /** @var \Drupal\commerce_order\Entity\OrderInterface $order */
    $order = Order::create([
      'type' => 'contacts_booking',
      'store_id' => $this->store,
      'state' => 'draft',
      'event' => $this->event->id(),
    ]);
    $order->save();

    // Add our order item.
    $order_item = OrderItem::create([
      'id' => 1,
      'type' => 'contacts_ticket',
      'state' => $ticket_state_before,
      'unit_price' => new Price('10', 'USD'),
      'mapped_price' => [
        'booking_window' => 'standard',
        'class' => 'standard',
      ],
    ]);
    $order_item->save();
    $order->addItem($order_item)->save();

    // Clear any previous events.
    $this->triggeredEvents = [];
    $this->triggeredEventsByGroup = [];

    if ($order_status_paid) {
      Payment::create($payment_values + [
        'type' => 'payment_default',
        'payment_gateway' => $this->gateway->id(),
        'order_id' => $order->id(),
        'state' => 'completed',
        'amount' => new Price('10', 'USD'),
      ])->save();

      // Update order total since payment was created.
      $this->container->get('commerce_payment.order_updater')
        ->updateOrder($order, TRUE);
    }

    // Start transition.
    $order = $order_storage->loadUnchanged($order->id());
    $order->getState()->applyTransitionById('place');
    $order->save();

    if (!empty($transition)) {
      $this->checkTransitions($transition, $additional);
    }
    else {
      static::assertTrue(!isset($this->triggeredEventsByGroup['contacts_events_order_items']), 'No transitions expected.');
    }

    // Check new ticket state.
    $order_item = $order_item_storage->loadUnchanged($order_item->id());
    static::assertEquals($ticket_state_after, $order_item->get('state')->value, 'Order item state does not match expected.');
  }

  /**
   * Data provider for testOrderPlacedTransitions.
   */
  public function dataOnOrderPlaced() {
    $data['pending_not_paid'] = [
      'ticket_state_before' => 'pending',
      'order_status' => FALSE,
      'ticket_state_after' => 'confirmed',
      'transition' => 'confirm',
      'additional' => [],
    ];
    $data['pending_paid'] = [
      'ticket_state_before' => 'pending',
      'order_status' => TRUE,
      'ticket_state_after' => 'paid_in_full',
      'transition' => 'confirmed_paid_in_full',
      'additional' => ['confirm', 'paid_in_full'],
    ];

    $data['confirmed_not_paid'] = [
      'ticket_state_before' => 'confirmed',
      'order_status' => FALSE,
      'ticket_state_after' => 'confirmed',
      'transition' => '',
      'additional' => [],
    ];
    $data['confirmed_paid'] = [
      'ticket_state_before' => 'confirmed',
      'order_status' => TRUE,
      'ticket_state_after' => 'paid_in_full',
      'transition' => 'paid_in_full',
      'additional' => [],
    ];

    $data['paid_in_full_not_paid'] = [
      'ticket_state_before' => 'paid_in_full',
      'order_status' => FALSE,
      'ticket_state_after' => 'confirmed',
      'transition' => 'payment_undone',
      'additional' => [],
    ];
    $data['paid_in_full_paid'] = [
      'ticket_state_before' => 'paid_in_full',
      'order_status' => TRUE,
      'ticket_state_after' => 'paid_in_full',
      'transition' => '',
      'additional' => [],
    ];

    $data['cancelled_not_paid'] = [
      'ticket_state_before' => 'cancelled',
      'order_status' => FALSE,
      'ticket_state_after' => 'cancelled',
      'transition' => '',
      'additional' => [],
    ];
    $data['cancelled_paid'] = [
      'ticket_state_before' => 'cancelled',
      'order_status' => TRUE,
      'ticket_state_after' => 'cancelled',
      'transition' => '',
      'additional' => [],
    ];

    return $data;
  }

  /**
   * Test checks order item transitions for the process of placing an order.
   *
   * @dataProvider dataOnPaymentMade
   */
  public function testPaymentMadeTransitions($ticket_state_before, $order_status_paid, $ticket_state_after, $transition, $additional, array $tracking = NULL) {
    /** @var \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager */
    $entity_type_manager = $this->container->get('entity_type.manager');
    $order_item_storage = $entity_type_manager->getStorage('commerce_order_item');

    $order_item = OrderItem::create([
      'type' => 'contacts_ticket',
      'state' => $ticket_state_before,
      'unit_price' => new Price('10', $this->store->getDefaultCurrencyCode()),
      'mapped_price' => [
        'booking_window' => 'standard',
        'class' => 'standard',
      ],
    ]);
    $order_item->save();

    /** @var \Drupal\commerce_order\Entity\OrderInterface $order */
    $order = Order::create([
      'type' => 'contacts_booking',
      'store_id' => $this->store,
      'order_items' => [$order_item],
      'state' => 'draft',
      'event' => $this->event->id(),
    ]);
    $order->save();

    $payment_amount = $order->getTotalPrice();
    if ($tracking) {
      $payment_amount = $payment_amount->multiply(0);
      foreach ($tracking as $entry) {
        $payment_amount = $payment_amount->add(new Price($entry['number'], $entry['currency_code']));
      }
    }
    elseif (!$order_status_paid) {
      $payment_amount = $payment_amount->subtract(new Price('1', $payment_amount->getCurrencyCode()));
    }

    // Clear any previous events.
    $this->triggeredEvents = [];
    $this->triggeredEventsByGroup = [];

    // Make the payment.
    Payment::create([
      'type' => 'payment_default',
      'payment_gateway' => $this->gateway->id(),
      'order_id' => $order->id(),
      'state' => 'completed',
      'amount' => $payment_amount,
      'order_item_tracking' => $tracking,
    ])->save();

    // Trigger the order update to apply transitions.
    $this->container->get('commerce_payment.order_updater')->updateOrder($order, TRUE);

    if (!empty($transition)) {
      $this->checkTransitions($transition, $additional);
    }
    else {
      static::assertTrue(!isset($this->triggeredEventsByGroup['contacts_events_order_items']), 'No transitions expected.');
    }

    // Check new ticket state.
    $order_item = $order_item_storage->loadUnchanged($order_item->id());
    static::assertEquals($ticket_state_after, $order_item->get('state')->value, 'Order item state does not match expected.');
  }

  /**
   * Data provider for testPaymentMadeTransitions.
   */
  public function dataOnPaymentMade() {
    $data['pending_not_paid'] = [
      'ticket_state_before' => 'pending',
      'order_status' => FALSE,
      'ticket_state_after' => 'pending',
      'transition' => '',
      'additional' => [],
    ];
    $data['pending_paid'] = [
      'ticket_state_before' => 'pending',
      'order_status' => TRUE,
      'ticket_state_after' => 'pending',
      'transition' => '',
      'additional' => [],
    ];

    $data['confirmed_not_paid'] = [
      'ticket_state_before' => 'confirmed',
      'order_status' => FALSE,
      'ticket_state_after' => 'confirmed',
      'transition' => '',
      'additional' => [],
    ];
    $data['confirmed_paid'] = [
      'ticket_state_before' => 'confirmed',
      'order_status' => TRUE,
      'ticket_state_after' => 'paid_in_full',
      'transition' => 'paid_in_full',
      'additional' => [],
    ];

    $data['paid_in_full_not_paid'] = [
      'ticket_state_before' => 'paid_in_full',
      'order_status' => FALSE,
      'ticket_state_after' => 'confirmed',
      'transition' => 'payment_undone',
      'additional' => [],
    ];
    $data['paid_in_full_paid'] = [
      'ticket_state_before' => 'paid_in_full',
      'order_status' => TRUE,
      'ticket_state_after' => 'paid_in_full',
      'transition' => '',
      'additional' => [],
    ];

    $data['cancelled_not_paid'] = [
      'ticket_state_before' => 'cancelled',
      'order_status' => FALSE,
      'ticket_state_after' => 'cancelled',
      'transition' => '',
      'additional' => [],
    ];
    $data['cancelled_paid'] = [
      'ticket_state_before' => 'cancelled',
      'order_status' => TRUE,
      'ticket_state_after' => 'cancelled',
      'transition' => '',
      'additional' => [],
    ];
    return $data;
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc