‪TYPO3CMS  ‪main
DateTimeConverterTest.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;
28 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
29 
30 final class ‪DateTimeConverterTest extends UnitTestCase
31 {
33 
34  protected function ‪setUp(): void
35  {
36  parent::setUp();
37  $this->converter = new ‪DateTimeConverter();
38  }
39 
40  #[Test]
42  {
43  $error = $this->converter->convertFrom('1980-12-13', 'DateTime');
44  self::assertInstanceOf(Error::class, $error);
45  }
46 
47  #[Test]
49  {
50  $expectedResult = '1980-12-13T20:15:07+01:23';
51  $date = $this->converter->convertFrom($expectedResult, 'DateTime');
52  $actualResult = $date->format('Y-m-d\\TH:i:sP');
53  self::assertSame($expectedResult, $actualResult);
54  }
55 
56  #[Test]
58  {
59  $expectedResult = '1980-12-13T20:15:07+01:23';
60  $mockMappingConfiguration = $this->createMock(PropertyMappingConfigurationInterface::class);
61  $mockMappingConfiguration
62  ->expects(self::atLeastOnce())
63  ->method('getConfigurationValue')
64  ->with(DateTimeConverter::class, ‪DateTimeConverter::CONFIGURATION_DATE_FORMAT)
65  ->willReturn(null);
66 
67  $date = $this->converter->convertFrom($expectedResult, 'DateTime', [], $mockMappingConfiguration);
68  $actualResult = $date->format(‪DateTimeConverter::DEFAULT_DATE_FORMAT);
69  self::assertSame($expectedResult, $actualResult);
70  }
71 
72  #[Test]
73  public function ‪convertFromEmptyStringReturnsNull(): void
74  {
75  $date = $this->converter->convertFrom('', 'DateTime', [], null);
76  self::assertNull($date);
77  }
78 
82  public static function ‪convertFromStringDataProvider(): array
83  {
84  return [
85  ['1308174051', '', false],
86  ['13-12-1980', 'd.m.Y', false],
87  ['1308174051', 'Y-m-d', false],
88  ['12:13', 'H:i', true],
89  ['13.12.1980', 'd.m.Y', true],
90  ['2005-08-15T15:52:01+00:00', null, true],
91  ['2005-08-15T15:52:01+00:00', \DateTimeInterface::ATOM, true],
92  ['1308174051', 'U', true],
93  ];
94  }
95 
101  #[DataProvider('convertFromStringDataProvider')]
102  #[Test]
103  public function ‪convertFromStringTests(string $source, ?string $dateFormat, bool $isValid): void
104  {
105  if ($dateFormat !== null) {
106  $mockMappingConfiguration = $this->createMock(PropertyMappingConfigurationInterface::class);
107  $mockMappingConfiguration
108  ->expects(self::atLeastOnce())
109  ->method('getConfigurationValue')
110  ->with(DateTimeConverter::class, ‪DateTimeConverter::CONFIGURATION_DATE_FORMAT)
111  ->willReturn($dateFormat);
112  } else {
113  $mockMappingConfiguration = null;
114  }
115  $date = $this->converter->convertFrom($source, 'DateTime', [], $mockMappingConfiguration);
116  if ($isValid !== true) {
117  self::assertInstanceOf(Error::class, $date);
118  return;
119  }
120  self::assertInstanceOf('DateTime', $date);
121 
122  if ($dateFormat === null) {
124  }
125  self::assertSame($source, $date->format($dateFormat));
126  }
127 
133  {
134  return [
135  ['1308174051'],
136  [1308174051],
137  ];
138  }
139 
140  #[DataProvider('convertFromIntegerOrDigitStringsWithoutConfigurationDataProvider')]
141  #[Test]
142  public function ‪convertFromIntegerOrDigitStringWithoutConfigurationTests(string|int $source): void
143  {
144  $date = $this->converter->convertFrom($source, 'DateTime', [], null);
145  self::assertInstanceOf('DateTime', $date);
146  self::assertSame((string)$source, $date->format('U'));
147  }
148 
149  #[DataProvider('convertFromIntegerOrDigitStringsWithoutConfigurationDataProvider')]
150  #[Test]
152  {
153  $date = $this->converter->convertFrom(['date' => $source], 'DateTime', [], null);
154  self::assertInstanceOf('DateTime', $date);
155  self::assertSame((string)$source, $date->format('U'));
156  }
157 
158  #[Test]
160  {
161  $error = $this->converter->convertFrom(['date' => '1980-12-13'], 'DateTime');
162  self::assertInstanceOf(Error::class, $error);
163  }
164 
165  #[Test]
167  {
168  $this->expectException(TypeConverterException::class);
169  $this->expectExceptionCode(1308003914);
170  $this->converter->convertFrom(['hour' => '12', 'minute' => '30'], 'DateTime');
171  }
172 
173  #[Test]
175  {
176  $expectedResult = '1980-12-13T20:15:07+01:23';
177  $date = $this->converter->convertFrom(['date' => $expectedResult], 'DateTime');
178  $actualResult = $date->format('Y-m-d\\TH:i:sP');
179  self::assertSame($expectedResult, $actualResult);
180  }
181 
185  public static function ‪invalidDatePartKeyValuesDataProvider(): array
186  {
187  return [
188  [['day' => '13.0', 'month' => '10', 'year' => '2010']],
189  [['day' => '13', 'month' => '10.0', 'year' => '2010']],
190  [['day' => '13', 'month' => '10', 'year' => '2010.0']],
191  [['day' => '-13', 'month' => '10', 'year' => '2010']],
192  [['day' => '13', 'month' => '-10', 'year' => '2010']],
193  [['day' => '13', 'month' => '10', 'year' => '-2010']],
194  ];
195  }
196 
197  #[DataProvider('invalidDatePartKeyValuesDataProvider')]
198  #[Test]
200  {
201  $this->expectException(TypeConverterException::class);
202  $this->expectExceptionCode(1308003914);
203  $this->converter->convertFrom($source, 'DateTime');
204  }
205 
206  #[Test]
208  {
209  $source = ['day' => '13', 'month' => '10', 'year' => '2010'];
210  $mappingConfiguration = new ‪PropertyMappingConfiguration();
211  $mappingConfiguration->setTypeConverterOption(
212  DateTimeConverter::class,
214  'Y-m-d'
215  );
216 
217  $date = $this->converter->convertFrom($source, 'DateTime', [], $mappingConfiguration);
218  $actualResult = $date->format('Y-m-d');
219  self::assertSame('2010-10-13', $actualResult);
220  }
221 
222  #[Test]
224  {
225  $source = [
226  'date' => '2011-06-16',
227  'dateFormat' => 'Y-m-d',
228  'hour' => '12',
229  'minute' => '30',
230  'second' => '59',
231  ];
232  $date = $this->converter->convertFrom($source, 'DateTime');
233  self::assertSame('2011-06-16', $date->format('Y-m-d'));
234  self::assertSame('12', $date->format('H'));
235  self::assertSame('30', $date->format('i'));
236  self::assertSame('59', $date->format('s'));
237  }
238 
239  #[Test]
241  {
242  $source = [
243  'date' => '2011-06-16 12:30:59',
244  'dateFormat' => 'Y-m-d H:i:s',
245  'timezone' => 'Atlantic/Reykjavik',
246  ];
247  $date = $this->converter->convertFrom($source, 'DateTime');
248  self::assertSame('2011-06-16', $date->format('Y-m-d'));
249  self::assertSame('12', $date->format('H'));
250  self::assertSame('30', $date->format('i'));
251  self::assertSame('59', $date->format('s'));
252  self::assertSame('Atlantic/Reykjavik', $date->getTimezone()->getName());
253  }
254 
255  #[Test]
257  {
258  $this->expectException(TypeConverterException::class);
259  $this->expectExceptionCode(1308240974);
260  $source = [
261  'date' => '2011-06-16',
262  'dateFormat' => 'Y-m-d',
263  'timezone' => 'Invalid/Timezone',
264  ];
265  $this->converter->convertFrom($source, 'DateTime');
266  }
267 
268  #[Test]
270  {
271  $this->expectException(TypeConverterException::class);
272  $this->expectExceptionCode(1308003914);
273  $this->converter->convertFrom([], 'DateTime', [], null);
274  }
275 
276  #[Test]
278  {
279  self::assertNull($this->converter->convertFrom(['date' => ''], 'DateTime', [], null));
280  }
281 
285  public static function ‪convertFromArrayDataProvider(): array
286  {
287  return [
288  [['date' => '2005-08-15T15:52:01+01:00'], true, '2005-08-15T15:52:01+01:00'],
289  [['date' => '1308174051', 'dateFormat' => ''], false, null],
290  [['date' => '13-12-1980', 'dateFormat' => 'd.m.Y'], false, null],
291  [['date' => '1308174051', 'dateFormat' => 'Y-m-d'], false, null],
292  [['date' => '12:13', 'dateFormat' => 'H:i'], true, null],
293  [['date' => '13.12.1980', 'dateFormat' => 'd.m.Y'], true, null],
294  [['date' => '2005-08-15T15:52:01+00:00', 'dateFormat' => ''], true, '2005-08-15T15:52:01+00:00'],
295  [['date' => '2005-08-15T15:52:01+00:00', 'dateFormat' => \DateTimeInterface::ATOM], true, '2005-08-15T15:52:01+00:00'],
296  [['date' => '1308174051', 'dateFormat' => 'U'], true, '2011-06-15T21:40:51+00:00'],
297  [['date' => 1308174051, 'dateFormat' => 'U'], true, '2011-06-15T21:40:51+00:00'],
298  [['date' => -1308174051, 'dateFormat' => 'U'], true, '1928-07-19T02:19:09+00:00'],
299  ];
300  }
301 
306  #[DataProvider('convertFromArrayDataProvider')]
307  #[Test]
308  public function ‪convertFromArrayTests(array $source, $isValid, ?string $expectedResult): void
309  {
310  $dateFormat = isset($source['dateFormat']) && $source['dateFormat'] !== '' ? $source['dateFormat'] : null;
311  if ($dateFormat !== null) {
312  $mockMappingConfiguration = $this->createMock(PropertyMappingConfigurationInterface::class);
313  $mockMappingConfiguration
314  ->expects(self::atLeastOnce())
315  ->method('getConfigurationValue')
316  ->with(DateTimeConverter::class, ‪DateTimeConverter::CONFIGURATION_DATE_FORMAT)
317  ->willReturn($dateFormat);
318  } else {
319  $mockMappingConfiguration = null;
320  }
321  $date = $this->converter->convertFrom($source, 'DateTime', [], $mockMappingConfiguration);
322 
323  if ($isValid !== true) {
324  self::assertInstanceOf(Error::class, $date);
325  return;
326  }
327 
328  self::assertInstanceOf('DateTime', $date);
329  if ($dateFormat === null) {
331  }
332  $dateAsString = isset($source['date']) ? (string)$source['date'] : '';
333  self::assertSame($dateAsString, $date->format($dateFormat));
334  if ($expectedResult !== null) {
335  self::assertSame($expectedResult, $date->format('c'));
336  }
337  }
338 
339  #[Test]
341  {
342  $className = DateTimeSubFixture::class;
343  $date = $this->converter->convertFrom('2005-08-15T15:52:01+00:00', $className);
344 
345  self::assertInstanceOf($className, $date);
346  self::assertSame('Bar', $date->foo());
347  }
348 }
‪TYPO3\CMS\Extbase\Property\TypeConverter\DateTimeConverter\DEFAULT_DATE_FORMAT
‪const DEFAULT_DATE_FORMAT
Definition: DateTimeConverter.php:76
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\convertFromReturnsErrorIfGivenArrayCantBeConverted
‪convertFromReturnsErrorIfGivenArrayCantBeConverted()
Definition: DateTimeConverterTest.php:159
‪TYPO3\CMS\Extbase\Property\Exception\TypeConverterException
Definition: TypeConverterException.php:25
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\convertFromAllowsToOverrideTheTimezone
‪convertFromAllowsToOverrideTheTimezone()
Definition: DateTimeConverterTest.php:240
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\convertFromIntegerOrDigitStringsWithoutConfigurationDataProvider
‪static convertFromIntegerOrDigitStringsWithoutConfigurationDataProvider()
Definition: DateTimeConverterTest.php:132
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\$converter
‪DateTimeConverter $converter
Definition: DateTimeConverterTest.php:32
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\convertFromReturnsErrorIfGivenStringCantBeConverted
‪convertFromReturnsErrorIfGivenStringCantBeConverted()
Definition: DateTimeConverterTest.php:41
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter
Definition: ArrayConverterTest.php:18
‪TYPO3\CMS\Extbase\Property\TypeConverter\DateTimeConverter
Definition: DateTimeConverter.php:64
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\convertFromUsesDefaultDateFormatIfItIsNotConfigured
‪convertFromUsesDefaultDateFormatIfItIsNotConfigured()
Definition: DateTimeConverterTest.php:57
‪TYPO3\CMS\Extbase\Property\PropertyMappingConfigurationInterface
Definition: PropertyMappingConfigurationInterface.php:22
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\convertFromProperlyConvertsArrayWithDefaultDateFormat
‪convertFromProperlyConvertsArrayWithDefaultDateFormat()
Definition: DateTimeConverterTest.php:174
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\invalidDatePartKeyValuesDataProvider
‪static invalidDatePartKeyValuesDataProvider()
Definition: DateTimeConverterTest.php:185
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest
Definition: DateTimeConverterTest.php:31
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\convertFromArrayReturnsNullForEmptyDate
‪convertFromArrayReturnsNullForEmptyDate()
Definition: DateTimeConverterTest.php:277
‪TYPO3\CMS\Extbase\Property\TypeConverter\DateTimeConverter\CONFIGURATION_DATE_FORMAT
‪const CONFIGURATION_DATE_FORMAT
Definition: DateTimeConverter.php:68
‪TYPO3\CMS\Extbase\Error\Error
Definition: Error.php:25
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\convertFromStringDataProvider
‪static convertFromStringDataProvider()
Definition: DateTimeConverterTest.php:82
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\convertFromArrayTests
‪convertFromArrayTests(array $source, $isValid, ?string $expectedResult)
Definition: DateTimeConverterTest.php:308
‪TYPO3\CMS\Extbase\Property\PropertyMappingConfiguration
Definition: PropertyMappingConfiguration.php:22
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\convertFromProperlyConvertsArrayWithDateAsArray
‪convertFromProperlyConvertsArrayWithDateAsArray()
Definition: DateTimeConverterTest.php:207
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\convertFromThrowsExceptionIfGivenArrayDoesNotSpecifyTheDate
‪convertFromThrowsExceptionIfGivenArrayDoesNotSpecifyTheDate()
Definition: DateTimeConverterTest.php:166
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\convertFromIntegerOrDigitStringInArrayWithoutConfigurationTests
‪convertFromIntegerOrDigitStringInArrayWithoutConfigurationTests(string|int $source)
Definition: DateTimeConverterTest.php:151
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\convertFromEmptyStringReturnsNull
‪convertFromEmptyStringReturnsNull()
Definition: DateTimeConverterTest.php:73
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\convertFromProperlyConvertsStringWithDefaultDateFormat
‪convertFromProperlyConvertsStringWithDefaultDateFormat()
Definition: DateTimeConverterTest.php:48
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\convertFromThrowsExceptionIfDatePartKeysHaveInvalidValuesSpecified
‪convertFromThrowsExceptionIfDatePartKeysHaveInvalidValuesSpecified($source)
Definition: DateTimeConverterTest.php:199
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\convertFromAllowsToOverrideTheTime
‪convertFromAllowsToOverrideTheTime()
Definition: DateTimeConverterTest.php:223
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\convertFromThrowsExceptionIfSpecifiedTimezoneIsInvalid
‪convertFromThrowsExceptionIfSpecifiedTimezoneIsInvalid()
Definition: DateTimeConverterTest.php:256
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\setUp
‪setUp()
Definition: DateTimeConverterTest.php:34
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\Fixtures\DateTimeSubFixture
Definition: DateTimeSubFixture.php:24
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\convertFromArrayThrowsExceptionForEmptyArray
‪convertFromArrayThrowsExceptionForEmptyArray()
Definition: DateTimeConverterTest.php:269
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\convertFromIntegerOrDigitStringWithoutConfigurationTests
‪convertFromIntegerOrDigitStringWithoutConfigurationTests(string|int $source)
Definition: DateTimeConverterTest.php:142
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\convertFromSupportsDateTimeSubClasses
‪convertFromSupportsDateTimeSubClasses()
Definition: DateTimeConverterTest.php:340
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\convertFromArrayDataProvider
‪static convertFromArrayDataProvider()
Definition: DateTimeConverterTest.php:285
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\convertFromStringTests
‪convertFromStringTests(string $source, ?string $dateFormat, bool $isValid)
Definition: DateTimeConverterTest.php:103