Commit d54d7a52 authored by Justin Bronn's avatar Justin Bronn
Browse files

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

[1.2.X] GeoDjango test suite housekeeping.  Moved data into fixtures for `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
parent 65b26b30
Loading
Loading
Loading
Loading
+96 −69
Original line number Diff line number Diff line
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,63 +18,49 @@ 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

        # 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)
    apps = ['geoapp', 'relatedapp']

    # No distance queries on MySQL.
    if not connection.ops.mysql:
        apps.append('distapp')

        # 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')
    if connection.ops.postgis and connection.ops.geography:
        apps.append('geogapp')

        if HAS_GDAL:
    # The following GeoDjango test apps depend on GDAL support.
            if not connection.ops.mysql:
                self.geo_apps.append('distapp')

    if HAS_GDAL:
        # 3D apps use LayerMapping, which uses GDAL.
        if connection.ops.postgis and GEOS_PREPARE:
                self.geo_apps.append('geo3d')
            apps.append('geo3d')

            self.geo_apps.append('layermap')
        apps.append('layermap')

        # Constructing the new INSTALLED_APPS, and including applications
        # within the GeoDjango test namespace (`self.geo_apps`).
        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])
        settings.INSTALLED_APPS = new_installed

        # Setting the URLs.
        settings.ROOT_URLCONF = 'django.contrib.gis.tests.urls'
        settings.SITE_ID = 1
    if namespace:
        return ['django.contrib.gis.tests.%s' % app
                for app in apps]
    else:
        return apps

    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):
def geodjango_suite():
    """
        This method is overridden to construct a suite consisting only of tests
        for GeoDjango.
    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.
@@ -105,7 +91,48 @@ class GeoDjangoTestSuiteRunner(DjangoTestSuiteRunner):
        suite.addTest(test_geoip.suite())

    # Finally, adding the suites for each of the GeoDjango test apps.
        for app_name in self.geo_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.
        new_installed =  ['django.contrib.sites',
                          'django.contrib.sitemaps',
                          'django.contrib.gis',
                          ]

        # Calling out to `geo_apps` to get GeoDjango applications supported
        # for testing.
        new_installed.extend(geo_apps())
        settings.INSTALLED_APPS = new_installed

        # 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):
        return geodjango_suite()
+0 −36
Original line number Diff line number Diff line
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)'),
                   )
+6.35 KiB

File added.

No diff preview for this file type.

+4 −35
Original line number Diff line number Diff line
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 @@ class DistanceTest(unittest.TestCase):
        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 @@ class DistanceTest(unittest.TestCase):
        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
+4 −7
Original line number Diff line number Diff line
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 @@ class Geo3DTest(unittest.TestCase):
        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
Loading