You are here

public function WebformElementDateTimeTest::testDateTime in Webform 6.x

Same name and namespace in other branches
  1. 8.5 tests/src/Functional/Element/WebformElementDateTimeTest.php \Drupal\Tests\webform\Functional\Element\WebformElementDateTimeTest::testDateTime()

Test datetime element.

File

tests/src/Functional/Element/WebformElementDateTimeTest.php, line 33

Class

WebformElementDateTimeTest
Tests for webform datetime element.

Namespace

Drupal\Tests\webform\Functional\Element

Code

public function testDateTime() {
  $webform = Webform::load('test_element_datetime');

  // Check posted submission values.
  $this
    ->postSubmission($webform);
  $this
    ->assertRaw("datetime_default: '2009-08-18T16:00:00+1000'");
  $this
    ->assertRaw("datetime_multiple:\n  - '2009-08-18T16:00:00+1000'");
  $this
    ->assertRaw("datetime_custom_composite:\n  - datetime: '2009-08-18T16:00:00+1000'");
  $this
    ->drupalGet('/webform/test_element_datetime');

  // Check datetime label has not for attributes.
  $this
    ->assertRaw('<label>datetime_default</label>');

  // Check '#format' values.
  $this
    ->assertFieldByName('datetime_default[date]', '2009-08-18');
  $this
    ->assertFieldByName('datetime_default[time]', '16:00:00');

  // Check datepicker and timepicker.
  $now_date = date('D, m/d/Y', strtotime('now'));
  if (floatval(\Drupal::VERSION) >= 9) {
    $this
      ->assertRaw('<input data-drupal-selector="edit-datetime-datepicker-timepicker-date" title="Date (e.g. ' . $now_date . ')" type="text" min="Mon, 01/01/1900" max="Sat, 12/31/2050" data-drupal-date-format="D, m/d/Y" placeholder="YYYY-MM-DD" data-help="Enter the date using the format YYYY-MM-DD (e.g., ' . $now_date . ')." id="edit-datetime-datepicker-timepicker-date" name="datetime_datepicker_timepicker[date]" value="Tue, 08/18/2009" size="15" maxlength="128" class="form-text" />');
  }
  else {
    $this
      ->assertRaw('<input data-drupal-selector="edit-datetime-datepicker-timepicker-date" title="Date (e.g. ' . $now_date . ')" type="text" min="Mon, 01/01/1900" max="Sat, 12/31/2050" data-drupal-date-format="D, m/d/Y" id="edit-datetime-datepicker-timepicker-date" name="datetime_datepicker_timepicker[date]" value="Tue, 08/18/2009" size="15" maxlength="128" class="form-text" />');
  }
  $this
    ->assertRaw('<input data-drupal-selector="edit-datetime-datepicker-timepicker-time"');

  // Skip time which can change during the tests.
  $this
    ->assertRaw('id="edit-datetime-datepicker-timepicker-time" name="datetime_datepicker_timepicker[time]" value="4:00 PM" size="12" maxlength="12" class="form-time webform-time" />');

  // Check date/time placeholder attribute.
  $this
    ->assertRaw(' type="text" data-drupal-date-format="Y-m-d" placeholder="{date}"');
  $this
    ->assertRaw(' type="text" step="1" data-webform-time-format="H:i:s" placeholder="{time}"');

  // Check time with custom min/max/step attributes.
  $this
    ->assertRaw('<input min="2009-01-01" data-min-year="2009" max="2009-12-31" data-max-year="2009" data-drupal-selector="edit-datetime-time-min-max-date"');
  $this
    ->assertRaw('<input min="09:00:00" max="17:00:00" data-drupal-selector="edit-datetime-time-min-max-time"');
  $this
    ->assertRaw('<input min="Thu, 01/01/2009" data-min-year="2009" max="Thu, 12/31/2009" data-max-year="2009" data-drupal-selector="edit-datetime-datepicker-timepicker-time-min-max-date"');
  $this
    ->assertRaw('<input min="09:00:00" max="17:00:00" data-drupal-selector="edit-datetime-datepicker-timepicker-time-min-max-time"');

  // Check 'datelist' and 'datetime' #default_value.
  $form = $webform
    ->getSubmissionForm();
  $this
    ->assertInstanceOf(DrupalDateTime::class, $form['elements']['datetime_default']['#default_value']);

  // Check datetime #date_date_max validation.
  $edit = [
    'datetime_min_max[date]' => '2010-08-18',
  ];
  $this
    ->drupalPostForm('/webform/test_element_datetime', $edit, 'Submit');
  $this
    ->assertRaw('<em class="placeholder">datetime_min_max</em> must be on or before <em class="placeholder">2009-12-31</em>.');

  // Check datetime #date_date_min validation.
  $edit = [
    'datetime_min_max[date]' => '2006-08-18',
  ];
  $this
    ->drupalPostForm('/webform/test_element_datetime', $edit, 'Submit');
  $this
    ->assertRaw('<em class="placeholder">datetime_min_max</em> must be on or after <em class="placeholder">2009-01-01</em>.');

  // Check datetime #date_max date validation.
  $edit = [
    'datetime_min_max_time[date]' => '2009-12-31',
    'datetime_min_max_time[time]' => '19:00:00',
  ];
  $this
    ->drupalPostForm('/webform/test_element_datetime', $edit, 'Submit');
  $this
    ->assertRaw('<em class="placeholder">datetime_min_max_time</em> must be on or before <em class="placeholder">2009-12-31 17:00:00</em>.');

  // Check datetime #date_min date validation.
  $edit = [
    'datetime_min_max_time[date]' => '2009-01-01',
    'datetime_min_max_time[time]' => '08:00:00',
  ];
  $this
    ->drupalPostForm('/webform/test_element_datetime', $edit, 'Submit');
  $this
    ->assertRaw('<em class="placeholder">datetime_min_max_time</em> must be on or after <em class="placeholder">2009-01-01 09:00:00</em>.');

  // Check datetime #date_max time validation.
  $edit = [
    'datetime_min_max_time[time]' => '01:00:00',
  ];
  $this
    ->drupalPostForm('/webform/test_element_datetime', $edit, 'Submit');
  $this
    ->assertRaw('<em class="placeholder">datetime_min_max_time: Time</em> must be on or after <em class="placeholder">09:00:00</em>.');
  $this
    ->assertRaw('<em class="placeholder">datetime_min_max_time</em> must be on or after <em class="placeholder">2009-01-01 09:00:00</em>.');

  // Check datetime #date_min time validation.
  $edit = [
    'datetime_min_max_time[time]' => '01:00:00',
  ];
  $this
    ->drupalPostForm('/webform/test_element_datetime', $edit, 'Submit');
  $this
    ->assertRaw('<em class="placeholder">datetime_min_max_time: Time</em> must be on or after <em class="placeholder">09:00:00</em>.');
  $this
    ->assertRaw('<em class="placeholder">datetime_min_max_time</em> must be on or after <em class="placeholder">2009-01-01 09:00:00</em>.');

  // Check: Issue #2723159: Datetime form element cannot validate when using a
  // format without seconds.
  $sid = $this
    ->postSubmission($webform);
  $submission = WebformSubmission::load($sid);
  $this
    ->assertNoRaw('The datetime_no_seconds date is invalid.');
  $this
    ->assertEqual($submission
    ->getElementData('datetime_no_seconds'), '2009-08-18T16:00:00+1000');
}