1. import unittest
    
  2. 
    
  3. from django.core.exceptions import ImproperlyConfigured
    
  4. from django.db import ProgrammingError
    
  5. 
    
  6. try:
    
  7.     from django.contrib.gis.db.backends.postgis.operations import PostGISOperations
    
  8. 
    
  9.     HAS_POSTGRES = True
    
  10. except ImportError:
    
  11.     HAS_POSTGRES = False
    
  12. 
    
  13. 
    
  14. if HAS_POSTGRES:
    
  15. 
    
  16.     class FakeConnection:
    
  17.         def __init__(self):
    
  18.             self.settings_dict = {
    
  19.                 "NAME": "test",
    
  20.             }
    
  21. 
    
  22.     class FakePostGISOperations(PostGISOperations):
    
  23.         def __init__(self, version=None):
    
  24.             self.version = version
    
  25.             self.connection = FakeConnection()
    
  26. 
    
  27.         def _get_postgis_func(self, func):
    
  28.             if func == "postgis_lib_version":
    
  29.                 if self.version is None:
    
  30.                     raise ProgrammingError
    
  31.                 else:
    
  32.                     return self.version
    
  33.             elif func == "version":
    
  34.                 pass
    
  35.             else:
    
  36.                 raise NotImplementedError("This function was not expected to be called")
    
  37. 
    
  38. 
    
  39. @unittest.skipUnless(HAS_POSTGRES, "The psycopg2 driver is needed for these tests")
    
  40. class TestPostGISVersionCheck(unittest.TestCase):
    
  41.     """
    
  42.     The PostGIS version check parses correctly the version numbers
    
  43.     """
    
  44. 
    
  45.     def test_get_version(self):
    
  46.         expect = "1.0.0"
    
  47.         ops = FakePostGISOperations(expect)
    
  48.         actual = ops.postgis_lib_version()
    
  49.         self.assertEqual(expect, actual)
    
  50. 
    
  51.     def test_version_classic_tuple(self):
    
  52.         expect = ("1.2.3", 1, 2, 3)
    
  53.         ops = FakePostGISOperations(expect[0])
    
  54.         actual = ops.postgis_version_tuple()
    
  55.         self.assertEqual(expect, actual)
    
  56. 
    
  57.     def test_version_dev_tuple(self):
    
  58.         expect = ("1.2.3dev", 1, 2, 3)
    
  59.         ops = FakePostGISOperations(expect[0])
    
  60.         actual = ops.postgis_version_tuple()
    
  61.         self.assertEqual(expect, actual)
    
  62. 
    
  63.     def test_version_loose_tuple(self):
    
  64.         expect = ("1.2.3b1.dev0", 1, 2, 3)
    
  65.         ops = FakePostGISOperations(expect[0])
    
  66.         actual = ops.postgis_version_tuple()
    
  67.         self.assertEqual(expect, actual)
    
  68. 
    
  69.     def test_valid_version_numbers(self):
    
  70.         versions = [
    
  71.             ("1.3.0", 1, 3, 0),
    
  72.             ("2.1.1", 2, 1, 1),
    
  73.             ("2.2.0dev", 2, 2, 0),
    
  74.         ]
    
  75. 
    
  76.         for version in versions:
    
  77.             with self.subTest(version=version):
    
  78.                 ops = FakePostGISOperations(version[0])
    
  79.                 actual = ops.spatial_version
    
  80.                 self.assertEqual(version[1:], actual)
    
  81. 
    
  82.     def test_no_version_number(self):
    
  83.         ops = FakePostGISOperations()
    
  84.         with self.assertRaises(ImproperlyConfigured):
    
  85.             ops.spatial_version