Quellcode durchsuchen

Moved contrib.gis tests out of contrib.

Tim Graham vor 10 Jahren
Ursprung
Commit
ad0be620ae
99 geänderte Dateien mit 82 neuen und 72 gelöschten Zeilen
  1. 0 6
      MANIFEST.in
  2. 0 0
      tests/gis_tests/__init__.py
  3. 0 0
      tests/gis_tests/data/ch-city/ch-city.dbf
  4. 0 0
      tests/gis_tests/data/ch-city/ch-city.prj
  5. 0 0
      tests/gis_tests/data/ch-city/ch-city.shp
  6. 0 0
      tests/gis_tests/data/ch-city/ch-city.shx
  7. 0 0
      tests/gis_tests/data/cities/cities.dbf
  8. 0 0
      tests/gis_tests/data/cities/cities.prj
  9. 0 0
      tests/gis_tests/data/cities/cities.shp
  10. 0 0
      tests/gis_tests/data/cities/cities.shx
  11. 0 0
      tests/gis_tests/data/counties/counties.dbf
  12. 0 0
      tests/gis_tests/data/counties/counties.shp
  13. 0 0
      tests/gis_tests/data/counties/counties.shx
  14. 0 0
      tests/gis_tests/data/geometries.json
  15. 0 0
      tests/gis_tests/data/interstates/interstates.dbf
  16. 0 0
      tests/gis_tests/data/interstates/interstates.prj
  17. 0 0
      tests/gis_tests/data/interstates/interstates.shp
  18. 0 0
      tests/gis_tests/data/interstates/interstates.shx
  19. 0 0
      tests/gis_tests/data/invalid/emptypoints.dbf
  20. 0 0
      tests/gis_tests/data/invalid/emptypoints.shp
  21. 0 0
      tests/gis_tests/data/invalid/emptypoints.shx
  22. 0 0
      tests/gis_tests/data/test_point/test_point.dbf
  23. 0 0
      tests/gis_tests/data/test_point/test_point.prj
  24. 0 0
      tests/gis_tests/data/test_point/test_point.shp
  25. 0 0
      tests/gis_tests/data/test_point/test_point.shx
  26. 0 0
      tests/gis_tests/data/test_poly/test_poly.dbf
  27. 0 0
      tests/gis_tests/data/test_poly/test_poly.prj
  28. 0 0
      tests/gis_tests/data/test_poly/test_poly.shp
  29. 0 0
      tests/gis_tests/data/test_poly/test_poly.shx
  30. 0 0
      tests/gis_tests/data/test_vrt/test_vrt.csv
  31. 0 0
      tests/gis_tests/data/test_vrt/test_vrt.vrt
  32. 0 0
      tests/gis_tests/data/texas.dbf
  33. 0 0
      tests/gis_tests/distapp/__init__.py
  34. 0 0
      tests/gis_tests/distapp/fixtures/initial.json
  35. 2 2
      tests/gis_tests/distapp/models.py
  36. 2 3
      tests/gis_tests/distapp/tests.py
  37. 0 0
      tests/gis_tests/gdal_tests/__init__.py
  38. 0 0
      tests/gis_tests/gdal_tests/data/raster.tif
  39. 0 0
      tests/gis_tests/gdal_tests/test_driver.py
  40. 2 3
      tests/gis_tests/gdal_tests/test_ds.py
  41. 0 0
      tests/gis_tests/gdal_tests/test_envelope.py
  42. 2 1
      tests/gis_tests/gdal_tests/test_geom.py
  43. 0 0
      tests/gis_tests/gdal_tests/test_raster.py
  44. 0 0
      tests/gis_tests/gdal_tests/test_srs.py
  45. 0 0
      tests/gis_tests/geo3d/__init__.py
  46. 0 2
      tests/gis_tests/geo3d/models.py
  47. 0 0
      tests/gis_tests/geo3d/tests.py
  48. 0 0
      tests/gis_tests/geo3d/views.py
  49. 0 0
      tests/gis_tests/geoadmin/__init__.py
  50. 0 0
      tests/gis_tests/geoadmin/admin.py
  51. 0 0
      tests/gis_tests/geoadmin/models.py
  52. 0 0
      tests/gis_tests/geoadmin/tests.py
  53. 0 0
      tests/gis_tests/geoadmin/urls.py
  54. 0 0
      tests/gis_tests/geoapp/__init__.py
  55. 0 0
      tests/gis_tests/geoapp/feeds.py
  56. 0 0
      tests/gis_tests/geoapp/fixtures/initial.json.gz
  57. 8 8
      tests/gis_tests/geoapp/models.py
  58. 0 0
      tests/gis_tests/geoapp/sitemaps.py
  59. 1 1
      tests/gis_tests/geoapp/test_feeds.py
  60. 2 1
      tests/gis_tests/geoapp/test_regress.py
  61. 0 0
      tests/gis_tests/geoapp/test_serializers.py
  62. 1 1
      tests/gis_tests/geoapp/test_sitemaps.py
  63. 2 3
      tests/gis_tests/geoapp/tests.py
  64. 0 0
      tests/gis_tests/geoapp/urls.py
  65. 0 0
      tests/gis_tests/geogapp/__init__.py
  66. 0 0
      tests/gis_tests/geogapp/fixtures/initial.json
  67. 6 1
      tests/gis_tests/geogapp/models.py
  68. 2 1
      tests/gis_tests/geogapp/tests.py
  69. 0 0
      tests/gis_tests/geos_tests/__init__.py
  70. 8 6
      tests/gis_tests/geos_tests/test_geos.py
  71. 5 3
      tests/gis_tests/geos_tests/test_geos_mutation.py
  72. 4 3
      tests/gis_tests/geos_tests/test_io.py
  73. 0 0
      tests/gis_tests/geos_tests/test_mutable_list.py
  74. 0 0
      tests/gis_tests/gis_migrations/__init__.py
  75. 0 0
      tests/gis_tests/gis_migrations/migrations/0001_initial.py
  76. 0 0
      tests/gis_tests/gis_migrations/migrations/__init__.py
  77. 1 1
      tests/gis_tests/gis_migrations/test_commands.py
  78. 3 2
      tests/gis_tests/gis_migrations/test_operations.py
  79. 0 0
      tests/gis_tests/inspectapp/__init__.py
  80. 0 3
      tests/gis_tests/inspectapp/models.py
  81. 2 1
      tests/gis_tests/inspectapp/tests.py
  82. 0 0
      tests/gis_tests/layermap/__init__.py
  83. 6 4
      tests/gis_tests/layermap/models.py
  84. 0 0
      tests/gis_tests/layermap/tests.py
  85. 0 0
      tests/gis_tests/maps/__init__.py
  86. 4 1
      tests/gis_tests/maps/tests.py
  87. 0 0
      tests/gis_tests/relatedapp/__init__.py
  88. 0 0
      tests/gis_tests/relatedapp/fixtures/initial.json
  89. 0 4
      tests/gis_tests/relatedapp/models.py
  90. 2 1
      tests/gis_tests/relatedapp/tests.py
  91. 1 2
      tests/gis_tests/test_data.py
  92. 0 0
      tests/gis_tests/test_geoforms.py
  93. 2 2
      tests/gis_tests/test_geoip.py
  94. 0 0
      tests/gis_tests/test_measure.py
  95. 2 3
      tests/gis_tests/test_spatialrefsys.py
  96. 0 0
      tests/gis_tests/tests.py
  97. 0 0
      tests/gis_tests/utils.py
  98. 10 1
      tests/runtests.py
  99. 2 2
      tests/test_runner/test_discover_runner.py

