Permalink
Browse files

[1.2.X] GeoDjango test suite housekeeping. Moved data into fixtures f…

…or `relatedapp` and `distapp` tests, and made both use Django's `TestCase`; moved functionality out of `GeoDjangoTestSuiteRunner` to allow future re-use in `runtests.py` (refs #10420); compressed test app fixtures and cleaned up imports.

Backport of r14776 from trunk.

git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.2.X@14812 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
1 parent 65b26b3 commit d54d7a52a959611124a47b47864ca34f154d1853 @jbronn jbronn committed Dec 4, 2010
@@ -1,14 +1,14 @@
-import sys
import unittest
from django.conf import settings
-from django.db.models import get_app
from django.test.simple import build_suite, DjangoTestSuiteRunner
+
def run_tests(*args, **kwargs):
from django.test.simple import run_tests as base_run_tests
return base_run_tests(*args, **kwargs)
+
def run_gis_tests(test_labels, verbosity=1, interactive=True, failfast=False, extra_tests=None):
import warnings
warnings.warn(
@@ -18,94 +18,121 @@ def run_gis_tests(test_labels, verbosity=1, interactive=True, failfast=False, ex
test_runner = GeoDjangoTestSuiteRunner(verbosity=verbosity, interactive=interactive, failfast=failfast)
return test_runner.run_tests(test_labels, extra_tests=extra_tests)
-class GeoDjangoTestSuiteRunner(DjangoTestSuiteRunner):
- def setup_test_environment(self, **kwargs):
- super(GeoDjangoTestSuiteRunner, self).setup_test_environment(**kwargs)
+def geo_apps(namespace=True):
+ """
+ Returns a list of GeoDjango test applications that reside in
+ `django.contrib.gis.tests` that can be used with the current
+ database and the spatial libraries that are installed.
+ """
+ from django.db import connection
+ from django.contrib.gis.geos import GEOS_PREPARE
+ from django.contrib.gis.gdal import HAS_GDAL
- from django.db import connection
- from django.contrib.gis.geos import GEOS_PREPARE
- from django.contrib.gis.gdal import HAS_GDAL
+ apps = ['geoapp', 'relatedapp']
- # Getting and storing the original values of INSTALLED_APPS and
- # the ROOT_URLCONF.
- self.old_installed = getattr(settings, 'INSTALLED_APPS', None)
- self.old_root_urlconf = getattr(settings, 'ROOT_URLCONF', None)
- self.old_site_id = getattr(settings, 'SITE_ID', None)
+ # No distance queries on MySQL.
+ if not connection.ops.mysql:
+ apps.append('distapp')
+
+ # Test geography support with PostGIS 1.5+.
+ if connection.ops.postgis and connection.ops.geography:
+ apps.append('geogapp')
+
+ # The following GeoDjango test apps depend on GDAL support.
+ if HAS_GDAL:
+ # 3D apps use LayerMapping, which uses GDAL.
+ if connection.ops.postgis and GEOS_PREPARE:
+ apps.append('geo3d')
+
+ apps.append('layermap')
+
+ if namespace:
+ return ['django.contrib.gis.tests.%s' % app
+ for app in apps]
+ else:
+ return apps
+
+
+def geodjango_suite():
+ """
+ Returns a TestSuite consisting only of GeoDjango tests that can be run.
+ """
+ import sys
+ from django.db.models import get_app
+
+ suite = unittest.TestSuite()
+
+ # Adding the GEOS tests.
+ from django.contrib.gis.geos import tests as geos_tests
+ suite.addTest(geos_tests.suite())
- # Tests that require use of a spatial database (e.g., creation of models)
- self.geo_apps = ['geoapp', 'relatedapp']
- if connection.ops.postgis and connection.ops.geography:
- # Test geography support with PostGIS 1.5+.
- self.geo_apps.append('geogapp')
+ # Adding the measurment tests.
+ from django.contrib.gis.tests import test_measure
+ suite.addTest(test_measure.suite())
- if HAS_GDAL:
- # The following GeoDjango test apps depend on GDAL support.
- if not connection.ops.mysql:
- self.geo_apps.append('distapp')
+ # Adding GDAL tests, and any test suite that depends on GDAL, to the
+ # suite if GDAL is available.
+ from django.contrib.gis.gdal import HAS_GDAL
+ if HAS_GDAL:
+ from django.contrib.gis.gdal import tests as gdal_tests
+ suite.addTest(gdal_tests.suite())
- # 3D apps use LayerMapping, which uses GDAL.
- if connection.ops.postgis and GEOS_PREPARE:
- self.geo_apps.append('geo3d')
+ from django.contrib.gis.tests import test_spatialrefsys, test_geoforms
+ suite.addTest(test_spatialrefsys.suite())
+ suite.addTest(test_geoforms.suite())
+ else:
+ sys.stderr.write('GDAL not available - no tests requiring GDAL will be run.\n')
- self.geo_apps.append('layermap')
+ # Add GeoIP tests to the suite, if the library and data is available.
+ from django.contrib.gis.utils import HAS_GEOIP
+ if HAS_GEOIP and hasattr(settings, 'GEOIP_PATH'):
+ from django.contrib.gis.tests import test_geoip
+ suite.addTest(test_geoip.suite())
+
+ # Finally, adding the suites for each of the GeoDjango test apps.
+ for app_name in geo_apps(namespace=False):
+ suite.addTest(build_suite(get_app(app_name)))
+
+ return suite
+
+
+class GeoDjangoTestSuiteRunner(DjangoTestSuiteRunner):
+
+ def setup_test_environment(self, **kwargs):
+ super(GeoDjangoTestSuiteRunner, self).setup_test_environment(**kwargs)
+
+ # Saving original values of INSTALLED_APPS, ROOT_URLCONF, and SITE_ID.
+ self.old_installed = getattr(settings, 'INSTALLED_APPS', None)
+ self.old_root_urlconf = getattr(settings, 'ROOT_URLCONF', '')
+ self.old_site_id = getattr(settings, 'SITE_ID', None)
# Constructing the new INSTALLED_APPS, and including applications
- # within the GeoDjango test namespace (`self.geo_apps`).
+ # within the GeoDjango test namespace.
new_installed = ['django.contrib.sites',
'django.contrib.sitemaps',
'django.contrib.gis',
]
- new_installed.extend(['django.contrib.gis.tests.%s' % app
- for app in self.geo_apps])
+
+ # Calling out to `geo_apps` to get GeoDjango applications supported
+ # for testing.
+ new_installed.extend(geo_apps())
settings.INSTALLED_APPS = new_installed
- # Setting the URLs.
- settings.ROOT_URLCONF = 'django.contrib.gis.tests.urls'
+ # SITE_ID needs to be set
settings.SITE_ID = 1
+ # ROOT_URLCONF needs to be set, else `AttributeErrors` are raised
+ # when TestCases are torn down that have `urls` defined.
+ settings.ROOT_URLCONF = ''
+
+
def teardown_test_environment(self, **kwargs):
super(GeoDjangoTestSuiteRunner, self).teardown_test_environment(**kwargs)
settings.INSTALLED_APPS = self.old_installed
settings.ROOT_URLCONF = self.old_root_urlconf
settings.SITE_ID = self.old_site_id
+
def build_suite(self, test_labels, extra_tests=None, **kwargs):
- """
- This method is overridden to construct a suite consisting only of tests
- for GeoDjango.
- """
- suite = unittest.TestSuite()
-
- # Adding the GEOS tests.
- from django.contrib.gis.geos import tests as geos_tests
- suite.addTest(geos_tests.suite())
-
- # Adding the measurment tests.
- from django.contrib.gis.tests import test_measure
- suite.addTest(test_measure.suite())
-
- # Adding GDAL tests, and any test suite that depends on GDAL, to the
- # suite if GDAL is available.
- from django.contrib.gis.gdal import HAS_GDAL
- if HAS_GDAL:
- from django.contrib.gis.gdal import tests as gdal_tests
- suite.addTest(gdal_tests.suite())
-
- from django.contrib.gis.tests import test_spatialrefsys, test_geoforms
- suite.addTest(test_spatialrefsys.suite())
- suite.addTest(test_geoforms.suite())
- else:
- sys.stderr.write('GDAL not available - no tests requiring GDAL will be run.\n')
-
- # Add GeoIP tests to the suite, if the library and data is available.
- from django.contrib.gis.utils import HAS_GEOIP
- if HAS_GEOIP and hasattr(settings, 'GEOIP_PATH'):
- from django.contrib.gis.tests import test_geoip
- suite.addTest(test_geoip.suite())
-
- # Finally, adding the suites for each of the GeoDjango test apps.
- for app_name in self.geo_apps:
- suite.addTest(build_suite(get_app(app_name)))
-
- return suite
+ return geodjango_suite()
@@ -1,36 +0,0 @@
-au_cities = (('Wollongong', 150.902, -34.4245),
- ('Shellharbour', 150.87, -34.5789),
- ('Thirroul', 150.924, -34.3147),
- ('Mittagong', 150.449, -34.4509),
- ('Batemans Bay', 150.175, -35.7082),
- ('Canberra', 144.963, -37.8143),
- ('Melbourne', 145.963, -37.8143),
- ('Sydney', 151.26071, -33.887034),
- ('Hobart', 147.33, -42.8827),
- ('Adelaide', 138.6, -34.9258),
- ('Hillsdale', 151.231341, -33.952685),
- )
-
-stx_cities = (('Downtown Houston', -95.363151, 29.763374),
- ('West University Place', -95.448601, 29.713803),
- ('Southside Place', -95.436920, 29.705777),
- ('Bellaire', -95.458732, 29.705614),
- ('Pearland', -95.287303, 29.563568),
- ('Galveston', -94.797489, 29.301336),
- ('Sealy', -96.156952, 29.780918),
- ('San Antonio', -98.493183, 29.424170),
- ('Saint Hedwig', -98.199820, 29.414197),
- )
-
-# Data from U.S. Census ZCTA cartographic boundary file for Texas (`zt48_d00.shp`).
-stx_zips = (('77002', 'POLYGON ((-95.365015 29.772327, -95.362415 29.772327, -95.360915 29.771827, -95.354615 29.771827, -95.351515 29.772527, -95.350915 29.765327, -95.351015 29.762436, -95.350115 29.760328, -95.347515 29.758528, -95.352315 29.753928, -95.356415 29.756328, -95.358215 29.754028, -95.360215 29.756328, -95.363415 29.757128, -95.364014 29.75638, -95.363415 29.753928, -95.360015 29.751828, -95.361815 29.749528, -95.362715 29.750028, -95.367516 29.744128, -95.369316 29.745128, -95.373916 29.744128, -95.380116 29.738028, -95.387916 29.727929, -95.388516 29.729629, -95.387916 29.732129, -95.382916 29.737428, -95.376616 29.742228, -95.372616 29.747228, -95.378601 29.750846, -95.378616 29.752028, -95.378616 29.754428, -95.376016 29.754528, -95.374616 29.759828, -95.373616 29.761128, -95.371916 29.763928, -95.372316 29.768727, -95.365884 29.76791, -95.366015 29.767127, -95.358715 29.765327, -95.358615 29.766327, -95.359115 29.767227, -95.360215 29.767027, -95.362783 29.768267, -95.365315 29.770527, -95.365015 29.772327))'),
- ('77005', 'POLYGON ((-95.447918 29.727275, -95.428017 29.728729, -95.421117 29.729029, -95.418617 29.727629, -95.418517 29.726429, -95.402117 29.726629, -95.402117 29.725729, -95.395316 29.725729, -95.391916 29.726229, -95.389716 29.725829, -95.396517 29.715429, -95.397517 29.715929, -95.400917 29.711429, -95.411417 29.715029, -95.418417 29.714729, -95.418317 29.70623, -95.440818 29.70593, -95.445018 29.70683, -95.446618 29.70763, -95.447418 29.71003, -95.447918 29.727275))'),
- ('77025', 'POLYGON ((-95.418317 29.70623, -95.414717 29.706129, -95.414617 29.70533, -95.418217 29.70533, -95.419817 29.69533, -95.419484 29.694196, -95.417166 29.690901, -95.414517 29.69433, -95.413317 29.69263, -95.412617 29.68973, -95.412817 29.68753, -95.414087 29.685055, -95.419165 29.685428, -95.421617 29.68513, -95.425717 29.67983, -95.425017 29.67923, -95.424517 29.67763, -95.427418 29.67763, -95.438018 29.664631, -95.436713 29.664411, -95.440118 29.662231, -95.439218 29.661031, -95.437718 29.660131, -95.435718 29.659731, -95.431818 29.660331, -95.441418 29.656631, -95.441318 29.656331, -95.441818 29.656131, -95.441718 29.659031, -95.441118 29.661031, -95.446718 29.656431, -95.446518 29.673431, -95.446918 29.69013, -95.447418 29.71003, -95.446618 29.70763, -95.445018 29.70683, -95.440818 29.70593, -95.418317 29.70623))'),
- ('77401', 'POLYGON ((-95.447918 29.727275, -95.447418 29.71003, -95.446918 29.69013, -95.454318 29.68893, -95.475819 29.68903, -95.475819 29.69113, -95.484419 29.69103, -95.484519 29.69903, -95.480419 29.70133, -95.480419 29.69833, -95.474119 29.69833, -95.474119 29.70453, -95.472719 29.71283, -95.468019 29.71293, -95.468219 29.720229, -95.464018 29.720229, -95.464118 29.724529, -95.463018 29.725929, -95.459818 29.726129, -95.459918 29.720329, -95.451418 29.720429, -95.451775 29.726303, -95.451318 29.727029, -95.447918 29.727275))'),
- )
-
-interstates = (('I-25', 'LINESTRING(-104.4780170766108 36.66698791870694, -104.4468522338495 36.79925409393386, -104.46212692626 36.9372149776075, -104.5126119783768 37.08163268820887, -104.5247764602161 37.29300499892048, -104.7084397427668 37.49150259925398, -104.8126599016282 37.69514285621863, -104.8452887035466 37.87613395659479, -104.7160169341003 38.05951763337799, -104.6165437927668 38.30432045855106, -104.6437227858174 38.53979986564737, -104.7596170387259 38.7322907594295, -104.8380078676822 38.89998460604341, -104.8501253693506 39.09980189213358, -104.8791648316464 39.24368776457503, -104.8635041274215 39.3785278162751, -104.8894471170052 39.5929228239605, -104.9721242843344 39.69528482419685, -105.0112104500356 39.7273080432394, -105.0010368577104 39.76677607811571, -104.981835619 39.81466504121967, -104.9858891550477 39.88806911250832, -104.9873548059578 39.98117234571016, -104.9766220487419 40.09796423450692, -104.9818565932953 40.36056530662884, -104.9912746373997 40.74904484447656)'),
- )
-
-stx_interstates = (('I-10', 'LINESTRING(924952.5 4220931.6,925065.3 4220931.6,929568.4 4221057.8)'),
- )
@@ -1,18 +1,17 @@
-import os, unittest
+import os
from decimal import Decimal
from django.db import connection
from django.db.models import Q
-from django.contrib.gis.gdal import DataSource
from django.contrib.gis.geos import GEOSGeometry, Point, LineString
from django.contrib.gis.measure import D # alias for Distance
from django.contrib.gis.tests.utils import oracle, postgis, spatialite, no_oracle, no_spatialite
+from django.test import TestCase
from models import AustraliaCity, Interstate, SouthTexasInterstate, \
SouthTexasCity, SouthTexasCityFt, CensusZipcode, SouthTexasZipcode
-from data import au_cities, interstates, stx_interstates, stx_cities, stx_zips
-class DistanceTest(unittest.TestCase):
+class DistanceTest(TestCase):
# A point we are testing distances with -- using a WGS84
# coordinate that'll be implicitly transormed to that to
@@ -28,37 +27,12 @@ def get_names(self, qs):
return cities
def test01_init(self):
- "Initialization of distance models."
-
- # Loading up the cities.
- def load_cities(city_model, data_tup):
- for name, x, y in data_tup:
- city_model(name=name, point=Point(x, y, srid=4326)).save()
-
- def load_interstates(imodel, data_tup):
- for name, wkt in data_tup:
- imodel(name=name, path=wkt).save()
-
- load_cities(SouthTexasCity, stx_cities)
- load_cities(SouthTexasCityFt, stx_cities)
- load_cities(AustraliaCity, au_cities)
-
+ "Test initialization of distance models."
self.assertEqual(9, SouthTexasCity.objects.count())
self.assertEqual(9, SouthTexasCityFt.objects.count())
self.assertEqual(11, AustraliaCity.objects.count())
-
- # Loading up the South Texas Zip Codes.
- for name, wkt in stx_zips:
- poly = GEOSGeometry(wkt, srid=4269)
- SouthTexasZipcode(name=name, poly=poly).save()
- CensusZipcode(name=name, poly=poly).save()
self.assertEqual(4, SouthTexasZipcode.objects.count())
self.assertEqual(4, CensusZipcode.objects.count())
-
- # Loading up the Interstates.
- load_interstates(Interstate, interstates)
- load_interstates(SouthTexasInterstate, stx_interstates)
-
self.assertEqual(1, Interstate.objects.count())
self.assertEqual(1, SouthTexasInterstate.objects.count())
@@ -382,8 +356,3 @@ def test09_measurement_null_fields(self):
z = SouthTexasZipcode.objects.distance(htown.point).area().get(name='78212')
self.assertEqual(None, z.distance)
self.assertEqual(None, z.area)
-
-def suite():
- s = unittest.TestSuite()
- s.addTest(unittest.makeSuite(DistanceTest))
- return s
@@ -1,4 +1,6 @@
-import os, re, unittest
+import os
+import re
+from django.utils.unittest import TestCase
from django.contrib.gis.db.models import Union, Extent3D
from django.contrib.gis.geos import GEOSGeometry, Point, Polygon
from django.contrib.gis.utils import LayerMapping, LayerMapError
@@ -49,7 +51,7 @@ def gen_bbox():
bbox_3d = Polygon(tuple((x, y, z) for (x, y), z in zip(bbox_2d[0].coords, bbox_z)), srid=32140)
return bbox_2d, bbox_3d
-class Geo3DTest(unittest.TestCase):
+class Geo3DTest(TestCase):
"""
Only a subset of the PostGIS routines are 3D-enabled, and this TestCase
tries to test the features that can handle 3D and that are also
@@ -227,8 +229,3 @@ def test07_translate(self):
for ztrans in ztranslations:
for city in City3D.objects.translate(0, 0, ztrans):
self.assertEqual(city_dict[city.name][2] + ztrans, city.translate.z)
-
-def suite():
- s = unittest.TestSuite()
- s.addTest(unittest.makeSuite(Geo3DTest))
- return s
Oops, something went wrong.
@@ -1,11 +1,12 @@
-import unittest
from xml.dom import minidom
+from django.test import TestCase
-from django.test import Client
from models import City
-class GeoFeedTest(unittest.TestCase):
- client = Client()
+
+class GeoFeedTest(TestCase):
+
+ urls = 'django.contrib.gis.tests.geoapp.urls'
def assertChildNodes(self, elem, expected):
"Taken from regressiontests/syndication/tests.py."
@@ -16,9 +17,9 @@ def assertChildNodes(self, elem, expected):
def test_geofeed_rss(self):
"Tests geographic feeds using GeoRSS over RSSv2."
# Uses `GEOSGeometry` in `item_geometry`
- doc1 = minidom.parseString(self.client.get('/geoapp/feeds/rss1/').content)
+ doc1 = minidom.parseString(self.client.get('/feeds/rss1/').content)
# Uses a 2-tuple in `item_geometry`
- doc2 = minidom.parseString(self.client.get('/geoapp/feeds/rss2/').content)
+ doc2 = minidom.parseString(self.client.get('/feeds/rss2/').content)
feed1, feed2 = doc1.firstChild, doc2.firstChild
# Making sure the box got added to the second GeoRSS feed.
@@ -41,8 +42,8 @@ def test_geofeed_rss(self):
def test_geofeed_atom(self):
"Testing geographic feeds using GeoRSS over Atom."
- doc1 = minidom.parseString(self.client.get('/geoapp/feeds/atom1/').content)
- doc2 = minidom.parseString(self.client.get('/geoapp/feeds/atom2/').content)
+ doc1 = minidom.parseString(self.client.get('/feeds/atom1/').content)
+ doc2 = minidom.parseString(self.client.get('/feeds/atom2/').content)
feed1, feed2 = doc1.firstChild, doc2.firstChild
# Making sure the box got added to the second GeoRSS feed.
@@ -60,7 +61,7 @@ def test_geofeed_atom(self):
def test_geofeed_w3c(self):
"Testing geographic feeds using W3C Geo."
- doc = minidom.parseString(self.client.get('/geoapp/feeds/w3cgeo1/').content)
+ doc = minidom.parseString(self.client.get('/feeds/w3cgeo1/').content)
feed = doc.firstChild
# Ensuring the geo namespace was added to the <feed> element.
self.assertEqual(feed.getAttribute(u'xmlns:geo'), u'http://www.w3.org/2003/01/geo/wgs84_pos#')
@@ -73,5 +74,5 @@ def test_geofeed_w3c(self):
self.assertChildNodes(item, ['title', 'link', 'description', 'guid', 'geo:lat', 'geo:lon'])
# Boxes and Polygons aren't allowed in W3C Geo feeds.
- self.assertRaises(ValueError, self.client.get, '/geoapp/feeds/w3cgeo2/') # Box in <channel>
- self.assertRaises(ValueError, self.client.get, '/geoapp/feeds/w3cgeo3/') # Polygons in <entry>
+ self.assertRaises(ValueError, self.client.get, '/feeds/w3cgeo2/') # Box in <channel>
+ self.assertRaises(ValueError, self.client.get, '/feeds/w3cgeo3/') # Polygons in <entry>
Oops, something went wrong.

0 comments on commit d54d7a5

Please sign in to comment.