Completed
Push — master ( c9c1e2...8a1e4c )
by
unknown
01:25
created

  A

Complexity

Total Complexity 25

Size/Duplication

Total Lines 248
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 25
dl 0
loc 248
rs 10
c 0
b 0
f 0

25 Methods

Rating   Name   Duplication   Size   Complexity  
A eoJsonTests.test_geometrie_validator_invalid_geometry() 0 3 1
A eoJsonTests.test_valid_max_area() 0 5 1
B eoJsonTests.setUp() 0 130 1
A eoJsonTests.test_validGeoJson() 0 3 1
A eoJsonTests.test_node_missing_in_schema() 0 8 1
A eoJsonTests.test_geometrie_validator_none() 0 5 1
A eoJsonTests.test_geojson_invalid_type() 0 4 1
A eoJsonTests.test_node_in_schema() 0 9 1
A eoJsonTests.test_geometrie_validator_no_multipolygon() 0 3 1
A eoJsonTests.test_geojson_serialize() 0 2 1
A eoJsonTests.test_geometrie_validator_invalid_geojson() 0 3 1
A eoJsonTests.test_geometrie_validator_geometry_not_in_flanders() 0 3 1
A eoJsonTests.test_geometrie_validator_invalid_geojson_no_crs() 0 3 1
A eoJsonTests.test_schema_node_default_missing() 0 3 1
A eoJsonTests.test_schema_node_with_max_area_kwarg() 0 3 1
A eoJsonTests.tearDown() 0 2 1
A eoJsonTests.test_geometrie_validator_empty_geometry() 0 2 1
A eoJsonTests.test_geometrie_validator_very_large() 0 3 1
A eoJsonTests.test_schema_node_with_none() 0 2 1
A eoJsonTests.test_geometrie_validator_invalid_srid() 0 3 1
A eoJsonTests.test_node_invalid_in_schema() 0 6 1
A eoJsonTests.test_invalid_max_area() 0 3 1
A eoJsonTests.test_geojson_serializes_none() 0 4 1
A eoJsonTests.test_schema_node_with_max_area_arg() 0 3 1
A eoJsonTests.test_geometrie_validator_intersecting_geometry() 0 5 1
1
import unittest
2
from pyramid import testing
3
import colander
4
from oe_geoutils.validation.validators_contour import GeometrieSchemaNode, geometrie_validator, GeoJson
5
6
import collections
7
8
Node = collections.namedtuple('Node', ['name'])
9
10
11
class GeoJsonTests(unittest.TestCase):
12
    def setUp(self):
13
        self.config = testing.setUp()
14
        self.max_area = 5
15
16
        self.geometrie = GeometrieSchemaNode(max_area=5)
17
18
        self.geojson_valid = {
19
            "type": "MultiPolygon",
20
            "coordinates": [[[[152184.01399999947, 212331.8648750011], [152185.94512499947, 212318.6137500011],
21
                              [152186.13837499946, 212318.6326250011], [152186.86699999947, 212313.9570000011],
22
                              [152186.91462499945, 212313.65187500112], [152192.45099999948, 212314.2943750011],
23
                              [152190.69212499948, 212319.2656250011], [152199.58799999946, 212319.5248750011],
24
                              [152197.85312499947, 212327.9388750011], [152197.57199999946, 212327.8978750011],
25
                              [152197.08099999945, 212333.2668750011], [152184.01399999947, 212331.8648750011]]]],
26
            "crs": {
27
                "type": "name",
28
                "properties": {
29
                    "name": "urn:ogc:def:crs:EPSG::31370"
30
                }
31
            }
32
        }
33
        self.geojson_invalid_type = {
34
            "type": "InvalidType",
35
            "coordinates": [
36
                [[[102.0, 2.0], [103.0, 2.0], [103.0, 3.0], [102.0, 3.0], [102.0, 2.0]]],
37
                [[[100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0]],
38
                 [[100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2]]]
39
            ],
40
            "crs": {
41
                "type": "name",
42
                "properties": {
43
                    "name": "urn:ogc:def:crs:EPSG::31370"
44
                }
45
            }
46
        }
47
        self.geojson_geom_not_in_flanders = {
48
            "type": "MultiPolygon",
49
            "coordinates": [
50
                [[[102.0, 2.0], [103.0, 2.0], [103.0, 3.0], [102.0, 3.0], [102.0, 2.0]]],
51
                [[[100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0]],
52
                 [[100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2]]]
53
            ],
54
            "crs": {
55
                "type": "name",
56
                "properties": {
57
                    "name": "urn:ogc:def:crs:EPSG::31370"
58
                }
59
            }
60
        }
61
        self.geojson_point = {
62
            "type": "Point",
63
            "coordinates": [102.0, 2.0],
64
            "crs": {
65
                "type": "name",
66
                "properties": {
67
                    "name": "urn:ogc:def:crs:EPSG::31370"
68
                }
69
            }
70
        }
