| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 | <?php/** * @file * Common functions for Location tests. */class LocationTestCase extends DrupalWebTestCase {  /**   * Custom assertion -- will check each element of an array against a reference value.   */  function assertArrayEpsilon($result, $expected, $epsilon, $message = '', $group = 'Other') {    foreach ($expected as $k => $test) {      $lower = $test - $epsilon;      $upper = $test + $epsilon;      if ($result[$k] < $lower || $result[$k] > $upper) {        $this->_assert('fail', $message ? $message : t('Value deviates by @amt, which is more than @maxdev.', array('@amt' => abs($test - $result[$k]), '@maxdev' => $epsilon)), $group);      }      else {        $this->_assert('pass', $message ? $message : t('Value within expected margin.'), $group);      }    }  }  /**   * Get a set of location field defaults.   * This will also enable collection on all parts of the location field.   */  function getLocationFieldDefaults() {    // Get the (settable) defaults.    $defaults = array();    $d = location_invoke_locationapi($location, 'defaults');    $fields = location_field_names();    foreach ($fields as $k => $v) {      if (!isset($d[$k]['nodiff'])) {        $defaults[$k] = $d[$k];      }    }    foreach ($defaults as $k => $v) {      // Change collection to allow.      $defaults[$k]['collect'] = 1;    }    return $defaults;  }  /**   * Flatten a post settings array because drupalPost isn't smart enough to.   */  function flattenPostData(&$edit) {    do {      $edit_flattened = TRUE;      foreach ($edit as $k => $v) {        if (is_array($v)) {          $edit_flattened = FALSE;          foreach ($v as $kk => $vv) {            $edit["{$k}[{$kk}]"] = $vv;          }          unset($edit[$k]);        }      }    } while (!$edit_flattened);  }  function addLocationContentType(&$settings, $add = array()) {    // find a non-existent random type name.    do {      $name = strtolower($this->randomName(3, 'type_'));    } while (node_get_types('type', $name));    // Get the (settable) defaults.    $defaults = $this->getLocationFieldDefaults();    $settings = array(      'name' => $name,      'type' => $name,      'location_settings' => array(        'multiple' => array(          'max' => 1,          'add' => 1,        ),        'form' => array(          'fields' => $defaults,        ),      ),    );    //$settings['location_settings'] = array_merge_recursive($settings['location_settings'], $add);    $this->flattenPostData($settings);    $add = array('location_settings' => $add);    $this->flattenPostData($add);    $settings = array_merge($settings, $add);    $this->drupalPost('admin/content/types/add', $settings, 'Save content type');    $this->refreshVariables();    $settings = variable_get('location_settings_node_'. $name, array());    return $name;  }  /**   * Delete a node.   */  function deleteNode($nid) {    // Implemention taken from node_delete, with some assumptions regarding    // function_exists removed.    $node = node_load($nid);    db_query('DELETE FROM {node} WHERE nid = %d', $node->nid);    db_query('DELETE FROM {node_revisions} WHERE nid = %d', $node->nid);    // Call the node-specific callback (if any):    node_invoke($node, 'delete');    node_invoke_nodeapi($node, 'delete');    // Clear the page and block caches.    cache_clear_all();  }  /**   * Order locations in a node by LID for testing repeatability purposes.   */  function reorderLocations(&$node, $field = 'locations') {    $locations = array();    foreach ($node->{$field} as $location) {      if ($location['lid']) {        $locations[$location['lid']] = $location;      }    }    ksort($locations);    $node->{$field} = array();    foreach ($locations as $location) {      $node->{$field}[] = $location;    }  }  /**   * Creates a node based on default settings. This uses the internal simpletest   * browser, meaning the node will be owned by the current simpletest _browser user.   *   * Code modified from #212304.   * This is mainly for testing for differences between node_save() and   * submitting a node/add/* form.   *   * @param values   *   An associative array of values to change from the defaults, keys are   *   node properties, for example 'body' => 'Hello, world!'.   * @return object Created node object.   */  function drupalCreateNodeViaForm($values = array()) {    $defaults = array(      'type' => 'page',      'title' => $this->randomName(8),     );    $edit = ($values + $defaults);    if (empty($edit['body'])) {      $content_type = db_fetch_array(db_query("select name, has_body from {node_type} where type='%s'", $edit['type']));      if ($content_type['has_body']) {        $edit['body'] = $this->randomName(32);      }    }    $type = $edit['type'];    unset($edit['type']); // Only used in URL.    $this->flattenPostData($edit); // Added by me.    $this->drupalPost('node/add/'. str_replace('_', '-', $type), $edit, t('Save'));    $node = node_load(array('title' => $edit['title']));    $this->assertRaw(t('@type %title has been created.', array('@type' => node_get_types('name', $node), '%title' => $edit['title'])), t('Node created successfully.'));    return $node;  }}
 |