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

[1.2.X] Fixed #10420 -- GeoDjango tests are run as part of Django tests when...

[1.2.X] Fixed #10420 -- GeoDjango tests are run as part of Django tests when using spatial database backends with `runtests.py`.

Backport of r15013 from trunk.

git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.2.X@15014 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent 2565b807
Loading
Loading
Loading
Loading
+8 −5
Original line number Diff line number Diff line
@@ -19,7 +19,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
@@ -47,14 +47,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.
    """
@@ -91,6 +93,7 @@ def geodjango_suite():
        suite.addTest(test_geoip.suite())

    # Finally, adding the suites for each of the GeoDjango test apps.
    if apps:
        for app_name in geo_apps(namespace=False):
            suite.addTest(build_suite(get_app(app_name)))

+21 −1
Original line number Diff line number Diff line
@@ -30,6 +30,12 @@ ALWAYS_INSTALLED_APPS = [
    'django.contrib.admindocs',
]

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'):