71
        self.geojson_srid_4326 = {
72
            "type": "MultiPolygon",
73
            "coordinates": [[[[152184.01399999947, 212331.8648750011], [152185.94512499947, 212318.6137500011],
74
                              [152186.13837499946, 212318.6326250011], [152186.86699999947, 212313.9570000011],
75
                              [152186.91462499945, 212313.65187500112], [152192.45099999948, 212314.2943750011],
76
                              [152190.69212499948, 212319.2656250011], [152199.58799999946, 212319.5248750011],
77
                              [152197.85312499947, 212327.9388750011], [152197.57199999946, 212327.8978750011],
78
                              [152197.08099999945, 212333.2668750011], [152184.01399999947, 212331.8648750011]]]],
79
            "crs": {
80
                "type": "name",
81
                "properties": {
82
                    "name": "urn:ogc:def:crs:EPSG::4326"
83
                }
84
            }
85
        }
86
        self.geojson_invalid_geom = {
87
            "type": "MultiPolygon",
88
            "coordinates": [[[[152184.01399999947, 212331.8648750011],[152184.01399999947, 212331.8648750010],
89
                              [152184.01399999947, 212331.8648750010]]]],
90
            "crs": {
91
                "type": "name",
92
                "properties": {
93
                    "name": "urn:ogc:def:crs:EPSG::31370"
94
                }
95
            }
96
        }
97
        self.geojson_invalid_type_no_crs = {
98
            "type": "MultiPolygon",
99
            "coordinates": [[[[152184.01399999947, 212331.8648750011], [152185.94512499947, 212318.6137500011],
100
                              [152186.13837499946, 212318.6326250011], [152186.86699999947, 212313.9570000011],
101
                              [152186.91462499945, 212313.65187500112], [152192.45099999948, 212314.2943750011],
102
                              [152190.69212499948, 212319.2656250011], [152199.58799999946, 212319.5248750011],
103
                              [152197.85312499947, 212327.9388750011], [152197.57199999946, 212327.8978750011],
104
                              [152197.08099999945, 212333.2668750011], [152184.01399999947, 212331.8648750010]]]],
105
        }
106
        self.geojson_intersecting_geom = {
107
            "type": "MultiPolygon",
108
            "coordinates": [[[[136311.36331804123, 189479.80567278434], [136330.70361803696, 189482.001472787],
109
                              [136330.25991803684, 189485.51207278483], [136312.9926180562, 189622.26197274867],
110
                              [136309.1386180551, 189621.94727274682], [136287.7971180621, 189620.205472745],
111
                              [136299.8650180514, 189546.03157276567], [136303.254718051, 189525.19737276994],
112
                              [136303.72911804935, 189522.28157277592], [136303.86311804503, 189521.45807277132],
113
                              [136304.32241804857, 189518.63487277366], [136305.1149180444, 189513.7637727782],
114
                              [136305.38571804608, 189512.09917277843], [136310.10041803963, 189483.12087278347],
115
                              [136310.65291804122, 189479.72507278528], [136311.36331804123, 189479.80567278434]]],
116
                            [[[136337.15461803263, 189483.00437278394], [136336.6959180319, 189486.44747278653],
117
                              [136328.27671804628, 189549.64527276624], [136390.48041802715, 189555.04837277252],
118
                              [136380.7150180388, 189628.1505727535], [136349.4110180502, 189625.37497274857],
119
                              [136329.42661805183, 189623.6030727476], [136312.9926180562, 189622.26197274867],
120
                              [136330.25991803684, 189485.51207278483], [136330.70361803696, 189482.001472787],
121
                              [136337.15461803263, 189483.00437278394]]]],
122
            "crs": {
123
                "type": "name",
124
                "properties": {
125
                    "name": "urn:ogc:def:crs:EPSG::31370"
126
                }
127
            }
128
        }
129
        self.geojson_very_large = {
130
            "type": "MultiPolygon",
131
            "coordinates": [[[
132
                [149287.72860779167967848, 218916.39169927779585123],
133
                [153788.90851591509999707, 182097.94758232310414314],
134
                [220400.85877580623491667, 180574.3110011201351881],
135
                [220400.85877580623491667, 180574.3110011201351881],
136
                [149287.72860779167967848, 218916.39169927779585123]
137
            ]]],
138
            "crs": {
139
                "type": "name",
140
                "properties": {
141
                    "name": "urn:ogc:def:crs:EPSG::31370"
142
                }
143
            }
144
        }
145
146
    def tearDown(self):
147
        testing.tearDown()
148
149
    def test_valid_max_area(self):
150
        geomschemanode = GeometrieSchemaNode(max_area="4")
151
        self.assertEqual(40000, geomschemanode.max_area)
152
        geomschemanode = GeometrieSchemaNode(max_area=5.2)
153
        self.assertEqual(52000, geomschemanode.max_area)
154
155
    def test_invalid_max_area(self):
156
        geomschemanode = GeometrieSchemaNode(max_area="test")
157
        self.assertEqual(80000000, geomschemanode.max_area)
158
159
    def test_validGeoJson(self):