+ 0 - 6
MANIFEST.in

@@ -19,14 +19,8 @@ recursive-include django/contrib/admin/templates *
 recursive-include django/contrib/admin/static *
 recursive-include django/contrib/admindocs/templates *
 recursive-include django/contrib/auth/templates *
-recursive-include django/contrib/gis/gdal/tests/data *
 recursive-include django/contrib/gis/static *
 recursive-include django/contrib/gis/templates *
-recursive-include django/contrib/gis/tests/data *
-recursive-include django/contrib/gis/tests/distapp/fixtures *
-recursive-include django/contrib/gis/tests/geoapp/fixtures *
-recursive-include django/contrib/gis/tests/geogapp/fixtures *
-recursive-include django/contrib/gis/tests/relatedapp/fixtures *
 recursive-include django/contrib/sitemaps/templates *
 recursive-exclude * __pycache__
 recursive-exclude * *.py[co]

+ 0 - 0
django/contrib/gis/gdal/tests/__init__.py → tests/gis_tests/__init__.py


+ 0 - 0
django/contrib/gis/tests/data/ch-city/ch-city.dbf → tests/gis_tests/data/ch-city/ch-city.dbf


+ 0 - 0
django/contrib/gis/tests/data/ch-city/ch-city.prj → tests/gis_tests/data/ch-city/ch-city.prj


+ 0 - 0
django/contrib/gis/tests/data/ch-city/ch-city.shp → tests/gis_tests/data/ch-city/ch-city.shp


+ 0 - 0
django/contrib/gis/tests/data/ch-city/ch-city.shx → tests/gis_tests/data/ch-city/ch-city.shx


+ 0 - 0
django/contrib/gis/tests/data/cities/cities.dbf → tests/gis_tests/data/cities/cities.dbf


+ 0 - 0
django/contrib/gis/tests/data/cities/cities.prj → tests/gis_tests/data/cities/cities.prj


+ 0 - 0
django/contrib/gis/tests/data/cities/cities.shp → tests/gis_tests/data/cities/cities.shp


+ 0 - 0
django/contrib/gis/tests/data/cities/cities.shx → tests/gis_tests/data/cities/cities.shx


+ 0 - 0
django/contrib/gis/tests/data/counties/counties.dbf → tests/gis_tests/data/counties/counties.dbf


