You are here

geofield.test in Geofield 7.2

Tests for geofield.module.

File

tests/geofield.test
View source
<?php

/**
 * @file
 * Tests for geofield.module.
 */
class GeofieldBaseTestCase extends FieldTestCase {
  function _testWKTFormatter($id, $geometry, $label) {
    $entity = field_test_entity_test_load($id);
    $entity->content = field_attach_view('test_entity', $entity, 'full');
    $this->content = drupal_render($entity->content);
    $value = $geometry
      ->out('wkt');
    $this
      ->assertText($value, 'WKT output for ' . $label . ' widget is correct.');
  }

  /**
   * Helper function for testGeofieldWidgets().
   */
  function _testGeoFieldAPISetup($widget_type, $display_type) {

    // Setup a field and instance
    $entity_type = 'test_entity';
    $this->field_name = drupal_strtolower($this
      ->randomName());
    $this->field = array(
      'field_name' => $this->field_name,
      'type' => 'geofield',
    );
    field_create_field($this->field);
    $this->instance = array(
      'field_name' => $this->field_name,
      'entity_type' => 'test_entity',
      'bundle' => 'test_bundle',
      'label' => $this
        ->randomName() . '_label',
      'settings' => array(),
      'widget' => array(
        'type' => $widget_type,
      ),
      'display' => array(
        'full' => array(
          'type' => $display_type,
        ),
      ),
    );
    field_create_instance($this->instance);
  }

}
class GeofieldWidgetTestCase extends GeofieldBaseTestCase {
  public static function getInfo() {
    return array(
      'name' => 'Geofield - Widgets',
      'description' => "Test the creation of geofields.",
      'group' => 'Geofield',
    );
  }
  function setUp() {
    parent::setUp(array(
      'geofield',
      'field_test',
    ));
    $this->admin_user = $this
      ->drupalCreateUser(array(
      'administer filters',
    ));
    $this->web_user = $this
      ->drupalCreateUser(array(
      'access field_test content',
      'administer field_test content',
      'administer modules',
    ));
    $this
      ->drupalLogin($this->web_user);
  }

  // Test fields.

  /**
   * Test lat/lon Input.
   */
  function testGeofieldFieldLatLonWidget() {

    // Test lat/lon widget
    $this
      ->_testGeoFieldAPISetup('geofield_latlon', 'geofield_wkt');

    // Display creation form.
    $langcode = LANGUAGE_NONE;
    $this
      ->drupalGet('test-entity/add/test-bundle');
    $this
      ->assertFieldByName("{$this->field_name}[{$langcode}][0][geom][lat]", '', t('Lat/lon widget [lat] is displayed'));
    $this
      ->assertFieldByName("{$this->field_name}[{$langcode}][0][geom][lon]", '', t('Lat/lon widget [lon] is displayed'));

    // Submit with some value.
    include_once drupal_get_path('module', 'geofield') . '/includes/GeoGenerator.php';
    $generator = new GeoGenerator();
    $point = $generator
      ->random_point();
    geophp_load();
    $geometry = new Point($point[0], $point[1]);
    $edit = array(
      "{$this->field_name}[{$langcode}][0][geom][lat]" => $geometry
        ->getY(),
      "{$this->field_name}[{$langcode}][0][geom][lon]" => $geometry
        ->getX(),
    );
    $this
      ->drupalPost(NULL, $edit, t('Save'));
    preg_match('|test-entity/manage/(\\d+)/edit|', $this->url, $match);
    $id = $match[1];
    $this
      ->assertRaw(t('test_entity @id has been created.', array(
      '@id' => $id,
    )), t('Lat/lon entity was created'));
    $this
      ->assertFieldByName($this->field_name . '[und][0][geom][lat]', $geometry
      ->getY(), 'Lat field widget set correctly');
    $this
      ->assertFieldByName($this->field_name . '[und][0][geom][lon]', $geometry
      ->getX(), 'Lon field widget set correctly');
    $this
      ->_testWKTFormatter($id, $geometry, 'lat/lon');

    // Edge case, submit with 0,0 value.
    $this
      ->drupalGet('test-entity/add/test-bundle');
    $edit = array(
      "{$this->field_name}[{$langcode}][0][geom][lat]" => '0',
      "{$this->field_name}[{$langcode}][0][geom][lon]" => '0',
    );
    $this
      ->drupalPost(NULL, $edit, t('Save'));
    preg_match('|test-entity/manage/(\\d+)/edit|', $this->url, $match);
    $id = $match[1];
    $this
      ->assertRaw(t('test_entity @id has been created.', array(
      '@id' => $id,
    )), t('Lat/lon entity was created with 0,0 value.'));
    $geometry = new Point(0, 0);
    $this
      ->_testWKTFormatter($id, $geometry, 'lat/lon');

    // Edge case, no geometry submitted.
    $this
      ->drupalGet('test-entity/add/test-bundle');
    $edit = array(
      "{$this->field_name}[{$langcode}][0][geom][lat]" => '',
      "{$this->field_name}[{$langcode}][0][geom][lon]" => '',
    );
    $this
      ->drupalPost(NULL, $edit, t('Save'));
    preg_match('|test-entity/manage/(\\d+)/edit|', $this->url, $match);
    $id = $match[1];
    $this
      ->assertRaw(t('test_entity @id has been created.', array(
      '@id' => $id,
    )), t('Lat/lon entity was created with null value.'));
  }

