Testing IP Address Detection and Validation Workflows in Geocoder
This test suite validates the functionality of the Query class in the Geocoder gem, focusing on IP address detection, coordinate handling, and address validation.
Test Coverage Overview
Implementation Analysis
Technical Details
Best Practices Demonstrated
alexreisner/geocoder
test/unit/query_test.rb
# encoding: utf-8
require 'test_helper'
class QueryTest < GeocoderTestCase
def test_detect_ipv4
assert Geocoder::Query.new("232.65.123.94").ip_address?
ip = IPAddr.new("232.65.123.94")
assert Geocoder::Query.new(ip).ip_address?
end
def test_detect_ipv6
assert Geocoder::Query.new("3ffe:0b00:0000:0000:0001:0000:0000:000a").ip_address?
ip = IPAddr.new("3ffe:0b00:0000:0000:0001:0000:0000:000a")
assert Geocoder::Query.new(ip).ip_address?
end
def test_detect_non_ip_address
assert !Geocoder::Query.new("232.65.123.94.43").ip_address?
assert !Geocoder::Query.new("::ffff:123.456.789").ip_address?
end
def test_strip_trailing_whitespace_for_ip_address_query
text = "77.251.213.1\n"
query = Geocoder::Query.new(text)
assert_equal text[0...-1], query.sanitized_text
end
def test_blank_query_detection
assert Geocoder::Query.new(nil).blank?
assert Geocoder::Query.new("").blank?
assert Geocoder::Query.new("\t ").blank?
assert !Geocoder::Query.new("a").blank?
assert !Geocoder::Query.new("Москва").blank? # no ASCII characters
assert !Geocoder::Query.new("\na").blank?
assert Geocoder::Query.new(nil, :params => {}).blank?
assert !Geocoder::Query.new(nil, :params => {:woeid => 1234567}).blank?
end
def test_blank_query_detection_for_coordinates
assert Geocoder::Query.new([nil,nil]).blank?
assert Geocoder::Query.new([87,nil]).blank?
end
def test_coordinates_detection
assert Geocoder::Query.new("51.178844,5").coordinates?
assert Geocoder::Query.new("51.178844, -1.826189").coordinates?
assert !Geocoder::Query.new("232.65.123").coordinates?
assert !Geocoder::Query.new("Test\n51.178844, -1.826189").coordinates?
end
def test_internal_ip_address
assert Geocoder::Query.new("127.0.0.1").internal_ip_address?
assert Geocoder::Query.new("172.19.0.1").internal_ip_address?
assert Geocoder::Query.new("10.100.100.1").internal_ip_address?
assert Geocoder::Query.new("192.168.0.1").internal_ip_address?
assert !Geocoder::Query.new("232.65.123.234").internal_ip_address?
end
def test_loopback_ip_address
assert Geocoder::Query.new("127.0.0.1").loopback_ip_address?
assert !Geocoder::Query.new("232.65.123.234").loopback_ip_address?
end
def test_private_ip_address
assert Geocoder::Query.new("172.19.0.1").private_ip_address?
assert Geocoder::Query.new("10.100.100.1").private_ip_address?
assert Geocoder::Query.new("192.168.0.1").private_ip_address?
assert !Geocoder::Query.new("127.0.0.1").private_ip_address?
assert !Geocoder::Query.new("232.65.123.234").private_ip_address?
end
def test_sanitized_text_with_array
q = Geocoder::Query.new([43.1313,11.3131])
assert_equal "43.1313,11.3131", q.sanitized_text
end
def test_custom_lookup
query = Geocoder::Query.new("address", :lookup => :nominatim)
assert_instance_of Geocoder::Lookup::Nominatim, query.lookup
end
def test_force_specify_ip_address
Geocoder.configure({:ip_lookup => :google})
query = Geocoder::Query.new("address", {:ip_address => true})
assert !query.ip_address?
assert_instance_of Geocoder::Lookup::Google, query.lookup
end
def test_force_specify_street_address
Geocoder.configure({:lookup => :google, :ip_lookup => :freegeoip})
query = Geocoder::Query.new("4.1.0.2", {street_address: true})
assert query.ip_address?
assert_instance_of Geocoder::Lookup::Google, query.lookup
end
def test_force_specify_ip_address_with_ip_lookup
query = Geocoder::Query.new("address", {:ip_address => true, :ip_lookup => :google})
assert !query.ip_address?
assert_instance_of Geocoder::Lookup::Google, query.lookup
end
end