833b5c99d193f579cba1c71fe21b5247cf4b6153
[yaffs-website] / web / core / modules / views / tests / src / Kernel / Handler / FieldDateTest.php
1 <?php
2
3 namespace Drupal\Tests\views\Kernel\Handler;
4
5 use Drupal\Tests\views\Kernel\ViewsKernelTestBase;
6 use Drupal\views\Views;
7
8 /**
9  * Tests the core Drupal\views\Plugin\views\field\Date handler.
10  *
11  * @group views
12  */
13 class FieldDateTest extends ViewsKernelTestBase {
14
15   /**
16    * Views used by this test.
17    *
18    * @var array
19    */
20   public static $testViews = ['test_view'];
21
22   /**
23    * {@inheritdoc}
24    */
25   public function schemaDefinition() {
26     $schema = parent::schemaDefinition();
27     $schema['views_test_data']['fields']['destroyed'] = [
28       'description' => "The destruction date of this record",
29       'type' => 'int',
30       'unsigned' => TRUE,
31       'not null' => FALSE,
32       'default' => 0,
33     ];
34     return $schema;
35   }
36
37   /**
38    * {@inheritdoc}
39    */
40   public function viewsData() {
41     $data = parent::viewsData();
42     $data['views_test_data']['created']['field']['id'] = 'date';
43     $data['views_test_data']['destroyed'] = [
44       'title' => 'Destroyed',
45       'help' => 'Date in future this will be destroyed.',
46       'field' => ['id' => 'date'],
47       'argument' => ['id' => 'date'],
48       'filter' => ['id' => 'date'],
49       'sort' => ['id' => 'date'],
50     ];
51     return $data;
52   }
53
54   /**
55    * {@inheritdoc}
56    */
57   public function dataSet() {
58     $datas = parent::dataSet();
59     foreach ($datas as $i => $data) {
60       $datas[$i]['destroyed'] = gmmktime(0, 0, 0, 1, 1, 2050);
61     }
62     return $datas;
63   }
64
65   /**
66    * Sets up functional test of the views date field.
67    */
68   public function testFieldDate() {
69     $view = Views::getView('test_view');
70     $view->setDisplay();
71
72     $view->displayHandlers->get('default')->overrideOption('fields', [
73       'created' => [
74         'id' => 'created',
75         'table' => 'views_test_data',
76         'field' => 'created',
77         'relationship' => 'none',
78         // ISO 8601 format, see http://php.net/manual/function.date.php
79         'custom_date_format' => 'c',
80       ],
81       'destroyed' => [
82         'id' => 'destroyed',
83         'table' => 'views_test_data',
84         'field' => 'destroyed',
85         'relationship' => 'none',
86         'custom_date_format' => 'c',
87       ],
88     ]);
89     $time = gmmktime(0, 0, 0, 1, 1, 2000);
90
91     $this->executeView($view);
92
93     $timezones = [
94       NULL,
95       'UTC',
96       'America/New_York',
97     ];
98
99     // Check each date/time in various timezones.
100     foreach ($timezones as $timezone) {
101       $dates = [
102         'short' => format_date($time, 'short', '', $timezone),
103         'medium' => format_date($time, 'medium', '', $timezone),
104         'long' => format_date($time, 'long', '', $timezone),
105         'custom' => format_date($time, 'custom', 'c', $timezone),
106         'fallback' => format_date($time, 'fallback', '', $timezone),
107         'html_date' => format_date($time, 'html_date', '', $timezone),
108         'html_datetime' => format_date($time, 'html_datetime', '', $timezone),
109         'html_month' => format_date($time, 'html_month', '', $timezone),
110         'html_time' => format_date($time, 'html_time', '', $timezone),
111         'html_week' => format_date($time, 'html_week', '', $timezone),
112         'html_year' => format_date($time, 'html_year', '', $timezone),
113         'html_yearless_date' => format_date($time, 'html_yearless_date', '', $timezone),
114       ];
115       $this->assertRenderedDatesEqual($view, $dates, $timezone);
116     }
117
118     // Check times in the past.
119     $time_since = $this->container->get('date.formatter')->formatTimeDiffSince($time);
120     $intervals = [
121       'raw time ago' => $time_since,
122       'time ago' => t('%time ago', ['%time' => $time_since]),
123       'raw time span' => $time_since,
124       'inverse time span' => "-$time_since",
125       'time span' => t('%time ago', ['%time' => $time_since]),
126     ];
127     $this->assertRenderedDatesEqual($view, $intervals);
128
129     // Check times in the future.
130     $time = gmmktime(0, 0, 0, 1, 1, 2050);
131     $formatted = $this->container->get('date.formatter')->formatTimeDiffUntil($time);
132     $intervals = [
133       'raw time span' => "-$formatted",
134       'time span' => t('%time hence', [
135         '%time' => $formatted,
136       ]),
137     ];
138     $this->assertRenderedFutureDatesEqual($view, $intervals);
139   }
140
141   /**
142    * Asserts properly formatted display against 'created' field in view.
143    *
144    * @param mixed $view
145    *   View to be tested.
146    * @param array $map
147    *   Data map.
148    * @param null $timezone
149    *   Optional timezone.
150    */
151   protected function assertRenderedDatesEqual($view, $map, $timezone = NULL) {
152     foreach ($map as $date_format => $expected_result) {
153       $view->field['created']->options['date_format'] = $date_format;
154       $t_args = [
155         '%value' => $expected_result,
156         '%format' => $date_format,
157       ];
158       if (isset($timezone)) {
159         $t_args['%timezone'] = $timezone;
160         $message = t('Value %value in %format format for timezone %timezone matches.', $t_args);
161         $view->field['created']->options['timezone'] = $timezone;
162       }
163       else {
164         $message = t('Value %value in %format format matches.', $t_args);
165       }
166       $actual_result = $view->field['created']->advancedRender($view->result[0]);
167       $this->assertEqual($expected_result, $actual_result, $message);
168     }
169   }
170
171   /**
172    * Asserts properly formatted display against 'destroyed' field in view.
173    *
174    * @param mixed $view
175    *   View to be tested.
176    * @param array $map
177    *   Data map.
178    */
179   protected function assertRenderedFutureDatesEqual($view, $map) {
180     foreach ($map as $format => $result) {
181       $view->field['destroyed']->options['date_format'] = $format;
182       $view_result = $view->field['destroyed']->advancedRender($view->result[0]);
183       $t_args = [
184         '%value' => $result,
185         '%format' => $format,
186         '%actual' => $view_result,
187       ];
188       $message = t('Value %value in %format matches %actual', $t_args);
189       $this->assertEqual($view_result, $result, $message);
190     }
191   }
192
193 }