summaryrefslogtreecommitdiff
path: root/tests/gis_tests/tests.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/gis_tests/tests.py')
-rw-r--r--tests/gis_tests/tests.py92
1 files changed, 92 insertions, 0 deletions
diff --git a/tests/gis_tests/tests.py b/tests/gis_tests/tests.py
new file mode 100644
index 0000000000..cc52d2429b
--- /dev/null
+++ b/tests/gis_tests/tests.py
@@ -0,0 +1,92 @@
+import sys
+import unittest
+
+from django.core.exceptions import ImproperlyConfigured
+from django.db import ProgrammingError
+from django.utils import six
+
+try:
+ from django.contrib.gis.db.backends.postgis.operations import PostGISOperations
+ HAS_POSTGRES = True
+except ImportError:
+ HAS_POSTGRES = False
+except ImproperlyConfigured as e:
+ # If psycopg is installed but not geos, the import path hits
+ # django.contrib.gis.geometry.backend which will "helpfully" convert
+ # an ImportError into an ImproperlyConfigured.
+ # Here, we make sure we're only catching this specific case and not another
+ # ImproperlyConfigured one.
+ if e.args and e.args[0].startswith('Could not import user-defined GEOMETRY_BACKEND'):
+ HAS_POSTGRES = False
+ else:
+ six.reraise(*sys.exc_info())
+
+
+if HAS_POSTGRES:
+ class FakeConnection(object):
+ def __init__(self):
+ self.settings_dict = {
+ 'NAME': 'test',
+ }
+
+ class FakePostGISOperations(PostGISOperations):
+ def __init__(self, version=None):
+ self.version = version
+ self.connection = FakeConnection()
+
+ def _get_postgis_func(self, func):
+ if func == 'postgis_lib_version':
+ if self.version is None:
+ raise ProgrammingError
+ else:
+ return self.version
+ else:
+ raise NotImplementedError('This function was not expected to be called')
+
+
+@unittest.skipUnless(HAS_POSTGRES, "The psycopg2 driver is needed for these tests")
+class TestPostgisVersionCheck(unittest.TestCase):
+ """
+ Tests that the postgis version check parses correctly the version numbers
+ """
+
+ def test_get_version(self):
+ expect = '1.0.0'
+ ops = FakePostGISOperations(expect)
+ actual = ops.postgis_lib_version()
+ self.assertEqual(expect, actual)
+
+ def test_version_classic_tuple(self):
+ expect = ('1.2.3', 1, 2, 3)
+ ops = FakePostGISOperations(expect[0])
+ actual = ops.postgis_version_tuple()
+ self.assertEqual(expect, actual)
+
+ def test_version_dev_tuple(self):
+ expect = ('1.2.3dev', 1, 2, 3)
+ ops = FakePostGISOperations(expect[0])
+ actual = ops.postgis_version_tuple()
+ self.assertEqual(expect, actual)
+
+ def test_valid_version_numbers(self):
+ versions = [
+ ('1.3.0', 1, 3, 0),
+ ('2.1.1', 2, 1, 1),
+ ('2.2.0dev', 2, 2, 0),
+ ]
+
+ for version in versions:
+ ops = FakePostGISOperations(version[0])
+ actual = ops.spatial_version
+ self.assertEqual(version[1:], actual)
+
+ def test_invalid_version_numbers(self):
+ versions = ['nope', '123']
+
+ for version in versions:
+ ops = FakePostGISOperations(version)
+ self.assertRaises(Exception, lambda: ops.spatial_version)
+
+ def test_no_version_number(self):
+ ops = FakePostGISOperations()
+ self.assertRaises(ImproperlyConfigured, lambda: ops.spatial_version)