  /**
   * Test WKT Input.
   */
  function testGeofieldFieldWKTWidget() {

    // Test lat/lon widget
    $this
      ->_testGeoFieldAPISetup('geofield_wkt', 'geofield_wkt');

    // Display creation form.
    $langcode = LANGUAGE_NONE;
    $this
      ->drupalGet('test-entity/add/test-bundle');
    $this
      ->assertFieldByName("{$this->field_name}[{$langcode}][0][geom]", '', t('WKT widget is displayed'));

    // Submit with some value.
    include_once drupal_get_path('module', 'geofield') . '/includes/GeoGenerator.php';
    $generator = new GeoGenerator();
    $wkt = $generator
      ->wkt_generate();
    $geometry = geoPHP::load($wkt, 'wkt');
    $edit = array(
      "{$this->field_name}[{$langcode}][0][geom]" => $geometry
        ->out('wkt'),
    );
    $this
      ->drupalPost(NULL, $edit, t('Save'));
    preg_match('|test-entity/manage/(\\d+)/edit|', $this->url, $match);
    $id = $match[1];
    $this
      ->assertRaw(t('test_entity @id has been created.', array(
      '@id' => $id,
    )), t('WKT entity was created'));
    $this
      ->_testWKTFormatter($id, $geometry, 'wkt');
  }

  /**
   * Test GeoJSON Input.
   */
  function testGeofieldFieldGeoJSONWidget() {

    // Test lat/lon widget
    $this
      ->_testGeoFieldAPISetup('geofield_geojson', 'geofield_wkt');

    // Display creation form.
    $langcode = LANGUAGE_NONE;
    $this
      ->drupalGet('test-entity/add/test-bundle');
    $this
      ->assertFieldByName("{$this->field_name}[{$langcode}][0][geom]", '', t('GeoJSON widget is displayed'));

    // Submit with some value.
    include_once drupal_get_path('module', 'geofield') . '/includes/GeoGenerator.php';
    $generator = new GeoGenerator();
    $wkt = $generator
      ->wkt_generate();
    $geometry = geoPHP::load($wkt, 'wkt');
    $edit = array(
      "{$this->field_name}[{$langcode}][0][geom]" => $geometry
        ->out('json'),
    );
    $this
      ->drupalPost(NULL, $edit, t('Save'));
    preg_match('|test-entity/manage/(\\d+)/edit|', $this->url, $match);
    $id = $match[1];
    $this
      ->assertRaw(t('test_entity @id has been created.', array(
      '@id' => $id,
    )), t('GeoJSON entity was created'));
    $this
      ->_testWKTFormatter($id, $geometry, 'json');
  }

