web/lib/django/contrib/gis/tests/__init__.py
changeset 0 0d40e90630ef
child 29 cc9b7e14412b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/lib/django/contrib/gis/tests/__init__.py	Wed Jan 20 00:34:04 2010 +0100
@@ -0,0 +1,183 @@
+import sys, unittest
+from django.utils.importlib import import_module
+
+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.gdal import HAS_GDAL
+    from django.contrib.gis.utils import HAS_GEOIP
+    from django.contrib.gis.tests.utils import mysql
+
+    # The test suite.
+    s = unittest.TestSuite()
+
+    # Adding the GEOS tests.
+    from django.contrib.gis.geos import tests as geos_tests
+    s.addTest(geos_tests.suite())
+
+    # Tests that require use of a spatial database (e.g., creation of models)
+    test_apps = ['geoapp', 'relatedapp']
+
+    # Tests that do not require setting up and tearing down a spatial database.
+    test_suite_names = [
+        'test_measure',
+        ]
+
+    # Tests applications that require a test spatial db.
+    if not mysql:
+        test_apps.append('distapp')
+
+    if HAS_GDAL:
+        # These tests require GDAL.
+        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
+        s.addTest(gdal_tests.suite())
+    else:
+        print >>sys.stderr, "GDAL not available - no tests requiring GDAL will be run."
+
+    if HAS_GEOIP and hasattr(settings, 'GEOIP_PATH'):
+        test_suite_names.append('test_geoip')
+
+    # 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)
+        s.addTest(tsuite.suite())
+
+    return s, test_apps
+
+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
+
+    # Getting initial values.
+    old_installed = settings.INSTALLED_APPS
+    old_root_urlconf = settings.ROOT_URLCONF
+
+    # 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',
+                      ]
+
+    # Setting the URLs.
+    settings.ROOT_URLCONF = 'django.contrib.gis.tests.urls'
+
+    # Creating the test suite, adding the test models to INSTALLED_APPS, and
+    # adding the model test suites to our suite package.
+    gis_suite, test_apps = geo_suite()
+    for test_model in test_apps:
+        module_name = 'django.contrib.gis.tests.%s' % test_model
+        if mysql:
+            test_module = 'tests_mysql'
+        else:
+            test_module = 'tests'
+        new_installed.append(module_name)
+
+        # Getting the model test suite
+        tsuite = import_module(module_name + '.' + test_module)
+        gis_suite.addTest(tsuite.suite())
+
+    # 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
+
+    # Running the tests using the GIS test runner.
+    result = run_tests(test_labels, suite=gis_suite, **kwargs)
+
+    # Restoring modified settings.
+    settings.INSTALLED_APPS = old_installed
+    settings.ROOT_URLCONF = old_root_urlconf
+
+    return result
+
+def run_tests(test_labels, verbosity=1, interactive=True, extra_tests=[], suite=None):
+    """
+    Set `TEST_RUNNER` in your settings with this routine in order to
+    scaffold test spatial databases correctly for your GeoDjango models.
+    For more documentation, please consult the following URL:
+      http://geodjango.org/docs/testing.html.
+    """
+    from django.conf import settings
+    from django.db import connection
+    from django.db.models import get_app, get_apps
+    from django.test.simple import build_suite, build_test, reorder_suite, TestCase
+    from django.test.utils import setup_test_environment, teardown_test_environment
+
+    # The `create_test_spatial_db` routine abstracts away all the steps needed
+    # to properly construct a spatial database for the backend.
+    from django.contrib.gis.db.backend import create_test_spatial_db
+
+    # Setting up for testing.
+    setup_test_environment()
+    settings.DEBUG = False
+    old_name = settings.DATABASE_NAME
+
+    # Creating the test spatial database.
+    create_test_spatial_db(verbosity=verbosity, autoclobber=not interactive)
+
+    # The suite may be passed in manually, e.g., when we run the GeoDjango test,
+    # we want to build it and pass it in due to some customizations.  Otherwise,
+    # the normal test suite creation process from `django.test.simple.run_tests`
+    # is used to create the test suite.
+    if suite is None:
+        suite = unittest.TestSuite()
+        if test_labels:
+            for label in test_labels:
+                if '.' in label:
+                    suite.addTest(build_test(label))
+                else:
+                    app = get_app(label)
+                    suite.addTest(build_suite(app))
+        else:
+            for app in get_apps():
+                suite.addTest(build_suite(app))
+
+        for test in extra_tests:
+            suite.addTest(test)
+
+    suite = reorder_suite(suite, (TestCase,))
+
+    # Executing the tests (including the model tests), and destorying the
+    # test database after the tests have completed.
+    result = unittest.TextTestRunner(verbosity=verbosity).run(suite)
+    connection.creation.destroy_test_db(old_name, verbosity)
+    teardown_test_environment()
+
+    # Returning the total failures and errors
+    return len(result.failures) + len(result.errors)
+
+# Class for creating a fake module with a run method.  This is for the
+# GEOS and GDAL tests that were moved to their respective modules.
+class _DeprecatedTestModule(object):
+    def __init__(self, mod_name):
+        self.mod_name = mod_name
+
+    def run(self):
+        from warnings import warn
+        warn('This test module is deprecated because it has moved to ' \
+             '`django.contrib.gis.%s.tests` and will disappear in 1.2.' %
+             self.mod_name, DeprecationWarning)
+        tests = import_module('django.contrib.gis.%s.tests' % self.mod_name)
+        tests.run()
+
+test_geos = _DeprecatedTestModule('geos')
+test_gdal = _DeprecatedTestModule('gdal')