You are here

date_popup_authored_format.test in Date Popup Authored 7

Simpletest case for Date Popup Authored.

Verify Date Popup Authored functionality.

File

tests/date_popup_authored_format.test
View source
<?php

/**
 * @file
 * Simpletest case for Date Popup Authored.
 *
 * Verify Date Popup Authored functionality.
 */

/**
 * Functionality tests for Date Popup Authored.
 */
class DatePopupAuthoredTestCase extends PageEditTestCase {
  public static function getInfo() {
    return array(
      'name' => 'Page editing with Date Popup Authored',
      'description' => 'Verify Date Popup Authored does not interfere with page editing.',
      'group' => 'Date Popup Authored',
    );
  }
  function setUp() {

    // Enable the module.
    DrupalWebTestCase::setUp('date_popup_authored');

    // Create users for test cases.
    $this->web_user = $this
      ->drupalCreateUser(array(
      'edit own page content',
      'create page content',
    ));
    $this->admin_user = $this
      ->drupalCreateUser(array(
      'bypass node access',
      'administer nodes',
    ));
  }

  /**
   * Check changing node authored on fields.
   */
  function testPageAuthoredOnEdit() {
    $this
      ->drupalLogin($this->admin_user);

    // Create node to edit.
    $langcode = LANGUAGE_NONE;
    $body_key = "body[{$langcode}][0][value]";
    $edit = array();
    $edit['title'] = $this
      ->randomName(8);
    $edit[$body_key] = $this
      ->randomName(16);
    $this
      ->drupalPost('node/add/page', $edit, t('Save'));
    $node = $this
      ->drupalGetNodeByTitle($edit['title']);
    $node->date = format_date($node->created, 'custom', 'Y-m-d H:i:s O');

    // Check that the Authored On field's format does not mangle the saved date.
    $this
      ->checkAuthoredOnWithFormat('M d, Y', $node);
    $this
      ->checkAuthoredOnWithFormat('M, Y', $node);
    $this
      ->checkAuthoredOnWithFormat('M d, Y H:i', $node);
    $this
      ->checkAuthoredOnWithFormat('m/d/Y - H:i:s', $node);
    $this
      ->checkAuthoredOnWithFormat('d M Y - g:i A', $node);
  }

  /**
   * Check to see if Date Popup Authored keeps the Authored On field intact.
   *
   * Date Popup cleverly handles how to replace regular text fields: if the date
   * format has both a date and time component, it creates one textfield for the
   * date and one for the time.
   *
   * Because of this, the node date needs to be split into date and time parts
   * so it can be compared with the date popup on the node submission form.
   *
   * @param $format
   *  The date format to test.
   * @param $node
   *  The node object to test the date format with.
   * @param $timezone
   *  Optionally, a timezone to test with.
   */
  function checkAuthoredOnWithFormat($format, $node, $timezone = '') {
    $timezone = !empty($timezone) ? $timezone : date_default_timezone_object();

    // Extract the date and time format parts
    $granularity = date_format_order($format);
    $date_format = date_limit_format($format, array_intersect($granularity, array(
      'month',
      'day',
      'year',
    )));
    $time_format = date_popup_format_to_popup_time(date_limit_format($format, array_intersect($granularity, array(
      'hour',
      'minute',
      'second',
    ))));

    // Generate a DateObject object for the node date.
    $node_date = DateObject::createFromFormat('Y-m-d H:i:s O', $node->date, $timezone);

    // Extract the date and time parts as seen on the node submission form
    $default_format = variable_get('date_popup_authored_format_page', variable_get('date_format_short', 'm/d/Y - H:i'));
    variable_set('date_popup_authored_format_page', $format);
    $this
      ->drupalGet('node/' . $node->nid . '/edit');
    $elements = $this
      ->xpath("//input[starts-with(@name, 'date[')]");
    $submitted_date_string = '';
    foreach ($elements as $element) {
      if ((string) $element['name'] === 'date[date]') {
        $this
          ->assertIdentical($node_date
          ->format($date_format), (string) $element['value'], 'The node date and submission form have identical dates.');
      }
      elseif ((string) $element['name'] === 'date[time]') {
        $this
          ->assertIdentical($node_date
          ->format($time_format), (string) $element['value'], 'The node date and submission form have identical times.');
      }
    }

    // Reset format back to default
    variable_set('date_popup_authored_format_page', $format);
  }

  /**
   * Tests form field validation.
   */
  function testFieldValidation() {

    // Define some test cases.
    $test_cases = array(
      array(
        'description' => 'a valid date field and a missing time field',
        'date' => '02/07/2014',
        'time' => '',
        'valid' => FALSE,
      ),
      array(
        'description' => 'a valid date field and a valid time field',
        'date' => '02/07/2014',
        'time' => '12:00',
        'valid' => TRUE,
      ),
    );

    // Log in as administrator.
    $this
      ->drupalLogin($this->admin_user);

    // Test the test cases.
    foreach ($test_cases as $test_case) {
      $edit = array(
        'title' => $this
          ->randomString(),
        'date[date]' => $test_case['date'],
        'date[time]' => $test_case['time'],
      );
      $this
        ->drupalPost('node/add/page', $edit, t('Save'));
      $error_messages = $this
        ->xpath('//div[contains(@class, "error")]');
      $message = format_string('When submitting a node with @description the form validation correctly @result.', array(
        '@description' => $test_case['description'],
        '@result' => $test_case['valid'] ? 'succeeds' : 'fails',
      ));
      $this
        ->assertEqual(empty($error_messages), $test_case['valid'], $message);
    }
  }

  /**
   * Tests variable cleanup after a content type is removed.
   */
  function testVariableCleanupAfterNodeTypeRemoval() {
    $node_type_name = strtolower($this
      ->randomName(8) . '_test');
    $node_type = $this
      ->drupalCreateContentType(array(
      'name' => $node_type_name,
      'type' => $node_type_name,
    ));
    variable_set('date_popup_authored_enabled_' . $node_type_name, 'foo');
    variable_set('date_popup_authored_format_' . $node_type_name, 'foo');
    variable_set('date_popup_authored_year_range_' . $node_type_name, 'foo');
    node_type_delete($node_type_name);
    $this
      ->assertNull(variable_get('date_popup_authored_enabled_' . $node_type_name));
    $this
      ->assertNull(variable_get('date_popup_authored_format_' . $node_type_name));
    $this
      ->assertNull(variable_get('date_popup_authored_year_range_' . $node_type_name));
  }

  /**
   * Tests variable cleanup after Date Popup Authored is uninstalled.
   */
  function testVariableCleanupAfterUninstall() {
    variable_set('date_popup_authored_enabled_page', 'foo');
    variable_set('date_popup_authored_format_page', 'foo');
    variable_set('date_popup_authored_year_range_page', 'foo');
    module_disable(array(
      'date_popup_authored',
    ));
    drupal_uninstall_modules(array(
      'date_popup_authored',
    ));
    $this
      ->assertNull(variable_get('date_popup_authored_enabled_page'));
    $this
      ->assertNull(variable_get('date_popup_authored_format_page'));
    $this
      ->assertNull(variable_get('date_popup_authored_year_range_page'));
  }

}

Classes

Namesort descending Description
DatePopupAuthoredTestCase Functionality tests for Date Popup Authored.