Back to Repositories

Testing PC Miler Geocoding Integration in alexreisner/geocoder

This test suite validates the PC Miler (Trimble Maps) integration within the Geocoder gem, covering geocoding and reverse geocoding functionality. The tests ensure proper handling of location queries, region settings, and response parsing.

Test Coverage Overview

The test suite provides comprehensive coverage of PC Miler integration functionality.

Key areas tested include:
  • Forward geocoding with various input formats
  • Reverse geocoding capabilities
  • Regional search configurations
  • Error handling and authorization
  • Response parsing and data extraction

Implementation Analysis

The testing approach follows Ruby unit testing patterns using the GeocoderTestCase framework. Tests validate query construction, URL formatting, and response parsing with detailed assertions for geographic data accuracy.

Key patterns include:
  • Setup configuration for PC Miler lookup
  • Mock HTTP response handling
  • Structured test cases for different input scenarios

Technical Details

Testing infrastructure includes:
  • Ruby test framework with GeocoderTestCase
  • Mock HTTP response handling
  • PC Miler API endpoint integration
  • UTF-8 encoding support
  • Configuration management for region settings

Best Practices Demonstrated

The test suite exemplifies strong testing practices through comprehensive coverage and structured organization.

Notable practices include:
  • Isolated test cases for specific functionality
  • Thorough error condition handling
  • Clear test method naming
  • Comprehensive assertion coverage
  • Configuration validation testing

alexreisner/geocoder

test/unit/lookups/pc_miler_test.rb

            
# encoding: utf-8
require 'test_helper'

class TrimbleMapsTest < GeocoderTestCase

  def setup
    super
    Geocoder.configure(lookup: :pc_miler)
  end

  def test_query_for_geocode
    query = Geocoder::Query.new('wall drug')
    lookup = Geocoder::Lookup.get(:pc_miler)
    res = lookup.query_url(query)
    assert_equal 'https://singlesearch.alk.com/NA/api/search?include=Meta&query=wall+drug', res
  end

  def test_query_for_geocode_with_commas
    query = Geocoder::Query.new('Fair Lawn, NJ, US')
    lookup = Geocoder::Lookup.get(:pc_miler)
    res = lookup.query_url(query)
    assert_equal 'https://singlesearch.alk.com/NA/api/search?include=Meta&query=Fair+Lawn%2C+NJ%2C+US', res
  end

  def test_query_for_reverse_geocode
    query = Geocoder::Query.new([43.99255, -102.24127])
    lookup = Geocoder::Lookup.get(:pc_miler)
    res = lookup.query_url(query)
    assert_equal 'https://singlesearch.alk.com/NA/api/search?include=Meta&query=43.99255%2C-102.24127', res
  end

  def test_not_authorized
    Geocoder.configure(always_raise: [Geocoder::RequestDenied])
    lookup = Geocoder::Lookup.get(:pc_miler)
    assert_raises Geocoder::RequestDenied do
      response = MockHttpResponse.new(code: 403)
      lookup.send(:check_response_for_errors!, response)
    end
  end

  def test_query_region_defaults_to_north_america
    query = Geocoder::Query.new('Sydney')
    lookup = Geocoder::Lookup.get(:pc_miler)
    res = lookup.query_url(query)
    assert_equal 'https://singlesearch.alk.com/NA/api/search?include=Meta&query=Sydney', res
  end

  def test_query_region_can_be_given_in_global_config
    Geocoder.configure(lookup: :pc_miler, pc_miler: { region: 'EU' })
    query = Geocoder::Query.new('Sydney')
    lookup = Geocoder::Lookup.get(:pc_miler)
    res = lookup.query_url(query)
    assert_equal 'https://singlesearch.alk.com/EU/api/search?include=Meta&query=Sydney', res
  end

  # option given in query takes precedence over global option
  def test_query_region_can_be_given_in_query
    Geocoder.configure(lookup: :pc_miler, pc_miler: { region: 'EU' })
    query = Geocoder::Query.new('Sydney', region: 'OC')
    lookup = Geocoder::Lookup.get(:pc_miler)
    res = lookup.query_url(query)
    assert_equal 'https://singlesearch.alk.com/OC/api/search?include=Meta&query=Sydney', res
  end

  def test_query_raises_if_region_is_invalid
    query = Geocoder::Query.new('Sydney', region: 'QQ')
    lookup = Geocoder::Lookup.get(:pc_miler)

    error = assert_raises do
      lookup.query_url(query)
    end

    assert_match /region_code 'QQ' is invalid/, error.message
  end

  def test_results_with_street_address
    results = Geocoder.search('wall drug')

    assert_equal 2, results.size

    result = results[0]

    assert_equal '510 Main St', result.street
    assert_equal 'Wall', result.city
    assert_equal 'South Dakota', result.state
    assert_equal 'SD', result.state_code
    assert_equal '57790-9501', result.postal_code
    assert_equal 'United States', result.country
    assert_equal 'US', result.country_code
    assert_equal '510 Main St, Wall, South Dakota, 57790-9501, United States', result.address
    assert_equal 44.0632, result.latitude
    assert_equal -102.2151, result.longitude
    assert_equal([44.0632, -102.2151], result.coordinates)
  end

  def test_results_without_street_address
    results = Geocoder.search('Duluth MN')

    assert_equal 1, results.size

    result = results[0]

    assert_equal '', result.street
    assert_equal 'Duluth', result.city
    assert_equal 'Minnesota', result.state
    assert_equal 'MN', result.state_code
    assert_equal '55806', result.postal_code
    assert_equal 'United States', result.country
    assert_equal 'US', result.country_code
    assert_equal 'Duluth, Minnesota, 55806, United States', result.address
    assert_equal 46.776443, result.latitude
    assert_equal -92.110529, result.longitude
    assert_equal([46.776443, -92.110529], result.coordinates)
  end

  def test_results_reverse_geocoding
    results = Geocoder.search([42.14228, -102.85796])

    assert_equal 1, results.size

    result = results[0]

    assert_equal '2093 NE-87', result.street
    assert_equal 'Alliance', result.city
    assert_equal 'Nebraska', result.state
    assert_equal 'NE', result.state_code
    assert_equal '69301', result.postal_code
    assert_equal 'United States', result.country
    assert_equal 'US', result.country_code
    assert_equal '2093 NE-87, Alliance, Nebraska, 69301, United States', result.address
    assert_equal 42.14228, result.latitude
    assert_equal -102.85796, result.longitude
    assert_equal([42.14228, -102.85796], result.coordinates)
  end

  def test_results_metadata
    results = Geocoder.search("Times Square")

    assert_equal 10, results.size

    results.map do |result|
      assert_equal 3, result.data["QueryConfidence"]
    end
  end
end