diff -r 6641e941ef1e -r ff1a9aa48cfd app/django/contrib/gis/tests/test_geoip.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/app/django/contrib/gis/tests/test_geoip.py Tue Oct 14 16:00:59 2008 +0000 @@ -0,0 +1,104 @@ +import os, unittest +from django.db import settings +from django.contrib.gis.geos import GEOSGeometry +from django.contrib.gis.utils import GeoIP, GeoIPException + +# Note: Requires use of both the GeoIP country and city datasets. +# The GEOIP_DATA path should be the only setting set (the directory +# should contain links or the actual database files 'GeoIP.dat' and +# 'GeoLiteCity.dat'. +class GeoIPTest(unittest.TestCase): + + def test01_init(self): + "Testing GeoIP initialization." + g1 = GeoIP() # Everything inferred from GeoIP path + path = settings.GEOIP_PATH + g2 = GeoIP(path, 0) # Passing in data path explicitly. + g3 = GeoIP.open(path, 0) # MaxMind Python API syntax. + + for g in (g1, g2, g3): + self.assertEqual(True, bool(g._country)) + self.assertEqual(True, bool(g._city)) + + # Only passing in the location of one database. + city = os.path.join(path, 'GeoLiteCity.dat') + cntry = os.path.join(path, 'GeoIP.dat') + g4 = GeoIP(city, country='') + self.assertEqual(None, g4._country) + g5 = GeoIP(cntry, city='') + self.assertEqual(None, g5._city) + + # Improper parameters. + bad_params = (23, 'foo', 15.23) + for bad in bad_params: + self.assertRaises(GeoIPException, GeoIP, cache=bad) + if isinstance(bad, basestring): + e = GeoIPException + else: + e = TypeError + self.assertRaises(e, GeoIP, bad, 0) + + def test02_bad_query(self): + "Testing GeoIP query parameter checking." + cntry_g = GeoIP(city='') + # No city database available, these calls should fail. + self.assertRaises(GeoIPException, cntry_g.city, 'google.com') + self.assertRaises(GeoIPException, cntry_g.coords, 'yahoo.com') + + # Non-string query should raise TypeError + self.assertRaises(TypeError, cntry_g.country_code, 17) + self.assertRaises(TypeError, cntry_g.country_name, GeoIP) + + def test03_country(self): + "Testing GeoIP country querying methods." + g = GeoIP(city='') + + fqdn = 'www.google.com' + addr = '12.215.42.19' + + for query in (fqdn, addr): + for func in (g.country_code, g.country_code_by_addr, g.country_code_by_name): + self.assertEqual('US', func(query)) + for func in (g.country_name, g.country_name_by_addr, g.country_name_by_name): + self.assertEqual('United States', func(query)) + self.assertEqual({'country_code' : 'US', 'country_name' : 'United States'}, + g.country(query)) + + def test04_city(self): + "Testing GeoIP city querying methods." + g = GeoIP(country='') + + addr = '130.80.29.3' + fqdn = 'chron.com' + for query in (fqdn, addr): + # Country queries should still work. + for func in (g.country_code, g.country_code_by_addr, g.country_code_by_name): + self.assertEqual('US', func(query)) + for func in (g.country_name, g.country_name_by_addr, g.country_name_by_name): + self.assertEqual('United States', func(query)) + self.assertEqual({'country_code' : 'US', 'country_name' : 'United States'}, + g.country(query)) + + # City information dictionary. + d = g.city(query) + self.assertEqual('USA', d['country_code3']) + self.assertEqual('Houston', d['city']) + self.assertEqual('TX', d['region']) + self.assertEqual('77002', d['postal_code']) + self.assertEqual(713, d['area_code']) + geom = g.geos(query) + self.failIf(not isinstance(geom, GEOSGeometry)) + lon, lat = (-95.366996765, 29.752300262) + lat_lon = g.lat_lon(query) + lat_lon = (lat_lon[1], lat_lon[0]) + for tup in (geom.tuple, g.coords(query), g.lon_lat(query), lat_lon): + self.assertAlmostEqual(lon, tup[0], 9) + self.assertAlmostEqual(lat, tup[1], 9) + +def suite(): + s = unittest.TestSuite() + s.addTest(unittest.makeSuite(GeoIPTest)) + return s + +def run(verbosity=2): + unittest.TextTestRunner(verbosity=verbosity).run(suite())