Author: jbronn
Date: 2010-09-11 20:40:42 -0500 (Sat, 11 Sep 2010)
New Revision: 13755

Modified:
   django/trunk/django/contrib/gis/tests/__init__.py
Log:
Fixed regression in running the GeoDjango test suite after r13670 with addition 
of `GeoDjangoTestSuiteRunner` (replaces `run_gis_tests`, which is now a stub).


Modified: django/trunk/django/contrib/gis/tests/__init__.py
===================================================================
--- django/trunk/django/contrib/gis/tests/__init__.py   2010-09-11 21:28:00 UTC 
(rev 13754)
+++ django/trunk/django/contrib/gis/tests/__init__.py   2010-09-12 01:40:42 UTC 
(rev 13755)
@@ -1,115 +1,108 @@
 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 geo_suite():
-    """
-    Builds a test suite for the GIS package.  This is not named
-    `suite` so it will not interfere with the Django test suite (since
-    spatial database tables are required to execute these tests on
-    some backends).
-    """
-    from django.conf import settings
-    from django.contrib.gis.geos import GEOS_PREPARE
-    from django.contrib.gis.gdal import HAS_GDAL
-    from django.contrib.gis.utils import HAS_GEOIP
-    from django.contrib.gis.tests.utils import postgis, mysql
-    from django.db import connection
-    from django.utils.importlib import import_module
+def run_gis_tests(test_labels, verbosity=1, interactive=True, failfast=False, 
extra_tests=None):
+    import warnings
+    warnings.warn(
+        'The run_gis_tests() test runner has been deprecated in favor of 
GeoDjangoTestSuiteRunner.',
+        PendingDeprecationWarning
+    )
+    test_runner = GeoDjangoTestSuiteRunner(verbosity=verbosity, 
interactive=interactive, failfast=failfast)
+    return test_runner.run_tests(test_labels, extra_tests=extra_tests)
 
-    gis_tests = []
+class GeoDjangoTestSuiteRunner(DjangoTestSuiteRunner):
 
-    # Adding the GEOS tests.
-    from django.contrib.gis.geos import tests as geos_tests
-    gis_tests.append(geos_tests.suite())
+    def setup_test_environment(self, **kwargs):
+        super(GeoDjangoTestSuiteRunner, self).setup_test_environment(**kwargs)
+        
+        from django.db import connection
+        from django.contrib.gis.geos import GEOS_PREPARE
+        from django.contrib.gis.gdal import HAS_GDAL
 
-    # Tests that require use of a spatial database (e.g., creation of models)
-    test_apps = ['geoapp', 'relatedapp']
-    if postgis and connection.ops.geography:
-        # Test geography support with PostGIS 1.5+.
-        test_apps.append('geogapp')
+        # Getting and storing the original values of INSTALLED_APPS and
+        # the ROOT_URLCONF.
+        self.old_installed = settings.INSTALLED_APPS
+        self.old_root_urlconf = settings.ROOT_URLCONF
 
-    # Tests that do not require setting up and tearing down a spatial database.
-    test_suite_names = [
-        'test_measure',
-        ]
+        # 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 HAS_GDAL:
-        # These tests require GDAL.
-        if not mysql:
-            test_apps.append('distapp')
+        if HAS_GDAL:
+            # The following GeoDjango test apps depend on GDAL support.
+            if not connection.ops.mysql:
+                self.geo_apps.append('distapp')
 
-        # Only PostGIS using GEOS 3.1+ can support 3D so far.
-        if postgis and GEOS_PREPARE:
-            test_apps.append('geo3d')
+            # 3D apps use LayerMapping, which uses GDAL.
+            if connection.ops.postgis and GEOS_PREPARE:
+                self.geo_apps.append('geo3d')
 
-        test_suite_names.extend(['test_spatialrefsys', 'test_geoforms'])
-        test_apps.append('layermap')
-        
-        # Adding the GDAL tests.
-        from django.contrib.gis.gdal import tests as gdal_tests
-        gis_tests.append(gdal_tests.suite())
-    else:
-        print >>sys.stderr, "GDAL not available - no tests requiring GDAL will 
be run."
+            self.geo_apps.append('layermap')
 
-    if HAS_GEOIP and hasattr(settings, 'GEOIP_PATH'):
-        test_suite_names.append('test_geoip')
+        # 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
 
-    # Adding the rest of the suites from the modules specified
-    # in the `test_suite_names`.
-    for suite_name in test_suite_names:
-        tsuite = import_module('django.contrib.gis.tests.' + suite_name)
-        gis_tests.append(tsuite.suite())
+        # Setting the URLs.
+        settings.ROOT_URLCONF = 'django.contrib.gis.tests.urls'
 
-    return gis_tests, test_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
 
-def run_gis_tests(test_labels, **kwargs):
-    """
-    Use this routine as the TEST_RUNNER in your settings in order to run the
-    GeoDjango test suite.  This must be done as a database superuser for
-    PostGIS, so read the docstring in `run_test()` below for more details.
-    """
-    from django.conf import settings
-    from django.db.models import loading
-    from django.contrib.gis.tests.utils import mysql
+    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()
 
-    # Getting initial values.
-    old_installed = settings.INSTALLED_APPS
-    old_root_urlconf = settings.ROOT_URLCONF
+        # Adding the GEOS tests.
+        from django.contrib.gis.geos import tests as geos_tests
+        suite.addTest(geos_tests.suite())
 
-    # Overridding the INSTALLED_APPS with only what we need,
-    # to prevent unnecessary database table creation.
-    new_installed =  ['django.contrib.sites',
-                      'django.contrib.sitemaps',
-                      'django.contrib.gis',
-                      ]
+        # Adding the measurment tests.
+        from django.contrib.gis.tests import test_measure
+        suite.addTest(test_measure.suite())
 
-    # Setting the URLs.
-    settings.ROOT_URLCONF = 'django.contrib.gis.tests.urls'
+        # 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())
 
-    # Creating the test suite, adding the test models to INSTALLED_APPS
-    # so they will be tested.
-    gis_tests, test_apps = geo_suite()
-    for test_model in test_apps:
-        module_name = 'django.contrib.gis.tests.%s' % test_model
-        new_installed.append(module_name)
+            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')
 
-    # Resetting the loaded flag to take into account what we appended to
-    # the INSTALLED_APPS (since this routine is invoked through
-    # django/core/management, it caches the apps; this ensures that syncdb
-    # will see our appended models)
-    settings.INSTALLED_APPS = new_installed
-    loading.cache.loaded = False
+        # 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())
 
-    kwargs['extra_tests'] = gis_tests
+        # 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)))
 
-    # Running the tests using the GIS test runner.
-    result = run_tests(test_labels, **kwargs)
-
-    # Restoring modified settings.
-    settings.INSTALLED_APPS = old_installed
-    settings.ROOT_URLCONF = old_root_urlconf
-
-    return result
+        return suite

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to django-upda...@googlegroups.com.
To unsubscribe from this group, send email to 
django-updates+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en.

Reply via email to