‪TYPO3CMS  ‪main
DateViewHelperTest.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
20 use PHPUnit\Framework\Attributes\DataProvider;
21 use PHPUnit\Framework\Attributes\Test;
23 use TYPO3\TestingFramework\Core\Functional\FunctionalTestCase;
24 use TYPO3Fluid\Fluid\Core\ViewHelper\Exception;
25 use TYPO3Fluid\Fluid\View\TemplateView;
26 
27 final class ‪DateViewHelperTest extends FunctionalTestCase
28 {
29  protected bool ‪$initializeDatabase = false;
30 
34  protected ‪$timezone;
35 
36  protected function ‪setUp(): void
37  {
38  parent::setUp();
39  $this->timezone = @date_default_timezone_get();
40  ‪$GLOBALS['TYPO3_CONF_VARS']['SYS']['ddmmyy'] = 'Y-m-d';
41  }
42 
43  protected function ‪tearDown(): void
44  {
45  date_default_timezone_set($this->timezone);
46  parent::tearDown();
47  }
48 
49  #[Test]
50  public function ‪viewHelperFormatsDateCorrectly(): void
51  {
52  $context = $this->get(RenderingContextFactory::class)->create();
53  $context->getTemplatePaths()->setTemplateSource('<f:format.date date="1980-12-13"></f:format.date>');
54  self::assertSame('1980-12-13', (new TemplateView($context))->render());
55  }
56 
57  #[Test]
58  public function ‪viewHelperRespectsCustomFormat(): void
59  {
60  $context = $this->get(RenderingContextFactory::class)->create();
61  $context->getTemplatePaths()->setTemplateSource('<f:format.date format="d.m.Y">1980-02-01</f:format.date>');
62  self::assertSame('01.02.1980', (new TemplateView($context))->render());
63  }
64 
65  #[Test]
66  public function ‪viewHelperAcceptsStrftimeFormat(): void
67  {
68  $context = $this->get(RenderingContextFactory::class)->create();
69  $context->getTemplatePaths()->setTemplateSource('<f:format.date format="%Y-%m-%d">1980-02-01</f:format.date>');
70  self::assertSame('1980-02-01', (new TemplateView($context))->render());
71  }
72 
73  #[Test]
75  {
76  $context = $this->get(RenderingContextFactory::class)->create();
77  $context->getTemplatePaths()->setTemplateSource('<f:format.date></f:format.date>');
78  self::assertSame('', (new TemplateView($context))->render());
79  }
80 
81  #[Test]
83  {
84  $context = $this->get(RenderingContextFactory::class)->create();
85  $context->getTemplatePaths()->setTemplateSource('<f:format.date date=""></f:format.date>');
86  self::assertSame(date('Y-m-d', ‪$GLOBALS['EXEC_TIME']), (new TemplateView($context))->render());
87  }
88 
89  #[Test]
91  {
92  ‪$GLOBALS['TYPO3_CONF_VARS']['SYS']['ddmmyy'] = '';
93  $context = $this->get(RenderingContextFactory::class)->create();
94  $context->getTemplatePaths()->setTemplateSource('<f:format.date>@1391876733</f:format.date>');
95  self::assertSame('2014-02-08', (new TemplateView($context))->render());
96  }
97 
98  #[Test]
99  public function ‪viewHelperUsesSystemFormat(): void
100  {
101  ‪$GLOBALS['TYPO3_CONF_VARS']['SYS']['ddmmyy'] = 'l, j. M y';
102  $context = $this->get(RenderingContextFactory::class)->create();
103  $context->getTemplatePaths()->setTemplateSource('<f:format.date>@1391876733</f:format.date>');
104  self::assertSame('Saturday, 8. Feb 14', (new TemplateView($context))->render());
105  }
106 
110  #[Test]
112  {
113  ‪$GLOBALS['TYPO3_CONF_VARS']['SYS']['ddmmyy'] = 'l, j. M y';
114  $context = $this->get(RenderingContextFactory::class)->create();
115  $context->getTemplatePaths()->setTemplateSource('{f:format.date(date: "@1645115363", format:"{undefinedVariable}")}');
116  self::assertSame('Thursday, 17. Feb 22', (new TemplateView($context))->render());
117  }
118 
119  #[Test]
121  {
122  $this->expectException(Exception::class);
123  $this->expectExceptionCode(1241722579);
124  $context = $this->get(RenderingContextFactory::class)->create();
125  $context->getTemplatePaths()->setTemplateSource('<f:format.date>foo</f:format.date>');
126  (new TemplateView($context))->render();
127  }
128 
129  #[Test]
130  public function ‪viewHelperUsesChildNodesWithTimestamp(): void
131  {
132  $context = $this->get(RenderingContextFactory::class)->create();
133  $context->getTemplatePaths()->setTemplateSource('<f:format.date>1359891658</f:format.date>');
134  self::assertEquals('2013-02-03', (new TemplateView($context))->render());
135  }
136 
137  #[Test]
138  public function ‪dateArgumentHasPriorityOverChildNodes(): void
139  {
140  $context = $this->get(RenderingContextFactory::class)->create();
141  $context->getTemplatePaths()->setTemplateSource('<f:format.date date="1980-12-12">1359891658</f:format.date>');
142  self::assertEquals('1980-12-12', (new TemplateView($context))->render());
143  }
144 
145  #[Test]
146  public function ‪relativeDateCalculationWorksWithoutBase(): void
147  {
148  $context = $this->get(RenderingContextFactory::class)->create();
149  $context->getTemplatePaths()->setTemplateSource('<f:format.date date="now" format="Y"/>');
150  self::assertEquals(date('Y'), (new TemplateView($context))->render());
151  }
152 
153  #[Test]
154  public function ‪baseArgumentIsConsideredForRelativeDate(): void
155  {
156  $context = $this->get(RenderingContextFactory::class)->create();
157  $context->getTemplatePaths()->setTemplateSource('<f:format.date date="-1 year" base="2017-01-01" format="Y"/>');
158  self::assertEquals('2016', (new TemplateView($context))->render());
159  }
160 
161  #[Test]
162  public function ‪baseArgumentDoesNotAffectAbsoluteTime(): void
163  {
164  $context = $this->get(RenderingContextFactory::class)->create();
165  $context->getTemplatePaths()->setTemplateSource('<f:format.date date="@1435784732" base="1485907200" format="Y"/>');
166  self::assertEquals('2015', (new TemplateView($context))->render());
167  }
168 
170  {
171  return [
172  'Europe/Berlin' => [
173  'Europe/Berlin',
174  '2013-02-03 12:40',
175  ],
176  'Asia/Riyadh' => [
177  'Asia/Riyadh',
178  '2013-02-03 14:40',
179  ],
180  ];
181  }
182 
183  #[DataProvider('viewHelperRespectsDefaultTimezoneForIntegerTimestampDataProvider')]
184  #[Test]
185  public function ‪viewHelperRespectsDefaultTimezoneForIntegerTimestamp(string ‪$timezone, string $expected): void
186  {
187  date_default_timezone_set(‪$timezone);
188  $date = 1359891658; // 2013-02-03 11:40 UTC
189  $context = $this->get(RenderingContextFactory::class)->create();
190  $context->getTemplatePaths()->setTemplateSource('<f:format.date date="' . $date . '" format="Y-m-d H:i"/>');
191  self::assertEquals($expected, (new TemplateView($context))->render());
192  }
193 
195  {
196  return [
197  'Europe/Berlin UTC' => [
198  'Europe/Berlin',
199  '@1359891658',
200  '2013-02-03 12:40',
201  ],
202  'Europe/Berlin Moscow' => [
203  'Europe/Berlin',
204  '03/Oct/2000:14:55:36 +0400',
205  '2000-10-03 12:55',
206  ],
207  'Asia/Riyadh UTC' => [
208  'Asia/Riyadh',
209  '@1359891658',
210  '2013-02-03 14:40',
211  ],
212  'Asia/Riyadh Moscow' => [
213  'Asia/Riyadh',
214  '03/Oct/2000:14:55:36 +0400',
215  '2000-10-03 13:55',
216  ],
217  ];
218  }
219 
220  #[DataProvider('viewHelperRespectsDefaultTimezoneForStringTimestampDataProvider')]
221  #[Test]
222  public function ‪viewHelperRespectsDefaultTimezoneForStringTimestamp(string $timeZone, string $date, string $expected): void
223  {
224  date_default_timezone_set($timeZone);
225  $context = $this->get(RenderingContextFactory::class)->create();
226  $context->getTemplatePaths()->setTemplateSource('<f:format.date date="' . $date . '" format="Y-m-d H:i"/>');
227  self::assertEquals($expected, (new TemplateView($context))->render());
228  }
229 
230  public static function ‪viewHelperUsesIcuBasedPatternDataProvider(): \Generator
231  {
232  yield 'default value in english' => [
233  '10:55:36 on a Tuesday',
234  'HH:mm:ss \'on a\' cccc',
235  'en-US',
236  ];
237  yield 'quarter of the year in french' => [
238  '4e trimestre',
239  'QQQQ',
240  'fr',
241  ];
242  yield 'quarter of the year - no locale' => [
243  '4th quarter of 2000',
244  'QQQQ \'of\' yyyy',
245  ];
246  }
247 
248  #[DataProvider('viewHelperUsesIcuBasedPatternDataProvider')]
249  #[Test]
250  public function ‪viewHelperUsesIcuBasedPattern(string $expected, string|int $pattern, ?string $locale = null): void
251  {
252  $date = '03/Oct/2000:14:55:36 +0400';
253  $context = $this->get(RenderingContextFactory::class)->create();
254  $context->getTemplatePaths()->setTemplateSource('<f:format.date date="' . $date . '" pattern="' . $pattern . '" locale="' . $locale . '"/>');
255  self::assertEquals($expected, (new TemplateView($context))->render());
256  }
257 }
‪TYPO3\CMS\Fluid\Tests\Functional\ViewHelpers\Format\DateViewHelperTest\viewHelperThrowsExceptionWithOriginalMessageIfDateStringCantBeParsed
‪viewHelperThrowsExceptionWithOriginalMessageIfDateStringCantBeParsed()
Definition: DateViewHelperTest.php:119
‪TYPO3\CMS\Fluid\Tests\Functional\ViewHelpers\Format\DateViewHelperTest\viewHelperUsesChildNodesWithTimestamp
‪viewHelperUsesChildNodesWithTimestamp()
Definition: DateViewHelperTest.php:129
‪TYPO3\CMS\Fluid\Tests\Functional\ViewHelpers\Format\DateViewHelperTest\viewHelperRespectsDefaultTimezoneForStringTimestamp
‪viewHelperRespectsDefaultTimezoneForStringTimestamp(string $timeZone, string $date, string $expected)
Definition: DateViewHelperTest.php:221
‪TYPO3\CMS\Fluid\Tests\Functional\ViewHelpers\Format\DateViewHelperTest\baseArgumentDoesNotAffectAbsoluteTime
‪baseArgumentDoesNotAffectAbsoluteTime()
Definition: DateViewHelperTest.php:161
‪TYPO3\CMS\Fluid\Tests\Functional\ViewHelpers\Format\DateViewHelperTest\viewHelperRespectsDefaultTimezoneForIntegerTimestamp
‪viewHelperRespectsDefaultTimezoneForIntegerTimestamp(string $timezone, string $expected)
Definition: DateViewHelperTest.php:184
‪TYPO3\CMS\Fluid\Tests\Functional\ViewHelpers\Format\DateViewHelperTest\viewHelperFormatsDateCorrectly
‪viewHelperFormatsDateCorrectly()
Definition: DateViewHelperTest.php:49
‪TYPO3\CMS\Fluid\Tests\Functional\ViewHelpers\Format\DateViewHelperTest\viewHelperRespectsDefaultTimezoneForIntegerTimestampDataProvider
‪static viewHelperRespectsDefaultTimezoneForIntegerTimestampDataProvider()
Definition: DateViewHelperTest.php:168
‪TYPO3\CMS\Fluid\Tests\Functional\ViewHelpers\Format\DateViewHelperTest\setUp
‪setUp()
Definition: DateViewHelperTest.php:35
‪TYPO3\CMS\Fluid\Tests\Functional\ViewHelpers\Format\DateViewHelperTest\relativeDateCalculationWorksWithoutBase
‪relativeDateCalculationWorksWithoutBase()
Definition: DateViewHelperTest.php:145
‪TYPO3\CMS\Fluid\Tests\Functional\ViewHelpers\Format
Definition: BytesViewHelperTest.php:18
‪TYPO3\CMS\Fluid\Tests\Functional\ViewHelpers\Format\DateViewHelperTest\$initializeDatabase
‪bool $initializeDatabase
Definition: DateViewHelperTest.php:29
‪TYPO3\CMS\Fluid\Tests\Functional\ViewHelpers\Format\DateViewHelperTest\viewHelperUsesDefaultIfNoSystemFormatIsAvailable
‪viewHelperUsesDefaultIfNoSystemFormatIsAvailable()
Definition: DateViewHelperTest.php:89
‪TYPO3\CMS\Fluid\Tests\Functional\ViewHelpers\Format\DateViewHelperTest\tearDown
‪tearDown()
Definition: DateViewHelperTest.php:42
‪TYPO3\CMS\Fluid\Tests\Functional\ViewHelpers\Format\DateViewHelperTest\viewHelperReturnsEmptyStringIfChildrenIsEmpty
‪viewHelperReturnsEmptyStringIfChildrenIsEmpty()
Definition: DateViewHelperTest.php:73
‪TYPO3\CMS\Fluid\Tests\Functional\ViewHelpers\Format\DateViewHelperTest\$timezone
‪string $timezone
Definition: DateViewHelperTest.php:33
‪TYPO3\CMS\Fluid\Tests\Functional\ViewHelpers\Format\DateViewHelperTest\viewHelperUsesIcuBasedPatternDataProvider
‪static viewHelperUsesIcuBasedPatternDataProvider()
Definition: DateViewHelperTest.php:229
‪TYPO3\CMS\Fluid\Tests\Functional\ViewHelpers\Format\DateViewHelperTest\viewHelperRespectsDefaultTimezoneForStringTimestampDataProvider
‪static viewHelperRespectsDefaultTimezoneForStringTimestampDataProvider()
Definition: DateViewHelperTest.php:193
‪TYPO3\CMS\Fluid\Tests\Functional\ViewHelpers\Format\DateViewHelperTest\dateArgumentHasPriorityOverChildNodes
‪dateArgumentHasPriorityOverChildNodes()
Definition: DateViewHelperTest.php:137
‪TYPO3\CMS\Fluid\Tests\Functional\ViewHelpers\Format\DateViewHelperTest\viewHelperAcceptsStrftimeFormat
‪viewHelperAcceptsStrftimeFormat()
Definition: DateViewHelperTest.php:65
‪TYPO3\CMS\Fluid\Tests\Functional\ViewHelpers\Format\DateViewHelperTest\viewHelperUsesSystemFormatWhenFormatWithNullValueIsGiven
‪viewHelperUsesSystemFormatWhenFormatWithNullValueIsGiven()
Definition: DateViewHelperTest.php:110
‪TYPO3\CMS\Fluid\Tests\Functional\ViewHelpers\Format\DateViewHelperTest\viewHelperRespectsCustomFormat
‪viewHelperRespectsCustomFormat()
Definition: DateViewHelperTest.php:57
‪TYPO3\CMS\Fluid\Tests\Functional\ViewHelpers\Format\DateViewHelperTest\viewHelperReturnsCurrentDateIfEmptyStringIsGiven
‪viewHelperReturnsCurrentDateIfEmptyStringIsGiven()
Definition: DateViewHelperTest.php:81
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Fluid\Tests\Functional\ViewHelpers\Format\DateViewHelperTest\viewHelperUsesIcuBasedPattern
‪viewHelperUsesIcuBasedPattern(string $expected, string|int $pattern, ?string $locale=null)
Definition: DateViewHelperTest.php:249
‪TYPO3\CMS\Fluid\Core\Rendering\RenderingContextFactory
Definition: RenderingContextFactory.php:51
‪TYPO3\CMS\Fluid\Tests\Functional\ViewHelpers\Format\DateViewHelperTest\baseArgumentIsConsideredForRelativeDate
‪baseArgumentIsConsideredForRelativeDate()
Definition: DateViewHelperTest.php:153
‪TYPO3\CMS\Fluid\Tests\Functional\ViewHelpers\Format\DateViewHelperTest\viewHelperUsesSystemFormat
‪viewHelperUsesSystemFormat()
Definition: DateViewHelperTest.php:98
‪TYPO3\CMS\Fluid\Tests\Functional\ViewHelpers\Format\DateViewHelperTest
Definition: DateViewHelperTest.php:28