  /**
   * Test Bounds Input.
   */
  function testGeofieldFieldBoundsWidget() {

    // Test lat/lon widget
    $this
      ->_testGeoFieldAPISetup('geofield_bounds', 'geofield_wkt');

    // Display creation form.
    $langcode = LANGUAGE_NONE;
    $this
      ->drupalGet('test-entity/add/test-bundle');
    $this
      ->assertFieldByName("{$this->field_name}[{$langcode}][0][geom][top]", '', t('Bounds widget field "top" is displayed.'));
    $this
      ->assertFieldByName("{$this->field_name}[{$langcode}][0][geom][bottom]", '', t('Bounds widget field "bottom" is displayed.'));
    $this
      ->assertFieldByName("{$this->field_name}[{$langcode}][0][geom][left]", '', t('Bounds widget field "left" is displayed.'));
    $this
      ->assertFieldByName("{$this->field_name}[{$langcode}][0][geom][right]", '', t('Bounds widget field "right" is displayed.'));

    // Submit with some value.
    include_once drupal_get_path('module', 'geofield') . '/includes/GeoGenerator.php';
    $generator = new GeoGenerator();

    // Instead of calculating 4 separate points, calculate a center point and
    // distance from it.
    list($lon, $lat) = $generator
      ->random_point();
    $lat_diff = $generator
      ->dd_generate(2, 10) / 100;
    $lon_diff = $generator
      ->dd_generate(2, 10) / 100;
    $edit = array(
      "{$this->field_name}[{$langcode}][0][geom][top]" => $lat + $lat_diff,
      "{$this->field_name}[{$langcode}][0][geom][bottom]" => $lat - $lat_diff,
      "{$this->field_name}[{$langcode}][0][geom][right]" => $lon + $lon_diff,
      "{$this->field_name}[{$langcode}][0][geom][left]" => $lon - $lon_diff,
    );
    $this
      ->drupalPost(NULL, $edit, t('Save'));
    preg_match('|test-entity/manage/(\\d+)/edit|', $this->url, $match);
    $id = $match[1];
    $this
      ->assertRaw(t('test_entity @id has been created.', array(
      '@id' => $id,
    )), t('Bounds entity was created'));
    $top = $lat + $lat_diff;
    $bottom = $lat - $lat_diff;
    $left = $lon - $lon_diff;
    $right = $lon + $lon_diff;
    $wkt = 'POLYGON ((' . $right . ' ' . $bottom . ', ' . $left . ' ' . $bottom . ', ' . $left . ' ' . $top . ', ' . $right . ' ' . $top . ', ' . $right . ' ' . $bottom . '))';
    $geometry = geoPHP::load($wkt, 'wkt');
    $this
      ->_testWKTFormatter($id, $geometry, 'wkt');

    // Edge case, create with 0, 0, 0, 0.
    $this
      ->drupalGet('test-entity/add/test-bundle');
    $edit = array(
      "{$this->field_name}[{$langcode}][0][geom][top]" => 0,
      "{$this->field_name}[{$langcode}][0][geom][bottom]" => 0,
      "{$this->field_name}[{$langcode}][0][geom][right]" => 0,
      "{$this->field_name}[{$langcode}][0][geom][left]" => 0,
    );
    $this
      ->drupalPost(NULL, $edit, t('Save'));
    preg_match('|test-entity/manage/(\\d+)/edit|', $this->url, $match);
    $id = $match[1];
    $this
      ->assertRaw(t('test_entity @id has been created.', array(
      '@id' => $id,
    )), t('Bounds entity was created with values of 0, 0, 0, 0'));
  }

}
class GeoFieldElementTestCase extends DrupalWebTestCase {
  public static function getInfo() {
    return array(
      'name' => 'Geofield FormAPI Elements',
      'description' => "Test Geofield FormAPI elements.",
      'group' => 'Geofield',
    );
  }
  function setUp() {
    parent::setUp(array(
      'geofield',
      'geofield_test',
      'geocoder',
    ));
    $this->web_user = $this
      ->drupalCreateUser(array(
      'access content',
    ));
    $this
      ->drupalLogin($this->web_user);
  }
  function testGeofieldLatLonElement() {

    // Test form element rendering
    $this
      ->drupalGet('geofield-latlon-element');
    $this
      ->assertFieldById('edit-geofield-latlon-simple-lat', '', 'Latitude element for simple geofield exists.');
    $this
      ->assertFieldById('edit-geofield-latlon-simple-lon', '', 'Longitude element for simple geofield exists.');
    $this
      ->assertFieldById('edit-geofield-latlon-verbose-lat', 41, 'Latitude element for verbose geofield exists.');
    $this
      ->assertFieldById('edit-geofield-latlon-verbose-lon', -86, 'Longitude element for verbose geofield exists.');

    // Test form element submission.
    $edit = array();
    $edit['geofield_latlon_simple[lat]'] = 41;
    $edit['geofield_latlon_simple[lon]'] = -86;
    $edit['geofield_latlon_verbose[lat]'] = 25;
    $edit['geofield_latlon_verbose[lon]'] = 54;
    $this
      ->drupalPost('geofield-latlon-element', $edit, t('Save'));
    $this
      ->assertText('Simple - Lat: 41 Lon: -86', "Simple Geofield saved data as expected");
    $this
      ->assertText('Verbose - Lat: 25 Lon: 54', "Verbose Geofield saved data as expected");
  }

}
class GeofieldFormatterTestCase extends GeofieldBaseTestCase {
  public static function getInfo() {
    return array(
      'name' => 'Geofield - Formatters',
      'description' => "Test the various display formatters of geofields.",
      'group' => 'Geofield',
    );
  }
  function setUp() {
    parent::setUp(array(
      'geofield',
      'field_test',
    ));
    $this->admin_user = $this
      ->drupalCreateUser(array(
      'administer filters',
    ));
    $this->web_user = $this
      ->drupalCreateUser(array(
      'access field_test content',
      'administer field_test content',
      'administer modules',
    ));
    $this
      ->drupalLogin($this->web_user);
  }
  function testGeofieldWKTFormatter() {

    // Test lat/lon widget
    $this
      ->_testGeoFieldAPISetup('geofield_wkt', 'geofield_wkt');

    // Display creation form.
    $langcode = LANGUAGE_NONE;
    $this
      ->drupalGet('test-entity/add/test-bundle');

    // Submit with some value.
    include_once drupal_get_path('module', 'geofield') . '/includes/GeoGenerator.php';
    $generator = new GeoGenerator();
    $wkt = $generator
      ->wkt_generate();
    geophp_load();
    $geometry = geoPHP::load($wkt, 'wkt');
    $edit = array(
      "{$this->field_name}[{$langcode}][0][geom]" => $geometry
        ->out('wkt'),
    );
    $this
      ->drupalPost(NULL, $edit, t('Save'));
    preg_match('|test-entity/manage/(\\d+)/edit|', $this->url, $match);
    $id = $match[1];
    $this
      ->_testWKTFormatter($id, $geometry, 'wkt');
  }
  function testGeofieldGeoJSONFormatter() {

    // Test lat/lon widget
    $this
      ->_testGeoFieldAPISetup('geofield_wkt', 'geofield_geojson');

    // Display creation form.
    $langcode = LANGUAGE_NONE;
    $this
      ->drupalGet('test-entity/add/test-bundle');

    // Submit with some value.
    include_once drupal_get_path('module', 'geofield') . '/includes/GeoGenerator.php';
    $generator = new GeoGenerator();
    $wkt = $generator
      ->wkt_generate();
    geophp_load();
    $geometry = geoPHP::load($wkt, 'wkt');
    $edit = array(
      "{$this->field_name}[{$langcode}][0][geom]" => $geometry
        ->out('wkt'),
    );
    $this
      ->drupalPost(NULL, $edit, t('Save'));
    preg_match('|test-entity/manage/(\\d+)/edit|', $this->url, $match);
    $id = $match[1];

    // Test GeoJSON output
    $entity = field_test_entity_test_load($id);
    $entity->content = field_attach_view('test_entity', $entity, 'full');
    $this->content = drupal_render($entity->content);
    $value = $geometry
      ->out('json');
    $this
      ->assertText($value, 'GeoJSON output is correct.');
  }
  function testGeofieldDefFormatter() {

    // Test lat/lon widget
    $this
      ->_testGeoFieldAPISetup('geofield_wkt', 'geofield_def_list');

    // Display creation form.
    $langcode = LANGUAGE_NONE;
    $this
      ->drupalGet('test-entity/add/test-bundle');

    // Submit with some value.
    include_once drupal_get_path('module', 'geofield') . '/includes/GeoGenerator.php';
    $generator = new GeoGenerator();
    $wkt = $generator
      ->wkt_generate();
    geophp_load();
    $geometry = geoPHP::load($wkt, 'wkt');
    $edit = array(
      "{$this->field_name}[{$langcode}][0][geom]" => $geometry
        ->out('wkt'),
    );
    $this
      ->drupalPost(NULL, $edit, t('Save'));
    preg_match('|test-entity/manage/(\\d+)/edit|', $this->url, $match);
    $id = $match[1];

    // Test GeoJSON output
    $entity = field_test_entity_test_load($id);
    $entity->content = field_attach_view('test_entity', $entity, 'full');
    $this->content = drupal_render($entity->content);

    // @TODO: Actually test output... :-/
  }

}