1<?php 2 3namespace Drupal\KernelTests\Core\Datetime; 4 5use Drupal\KernelTests\KernelTestBase; 6use Drupal\language\Entity\ConfigurableLanguage; 7 8/** 9 * Tests date formatting. 10 * 11 * @group Common 12 * @coversDefaultClass \Drupal\Core\Datetime\DateFormatter 13 */ 14class DateFormatterTest extends KernelTestBase { 15 16 /** 17 * {@inheritdoc} 18 */ 19 public static $modules = ['language', 'system']; 20 21 /** 22 * Arbitrary langcode for a custom language. 23 */ 24 const LANGCODE = 'xx'; 25 26 /** 27 * {@inheritdoc} 28 */ 29 protected function setUp() { 30 parent::setUp(); 31 32 $this->installConfig(['system']); 33 34 $this->setSetting('locale_custom_strings_' . self::LANGCODE, [ 35 '' => ['Sunday' => 'domingo'], 36 'Long month name' => ['March' => 'marzo'], 37 ]); 38 39 $formats = $this->container->get('entity_type.manager') 40 ->getStorage('date_format') 41 ->loadMultiple(['long', 'medium', 'short']); 42 $formats['long']->setPattern('l, j. F Y - G:i')->save(); 43 $formats['medium']->setPattern('j. F Y - G:i')->save(); 44 $formats['short']->setPattern('Y M j - g:ia')->save(); 45 46 ConfigurableLanguage::createFromLangcode(static::LANGCODE)->save(); 47 } 48 49 /** 50 * Tests DateFormatter::format(). 51 * 52 * @covers ::format 53 */ 54 public function testFormat() { 55 /** @var \Drupal\Core\Datetime\DateFormatterInterface $formatter */ 56 $formatter = $this->container->get('date.formatter'); 57 /** @var \Drupal\Core\Language\LanguageManagerInterface $language_manager */ 58 $language_manager = $this->container->get('language_manager'); 59 60 $timestamp = strtotime('2007-03-26T00:00:00+00:00'); 61 $this->assertSame('Sunday, 25-Mar-07 17:00:00 PDT', $formatter->format($timestamp, 'custom', 'l, d-M-y H:i:s T', 'America/Los_Angeles', 'en'), 'Test all parameters.'); 62 $this->assertSame('domingo, 25-Mar-07 17:00:00 PDT', $formatter->format($timestamp, 'custom', 'l, d-M-y H:i:s T', 'America/Los_Angeles', self::LANGCODE), 'Test translated format.'); 63 $this->assertSame('l, 25-Mar-07 17:00:00 PDT', $formatter->format($timestamp, 'custom', '\\l, d-M-y H:i:s T', 'America/Los_Angeles', self::LANGCODE), 'Test an escaped format string.'); 64 $this->assertSame('\\domingo, 25-Mar-07 17:00:00 PDT', $formatter->format($timestamp, 'custom', '\\\\l, d-M-y H:i:s T', 'America/Los_Angeles', self::LANGCODE), 'Test format containing backslash character.'); 65 $this->assertSame('\\l, 25-Mar-07 17:00:00 PDT', $formatter->format($timestamp, 'custom', '\\\\\\l, d-M-y H:i:s T', 'America/Los_Angeles', self::LANGCODE), 'Test format containing backslash followed by escaped format string.'); 66 $this->assertSame('Monday, 26-Mar-07 01:00:00 BST', $formatter->format($timestamp, 'custom', 'l, d-M-y H:i:s T', 'Europe/London', 'en'), 'Test a different time zone.'); 67 $this->assertSame('Thu, 01/01/1970 - 00:00', $formatter->format(0, 'custom', '', 'UTC', 'en'), 'Test custom format with empty string.'); 68 69 // Make sure we didn't change the configuration override language. 70 $this->assertSame('en', $language_manager->getConfigOverrideLanguage()->getId(), 'Configuration override language not disturbed,'); 71 72 // Test bad format string will use the fallback format. 73 $this->assertSame($formatter->format($timestamp, 'fallback'), $formatter->format($timestamp, 'bad_format_string'), 'Test fallback format.'); 74 $this->assertSame('en', $language_manager->getConfigOverrideLanguage()->getId(), 'Configuration override language not disturbed,'); 75 76 // Change the default language and timezone. 77 $this->config('system.site')->set('default_langcode', static::LANGCODE)->save(); 78 date_default_timezone_set('America/Los_Angeles'); 79 80 // Reset the language manager so new negotiations attempts will fall back on 81 // on the new language. 82 $language_manager->reset(); 83 $this->assertSame('en', $language_manager->getConfigOverrideLanguage()->getId(), 'Configuration override language not disturbed,'); 84 85 $this->assertSame('Sunday, 25-Mar-07 17:00:00 PDT', $formatter->format($timestamp, 'custom', 'l, d-M-y H:i:s T', 'America/Los_Angeles', 'en'), 'Test a different language.'); 86 $this->assertSame('Monday, 26-Mar-07 01:00:00 BST', $formatter->format($timestamp, 'custom', 'l, d-M-y H:i:s T', 'Europe/London'), 'Test a different time zone.'); 87 $this->assertSame('domingo, 25-Mar-07 17:00:00 PDT', $formatter->format($timestamp, 'custom', 'l, d-M-y H:i:s T'), 'Test custom date format.'); 88 $this->assertSame('domingo, 25. marzo 2007 - 17:00', $formatter->format($timestamp, 'long'), 'Test long date format.'); 89 $this->assertSame('25. marzo 2007 - 17:00', $formatter->format($timestamp, 'medium'), 'Test medium date format.'); 90 $this->assertSame('2007 Mar 25 - 5:00pm', $formatter->format($timestamp, 'short'), 'Test short date format.'); 91 $this->assertSame('25. marzo 2007 - 17:00', $formatter->format($timestamp), 'Test default date format.'); 92 // Test HTML time element formats. 93 $this->assertSame('2007-03-25T17:00:00-0700', $formatter->format($timestamp, 'html_datetime'), 'Test html_datetime date format.'); 94 $this->assertSame('2007-03-25', $formatter->format($timestamp, 'html_date'), 'Test html_date date format.'); 95 $this->assertSame('17:00:00', $formatter->format($timestamp, 'html_time'), 'Test html_time date format.'); 96 $this->assertSame('03-25', $formatter->format($timestamp, 'html_yearless_date'), 'Test html_yearless_date date format.'); 97 $this->assertSame('2007-W12', $formatter->format($timestamp, 'html_week'), 'Test html_week date format.'); 98 $this->assertSame('2007-03', $formatter->format($timestamp, 'html_month'), 'Test html_month date format.'); 99 $this->assertSame('2007', $formatter->format($timestamp, 'html_year'), 'Test html_year date format.'); 100 101 // Make sure we didn't change the configuration override language. 102 $this->assertSame('en', $language_manager->getConfigOverrideLanguage()->getId(), 'Configuration override language not disturbed,'); 103 104 // Test bad format string will use the fallback format. 105 $this->assertSame($formatter->format($timestamp, 'fallback'), $formatter->format($timestamp, 'bad_format_string'), 'Test fallback format.'); 106 $this->assertSame('en', $language_manager->getConfigOverrideLanguage()->getId(), 'Configuration override language not disturbed,'); 107 108 // HTML is not escaped by the date formatter, it must be escaped later. 109 $this->assertSame("<script>alert('2007');</script>", $formatter->format($timestamp, 'custom', '\<\s\c\r\i\p\t\>\a\l\e\r\t\(\'Y\'\)\;\<\/\s\c\r\i\p\t\>'), 'Script tags not removed from dates.'); 110 $this->assertSame('<em>2007</em>', $formatter->format($timestamp, 'custom', '\<\e\m\>Y\<\/\e\m\>'), 'Em tags are not removed from dates.'); 111 } 112 113} 114