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