Back to Repositories

Validating Configuration Management System in geocoder

This test suite validates the configuration functionality of the Geocoder gem, ensuring proper setup and handling of various configuration options, defaults, and error cases.

Test Coverage Overview

The test suite comprehensively covers configuration management in the Geocoder gem.

Key areas tested include:
  • Configuration default handling
  • Invalid lookup configuration error handling
  • Configuration setting methods
  • Lookup-specific configuration
  • Configuration inheritance and override chains

Implementation Analysis

The testing approach employs Ruby’s unit testing framework to verify configuration behavior systematically.

Key implementation patterns include:
  • Setup method to reset defaults before each test
  • Direct configuration method testing
  • Hierarchical configuration verification
  • Configuration merge operations

Technical Details

Testing infrastructure includes:
  • Ruby unit test framework
  • GeocoderTestCase custom test class
  • Configuration reset capabilities
  • Mock geocoding objects for distance calculations
  • Multiple configuration setting approaches

Best Practices Demonstrated

The test suite exemplifies strong testing practices through isolated test cases and comprehensive coverage.

Notable practices include:
  • Individual test methods for specific configuration scenarios
  • Error case validation
  • Configuration hierarchy testing
  • Clean setup and reset procedures
  • Clear test method naming conventions

alexreisner/geocoder

test/unit/configuration_test.rb

            
# encoding: utf-8
require 'test_helper'

class ConfigurationTest < GeocoderTestCase
  def setup
    Geocoder::Configuration.set_defaults
  end

  def test_exception_raised_on_bad_lookup_config
    Geocoder.configure(:lookup => :stoopid)
    assert_raises Geocoder::ConfigurationError do
      Geocoder.search "something dumb"
    end
  end

  def test_setting_with_class_method
    Geocoder::Configuration.units = :test
    assert_equal :test, Geocoder.config.units
  end

  def test_setting_with_configure_method
    Geocoder.configure(:units => :test)
    assert_equal :test, Geocoder.config.units
  end

  def test_config_for_lookup
    Geocoder.configure(
      :timeout => 5,
      :api_key => "aaa",
      :google => {
        :timeout => 2
      }
    )
    assert_equal 2, Geocoder.config_for_lookup(:google).timeout
    assert_equal "aaa", Geocoder.config_for_lookup(:google).api_key
  end

  def test_configuration_chain
    v = PlaceReverseGeocoded.new(*reverse_geocoded_object_params(:msg))
    v.latitude  = 0
    v.longitude = 0

    # method option > global configuration
    Geocoder.configure(:units => :km)
    assert_equal 69, v.distance_to([0,1], :mi).round

    # per-model configuration > global configuration
    PlaceReverseGeocoded.reverse_geocoded_by :latitude, :longitude, method: :spherical, units: :mi
    assert_equal 69, v.distance_to([0,1]).round

    # method option > per-model configuration
    assert_equal 111, v.distance_to([0,1], :km).round
  end

  def test_merge_into_lookup_config
    base = {
      timeout: 5,
      api_key: "xxx"
    }
    new = {
      timeout: 10,
      units: :km,
    }
    merged = {
      timeout: 10, # overwritten
      units: :km, # added
      api_key: "xxx" # preserved
    }
    Geocoder.configure(google: base)
    Geocoder.merge_into_lookup_config(:google, new)
    assert_equal merged, Geocoder.config[:google]
  end
end