Back to Repositories

Testing Twogis Geocoding Integration in Geocoder

This test suite validates the Twogis geocoding lookup functionality in the Geocoder gem, focusing on address parsing, coordinate validation, and handling of Russian addresses.

Test Coverage Overview

The test suite provides comprehensive coverage of Twogis geocoding functionality, including coordinate accuracy, address component parsing, and error handling.

  • Tests coordinate precision for Moscow landmarks
  • Validates address component extraction (street, city, country)
  • Handles edge cases like missing cities and countries
  • Verifies Russian address parsing and formatting

Implementation Analysis

The testing approach uses Ruby’s test framework with systematic validation of geocoding responses. Each test focuses on specific address components and result attributes.

  • Implements setup configuration for Twogis API
  • Uses assert_equal for precise coordinate matching
  • Employs silence_warnings for error condition testing
  • Validates complex nested response structures

Technical Details

  • Uses GeocoderTestCase as base test class
  • Implements API key configuration
  • Validates UTF-8 encoding for Russian characters
  • Tests both forward and reverse geocoding capabilities
  • Verifies specific result attributes like type, purpose_name, and building_name

Best Practices Demonstrated

The test suite exemplifies strong testing practices with thorough validation of geocoding functionality.

  • Comprehensive edge case handling
  • Structured test organization by feature
  • Clear test naming conventions
  • Proper setup and configuration management
  • Detailed assertion messages

alexreisner/geocoder

test/unit/lookups/twogis_test.rb

            
# encoding: utf-8
require 'test_helper'

class TwogisTest < GeocoderTestCase

  def setup
    super
    Geocoder.configure(lookup: :twogis)
    set_api_key!(:twogis)
  end

  def test_twogis_point
    result = Geocoder.search('Kremlin, Moscow, Russia').first
    assert_equal [55.755836, 37.617774], result.coordinates
  end

  def test_twogis_no_results
    silence_warnings do
      results = Geocoder.search("no results")
      assert_equal 0, results.length
    end
  end

  def test_twogis_no_city
    result = Geocoder.search('chernoe more').first
    assert_equal "", result.city
  end

  def test_twogis_no_country
    result = Geocoder.search('new york').first
    assert_equal "", result.country
  end

  def test_twogis_result_kind
    assert_nothing_raised do
      ["new york", [55.755836, 37.617774], 'chernoe more'].each do |query|
        Geocoder.search(query).first.type
      end
    end
  end

  def test_twogis_result_returns_street_name
    assert_nothing_raised do
      result = Geocoder.search("ohotniy riad 2").first
      assert_equal "улица Охотный Ряд", result.street
    end
  end

  def test_twogis_result_returns_street_address
    assert_nothing_raised do
      result = Geocoder.search("ohotniy riad 2").first
      assert_equal "улица Охотный Ряд, 2", result.street_address
    end
  end

  def test_twogis_result_returns_street_number
    assert_nothing_raised do
      result = Geocoder.search("ohotniy riad 2").first
      assert_equal "2", result.street_number
    end
  end

  def test_twogis_maximum_precision_on_russian_address
    result = Geocoder.search('ohotniy riad 2').first

    assert_equal [55.757261, 37.616732], result.coordinates

    assert_equal "Москва, улица Охотный Ряд, 2",
                 result.address
    assert_equal "Тверской район", result.district
    assert_equal "Москва", result.city
    assert_equal "Москва", result.region
    assert_equal "Россия", result.country
    assert_equal "улица Охотный Ряд, 2", result.street_address
    assert_equal "улица Охотный Ряд", result.street
    assert_equal "2", result.street_number

    assert_equal "building", result.type
    assert_equal "Многофункциональный комплекс", result.purpose_name
    assert_equal "Four Seasons Moscow, отель", result.building_name
  end

  def test_twogis_hydro_object
    result = Geocoder.search('volga river').first

    assert_equal [57.953151, 38.388873], result.coordinates
    assert_equal "", result.address
    assert_equal "", result.district
    assert_equal "Некоузский район", result.district_area
    assert_equal "Россия", result.country
    assert_equal "Ярославская область", result.region
    assert_equal "", result.street_address
    assert_equal "", result.street
    assert_equal "", result.street_number
    assert_equal "adm_div", result.type
    assert_equal "", result.purpose_name
    assert_equal "", result.building_name
    assert_equal "settlement", result.subtype
    assert_equal "Посёлок", result.subtype_specification
    assert_equal "settlement", result.subtype
    assert_equal "Волга", result.name
  end
end