+ 0 - 0
django/contrib/gis/tests/data/counties/counties.shp → tests/gis_tests/data/counties/counties.shp


+ 0 - 0
django/contrib/gis/tests/data/counties/counties.shx → tests/gis_tests/data/counties/counties.shx


+ 0 - 0
django/contrib/gis/tests/data/geometries.json → tests/gis_tests/data/geometries.json


+ 0 - 0
django/contrib/gis/tests/data/interstates/interstates.dbf → tests/gis_tests/data/interstates/interstates.dbf


+ 0 - 0
django/contrib/gis/tests/data/interstates/interstates.prj → tests/gis_tests/data/interstates/interstates.prj


+ 0 - 0
django/contrib/gis/tests/data/interstates/interstates.shp → tests/gis_tests/data/interstates/interstates.shp


+ 0 - 0
django/contrib/gis/tests/data/interstates/interstates.shx → tests/gis_tests/data/interstates/interstates.shx


+ 0 - 0
django/contrib/gis/tests/data/invalid/emptypoints.dbf → tests/gis_tests/data/invalid/emptypoints.dbf


+ 0 - 0
django/contrib/gis/tests/data/invalid/emptypoints.shp → tests/gis_tests/data/invalid/emptypoints.shp


+ 0 - 0
django/contrib/gis/tests/data/invalid/emptypoints.shx → tests/gis_tests/data/invalid/emptypoints.shx


+ 0 - 0
django/contrib/gis/tests/data/test_point/test_point.dbf → tests/gis_tests/data/test_point/test_point.dbf


+ 0 - 0
django/contrib/gis/tests/data/test_point/test_point.prj → tests/gis_tests/data/test_point/test_point.prj


+ 0 - 0
django/contrib/gis/tests/data/test_point/test_point.shp → tests/gis_tests/data/test_point/test_point.shp


+ 0 - 0
django/contrib/gis/tests/data/test_point/test_point.shx → tests/gis_tests/data/test_point/test_point.shx


+ 0 - 0
django/contrib/gis/tests/data/test_poly/test_poly.dbf → tests/gis_tests/data/test_poly/test_poly.dbf


+ 0 - 0
django/contrib/gis/tests/data/test_poly/test_poly.prj → tests/gis_tests/data/test_poly/test_poly.prj


+ 0 - 0
django/contrib/gis/tests/data/test_poly/test_poly.shp → tests/gis_tests/data/test_poly/test_poly.shp


+ 0 - 0
django/contrib/gis/tests/data/test_poly/test_poly.shx → tests/gis_tests/data/test_poly/test_poly.shx


+ 0 - 0
django/contrib/gis/tests/data/test_vrt/test_vrt.csv → tests/gis_tests/data/test_vrt/test_vrt.csv


+ 0 - 0
django/contrib/gis/tests/data/test_vrt/test_vrt.vrt → tests/gis_tests/data/test_vrt/test_vrt.vrt


+ 0 - 0
django/contrib/gis/tests/data/texas.dbf → tests/gis_tests/data/texas.dbf


+ 0 - 0
django/contrib/gis/geos/tests/__init__.py → tests/gis_tests/distapp/__init__.py


+ 0 - 0
django/contrib/gis/tests/distapp/fixtures/initial.json → tests/gis_tests/distapp/fixtures/initial.json


+ 2 - 2
django/contrib/gis/tests/distapp/models.py → tests/gis_tests/distapp/models.py

@@ -1,7 +1,8 @@
 from django.contrib.gis.db import models
-from django.contrib.gis.tests.utils import gisfield_may_be_null
 from django.utils.encoding import python_2_unicode_compatible
 
+from ..utils import gisfield_may_be_null
+
 
 @python_2_unicode_compatible
 class NamedModel(models.Model):
@@ -11,7 +12,6 @@ class NamedModel(models.Model):
 
     class Meta:
         abstract = True
-        app_label = 'distapp'
 
     def __str__(self):
         return self.name

+ 2 - 3
django/contrib/gis/tests/distapp/tests.py → tests/gis_tests/distapp/tests.py

@@ -2,13 +2,12 @@ from __future__ import unicode_literals
 
 from django.contrib.gis.geos import HAS_GEOS
 from django.contrib.gis.measure import D  # alias for Distance
-from django.contrib.gis.tests.utils import (
-    no_oracle, oracle, postgis, spatialite,
-)
 from django.db import connection
 from django.db.models import Q
 from django.test import TestCase, skipUnlessDBFeature
 
+from ..utils import no_oracle, oracle, postgis, spatialite
+
 if HAS_GEOS:
     from django.contrib.gis.geos import GEOSGeometry, LineString
 

+ 0 - 0
django/contrib/gis/tests/__init__.py → tests/gis_tests/gdal_tests/__init__.py


+ 0 - 0
django/contrib/gis/gdal/tests/data/raster.tif → tests/gis_tests/gdal_tests/data/raster.tif


