diff options
Diffstat (limited to 'lib/python2.7/site-packages/django/contrib/gis/tests/layermap/tests.py')
-rw-r--r-- | lib/python2.7/site-packages/django/contrib/gis/tests/layermap/tests.py | 331 |
1 files changed, 0 insertions, 331 deletions
diff --git a/lib/python2.7/site-packages/django/contrib/gis/tests/layermap/tests.py b/lib/python2.7/site-packages/django/contrib/gis/tests/layermap/tests.py deleted file mode 100644 index 8379311..0000000 --- a/lib/python2.7/site-packages/django/contrib/gis/tests/layermap/tests.py +++ /dev/null @@ -1,331 +0,0 @@ -# coding: utf-8 -from __future__ import absolute_import, unicode_literals - -import os -from copy import copy -from decimal import Decimal - -from django.contrib.gis.gdal import HAS_GDAL -from django.contrib.gis.tests.utils import HAS_SPATIAL_DB, mysql -from django.db import router -from django.conf import settings -from django.test import TestCase -from django.utils import unittest -from django.utils.unittest import skipUnless -from django.utils._os import upath - -if HAS_GDAL: - from django.contrib.gis.utils.layermapping import (LayerMapping, - LayerMapError, InvalidDecimal, MissingForeignKey) - from django.contrib.gis.gdal import DataSource - - from .models import ( - City, County, CountyFeat, Interstate, ICity1, ICity2, Invalid, State, - city_mapping, co_mapping, cofeat_mapping, inter_mapping) - - -shp_path = os.path.realpath(os.path.join(os.path.dirname(upath(__file__)), os.pardir, 'data')) -city_shp = os.path.join(shp_path, 'cities', 'cities.shp') -co_shp = os.path.join(shp_path, 'counties', 'counties.shp') -inter_shp = os.path.join(shp_path, 'interstates', 'interstates.shp') -invalid_shp = os.path.join(shp_path, 'invalid', 'emptypoints.shp') - -# Dictionaries to hold what's expected in the county shapefile. -NAMES = ['Bexar', 'Galveston', 'Harris', 'Honolulu', 'Pueblo'] -NUMS = [1, 2, 1, 19, 1] # Number of polygons for each. -STATES = ['Texas', 'Texas', 'Texas', 'Hawaii', 'Colorado'] - - -@skipUnless(HAS_GDAL and HAS_SPATIAL_DB, "GDAL and spatial db are required.") -class LayerMapTest(TestCase): - - def test_init(self): - "Testing LayerMapping initialization." - - # Model field that does not exist. - bad1 = copy(city_mapping) - bad1['foobar'] = 'FooField' - - # Shapefile field that does not exist. - bad2 = copy(city_mapping) - bad2['name'] = 'Nombre' - - # Nonexistent geographic field type. - bad3 = copy(city_mapping) - bad3['point'] = 'CURVE' - - # Incrementing through the bad mapping dictionaries and - # ensuring that a LayerMapError is raised. - for bad_map in (bad1, bad2, bad3): - with self.assertRaises(LayerMapError): - lm = LayerMapping(City, city_shp, bad_map) - - # A LookupError should be thrown for bogus encodings. - with self.assertRaises(LookupError): - lm = LayerMapping(City, city_shp, city_mapping, encoding='foobar') - - def test_simple_layermap(self): - "Test LayerMapping import of a simple point shapefile." - # Setting up for the LayerMapping. - lm = LayerMapping(City, city_shp, city_mapping) - lm.save() - - # There should be three cities in the shape file. - self.assertEqual(3, City.objects.count()) - - # Opening up the shapefile, and verifying the values in each - # of the features made it to the model. - ds = DataSource(city_shp) - layer = ds[0] - for feat in layer: - city = City.objects.get(name=feat['Name'].value) - self.assertEqual(feat['Population'].value, city.population) - self.assertEqual(Decimal(str(feat['Density'])), city.density) - self.assertEqual(feat['Created'].value, city.dt) - - # Comparing the geometries. - pnt1, pnt2 = feat.geom, city.point - self.assertAlmostEqual(pnt1.x, pnt2.x, 5) - self.assertAlmostEqual(pnt1.y, pnt2.y, 5) - - def test_layermap_strict(self): - "Testing the `strict` keyword, and import of a LineString shapefile." - # When the `strict` keyword is set an error encountered will force - # the importation to stop. - with self.assertRaises(InvalidDecimal): - lm = LayerMapping(Interstate, inter_shp, inter_mapping) - lm.save(silent=True, strict=True) - Interstate.objects.all().delete() - - # This LayerMapping should work b/c `strict` is not set. - lm = LayerMapping(Interstate, inter_shp, inter_mapping) - lm.save(silent=True) - - # Two interstate should have imported correctly. - self.assertEqual(2, Interstate.objects.count()) - - # Verifying the values in the layer w/the model. - ds = DataSource(inter_shp) - - # Only the first two features of this shapefile are valid. - valid_feats = ds[0][:2] - for feat in valid_feats: - istate = Interstate.objects.get(name=feat['Name'].value) - - if feat.fid == 0: - self.assertEqual(Decimal(str(feat['Length'])), istate.length) - elif feat.fid == 1: - # Everything but the first two decimal digits were truncated, - # because the Interstate model's `length` field has decimal_places=2. - self.assertAlmostEqual(feat.get('Length'), float(istate.length), 2) - - for p1, p2 in zip(feat.geom, istate.path): - self.assertAlmostEqual(p1[0], p2[0], 6) - self.assertAlmostEqual(p1[1], p2[1], 6) - - def county_helper(self, county_feat=True): - "Helper function for ensuring the integrity of the mapped County models." - for name, n, st in zip(NAMES, NUMS, STATES): - # Should only be one record b/c of `unique` keyword. - c = County.objects.get(name=name) - self.assertEqual(n, len(c.mpoly)) - self.assertEqual(st, c.state.name) # Checking ForeignKey mapping. - - # Multiple records because `unique` was not set. - if county_feat: - qs = CountyFeat.objects.filter(name=name) - self.assertEqual(n, qs.count()) - - def test_layermap_unique_multigeometry_fk(self): - "Testing the `unique`, and `transform`, geometry collection conversion, and ForeignKey mappings." - # All the following should work. - try: - # Telling LayerMapping that we want no transformations performed on the data. - lm = LayerMapping(County, co_shp, co_mapping, transform=False) - - # Specifying the source spatial reference system via the `source_srs` keyword. - lm = LayerMapping(County, co_shp, co_mapping, source_srs=4269) - lm = LayerMapping(County, co_shp, co_mapping, source_srs='NAD83') - - # Unique may take tuple or string parameters. - for arg in ('name', ('name', 'mpoly')): - lm = LayerMapping(County, co_shp, co_mapping, transform=False, unique=arg) - except: - self.fail('No exception should be raised for proper use of keywords.') - - # Testing invalid params for the `unique` keyword. - for e, arg in ((TypeError, 5.0), (ValueError, 'foobar'), (ValueError, ('name', 'mpolygon'))): - self.assertRaises(e, LayerMapping, County, co_shp, co_mapping, transform=False, unique=arg) - - # No source reference system defined in the shapefile, should raise an error. - if not mysql: - self.assertRaises(LayerMapError, LayerMapping, County, co_shp, co_mapping) - - # Passing in invalid ForeignKey mapping parameters -- must be a dictionary - # mapping for the model the ForeignKey points to. - bad_fk_map1 = copy(co_mapping); bad_fk_map1['state'] = 'name' - bad_fk_map2 = copy(co_mapping); bad_fk_map2['state'] = {'nombre' : 'State'} - self.assertRaises(TypeError, LayerMapping, County, co_shp, bad_fk_map1, transform=False) - self.assertRaises(LayerMapError, LayerMapping, County, co_shp, bad_fk_map2, transform=False) - - # There exist no State models for the ForeignKey mapping to work -- should raise - # a MissingForeignKey exception (this error would be ignored if the `strict` - # keyword is not set). - lm = LayerMapping(County, co_shp, co_mapping, transform=False, unique='name') - self.assertRaises(MissingForeignKey, lm.save, silent=True, strict=True) - - # Now creating the state models so the ForeignKey mapping may work. - State.objects.bulk_create([ - State(name='Colorado'), State(name='Hawaii'), State(name='Texas') - ]) - - # If a mapping is specified as a collection, all OGR fields that - # are not collections will be converted into them. For example, - # a Point column would be converted to MultiPoint. Other things being done - # w/the keyword args: - # `transform=False`: Specifies that no transform is to be done; this - # has the effect of ignoring the spatial reference check (because the - # county shapefile does not have implicit spatial reference info). - # - # `unique='name'`: Creates models on the condition that they have - # unique county names; geometries from each feature however will be - # appended to the geometry collection of the unique model. Thus, - # all of the various islands in Honolulu county will be in in one - # database record with a MULTIPOLYGON type. - lm = LayerMapping(County, co_shp, co_mapping, transform=False, unique='name') - lm.save(silent=True, strict=True) - - # A reference that doesn't use the unique keyword; a new database record will - # created for each polygon. - lm = LayerMapping(CountyFeat, co_shp, cofeat_mapping, transform=False) - lm.save(silent=True, strict=True) - - # The county helper is called to ensure integrity of County models. - self.county_helper() - - def test_test_fid_range_step(self): - "Tests the `fid_range` keyword and the `step` keyword of .save()." - # Function for clearing out all the counties before testing. - def clear_counties(): County.objects.all().delete() - - State.objects.bulk_create([ - State(name='Colorado'), State(name='Hawaii'), State(name='Texas') - ]) - - # Initializing the LayerMapping object to use in these tests. - lm = LayerMapping(County, co_shp, co_mapping, transform=False, unique='name') - - # Bad feature id ranges should raise a type error. - bad_ranges = (5.0, 'foo', co_shp) - for bad in bad_ranges: - self.assertRaises(TypeError, lm.save, fid_range=bad) - - # Step keyword should not be allowed w/`fid_range`. - fr = (3, 5) # layer[3:5] - self.assertRaises(LayerMapError, lm.save, fid_range=fr, step=10) - lm.save(fid_range=fr) - - # Features IDs 3 & 4 are for Galveston County, Texas -- only - # one model is returned because the `unique` keyword was set. - qs = County.objects.all() - self.assertEqual(1, qs.count()) - self.assertEqual('Galveston', qs[0].name) - - # Features IDs 5 and beyond for Honolulu County, Hawaii, and - # FID 0 is for Pueblo County, Colorado. - clear_counties() - lm.save(fid_range=slice(5, None), silent=True, strict=True) # layer[5:] - lm.save(fid_range=slice(None, 1), silent=True, strict=True) # layer[:1] - - # Only Pueblo & Honolulu counties should be present because of - # the `unique` keyword. Have to set `order_by` on this QuerySet - # or else MySQL will return a different ordering than the other dbs. - qs = County.objects.order_by('name') - self.assertEqual(2, qs.count()) - hi, co = tuple(qs) - hi_idx, co_idx = tuple(map(NAMES.index, ('Honolulu', 'Pueblo'))) - self.assertEqual('Pueblo', co.name) - self.assertEqual(NUMS[co_idx], len(co.mpoly)) - self.assertEqual('Honolulu', hi.name) - self.assertEqual(NUMS[hi_idx], len(hi.mpoly)) - - # Testing the `step` keyword -- should get the same counties - # regardless of we use a step that divides equally, that is odd, - # or that is larger than the dataset. - for st in (4,7,1000): - clear_counties() - lm.save(step=st, strict=True) - self.county_helper(county_feat=False) - - def test_model_inheritance(self): - "Tests LayerMapping on inherited models. See #12093." - icity_mapping = {'name' : 'Name', - 'population' : 'Population', - 'density' : 'Density', - 'point' : 'POINT', - 'dt' : 'Created', - } - - # Parent model has geometry field. - lm1 = LayerMapping(ICity1, city_shp, icity_mapping) - lm1.save() - - # Grandparent has geometry field. - lm2 = LayerMapping(ICity2, city_shp, icity_mapping) - lm2.save() - - self.assertEqual(6, ICity1.objects.count()) - self.assertEqual(3, ICity2.objects.count()) - - def test_invalid_layer(self): - "Tests LayerMapping on invalid geometries. See #15378." - invalid_mapping = {'point': 'POINT'} - lm = LayerMapping(Invalid, invalid_shp, invalid_mapping, - source_srs=4326) - lm.save(silent=True) - - def test_textfield(self): - "Tests that String content fits also in a TextField" - mapping = copy(city_mapping) - mapping['name_txt'] = 'Name' - lm = LayerMapping(City, city_shp, mapping) - lm.save(silent=True, strict=True) - self.assertEqual(City.objects.count(), 3) - self.assertEqual(City.objects.all().order_by('name_txt')[0].name_txt, "Houston") - - def test_encoded_name(self): - """ Test a layer containing utf-8-encoded name """ - city_shp = os.path.join(shp_path, 'ch-city', 'ch-city.shp') - lm = LayerMapping(City, city_shp, city_mapping) - lm.save(silent=True, strict=True) - self.assertEqual(City.objects.count(), 1) - self.assertEqual(City.objects.all()[0].name, "Zürich") - -class OtherRouter(object): - def db_for_read(self, model, **hints): - return 'other' - - def db_for_write(self, model, **hints): - return self.db_for_read(model, **hints) - - def allow_relation(self, obj1, obj2, **hints): - return None - - def allow_syncdb(self, db, model): - return True - - -@skipUnless(HAS_GDAL and HAS_SPATIAL_DB, "GDAL and spatial db are required.") -class LayerMapRouterTest(TestCase): - - def setUp(self): - self.old_routers = router.routers - router.routers = [OtherRouter()] - - def tearDown(self): - router.routers = self.old_routers - - @unittest.skipUnless(len(settings.DATABASES) > 1, 'multiple databases required') - def test_layermapping_default_db(self): - lm = LayerMapping(City, city_shp, city_mapping) - self.assertEqual(lm.using, 'other') |