‪TYPO3CMS  11.5
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 
26 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
27 
31 class ‪DateTimeConverterTest extends UnitTestCase
32 {
34 
35  protected function ‪setUp(): void
36  {
37  parent::setUp();
38  $this->converter = new ‪DateTimeConverter();
39  }
40 
44  public function ‪checkMetadata(): void
45  {
46  self::assertEquals(['string', 'integer', 'array'], $this->converter->getSupportedSourceTypes(), 'Source types do not match');
47  self::assertEquals('DateTime', $this->converter->getSupportedTargetType(), 'Target type does not match');
48  self::assertEquals(10, $this->converter->getPriority(), 'Priority does not match');
49  }
50 
57  {
58  self::assertFalse($this->converter->canConvertFrom('Foo', 'SomeOtherType'));
59  }
60 
65  {
66  self::assertTrue($this->converter->canConvertFrom('Foo', 'DateTime'));
67  }
68 
73  {
74  self::assertTrue($this->converter->canConvertFrom('', 'DateTime'));
75  }
76 
81  {
82  $error = $this->converter->convertFrom('1980-12-13', 'DateTime');
83  self::assertInstanceOf(Error::class, $error);
84  }
85 
90  {
91  $expectedResult = '1980-12-13T20:15:07+01:23';
92  $date = $this->converter->convertFrom($expectedResult, 'DateTime');
93  $actualResult = $date->format('Y-m-d\\TH:i:sP');
94  self::assertSame($expectedResult, $actualResult);
95  }
96 
101  {
102  $expectedResult = '1980-12-13T20:15:07+01:23';
103  $mockMappingConfiguration = $this->createMock(PropertyMappingConfigurationInterface::class);
104  $mockMappingConfiguration
105  ->expects(self::atLeastOnce())
106  ->method('getConfigurationValue')
107  ->with(DateTimeConverter::class, ‪DateTimeConverter::CONFIGURATION_DATE_FORMAT)
108  ->willReturn(null);
109 
110  $date = $this->converter->convertFrom($expectedResult, 'DateTime', [], $mockMappingConfiguration);
111  $actualResult = $date->format(‪DateTimeConverter::DEFAULT_DATE_FORMAT);
112  self::assertSame($expectedResult, $actualResult);
113  }
114 
118  public function ‪convertFromEmptyStringReturnsNull(): void
119  {
120  $date = $this->converter->convertFrom('', 'DateTime', [], null);
121  self::assertNull($date);
122  }
123 
128  public function ‪convertFromStringDataProvider(): array
129  {
130  return [
131  ['1308174051', '', false],
132  ['13-12-1980', 'd.m.Y', false],
133  ['1308174051', 'Y-m-d', false],
134  ['12:13', 'H:i', true],
135  ['13.12.1980', 'd.m.Y', true],
136  ['2005-08-15T15:52:01+00:00', null, true],
137  ['2005-08-15T15:52:01+00:00', \DateTimeInterface::ATOM, true],
138  ['1308174051', 'U', true],
139  ];
140  }
141 
149  public function ‪convertFromStringTests($source, $dateFormat, $isValid): void
150  {
151  if ($dateFormat !== null) {
152  $mockMappingConfiguration = $this->createMock(PropertyMappingConfigurationInterface::class);
153  $mockMappingConfiguration
154  ->expects(self::atLeastOnce())
155  ->method('getConfigurationValue')
156  ->with(DateTimeConverter::class, ‪DateTimeConverter::CONFIGURATION_DATE_FORMAT)
157  ->willReturn($dateFormat);
158  } else {
159  $mockMappingConfiguration = null;
160  }
161  $date = $this->converter->convertFrom($source, 'DateTime', [], $mockMappingConfiguration);
162  if ($isValid !== true) {
163  self::assertInstanceOf(Error::class, $date);
164  return;
165  }
166  self::assertInstanceOf('DateTime', $date);
167 
168  if ($dateFormat === null) {
170  }
171  self::assertSame($source, $date->format($dateFormat));
172  }
173 
180  {
181  return [
182  ['1308174051'],
183  [1308174051],
184  ];
185  }
186 
193  {
194  $date = $this->converter->convertFrom($source, 'DateTime', [], null);
195  self::assertInstanceOf('DateTime', $date);
196  self::assertSame((string)$source, $date->format('U'));
197  }
198 
207  {
208  $date = $this->converter->convertFrom(['date' => $source], 'DateTime', [], null);
209  self::assertInstanceOf('DateTime', $date);
210  self::assertSame((string)$source, $date->format('U'));
211  }
212 
217  {
218  self::assertTrue($this->converter->canConvertFrom([], 'DateTime'));
219  }
220 
225  {
226  $error = $this->converter->convertFrom(['date' => '1980-12-13'], 'DateTime');
227  self::assertInstanceOf(Error::class, $error);
228  }
229 
234  {
235  $this->expectException(TypeConverterException::class);
236  $this->expectExceptionCode(1308003914);
237  $this->converter->convertFrom(['hour' => '12', 'minute' => '30'], 'DateTime');
238  }
239 
244  {
245  $expectedResult = '1980-12-13T20:15:07+01:23';
246  $date = $this->converter->convertFrom(['date' => $expectedResult], 'DateTime');
247  $actualResult = $date->format('Y-m-d\\TH:i:sP');
248  self::assertSame($expectedResult, $actualResult);
249  }
250 
256  {
257  return [
258  [['day' => '13.0', 'month' => '10', 'year' => '2010']],
259  [['day' => '13', 'month' => '10.0', 'year' => '2010']],
260  [['day' => '13', 'month' => '10', 'year' => '2010.0']],
261  [['day' => '-13', 'month' => '10', 'year' => '2010']],
262  [['day' => '13', 'month' => '-10', 'year' => '2010']],
263  [['day' => '13', 'month' => '10', 'year' => '-2010']],
264  ];
265  }
266 
272  {
273  $this->expectException(TypeConverterException::class);
274  $this->expectExceptionCode(1308003914);
275  $this->converter->convertFrom($source, 'DateTime');
276  }
277 
282  {
283  $source = ['day' => '13', 'month' => '10', 'year' => '2010'];
284  $mappingConfiguration = new ‪PropertyMappingConfiguration();
285  $mappingConfiguration->setTypeConverterOption(
286  DateTimeConverter::class,
288  'Y-m-d'
289  );
290 
291  $date = $this->converter->convertFrom($source, 'DateTime', [], $mappingConfiguration);
292  $actualResult = $date->format('Y-m-d');
293  self::assertSame('2010-10-13', $actualResult);
294  }
295 
300  {
301  $source = [
302  'date' => '2011-06-16',
303  'dateFormat' => 'Y-m-d',
304  'hour' => '12',
305  'minute' => '30',
306  'second' => '59',
307  ];
308  $date = $this->converter->convertFrom($source, 'DateTime');
309  self::assertSame('2011-06-16', $date->format('Y-m-d'));
310  self::assertSame('12', $date->format('H'));
311  self::assertSame('30', $date->format('i'));
312  self::assertSame('59', $date->format('s'));
313  }
314 
319  {
320  $source = [
321  'date' => '2011-06-16 12:30:59',
322  'dateFormat' => 'Y-m-d H:i:s',
323  'timezone' => 'Atlantic/Reykjavik',
324  ];
325  $date = $this->converter->convertFrom($source, 'DateTime');
326  self::assertSame('2011-06-16', $date->format('Y-m-d'));
327  self::assertSame('12', $date->format('H'));
328  self::assertSame('30', $date->format('i'));
329  self::assertSame('59', $date->format('s'));
330  self::assertSame('Atlantic/Reykjavik', $date->getTimezone()->getName());
331  }
332 
337  {
338  $this->expectException(TypeConverterException::class);
339  $this->expectExceptionCode(1308240974);
340  $source = [
341  'date' => '2011-06-16',
342  'dateFormat' => 'Y-m-d',
343  'timezone' => 'Invalid/Timezone',
344  ];
345  $this->converter->convertFrom($source, 'DateTime');
346  }
347 
352  {
353  $this->expectException(TypeConverterException::class);
354  $this->expectExceptionCode(1308003914);
355  $this->converter->convertFrom([], 'DateTime', [], null);
356  }
357 
362  {
363  self::assertNull($this->converter->convertFrom(['date' => ''], 'DateTime', [], null));
364  }
365 
370  public function ‪convertFromArrayDataProvider(): array
371  {
372  return [
373  [['date' => '2005-08-15T15:52:01+01:00'], true, '2005-08-15T15:52:01+01:00'],
374  [['date' => '1308174051', 'dateFormat' => ''], false, null],
375  [['date' => '13-12-1980', 'dateFormat' => 'd.m.Y'], false, null],
376  [['date' => '1308174051', 'dateFormat' => 'Y-m-d'], false, null],
377  [['date' => '12:13', 'dateFormat' => 'H:i'], true, null],
378  [['date' => '13.12.1980', 'dateFormat' => 'd.m.Y'], true, null],
379  [['date' => '2005-08-15T15:52:01+00:00', 'dateFormat' => ''], true, '2005-08-15T15:52:01+00:00'],
380  [['date' => '2005-08-15T15:52:01+00:00', 'dateFormat' => \DateTimeInterface::ATOM], true, '2005-08-15T15:52:01+00:00'],
381  [['date' => '1308174051', 'dateFormat' => 'U'], true, '2011-06-15T21:40:51+00:00'],
382  [['date' => 1308174051, 'dateFormat' => 'U'], true, '2011-06-15T21:40:51+00:00'],
383  [['date' => -1308174051, 'dateFormat' => 'U'], true, '1928-07-19T02:19:09+00:00'],
384  ];
385  }
386 
394  public function ‪convertFromArrayTests(array $source, $isValid, ?string $expectedResult): void
395  {
396  $dateFormat = isset($source['dateFormat']) && $source['dateFormat'] !== '' ? $source['dateFormat'] : null;
397  if ($dateFormat !== null) {
398  $mockMappingConfiguration = $this->createMock(PropertyMappingConfigurationInterface::class);
399  $mockMappingConfiguration
400  ->expects(self::atLeastOnce())
401  ->method('getConfigurationValue')
402  ->with(DateTimeConverter::class, ‪DateTimeConverter::CONFIGURATION_DATE_FORMAT)
403  ->willReturn($dateFormat);
404  } else {
405  $mockMappingConfiguration = null;
406  }
407  $date = $this->converter->convertFrom($source, 'DateTime', [], $mockMappingConfiguration);
408 
409  if ($isValid !== true) {
410  self::assertInstanceOf(Error::class, $date);
411  return;
412  }
413 
414  self::assertInstanceOf('DateTime', $date);
415  if ($dateFormat === null) {
417  }
418  $dateAsString = isset($source['date']) ? (string)$source['date'] : '';
419  self::assertSame($dateAsString, $date->format($dateFormat));
420  if ($expectedResult !== null) {
421  self::assertSame($expectedResult, $date->format('c'));
422  }
423  }
424 
429  {
430  $className = DateTimeSubFixture::class;
431  $date = $this->converter->convertFrom('2005-08-15T15:52:01+00:00', $className);
432 
433  self::assertInstanceOf($className, $date);
434  self::assertSame('Bar', $date->foo());
435  }
436 }
‪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:224
‪TYPO3\CMS\Extbase\Property\Exception\TypeConverterException
Definition: TypeConverterException.php:25
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\convertFromAllowsToOverrideTheTimezone
‪convertFromAllowsToOverrideTheTimezone()
Definition: DateTimeConverterTest.php:318
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\$converter
‪DateTimeConverter $converter
Definition: DateTimeConverterTest.php:33
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\convertFromIntegerOrDigitStringInArrayWithoutConfigurationTests
‪convertFromIntegerOrDigitStringInArrayWithoutConfigurationTests($source)
Definition: DateTimeConverterTest.php:206
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\convertFromArrayDataProvider
‪array convertFromArrayDataProvider()
Definition: DateTimeConverterTest.php:370
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\convertFromReturnsErrorIfGivenStringCantBeConverted
‪convertFromReturnsErrorIfGivenStringCantBeConverted()
Definition: DateTimeConverterTest.php:80
‪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\checkMetadata
‪checkMetadata()
Definition: DateTimeConverterTest.php:44
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\convertFromUsesDefaultDateFormatIfItIsNotConfigured
‪convertFromUsesDefaultDateFormatIfItIsNotConfigured()
Definition: DateTimeConverterTest.php:100
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\invalidDatePartKeyValuesDataProvider
‪array invalidDatePartKeyValuesDataProvider()
Definition: DateTimeConverterTest.php:255
‪TYPO3\CMS\Extbase\Property\PropertyMappingConfigurationInterface
Definition: PropertyMappingConfigurationInterface.php:22
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\convertFromProperlyConvertsArrayWithDefaultDateFormat
‪convertFromProperlyConvertsArrayWithDefaultDateFormat()
Definition: DateTimeConverterTest.php:243
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest
Definition: DateTimeConverterTest.php:32
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\convertFromArrayReturnsNullForEmptyDate
‪convertFromArrayReturnsNullForEmptyDate()
Definition: DateTimeConverterTest.php:361
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\canConvertFromReturnsFalseIfTargetTypeIsNotDateTime
‪canConvertFromReturnsFalseIfTargetTypeIsNotDateTime()
Definition: DateTimeConverterTest.php:56
‪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\convertFromArrayTests
‪convertFromArrayTests(array $source, $isValid, ?string $expectedResult)
Definition: DateTimeConverterTest.php:394
‪TYPO3\CMS\Extbase\Property\PropertyMappingConfiguration
Definition: PropertyMappingConfiguration.php:22
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\convertFromStringTests
‪convertFromStringTests($source, $dateFormat, $isValid)
Definition: DateTimeConverterTest.php:149
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\convertFromProperlyConvertsArrayWithDateAsArray
‪convertFromProperlyConvertsArrayWithDateAsArray()
Definition: DateTimeConverterTest.php:281
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\convertFromThrowsExceptionIfGivenArrayDoesNotSpecifyTheDate
‪convertFromThrowsExceptionIfGivenArrayDoesNotSpecifyTheDate()
Definition: DateTimeConverterTest.php:233
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\convertFromIntegerOrDigitStringsWithoutConfigurationDataProvider
‪array convertFromIntegerOrDigitStringsWithoutConfigurationDataProvider()
Definition: DateTimeConverterTest.php:179
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\convertFromEmptyStringReturnsNull
‪convertFromEmptyStringReturnsNull()
Definition: DateTimeConverterTest.php:118
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\canConvertFromReturnsTrueIfSourceTypeIsAnArray
‪canConvertFromReturnsTrueIfSourceTypeIsAnArray()
Definition: DateTimeConverterTest.php:216
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\convertFromStringDataProvider
‪array convertFromStringDataProvider()
Definition: DateTimeConverterTest.php:128
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\convertFromProperlyConvertsStringWithDefaultDateFormat
‪convertFromProperlyConvertsStringWithDefaultDateFormat()
Definition: DateTimeConverterTest.php:89
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\convertFromIntegerOrDigitStringWithoutConfigurationTests
‪convertFromIntegerOrDigitStringWithoutConfigurationTests($source)
Definition: DateTimeConverterTest.php:192
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\canConvertFromReturnsTrueIfSourceTypeIsAString
‪canConvertFromReturnsTrueIfSourceTypeIsAString()
Definition: DateTimeConverterTest.php:64
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\convertFromThrowsExceptionIfDatePartKeysHaveInvalidValuesSpecified
‪convertFromThrowsExceptionIfDatePartKeysHaveInvalidValuesSpecified($source)
Definition: DateTimeConverterTest.php:271
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\convertFromAllowsToOverrideTheTime
‪convertFromAllowsToOverrideTheTime()
Definition: DateTimeConverterTest.php:299
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\canConvertFromReturnsTrueIfSourceTypeIsAnEmptyString
‪canConvertFromReturnsTrueIfSourceTypeIsAnEmptyString()
Definition: DateTimeConverterTest.php:72
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\convertFromThrowsExceptionIfSpecifiedTimezoneIsInvalid
‪convertFromThrowsExceptionIfSpecifiedTimezoneIsInvalid()
Definition: DateTimeConverterTest.php:336
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\setUp
‪setUp()
Definition: DateTimeConverterTest.php:35
‪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:351
‪TYPO3\CMS\Extbase\Tests\Unit\Property\TypeConverter\DateTimeConverterTest\convertFromSupportsDateTimeSubClasses
‪convertFromSupportsDateTimeSubClasses()
Definition: DateTimeConverterTest.php:428