+ 0 - 0
django/contrib/gis/gdal/tests/test_driver.py → tests/gis_tests/gdal_tests/test_driver.py


+ 2 - 3
django/contrib/gis/gdal/tests/test_ds.py → tests/gis_tests/gdal_tests/test_ds.py

@@ -3,9 +3,8 @@ import unittest
 from unittest import skipUnless
 
 from django.contrib.gis.gdal import HAS_GDAL
-from django.contrib.gis.geometry.test_data import (
-    TEST_DATA, TestDS, get_ds_file,
-)
+
+from ..test_data import TEST_DATA, TestDS, get_ds_file
 
 if HAS_GDAL:
     from django.contrib.gis.gdal import DataSource, Envelope, OGRGeometry, GDALException, OGRIndexError, GDAL_VERSION

+ 0 - 0
django/contrib/gis/gdal/tests/test_envelope.py → tests/gis_tests/gdal_tests/test_envelope.py


+ 2 - 1
django/contrib/gis/gdal/tests/test_geom.py → tests/gis_tests/gdal_tests/test_geom.py

@@ -4,9 +4,10 @@ from binascii import b2a_hex
 from unittest import skipUnless
 
 from django.contrib.gis.gdal import HAS_GDAL
-from django.contrib.gis.geometry.test_data import TestDataMixin
 from django.utils.six.moves import range
 
+from ..test_data import TestDataMixin
+
 try:
     from django.utils.six.moves import cPickle as pickle
 except ImportError:

+ 0 - 0
django/contrib/gis/gdal/tests/test_raster.py → tests/gis_tests/gdal_tests/test_raster.py


+ 0 - 0
django/contrib/gis/gdal/tests/test_srs.py → tests/gis_tests/gdal_tests/test_srs.py


+ 0 - 0
django/contrib/gis/tests/distapp/__init__.py → tests/gis_tests/geo3d/__init__.py


+ 0 - 2
django/contrib/gis/tests/geo3d/models.py → tests/gis_tests/geo3d/models.py

@@ -10,7 +10,6 @@ class NamedModel(models.Model):
 
     class Meta:
         abstract = True
-        app_label = 'geo3d'
 
     def __str__(self):
         return self.name
@@ -50,7 +49,6 @@ class SimpleModel(models.Model):
 
     class Meta:
         abstract = True
-        app_label = 'geo3d'
 
 
 class Point2D(SimpleModel):

+ 0 - 0
django/contrib/gis/tests/geo3d/tests.py → tests/gis_tests/geo3d/tests.py


+ 0 - 0
django/contrib/gis/tests/geo3d/views.py → tests/gis_tests/geo3d/views.py


+ 0 - 0
django/contrib/gis/tests/geo3d/__init__.py → tests/gis_tests/geoadmin/__init__.py


+ 0 - 0
django/contrib/gis/tests/geoadmin/admin.py → tests/gis_tests/geoadmin/admin.py


+ 0 - 0
django/contrib/gis/tests/geoadmin/models.py → tests/gis_tests/geoadmin/models.py


+ 0 - 0
django/contrib/gis/tests/geoadmin/tests.py → tests/gis_tests/geoadmin/tests.py


+ 0 - 0
django/contrib/gis/tests/geoadmin/urls.py → tests/gis_tests/geoadmin/urls.py


+ 0 - 0
django/contrib/gis/tests/geoadmin/__init__.py → tests/gis_tests/geoapp/__init__.py


+ 0 - 0
django/contrib/gis/tests/geoapp/feeds.py → tests/gis_tests/geoapp/feeds.py


+ 0 - 0
django/contrib/gis/tests/geoapp/fixtures/initial.json.gz → tests/gis_tests/geoapp/fixtures/initial.json.gz


+ 8 - 8
django/contrib/gis/tests/geoapp/models.py → tests/gis_tests/geoapp/models.py

@@ -1,7 +1,8 @@
 from django.contrib.gis.db import models
-from django.contrib.gis.tests.utils import gisfield_may_be_null
 from django.utils.encoding import python_2_unicode_compatible
 
+from ..utils import gisfield_may_be_null
+
 
 @python_2_unicode_compatible
 class NamedModel(models.Model):
@@ -11,7 +12,6 @@ class NamedModel(models.Model):
 
     class Meta:
         abstract = True
-        app_label = 'geoapp'
 
     def __str__(self):
         return self.name
@@ -24,6 +24,9 @@ class Country(NamedModel):
 class City(NamedModel):
     point = models.PointField()
 
+    class Meta:
+        app_label = 'geoapp'
+
 
 # This is an inherited model from City
 class PennsylvaniaCity(City):
@@ -41,6 +44,9 @@ class PennsylvaniaCity(City):
 class State(NamedModel):
     poly = models.PolygonField(null=gisfield_may_be_null)  # Allowing NULL geometries here.
 
+    class Meta:
+        app_label = 'geoapp'
+
 
 class Track(NamedModel):
     line = models.LineStringField()
