contacts_events-8.x-1.x-dev/tests/src/Kernel/EventClassEvaluationTest.php
tests/src/Kernel/EventClassEvaluationTest.php
<?php
namespace Drupal\Tests\contacts_events\Kernel;
use Drupal\commerce_order\Entity\Order;
use Drupal\commerce_order\Entity\OrderItem;
use Drupal\commerce_order\Entity\OrderItemInterface;
use Drupal\contacts_events\Entity\Event;
use Drupal\contacts_events\Entity\EventClass;
use Drupal\contacts_events\Entity\Ticket;
use Drupal\KernelTests\KernelTestBase;
/**
* Test the event class evaluation.
*
* @coversDefaultClass \Drupal\contacts_events\Entity\EventClass
*
* @group contacts_events
*/
class EventClassEvaluationTest extends KernelTestBase {
/**
* {@inheritdoc}
*/
protected static $fullStackModules = [
'address',
'commerce',
'commerce_checkout',
'commerce_order',
'commerce_price',
'commerce_number_pattern',
'commerce_payment',
'commerce_store',
'contacts',
'contacts_events',
'ctools',
'datetime',
'datetime_range',
'entity',
'entity_reference',
'entity_reference_revisions',
'facets',
'field',
'file',
'image',
'inline_entity_form',
'name',
'options',
'path',
'profile',
'state_machine',
'system',
'text',
'user',
];
/**
* {@inheritdoc}
*/
protected $strictConfigSchema = FALSE;
/**
* Test classes with no conditions, ensuring types are protected.
*
* @param string $class_type
* The class type.
* @param string $order_item_type
* The order item type.
* @param bool $expected
* The expected result of evaluation.
*
* @dataProvider dataGlobalNoConditions
*/
public function testNoConditions($class_type, $order_item_type, $expected) {
// Create a class.
$class = new EventClass([
'id' => 'standard',
'type' => $class_type,
], 'event_class');
// Set up our context.
$order_item = $this->prophesize(OrderItemInterface::class);
$order_item->bundle()->willReturn($order_item_type);
$this->assertEquals($expected, $class->evaluate($order_item->reveal(), TRUE));
}
/**
* Data provider for testNoConditions.
*/
public function dataGlobalNoConditions() {
// Global event class - ticket order item.
$data['global-contacts_ticket'] = [
'class_type' => 'global',
'order_item_type' => 'contacts_ticket',
'expected' => TRUE,
];
// Ticket event class - ticket order item.
$data['contacts_ticket-contacts_ticket'] = [
'class_type' => 'contacts_ticket',
'order_item_type' => 'contacts_ticket',
'expected' => TRUE,
];
// Other event class - ticket order item.
$data['other-contacts_ticket'] = [
'class_type' => 'other',
'order_item_type' => 'contacts_ticket',
'expected' => FALSE,
];
// Global event class - other order item.
$data['global-other'] = [
'class_type' => 'global',
'order_item_type' => 'other',
'expected' => TRUE,
];
// Ticket event class - other order item.
$data['contacts_ticket-other'] = [
'class_type' => 'contacts_ticket',
'order_item_type' => 'other',
'expected' => FALSE,
];
// Other event class - other order item.
$data['other-other'] = [
'class_type' => 'other',
'order_item_type' => 'other',
'expected' => TRUE,
];
return $data;
}
/**
* Test classes with date conditions.
*
* @param string $date_of_birth
* The date of birth on the ticket.
* @param string $event_date
* The date of the event.
* @param bool $adult_result
* The expected result from evaluating the adult class.
* @param bool $child_result
* The expected result from evaluating the child class.
*
* @dataProvider dataTestDateCondition
*/
public function testDateConditions($date_of_birth, $event_date, $adult_result, $child_result) {
$this->enableModules(static::$fullStackModules);
$this->config('system.date')->set('country.default', 'GB')->save();
$this->installEntitySchema('commerce_store');
$this->installConfig(['commerce_order', 'system', 'contacts_events']);
$this->installEntitySchema('contacts_event');
$this->installEntitySchema('contacts_ticket');
$this->installEntitySchema('commerce_order');
$this->installEntitySchema('commerce_order_item');
// Set up our context.
$event = Event::create([
'type' => 'default',
'date' => ['value' => $event_date],
]);
$order = Order::create([
'type' => 'contacts_booking',
'event' => $event,
]);
$order_item = OrderItem::create([
'type' => 'contacts_ticket',
'order_id' => $order,
]);
$ticket = Ticket::create([
'type' => 'standard',
'date_of_birth' => $date_of_birth,
'order_item' => $order_item,
'event' => $event,
]);
$order_item->set('purchased_entity', $ticket);
// Create and evaluate our adult class.
$adult_class = new EventClass([
'id' => 'adult',
'type' => 'contacts_ticket',
'min_age' => 18,
], 'event_class');
$this->assertEquals($adult_result, $adult_class->evaluate($order_item), 'Adult evaluation');
// Create and evaluate our child class.
$child_class = new EventClass([
'id' => 'child',
'type' => 'contacts_ticket',
'max_age' => 17,
], 'event_class');
$this->assertEquals($child_result, $child_class->evaluate($order_item), 'Child evaluation');
}
/**
* Data provider for testDateConditions.
*/
public function dataTestDateCondition() {
$data['over_18'] = [
'date_of_birth' => '2000-01-01',
'event_date' => '2018-08-01T10:00:00',
'adult_result' => TRUE,
'child_result' => FALSE,
];
$data['exactly_18'] = [
'date_of_birth' => '2000-08-01',
'event_date' => '2018-08-01T10:00:00',
'adult_result' => TRUE,
'child_result' => FALSE,
];
$data['almost_18'] = [
'date_of_birth' => '2000-08-02',
'event_date' => '2018-08-01T10:00:00',
'adult_result' => FALSE,
'child_result' => TRUE,
];
$data['under_18'] = [
'date_of_birth' => '2001-01-01',
'event_date' => '2018-08-01T10:00:00',
'adult_result' => FALSE,
'child_result' => TRUE,
];
return $data;
}
}