160
        validated = self.geometrie.deserialize(self.geojson_valid)
161
        self.assertIsInstance(validated, dict)
162
163
    def test_geojson_serialize(self):
164
        self.assertRaises(NotImplementedError, GeoJson().serialize, None, None)
165
166
    def test_geojson_serializes_none(self):
167
        self.assertIsNone(GeoJson().build_shape(None))
168
        self.assertEquals(colander.null, GeoJson().deserialize(None, {}))
169
        self.assertEquals(colander.null, GeoJson().deserialize(None, None))
170
171
    def test_geojson_invalid_type(self):
172
        self.assertRaises(
173
            colander.Invalid,
174
            self.geometrie.deserialize, self.geojson_invalid_type)
175
176
    def test_geometrie_validator_none(self):
177
        self.assertRaises(
178
            colander.Invalid, geometrie_validator, None, {}, self.max_area)
179
        self.assertRaises(
180
            colander.Invalid, geometrie_validator, None, None, self.max_area)
181
182
    def test_geometrie_validator_no_multipolygon(self):
183
        self.assertRaises(
184
            colander.Invalid, geometrie_validator, None, self.geojson_point, self.max_area)
185
186
    def test_geometrie_validator_invalid_srid(self):
187
        self.assertRaises(
188
            colander.Invalid, geometrie_validator, None, self.geojson_srid_4326, self.max_area)
189
190
    def test_geometrie_validator_invalid_geometry(self):
191
        self.assertRaises(
192
            colander.Invalid, geometrie_validator, None, self.geojson_invalid_geom, self.max_area)
193
194
    def test_geometrie_validator_geometry_not_in_flanders(self):
195
        self.assertRaises(
196
            colander.Invalid, geometrie_validator, None, self.geojson_geom_not_in_flanders, self.max_area)
197
198
    def test_geometrie_validator_invalid_geojson(self):
199
        self.assertRaises(
200
            colander.Invalid, geometrie_validator, None, self.geojson_invalid_type, self.max_area)
201
202
    def test_geometrie_validator_invalid_geojson_no_crs(self):
203
        self.assertRaises(
204
            colander.Invalid, geometrie_validator, None, self.geojson_invalid_type_no_crs, self.max_area)
205
206
    def test_geometrie_validator_intersecting_geometry(self):
207
        self.assertRaises(
208
            colander.Invalid, self.geometrie.deserialize,
209
                {"type": "Polygon", "coordinates": [[[0, 0], [0, 0], [0, 0], [0, 0]]],
210
                 "crs": {"type": "name", "properties": {"name": "urn:ogc:def:crs:EPSG::31370"}}})
211
212
    def test_geometrie_validator_empty_geometry(self):
213
        self.geometrie.deserialize(self.geojson_intersecting_geom)
214
215
    def test_geometrie_validator_very_large(self):
216
        self.assertRaises(
217
            colander.Invalid, self.geometrie.deserialize, self.geojson_very_large)
218
219
    def test_schema_node_with_none(self):
220
        self.assertRaises(colander.Invalid, self.geometrie.deserialize, None)
221
222
    def test_schema_node_with_max_area_kwarg(self):
223
        schema_node = GeometrieSchemaNode(max_area=6)
224
        self.assertEqual(6 * 10000, schema_node.max_area)
225
226
    def test_schema_node_with_max_area_arg(self):
227
        schema_node = GeometrieSchemaNode(6)
228
        self.assertEqual(6 * 10000, schema_node.max_area)
229
230
    def test_schema_node_default_missing(self):
231
        result = GeometrieSchemaNode(max_area=5, missing=None).deserialize(None)
232
        self.assertIsNone(result)
233
234
    def test_node_missing_in_schema(self):
235
        class TestClass(colander.MappingSchema):
236
            some = colander.SchemaNode(colander.String())
237
            geometry = GeometrieSchemaNode(max_area=1000, missing=None)
238
239
        test_instance = TestClass().deserialize({'some': 'thing'})
240
        self.assertEqual('thing', test_instance['some'])
241
        self.assertIsNone(test_instance['geometry'])
242
243
    def test_node_in_schema(self):
244
        class TestClass(colander.MappingSchema):
245
            some = colander.SchemaNode(colander.String())
246
            geometry = GeometrieSchemaNode(max_area=1000, missing=None)
247
248
        test_instance = TestClass().deserialize({'some': 'thing', 'geometry': self.geojson_valid})
249
        self.assertEqual('thing', test_instance['some'])
250
        self.assertIsNotNone(test_instance['geometry'])
251
        self.assertIsInstance(test_instance['geometry'], dict)
252
253
    def test_node_invalid_in_schema(self):
254
        class TestClass(colander.MappingSchema):
255
            some = colander.SchemaNode(colander.String())
256
            geometry = GeometrieSchemaNode(max_area=1000, missing=None)
257
        self.assertRaises(colander.Invalid, TestClass().deserialize,
258
                          {'some': 'thing', 'geometry': self.geojson_invalid_geom})
259