function TimezoneTest::assertTimesUnderstoodCorrectly

Same name and namespace in other branches
  1. 9 core/tests/Drupal/KernelTests/Core/Datetime/Element/TimezoneTest.php \Drupal\KernelTests\Core\Datetime\Element\TimezoneTest::assertTimesUnderstoodCorrectly()
  2. 10 core/tests/Drupal/KernelTests/Core/Datetime/Element/TimezoneTest.php \Drupal\KernelTests\Core\Datetime\Element\TimezoneTest::assertTimesUnderstoodCorrectly()
  3. 11.x core/tests/Drupal/KernelTests/Core/Datetime/Element/TimezoneTest.php \Drupal\KernelTests\Core\Datetime\Element\TimezoneTest::assertTimesUnderstoodCorrectly()

Asserts that elements interpret dates using the expected time zones.

Parameters

string $elementType: The element type to test.

array $inputs: The names of the default input elements used by this element type.

Throws

\Exception

2 calls to TimezoneTest::assertTimesUnderstoodCorrectly()
TimezoneTest::testDatelistElementTimesUnderstoodCorrectly in core/tests/Drupal/KernelTests/Core/Datetime/Element/TimezoneTest.php
Tests datelist elements interpret their times correctly when saving.
TimezoneTest::testDatetimeElementTimesUnderstoodCorrectly in core/tests/Drupal/KernelTests/Core/Datetime/Element/TimezoneTest.php
Tests datetime elements interpret their times correctly when saving.

File

core/tests/Drupal/KernelTests/Core/Datetime/Element/TimezoneTest.php, line 256

Class

TimezoneTest
Tests the timezone handling of datetime and datelist element types.

Namespace

Drupal\KernelTests\Core\Datetime\Element

Code

protected function assertTimesUnderstoodCorrectly($elementType, array $inputs) {
    $this->elementType = $elementType;
    // Simulate the form being saved, with the user adding the date for any
    // initially empty elements, but not changing other elements.
    $form_state = new FormState();
    $form_builder = $this->container
        ->get('form_builder');
    $form = $this->setupForm($form_state, $form_builder);
    foreach ($form as $elementName => $element) {
        if (isset($element['#type']) && $element['#type'] === $this->elementType && $element['#default_value'] === '') {
            $newValues = [];
            // Build an array of new values for the initially empty elements,
            // depending on the inputs required by the element type, and using
            // the timezone that will be expected for that test element.
            foreach ($inputs as $input) {
                $newValues[$input] = $this->formattedDates[$input][$element['#test_expect_timezone']];
            }
            $form_state->setValue([
                $elementName,
            ], $newValues);
        }
    }
    $form_builder->submitForm($this, $form_state);
    // Examine the output of each test element.
    $utc = new \DateTimeZone('UTC');
    $expectedDateUTC = clone $this->date;
    $expectedDateUTC->setTimezone($utc)
        ->format('Y-m-d H:i:s');
    $wrongDates = [];
    $wrongTimezones = [];
    $rightDates = 0;
    foreach ($form_state->getCompleteForm() as $elementName => $element) {
        if (isset($element['#type']) && $element['#type'] === $this->elementType) {
            $actualDate = $form_state->getValue($elementName);
            $actualTimezone = array_search($actualDate->getTimezone()
                ->getName(), $this->timezones);
            $actualDateUTC = $actualDate->setTimezone($utc)
                ->format('Y-m-d H:i:s');
            // Check that $this->date has not anywhere been accidentally changed
            // from its default timezone, invalidating the test logic.
            $this->assertEquals(date_default_timezone_get(), $this->date
                ->getTimezone()
                ->getName(), "Test date still set to user timezone.");
            // Build a list of cases where the result is not as expected.
            // Check the time has been understood correctly.
            if ($actualDate != $this->date) {
                $wrongDates[$element['#title']] = $actualDateUTC;
            }
            else {
                // Explicitly counting test passes prevents the test from seeming to
                // pass just because the whole loop is being skipped.
                $rightDates++;
            }
            // Check the correct timezone is set on the value object.
            if ($element['#test_expect_timezone'] !== $actualTimezone) {
                $wrongTimezones[$element['#title']] = [
                    $element['#test_expect_timezone'],
                    $actualTimezone,
                ];
            }
        }
    }
    $message = "On all elements the time should be understood correctly as {$expectedDateUTC}: \n" . print_r($wrongDates, TRUE);
    $this->assertEquals($this->testConditions, $rightDates, $message);
    $message = "On all elements the correct timezone should be set on the value object: (expected, actual) \n" . print_r($wrongTimezones, TRUE);
    $this->assertCount(0, $wrongTimezones, $message);
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.