public function DrupalDateTimeTest::testDateTimezone

Test that DrupalDateTime can detect the right timezone to use. Test with a variety of less commonly used timezone names to help ensure that the system timezone will be different than the stated timezones.

File

drupal/core/modules/system/lib/Drupal/system/Tests/Datetime/DrupalDateTimeTest.php, line 45
Definition of Drupal\system\Tests\Datetime\DateTimePlusTest.

Class

DrupalDateTimeTest

Namespace

Drupal\system\Tests\Datetime

Code

public function testDateTimezone() {
  global $user;
  $date_string = '2007-01-31 21:00:00';

  // Make sure no site timezone has been set.
  config('system.date')
    ->set('timezone.default', NULL)
    ->save();
  config('system.date')
    ->set('timezone.user.configurable', 0)
    ->save();

  // Detect the system timezone.
  $system_timezone = date_default_timezone_get();

  // Create a date object with an unspecified timezone, which should
  // end up using the system timezone.
  $date = new DrupalDateTime($date_string);
  $timezone = $date
    ->getTimezone()
    ->getName();
  $this
    ->assertTrue($timezone == $system_timezone, 'DrupalDateTime uses the system timezone when there is no site timezone.');

  // Create a date object with a specified timezone.
  $date = new DrupalDateTime($date_string, 'America/Yellowknife');
  $timezone = $date
    ->getTimezone()
    ->getName();
  $this
    ->assertTrue($timezone == 'America/Yellowknife', 'DrupalDateTime uses the specified timezone if provided.');

  // Set a site timezone.
  config('system.date')
    ->set('timezone.default', 'Europe/Warsaw')
    ->save();

  // Create a date object with an unspecified timezone, which should
  // end up using the site timezone.
  $date = new DrupalDateTime($date_string);
  $timezone = $date
    ->getTimezone()
    ->getName();
  $this
    ->assertTrue($timezone == 'Europe/Warsaw', 'DrupalDateTime uses the site timezone if provided.');

  // Create user.
  config('system.date')
    ->set('timezone.user.configurable', 1)
    ->save();
  $test_user = $this
    ->drupalCreateUser(array());
  $this
    ->drupalLogin($test_user);

  // Set up the user with a different timezone than the site.
  $edit = array(
    'mail' => $test_user->mail,
    'timezone' => 'Asia/Manila',
  );
  $this
    ->drupalPost('user/' . $test_user->uid . '/edit', $edit, t('Save'));

  // Disable session saving as we are about to modify the global $user.
  drupal_save_session(FALSE);

  // Save the original user and then replace it with the test user.
  $real_user = $user;
  $user = user_load($test_user->uid, TRUE);

  // Simulate a Drupal bootstrap with the logged-in user.
  date_default_timezone_set(drupal_get_user_timezone());

  // Create a date object with an unspecified timezone, which should
  // end up using the user timezone.
  $date = new DrupalDateTime($date_string);
  $timezone = $date
    ->getTimezone()
    ->getName();
  $this
    ->assertTrue($timezone == 'Asia/Manila', 'DrupalDateTime uses the user timezone, if configurable timezones are used and it is set.');

  // Restore the original user, and enable session saving.
  $user = $real_user;

  // Restore default time zone.
  date_default_timezone_set(drupal_get_user_timezone());
  drupal_save_session(TRUE);
}