diff --git a/django/contrib/gis/tests/__init__.py b/django/contrib/gis/tests/__init__.py index cf8e746ed3..612382c460 100644 --- a/django/contrib/gis/tests/__init__.py +++ b/django/contrib/gis/tests/__init__.py @@ -17,7 +17,7 @@ def run_gis_tests(test_labels, verbosity=1, interactive=True, failfast=False, ex return test_runner.run_tests(test_labels, extra_tests=extra_tests) -def geo_apps(namespace=True): +def geo_apps(namespace=True, runtests=False): """ Returns a list of GeoDjango test applications that reside in `django.contrib.gis.tests` that can be used with the current @@ -45,14 +45,16 @@ def geo_apps(namespace=True): apps.append('layermap') - if namespace: + if runtests: + return [('django.contrib.gis.tests', app) for app in apps] + elif namespace: return ['django.contrib.gis.tests.%s' % app for app in apps] else: return apps -def geodjango_suite(): +def geodjango_suite(apps=True): """ Returns a TestSuite consisting only of GeoDjango tests that can be run. """ @@ -89,8 +91,9 @@ def geodjango_suite(): 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))) + if apps: + for app_name in geo_apps(namespace=False): + suite.addTest(build_suite(get_app(app_name))) return suite diff --git a/tests/runtests.py b/tests/runtests.py index 055c910386..5893841f74 100755 --- a/tests/runtests.py +++ b/tests/runtests.py @@ -30,6 +30,12 @@ ALWAYS_INSTALLED_APPS = [ 'django.contrib.staticfiles', ] +def geodjango(settings): + # All databases must have spatial backends to run GeoDjango tests. + spatial_dbs = [name for name, db_dict in settings.DATABASES.items() + if db_dict['ENGINE'].startswith('django.contrib.gis')] + return len(spatial_dbs) == len(settings.DATABASES) + def get_test_models(): models = [] for loc, dirpath in (MODEL_TESTS_DIR_NAME, MODEL_TEST_DIR), (REGRESSION_TESTS_DIR_NAME, REGRESSION_TEST_DIR), (CONTRIB_DIR_NAME, CONTRIB_DIR): @@ -124,7 +130,15 @@ def setup(verbosity, test_labels): # Load all the test model apps. test_labels_set = set([label.split('.')[0] for label in test_labels]) - for model_dir, model_name in get_test_models(): + test_models = get_test_models() + + # If GeoDjango, then we'll want to add in the test applications + # that are a part of its test suite. + if geodjango(settings): + from django.contrib.gis.tests import geo_apps + test_models.extend(geo_apps(runtests=True)) + + for model_dir, model_name in test_models: model_label = '.'.join([model_dir, model_name]) # if the model was named on the command line, or # no models were named (i.e., run all), import @@ -162,6 +176,12 @@ def django_tests(verbosity, interactive, failfast, test_labels): except ValueError: pass + # If GeoDjango is used, add it's tests that aren't a part of + # an application (e.g., GEOS, GDAL, Distance objects). + if geodjango(settings): + from django.contrib.gis.tests import geodjango_suite + extra_tests.append(geodjango_suite(apps=False)) + # Run the test suite, including the extra validation tests. from django.test.utils import get_runner if not hasattr(settings, 'TEST_RUNNER'):