@@ -57,9 +63,6 @@ class Truth(models.Model):
 
     objects = models.GeoManager()
 
-    class Meta:
-        app_label = 'geoapp'
-
 
 class Feature(NamedModel):
     geom = models.GeometryField()
@@ -70,9 +73,6 @@ class MinusOneSRID(models.Model):
 
     objects = models.GeoManager()
 
-    class Meta:
-        app_label = 'geoapp'
-
 
 class NonConcreteField(models.IntegerField):
 

+ 0 - 0
django/contrib/gis/tests/geoapp/sitemaps.py → tests/gis_tests/geoapp/sitemaps.py


+ 1 - 1
django/contrib/gis/tests/geoapp/test_feeds.py → tests/gis_tests/geoapp/test_feeds.py

@@ -14,7 +14,7 @@ if HAS_GEOS:
 
 
 @modify_settings(INSTALLED_APPS={'append': 'django.contrib.sites'})
-@override_settings(ROOT_URLCONF='django.contrib.gis.tests.geoapp.urls')
+@override_settings(ROOT_URLCONF='gis_tests.geoapp.urls')
 @skipUnlessDBFeature("gis_enabled")
 class GeoFeedTest(TestCase):
     fixtures = ['initial']

+ 2 - 1
django/contrib/gis/tests/geoapp/test_regress.py → tests/gis_tests/geoapp/test_regress.py

@@ -5,10 +5,11 @@ from datetime import datetime
 
 from django.contrib.gis.geos import HAS_GEOS
 from django.contrib.gis.shortcuts import render_to_kmz
-from django.contrib.gis.tests.utils import no_oracle
 from django.db.models import Count, Min
 from django.test import TestCase, skipUnlessDBFeature
 
+from ..utils import no_oracle
+
 if HAS_GEOS:
     from django.contrib.gis.db.models import Extent
     from .models import City, PennsylvaniaCity, State, Truth

+ 0 - 0
django/contrib/gis/tests/geoapp/test_serializers.py → tests/gis_tests/geoapp/test_serializers.py


+ 1 - 1
django/contrib/gis/tests/geoapp/test_sitemaps.py → tests/gis_tests/geoapp/test_sitemaps.py

@@ -18,7 +18,7 @@ if HAS_GEOS:
 
 
 @modify_settings(INSTALLED_APPS={'append': ['django.contrib.sites', 'django.contrib.sitemaps']})
-@override_settings(ROOT_URLCONF='django.contrib.gis.tests.geoapp.urls')
+@override_settings(ROOT_URLCONF='gis_tests.geoapp.urls')
 @skipUnlessDBFeature("gis_enabled")
 class GeoSitemapTest(TestCase):
 

+ 2 - 3
django/contrib/gis/tests/geoapp/tests.py → tests/gis_tests/geoapp/tests.py

@@ -5,15 +5,14 @@ from tempfile import NamedTemporaryFile
 
 from django.contrib.gis import gdal
 from django.contrib.gis.geos import HAS_GEOS
-from django.contrib.gis.tests.utils import (
-    no_oracle, oracle, postgis, spatialite,
-)
 from django.core.management import call_command
 from django.db import connection
 from django.test import TestCase, ignore_warnings, skipUnlessDBFeature
 from django.utils import six
 from django.utils.deprecation import RemovedInDjango20Warning
 
