annotate core/modules/datetime/src/Tests/DateTestBase.php @ 14:1fec387a4317

Update Drupal core to 8.5.2 via Composer
author Chris Cannam
date Mon, 23 Apr 2018 09:46:53 +0100
parents 4c8ae668cc8c
children 129ea1e6d783
rev   line source
Chris@0 1 <?php
Chris@0 2
Chris@0 3 namespace Drupal\datetime\Tests;
Chris@0 4
Chris@0 5 @trigger_error('\Drupal\datetime\Tests\DateTestBase is deprecated in Drupal 8.4.0 and will be removed before Drupal 9.0.0. Use \Drupal\Tests\BrowserTestBase instead. See https://www.drupal.org/node/2780063.', E_USER_DEPRECATED);
Chris@0 6
Chris@0 7 use Drupal\Component\Utility\Unicode;
Chris@0 8 use Drupal\Core\Entity\Entity\EntityFormDisplay;
Chris@0 9 use Drupal\Core\Entity\Entity\EntityViewDisplay;
Chris@0 10 use Drupal\datetime\Plugin\Field\FieldType\DateTimeItem;
Chris@0 11 use Drupal\entity_test\Entity\EntityTest;
Chris@0 12 use Drupal\field\Entity\FieldConfig;
Chris@0 13 use Drupal\field\Entity\FieldStorageConfig;
Chris@0 14 use Drupal\simpletest\WebTestBase;
Chris@0 15
Chris@0 16 /**
Chris@0 17 * Provides a base class for testing Datetime field functionality.
Chris@0 18 *
Chris@0 19 * @deprecated in Drupal 8.4.0 and will be removed before Drupal 9.0.0.
Chris@0 20 * Use \Drupal\Tests\BrowserTestBase instead.
Chris@0 21 */
Chris@0 22 abstract class DateTestBase extends WebTestBase {
Chris@0 23
Chris@0 24 /**
Chris@0 25 * Modules to enable.
Chris@0 26 *
Chris@0 27 * @var array
Chris@0 28 */
Chris@0 29 public static $modules = ['node', 'entity_test', 'datetime', 'field_ui'];
Chris@0 30
Chris@0 31 /**
Chris@0 32 * An array of display options to pass to entity_get_display()
Chris@0 33 *
Chris@0 34 * @var array
Chris@0 35 */
Chris@0 36 protected $displayOptions;
Chris@0 37
Chris@0 38 /**
Chris@0 39 * A field storage to use in this test class.
Chris@0 40 *
Chris@0 41 * @var \Drupal\field\Entity\FieldStorageConfig
Chris@0 42 */
Chris@0 43 protected $fieldStorage;
Chris@0 44
Chris@0 45 /**
Chris@0 46 * The field used in this test class.
Chris@0 47 *
Chris@0 48 * @var \Drupal\field\Entity\FieldConfig
Chris@0 49 */
Chris@0 50 protected $field;
Chris@0 51
Chris@0 52 /**
Chris@0 53 * The date formatter service.
Chris@0 54 *
Chris@0 55 * @var \Drupal\Core\Datetime\DateFormatterInterface
Chris@0 56 */
Chris@0 57 protected $dateFormatter;
Chris@0 58
Chris@0 59 /**
Chris@0 60 * An array of timezone extremes to test.
Chris@0 61 *
Chris@0 62 * @var string[]
Chris@0 63 */
Chris@0 64 protected static $timezones = [
Chris@0 65 // UTC-12, no DST.
Chris@0 66 'Pacific/Kwajalein',
Chris@0 67 // UTC-11, no DST
Chris@0 68 'Pacific/Midway',
Chris@0 69 // UTC-7, no DST.
Chris@0 70 'America/Phoenix',
Chris@0 71 // UTC.
Chris@0 72 'UTC',
Chris@0 73 // UTC+5:30, no DST.
Chris@0 74 'Asia/Kolkata',
Chris@0 75 // UTC+12, no DST
Chris@0 76 'Pacific/Funafuti',
Chris@0 77 // UTC+13, no DST.
Chris@0 78 'Pacific/Tongatapu',
Chris@0 79 ];
Chris@0 80
Chris@0 81 /**
Chris@0 82 * Returns the type of field to be tested.
Chris@0 83 *
Chris@0 84 * @return string
Chris@0 85 */
Chris@0 86 abstract protected function getTestFieldType();
Chris@0 87
Chris@0 88 /**
Chris@0 89 * {@inheritdoc}
Chris@0 90 */
Chris@0 91 protected function setUp() {
Chris@0 92 parent::setUp();
Chris@0 93
Chris@0 94 $web_user = $this->drupalCreateUser([
Chris@0 95 'access content',
Chris@0 96 'view test entity',
Chris@0 97 'administer entity_test content',
Chris@0 98 'administer entity_test form display',
Chris@0 99 'administer content types',
Chris@0 100 'administer node fields',
Chris@0 101 ]);
Chris@0 102 $this->drupalLogin($web_user);
Chris@0 103
Chris@0 104 // Create a field with settings to validate.
Chris@0 105 $this->createField();
Chris@0 106
Chris@0 107 $this->dateFormatter = $this->container->get('date.formatter');
Chris@0 108 }
Chris@0 109
Chris@0 110 /**
Chris@0 111 * Creates a date test field.
Chris@0 112 */
Chris@0 113 protected function createField() {
Chris@0 114 $field_name = Unicode::strtolower($this->randomMachineName());
Chris@0 115 $type = $this->getTestFieldType();
Chris@0 116 $widget_type = $formatter_type = $type . '_default';
Chris@0 117
Chris@0 118 $this->fieldStorage = FieldStorageConfig::create([
Chris@0 119 'field_name' => $field_name,
Chris@0 120 'entity_type' => 'entity_test',
Chris@0 121 'type' => $type,
Chris@0 122 'settings' => ['datetime_type' => DateTimeItem::DATETIME_TYPE_DATE],
Chris@0 123 ]);
Chris@0 124 $this->fieldStorage->save();
Chris@0 125 $this->field = FieldConfig::create([
Chris@0 126 'field_storage' => $this->fieldStorage,
Chris@0 127 'bundle' => 'entity_test',
Chris@0 128 'description' => 'Description for ' . $field_name,
Chris@0 129 'required' => TRUE,
Chris@0 130 ]);
Chris@0 131 $this->field->save();
Chris@0 132
Chris@0 133 EntityFormDisplay::load('entity_test.entity_test.default')
Chris@0 134 ->setComponent($field_name, ['type' => $widget_type])
Chris@0 135 ->save();
Chris@0 136
Chris@0 137 $this->displayOptions = [
Chris@0 138 'type' => $formatter_type,
Chris@0 139 'label' => 'hidden',
Chris@0 140 'settings' => ['format_type' => 'medium'] + $this->defaultSettings,
Chris@0 141 ];
Chris@0 142 EntityViewDisplay::create([
Chris@0 143 'targetEntityType' => $this->field->getTargetEntityTypeId(),
Chris@0 144 'bundle' => $this->field->getTargetBundle(),
Chris@0 145 'mode' => 'full',
Chris@0 146 'status' => TRUE,
Chris@0 147 ])->setComponent($field_name, $this->displayOptions)
Chris@0 148 ->save();
Chris@0 149 }
Chris@0 150
Chris@0 151 /**
Chris@0 152 * Renders a entity_test and sets the output in the internal browser.
Chris@0 153 *
Chris@0 154 * @param int $id
Chris@0 155 * The entity_test ID to render.
Chris@0 156 * @param string $view_mode
Chris@0 157 * (optional) The view mode to use for rendering. Defaults to 'full'.
Chris@0 158 * @param bool $reset
Chris@0 159 * (optional) Whether to reset the entity_test controller cache. Defaults to
Chris@0 160 * TRUE to simplify testing.
Chris@0 161 */
Chris@0 162 protected function renderTestEntity($id, $view_mode = 'full', $reset = TRUE) {
Chris@0 163 if ($reset) {
Chris@0 164 $this->container->get('entity_type.manager')->getStorage('entity_test')->resetCache([$id]);
Chris@0 165 }
Chris@0 166 $entity = EntityTest::load($id);
Chris@0 167 $display = EntityViewDisplay::collectRenderDisplay($entity, $view_mode);
Chris@0 168 $build = $display->build($entity);
Chris@0 169 $output = $this->container->get('renderer')->renderRoot($build);
Chris@0 170 $this->setRawContent($output);
Chris@0 171 $this->verbose($output);
Chris@0 172 }
Chris@0 173
Chris@0 174 /**
Chris@0 175 * Sets the site timezone to a given timezone.
Chris@0 176 *
Chris@0 177 * @param string $timezone
Chris@0 178 * The timezone identifier to set.
Chris@0 179 */
Chris@0 180 protected function setSiteTimezone($timezone) {
Chris@0 181 // Set an explicit site timezone, and disallow per-user timezones.
Chris@0 182 $this->config('system.date')
Chris@0 183 ->set('timezone.user.configurable', 0)
Chris@0 184 ->set('timezone.default', $timezone)
Chris@0 185 ->save();
Chris@0 186 }
Chris@0 187
Chris@14 188 /**
Chris@14 189 * Massages test date values.
Chris@14 190 *
Chris@14 191 * If a date object is generated directly by a test, then it needs to be
Chris@14 192 * adjusted to behave like the computed date from the item.
Chris@14 193 *
Chris@14 194 * @param \Drupal\Core\Datetime\DrupalDateTime $date
Chris@14 195 * A date object directly generated by the test.
Chris@14 196 */
Chris@14 197 protected function massageTestDate($date) {
Chris@14 198 if ($this->field->getSetting('datetime_type') === DateTimeItem::DATETIME_TYPE_DATE) {
Chris@14 199 // Set the default time for date-only items.
Chris@14 200 $date->setDefaultDateTime();
Chris@14 201 }
Chris@14 202 }
Chris@14 203
Chris@0 204 }