+from ..utils import no_oracle, oracle, postgis, spatialite
+
 if HAS_GEOS:
     from django.contrib.gis.db.models import Extent, MakeLine, Union
     from django.contrib.gis.geos import (fromstr, GEOSGeometry,

+ 0 - 0
django/contrib/gis/tests/geoapp/urls.py → tests/gis_tests/geoapp/urls.py


+ 0 - 0
django/contrib/gis/tests/geoapp/__init__.py → tests/gis_tests/geogapp/__init__.py


+ 0 - 0
django/contrib/gis/tests/geogapp/fixtures/initial.json → tests/gis_tests/geogapp/fixtures/initial.json


+ 6 - 1
django/contrib/gis/tests/geogapp/models.py → tests/gis_tests/geogapp/models.py

@@ -10,7 +10,6 @@ class NamedModel(models.Model):
 
     class Meta:
         abstract = True
-        app_label = 'geogapp'
 
     def __str__(self):
         return self.name
@@ -19,6 +18,9 @@ class NamedModel(models.Model):
 class City(NamedModel):
     point = models.PointField(geography=True)
 
+    class Meta:
+        app_label = 'geogapp'
+
 
 class Zipcode(NamedModel):
     code = models.CharField(max_length=10)
@@ -29,5 +31,8 @@ class County(NamedModel):
     state = models.CharField(max_length=20)
     mpoly = models.MultiPolygonField(geography=True)
 
+    class Meta:
+        app_label = 'geogapp'
+
     def __str__(self):
         return ' County, '.join([self.name, self.state])

+ 2 - 1
django/contrib/gis/tests/geogapp/tests.py → tests/gis_tests/geogapp/tests.py

@@ -9,10 +9,11 @@ from unittest import skipUnless
 from django.contrib.gis.gdal import HAS_GDAL
 from django.contrib.gis.geos import HAS_GEOS
 from django.contrib.gis.measure import D
-from django.contrib.gis.tests.utils import oracle, postgis
 from django.test import TestCase, skipUnlessDBFeature
 from django.utils._os import upath
 
+from ..utils import oracle, postgis
+
 if HAS_GEOS:
     from .models import City, County, Zipcode
 

+ 0 - 0
django/contrib/gis/tests/geogapp/__init__.py → tests/gis_tests/geos_tests/__init__.py


+ 8 - 6
django/contrib/gis/geos/tests/test_geos.py → tests/gis_tests/geos_tests/test_geos.py

@@ -9,19 +9,21 @@ from io import BytesIO
 from unittest import skipUnless
 
 from django.contrib.gis.gdal import HAS_GDAL
-from django.contrib.gis.geometry.test_data import TestDataMixin
+from django.contrib.gis.geos import HAS_GEOS
 from django.contrib.gis.shortcuts import numpy
 from django.utils import six
 from django.utils.encoding import force_bytes
 from django.utils.six.moves import range
 
-from .. import HAS_GEOS
+from ..test_data import TestDataMixin
 
 if HAS_GEOS:
-    from .. import (GEOSException, GEOSIndexError, GEOSGeometry,
-        GeometryCollection, Point, MultiPoint, Polygon, MultiPolygon, LinearRing,
-        LineString, MultiLineString, fromfile, fromstr, geos_version_info)
-    from ..base import gdal, GEOSBase
+    from django.contrib.gis.geos import (
+        GEOSException, GEOSIndexError, GEOSGeometry, GeometryCollection, Point,
+        MultiPoint, Polygon, MultiPolygon, LinearRing, LineString,
+        MultiLineString, fromfile, fromstr, geos_version_info,
+    )
+    from django.contrib.gis.geos.base import gdal, GEOSBase
 
 
 @skipUnless(HAS_GEOS, "Geos is required.")

+ 5 - 3
django/contrib/gis/geos/tests/test_geos_mutation.py → tests/gis_tests/geos_tests/test_geos_mutation.py

@@ -5,11 +5,13 @@
 import unittest
 from unittest import skipUnless
 
-from .. import HAS_GEOS
+from django.contrib.gis.geos import HAS_GEOS
 
 if HAS_GEOS:
-    from .. import fromstr, LinearRing, LineString, MultiPoint, Point, Polygon
-    from ..error import GEOSIndexError
+    from django.contrib.gis.geos import (
+        fromstr, LinearRing, LineString, MultiPoint, Point, Polygon,
+    )
+    from django.contrib.gis.geos.error import GEOSIndexError
 
 
 if HAS_GEOS:

+ 4 - 3
django/contrib/gis/geos/tests/test_io.py → tests/gis_tests/geos_tests/test_io.py

@@ -4,12 +4,13 @@ import binascii
 import unittest
 from unittest import skipUnless
 
+from django.contrib.gis.geos import HAS_GEOS
 from django.utils.six import memoryview
 
-from ..import HAS_GEOS  # isort:skip
-
 if HAS_GEOS:
-    from .. import GEOSGeometry, WKTReader, WKTWriter, WKBReader, WKBWriter
+    from django.contrib.gis.geos import (
+        GEOSGeometry, WKTReader, WKTWriter, WKBReader, WKBWriter,
+    )
 
 
 @skipUnless(HAS_GEOS, "Geos is required.")

+ 0 - 0
django/contrib/gis/geos/tests/test_mutable_list.py → tests/gis_tests/geos_tests/test_mutable_list.py


+ 0 - 0
django/contrib/gis/tests/gis_migrations/__init__.py → tests/gis_tests/gis_migrations/__init__.py


+ 0 - 0
django/contrib/gis/tests/gis_migrations/migrations/0001_initial.py → tests/gis_tests/gis_migrations/migrations/0001_initial.py


+ 0 - 0
django/contrib/gis/tests/gis_migrations/migrations/__init__.py → tests/gis_tests/gis_migrations/migrations/__init__.py


+ 1 - 1
django/contrib/gis/tests/gis_migrations/test_commands.py → tests/gis_tests/gis_migrations/test_commands.py

@@ -10,7 +10,7 @@ class MigrateTests(TransactionTestCase):
     """
     Tests running the migrate command in Geodjango.
     """
-    available_apps = ["django.contrib.gis.tests.gis_migrations"]
+    available_apps = ["gis_tests.gis_migrations"]
 
     def get_table_description(self, table):
         with connection.cursor() as cursor:

+ 3 - 2
django/contrib/gis/tests/gis_migrations/test_operations.py → tests/gis_tests/gis_migrations/test_operations.py

@@ -1,11 +1,12 @@
 from __future__ import unicode_literals
 
-from django.contrib.gis.tests.utils import mysql
 from django.db import connection, migrations, models
 from django.db.migrations.migration import Migration
 from django.db.migrations.state import ProjectState
 from django.test import TransactionTestCase, skipUnlessDBFeature
 
+from ..utils import mysql
+
 if connection.features.gis_enabled:
     from django.contrib.gis.db.models import fields
     try:
@@ -17,7 +18,7 @@ if connection.features.gis_enabled:
 
 @skipUnlessDBFeature("gis_enabled")
 class OperationTests(TransactionTestCase):
-    available_apps = ["django.contrib.gis.tests.gis_migrations"]
+    available_apps = ["gis_tests.gis_migrations"]
 
     def tearDown(self):
         # Delete table after testing

+ 0 - 0
django/contrib/gis/tests/inspectapp/__init__.py → tests/gis_tests/inspectapp/__init__.py


+ 0 - 3
django/contrib/gis/tests/inspectapp/models.py → tests/gis_tests/inspectapp/models.py

@@ -14,6 +14,3 @@ class AllOGRFields(models.Model):
     point = models.PointField()
 
     objects = models.GeoManager()
-
-    class Meta:
-        app_label = 'inspectapp'

+ 2 - 1
django/contrib/gis/tests/inspectapp/tests.py → tests/gis_tests/inspectapp/tests.py

@@ -5,12 +5,13 @@ import re
 from unittest import skipUnless
 
 from django.contrib.gis.gdal import HAS_GDAL
-from django.contrib.gis.geometry.test_data import TEST_DATA
 from django.core.management import call_command
 from django.db import connection, connections
 from django.test import TestCase, skipUnlessDBFeature
 from django.utils.six import StringIO
 
+from ..test_data import TEST_DATA
+
 if HAS_GDAL:
     from django.contrib.gis.gdal import Driver, GDALException
     from django.contrib.gis.utils.ogrinspect import ogrinspect

+ 0 - 0
django/contrib/gis/tests/layermap/__init__.py → tests/gis_tests/layermap/__init__.py


+ 6 - 4
django/contrib/gis/tests/layermap/models.py → tests/gis_tests/layermap/models.py

@@ -10,7 +10,6 @@ class NamedModel(models.Model):
 
     class Meta:
         abstract = True
-        app_label = 'layermap'
 
     def __str__(self):
         return self.name
@@ -37,11 +36,17 @@ class City(NamedModel):
     dt = models.DateField()
     point = models.PointField()
 
+    class Meta:
+        app_label = 'layermap'
+
 
 class Interstate(NamedModel):
     length = models.DecimalField(max_digits=6, decimal_places=2)
     path = models.LineStringField()
 
+    class Meta:
+        app_label = 'layermap'
+
 
 # Same as `City` above, but for testing model inheritance.
 class CityBase(NamedModel):
@@ -67,9 +72,6 @@ class ICity2(ICity1):
 class Invalid(models.Model):
     point = models.PointField()
 
-    class Meta:
-        app_label = 'layermap'
-
 
 # Mapping dictionaries for the models above.
 co_mapping = {

+ 0 - 0
django/contrib/gis/tests/layermap/tests.py → tests/gis_tests/layermap/tests.py


+ 0 - 0
django/contrib/gis/tests/maps/__init__.py → tests/gis_tests/maps/__init__.py


+ 4 - 1
django/contrib/gis/tests/maps/tests.py → tests/gis_tests/maps/tests.py

@@ -5,12 +5,15 @@ from unittest import skipUnless
 
 from django.contrib.gis.geos import HAS_GEOS
 from django.test import TestCase
-from django.test.utils import override_settings
+from django.test.utils import modify_settings, override_settings
 
 GOOGLE_MAPS_API_KEY = 'XXXX'
 
 
 @skipUnless(HAS_GEOS, 'Geos is required.')
+@modify_settings(
+    INSTALLED_APPS={'append': 'django.contrib.gis'},
+)
 class GoogleMapsTest(TestCase):
 
     @override_settings(GOOGLE_MAPS_API_KEY=GOOGLE_MAPS_API_KEY)

+ 0 - 0
django/contrib/gis/tests/relatedapp/__init__.py → tests/gis_tests/relatedapp/__init__.py


+ 0 - 0
django/contrib/gis/tests/relatedapp/fixtures/initial.json → tests/gis_tests/relatedapp/fixtures/initial.json


+ 0 - 4
django/contrib/gis/tests/relatedapp/models.py → tests/gis_tests/relatedapp/models.py

@@ -8,7 +8,6 @@ class SimpleModel(models.Model):
 
     class Meta:
         abstract = True
-        app_label = 'relatedapp'
 
 
 @python_2_unicode_compatible
@@ -34,9 +33,6 @@ class AugmentedLocation(Location):
 
     objects = models.GeoManager()
 
-    class Meta:
-        app_label = 'relatedapp'
-
 
 class DirectoryEntry(SimpleModel):
     listing_text = models.CharField(max_length=50)

+ 2 - 1
django/contrib/gis/tests/relatedapp/tests.py → tests/gis_tests/relatedapp/tests.py

@@ -1,13 +1,14 @@
 from __future__ import unicode_literals
 
 from django.contrib.gis.geos import HAS_GEOS
-from django.contrib.gis.tests.utils import no_oracle
 from django.db import connection
 from django.test import TestCase, ignore_warnings, skipUnlessDBFeature
 from django.test.utils import override_settings
 from django.utils import timezone
 from django.utils.deprecation import RemovedInDjango20Warning
 
+from ..utils import no_oracle
+
 if HAS_GEOS:
     from django.contrib.gis.db.models import Collect, Count, Extent, F, Union
     from django.contrib.gis.geometry.backend import Geometry

+ 1 - 2
django/contrib/gis/geometry/test_data.py → tests/gis_tests/test_data.py

@@ -5,13 +5,12 @@ for the GEOS and GDAL tests.
 import json
 import os
 
-from django.contrib import gis
 from django.utils import six
 from django.utils._os import upath
 from django.utils.functional import cached_property
 
 # Path where reference test data is located.
-TEST_DATA = os.path.join(os.path.dirname(upath(gis.__file__)), 'tests', 'data')
+TEST_DATA = os.path.join(os.path.dirname(upath(__file__)), 'data')
 
 
 def tuplize(seq):

+ 0 - 0
django/contrib/gis/tests/test_geoforms.py → tests/gis_tests/test_geoforms.py


+ 2 - 2
django/contrib/gis/geoip/tests.py → tests/gis_tests/test_geoip.py

@@ -11,10 +11,10 @@ from django.contrib.gis.geos import HAS_GEOS
 from django.utils import six
 
 if HAS_GEOIP:
-    from . import GeoIP, GeoIPException
+    from django.contrib.gis.geoip import GeoIP, GeoIPException
 
 if HAS_GEOS:
-    from ..geos import GEOSGeometry
+    from django.contrib.gis.geos import GEOSGeometry
 
 
 # Note: Requires use of both the GeoIP country and city datasets.

+ 0 - 0
django/contrib/gis/tests/test_measure.py → tests/gis_tests/test_measure.py


+ 2 - 3
django/contrib/gis/tests/test_spatialrefsys.py → tests/gis_tests/test_spatialrefsys.py

@@ -1,13 +1,12 @@
 import unittest
 
 from django.contrib.gis.gdal import HAS_GDAL
-from django.contrib.gis.tests.utils import (
-    SpatialRefSys, oracle, postgis, spatialite,
-)
 from django.db import connection
 from django.test import skipUnlessDBFeature
 from django.utils import six
 
+from .utils import SpatialRefSys, oracle, postgis, spatialite
+
 test_srs = ({
     'srid': 4326,
     'auth_name': ('EPSG', True),

+ 0 - 0
django/contrib/gis/tests/tests.py → tests/gis_tests/tests.py


+ 0 - 0
django/contrib/gis/tests/utils.py → tests/gis_tests/utils.py


+ 10 - 1
tests/runtests.py

@@ -76,9 +76,10 @@ def get_test_modules():
         (None, RUNTESTS_DIR),
         (CONTRIB_MODULE_PATH, CONTRIB_DIR)
     ]
+    # GIS tests are in nested apps
     if connection.features.gis_enabled:
         discovery_paths.append(
-            ('django.contrib.gis.tests', os.path.join(CONTRIB_DIR, 'gis', 'tests'))
+            ('gis_tests', os.path.join(RUNTESTS_DIR, 'gis_tests'))
         )
 
     for modpath, dirpath in discovery_paths:
@@ -208,6 +209,14 @@ def setup(verbosity, test_labels):
                 print("Importing application %s" % module_name)
             settings.INSTALLED_APPS.append(module_label)
 
+    # Add contrib.gis to INSTALLED_APPS if needed (rather than requiring
+    # @override_settings(INSTALLED_APPS=...) on all test cases.
+    gis = 'django.contrib.gis'
+    if connection.features.gis_enabled and gis not in settings.INSTALLED_APPS:
+        if verbosity >= 2:
+            print("Importing application %s" % gis)
+        settings.INSTALLED_APPS.append(gis)
+
     apps.set_installed_apps(settings.INSTALLED_APPS)
 
     return state

+ 2 - 2
tests/test_runner/test_discover_runner.py

@@ -121,9 +121,9 @@ class DiscoverRunnerTest(TestCase):
         """
         Tests shouldn't be discovered twice when discovering on overlapping paths.
         """
-        single = DiscoverRunner().build_suite(["django.contrib.gis"]).countTestCases()
+        single = DiscoverRunner().build_suite(["gis_tests"]).countTestCases()
         dups = DiscoverRunner().build_suite(
-            ["django.contrib.gis", "django.contrib.gis.tests.geo3d"]).countTestCases()
+            ["gis_tests", "gis_tests.geo3d"]).countTestCases()
         self.assertEqual(single, dups)
 
     def test_reverse(self):