1
|
|
|
# -*- coding: utf-8 -*- |
2
|
|
|
import unittest |
3
|
|
|
import responses |
4
|
|
|
import json |
5
|
|
|
|
6
|
|
|
try: |
7
|
|
|
from unittest.mock import Mock, patch, MagicMock |
8
|
|
|
except: |
9
|
|
|
from mock import Mock, patch, MagicMock |
10
|
|
|
|
11
|
|
|
from oe_geoutils.utils import ( |
12
|
|
|
convert_geojson_to_wktelement, |
13
|
|
|
get_srid_from_geojson, |
14
|
|
|
convert_wktelement_to_geojson, |
15
|
|
|
get_centroid_xy, |
16
|
|
|
nearest_location, |
17
|
|
|
check_in_flanders, |
18
|
|
|
check_within_flanders, |
19
|
|
|
AdminGrenzenClient, |
20
|
|
|
remove_dupl_values, |
21
|
|
|
remove_dupl_coords |
22
|
|
|
) |
23
|
|
|
|
24
|
|
|
try: |
25
|
|
|
from __init__ import text_, mock_geozoekdiensten_response, mock_geozoekdiensten_get_gemeente_response, \ |
26
|
|
|
get_gemeente_results, get_provincie_results |
27
|
|
|
except: |
28
|
|
|
from tests import text_, mock_geozoekdiensten_response, mock_geozoekdiensten_get_gemeente_response, \ |
29
|
|
|
get_gemeente_results, get_provincie_results |
30
|
|
|
|
31
|
|
|
try: |
32
|
|
|
from tests import testdata |
33
|
|
|
except: |
34
|
|
|
import testdata |
35
|
|
|
|
36
|
|
|
niscode_url = 'https://test-geo.onroerenderfgoed.be/zoekdiensten/administratievegrenzen' |
37
|
|
|
|
38
|
|
|
|
39
|
|
|
class GeoUtilTests(unittest.TestCase): |
40
|
|
|
geojson_valid = { |
41
|
|
|
"type": "MultiPolygon", |
42
|
|
|
"coordinates": [[[[152184.01399999947, 212331.8648750011], [152185.94512499947, 212318.6137500011], |
43
|
|
|
[152186.13837499946, 212318.6326250011], [152186.86699999947, 212313.9570000011], |
44
|
|
|
[152186.91462499945, 212313.65187500112], [152192.45099999948, 212314.2943750011], |
45
|
|
|
[152190.69212499948, 212319.2656250011], [152199.58799999946, 212319.5248750011], |
46
|
|
|
[152197.85312499947, 212327.9388750011], [152197.57199999946, 212327.8978750011], |
47
|
|
|
[152197.08099999945, 212333.2668750011], [152184.01399999947, 212331.8648750011]]]], |
48
|
|
|
"crs": { |
49
|
|
|
"type": "name", |
50
|
|
|
"properties": { |
51
|
|
|
"name": "urn:ogc:def:crs:EPSG::31370" |
52
|
|
|
} |
53
|
|
|
} |
54
|
|
|
} |
55
|
|
|
|
56
|
|
|
def test_geojson_none(self): |
57
|
|
|
self.assertEqual(None, get_srid_from_geojson(None)) |
58
|
|
|
|
59
|
|
|
def test_geojson_value_error(self): |
60
|
|
|
geojson = {"type": "MultiPolygon", |
61
|
|
|
"coordinates": [[]], |
62
|
|
|
"crs": { |
63
|
|
|
"type": "wrong value", |
64
|
|
|
"properties": { |
65
|
|
|
"name": "urn:ogc:def:crs:EPSG::31370" |
66
|
|
|
} |
67
|
|
|
}} |
68
|
|
|
|
69
|
|
|
self.assertRaises(ValueError, convert_geojson_to_wktelement, geojson) |
70
|
|
|
|
71
|
|
|
def test_conversions(self): |
72
|
|
|
self.assertIsNone(convert_wktelement_to_geojson(None)) |
73
|
|
|
test_wktelement = convert_geojson_to_wktelement(testdata.test_geojson_valid) |
74
|
|
|
test_geojson_converted = convert_wktelement_to_geojson(test_wktelement) |
75
|
|
|
self.assertEqual(testdata.test_geojson_valid['type'], test_geojson_converted['type']) |
76
|
|
|
self.assertEqual(len(testdata.test_geojson_valid['coordinates']), len(test_geojson_converted['coordinates'])) |
77
|
|
|
self.assertEqual(testdata.test_geojson_valid['crs']['type'], test_geojson_converted['crs']['type']) |
78
|
|
|
self.assertEqual(testdata.test_geojson_valid['crs']['properties']['name'], |
79
|
|
|
test_geojson_converted['crs']['properties']['name']) |
80
|
|
|
|
81
|
|
|
def test_wktelement_attribute_error(self): |
82
|
|
|
wktelement = "string" |
83
|
|
|
self.assertRaises(AssertionError, convert_wktelement_to_geojson, wktelement) |
84
|
|
|
|
85
|
|
|
def test_get_centroid_polygon(self): |
86
|
|
|
self.assertEqual('172928.1839066983,174844.0219267663', get_centroid_xy(testdata.test_geojson_valid_polygon)) |
87
|
|
|
|
88
|
|
|
def test_get_centroid(self): |
89
|
|
|
self.assertEqual('172928.1839066983,174844.0219267663', get_centroid_xy(testdata.test_geojson_valid)) |
90
|
|
|
|
91
|
|
|
def test_get_centroid_2(self): |
92
|
|
|
self.assertEqual('152191.3046633389,212324.6399979071', get_centroid_xy(testdata.test_geojson_mulipolygon)) |
93
|
|
|
|
94
|
|
|
def test_closed_crab_location(self): |
95
|
|
|
closed_adres = {'omschrijving_straat': u'Fonteinstraat, 75', 'huisnummer': u'75', 'straat': u'Fonteinstraat', |
96
|
|
|
'postcode': u'3000', 'gemeente': u'Leuven', 'land': 'BE'} |
97
|
|
|
self.assertDictEqual(closed_adres, nearest_location(testdata.test_geojson_valid)) |
98
|
|
|
|
99
|
|
|
def test_closed_crab_location_none(self): |
100
|
|
|
self.assertIsNone(nearest_location(testdata.test_json_intersects_flanders)) |
101
|
|
|
|
102
|
|
|
def test_closed_crab_location_False(self): |
103
|
|
|
self.assertFalse(nearest_location(testdata.test_json_outside_flanders)) |
104
|
|
|
|
105
|
|
|
def test_closesr_crab_location_crabpy_gateway(self): |
106
|
|
|
n75 = Mock() |
107
|
|
|
n75.id = 102 |
108
|
|
|
n75.huisnummer = "75" |
109
|
|
|
fonteinstraat = Mock() |
110
|
|
|
fonteinstraat.id = 101 |
111
|
|
|
fonteinstraat.label = "Fonteinstraat" |
112
|
|
|
fonteinstraat.huisnummers = [n75] |
113
|
|
|
leuven = Mock() |
114
|
|
|
leuven.id = 100 |
115
|
|
|
leuven.naam = "Leuven" |
116
|
|
|
leuven.straten = [fonteinstraat] |
117
|
|
|
gemeenten = [leuven] |
118
|
|
|
crabpy_gateway = Mock() |
119
|
|
|
crabpy_gateway.list_gemeenten = Mock(return_value=gemeenten) |
120
|
|
|
closed_adres = {'omschrijving_straat': u'Fonteinstraat, 75', 'huisnummer': u'75', 'huisnummer_id': 102, |
121
|
|
|
'straat': u'Fonteinstraat', 'straat_id': 101, |
122
|
|
|
'postcode': u'3000', 'gemeente': u'Leuven', 'gemeente_id': 100, 'land': 'BE'} |
123
|
|
|
self.assertDictEqual(closed_adres, nearest_location(testdata.test_geojson_valid, crabpy_gateway)) |
124
|
|
|
|
125
|
|
|
def test_check_in_flanders(self): |
126
|
|
|
self.assertTrue(check_in_flanders(testdata.test_geojson_valid)) |
127
|
|
|
self.assertTrue(check_in_flanders(testdata.test_json_intersects_flanders)) |
128
|
|
|
self.assertFalse(check_in_flanders(testdata.test_json_outside_flanders)) |
129
|
|
|
|
130
|
|
|
def test_check_within_flanders(self): |
131
|
|
|
self.assertTrue(check_within_flanders(testdata.test_geojson_valid)) |
132
|
|
|
self.assertFalse(check_within_flanders(testdata.test_json_intersects_flanders)) |
133
|
|
|
self.assertFalse(check_within_flanders(testdata.test_json_outside_flanders)) |
134
|
|
|
|
135
|
|
|
def test_convert_geojson_to_wktelement_none(self): |
136
|
|
|
self.assertIsNone(convert_geojson_to_wktelement(None)) |
137
|
|
|
|
138
|
|
|
@responses.activate |
139
|
|
|
def test_admin_grenzen_client(self): |
140
|
|
|
base_url = mock_geozoekdiensten_response() |
141
|
|
|
gemeenten = AdminGrenzenClient(base_url).get_gemeenten(self.geojson_valid) |
142
|
|
|
self.assertIsInstance(gemeenten, list) |
143
|
|
|
self.assertGreater(len(gemeenten), 0) |
144
|
|
|
|
145
|
|
|
@responses.activate |
146
|
|
|
def test_admin_grenzen_client_outside_flanders(self): |
147
|
|
|
base_url = mock_geozoekdiensten_response() |
148
|
|
|
gemeenten = AdminGrenzenClient(base_url).get_gemeenten(testdata.test_json_outside_flanders) |
149
|
|
|
self.assertIsInstance(gemeenten, list) |
150
|
|
|
self.assertEqual(len(gemeenten), 0) |
151
|
|
|
|
152
|
|
|
@responses.activate |
153
|
|
|
def test_admin_grenzen_client_raise_service_error(self): |
154
|
|
|
base_url = mock_geozoekdiensten_response(response_status=500) |
155
|
|
|
with self.assertRaises(Exception) as ex: |
156
|
|
|
AdminGrenzenClient(base_url).get_gemeenten(self.geojson_valid) |
157
|
|
|
|
158
|
|
|
@responses.activate |
159
|
|
|
def test_get_gemeente_2(self): |
160
|
|
|
base_url = mock_geozoekdiensten_get_gemeente_response(len_results=2) |
161
|
|
|
gemeente = AdminGrenzenClient(base_url).get_gemeente(testdata.test_geojson_mulipolygon) |
162
|
|
|
self.assertDictEqual({'naam': 'Antwerpen', 'niscode': '11002'}, gemeente) |
163
|
|
|
|
164
|
|
|
@responses.activate |
165
|
|
|
def test_get_gemeente_1(self): |
166
|
|
|
base_url = mock_geozoekdiensten_get_gemeente_response(len_results=1) |
167
|
|
|
gemeente = AdminGrenzenClient(base_url).get_gemeente(testdata.test_geojson_mulipolygon) |
168
|
|
|
self.assertDictEqual({'naam': 'gemeente', 'niscode': 'niscode'}, gemeente) |
169
|
|
|
|
170
|
|
|
@responses.activate |
171
|
|
|
def test_get_gemeente_0(self): |
172
|
|
|
base_url = mock_geozoekdiensten_get_gemeente_response(len_results=0) |
173
|
|
|
gemeente = AdminGrenzenClient(base_url).get_gemeente(testdata.test_geojson_mulipolygon) |
174
|
|
|
self.assertIsNone(gemeente) |
175
|
|
|
|
176
|
|
|
@responses.activate |
177
|
|
|
def test_get_provincie(self): |
178
|
|
|
base_url = 'http://geozoekdienst.en/provincies' |
179
|
|
|
responses.add(responses.POST, base_url, body=json.dumps(get_provincie_results)) |
180
|
|
|
provincie = AdminGrenzenClient(base_url).get_provincie(testdata.test_geojson_mulipolygon) |
181
|
|
|
self.assertDictEqual({'naam': 'Antwerpen', 'niscode': '10000'}, provincie) |
182
|
|
|
|
183
|
|
|
@responses.activate |
184
|
|
|
def test_get_provincies(self): |
185
|
|
|
base_url = 'http://geozoekdienst.en/provincies' |
186
|
|
|
responses.add(responses.POST, base_url, body=json.dumps(get_provincie_results)) |
187
|
|
|
provincies = AdminGrenzenClient(base_url).get_provincies(testdata.test_geojson_mulipolygon) |
188
|
|
|
self.assertListEqual(['Antwerpen', 'Vlaams Brabant'], provincies) |
189
|
|
|
|
190
|
|
|
def test_remove_dupl_values_simple(self): |
191
|
|
|
a = [1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5, 1] |
192
|
|
|
remove_dupl_values(a) |
193
|
|
|
self.assertEqual([1, 2, 3, 4, 5, 1], a) |
194
|
|
|
|
195
|
|
|
def test_remove_dupl_values(self): |
196
|
|
|
a = [[94826.49908124168, 193977.986615351], |
197
|
|
|
[94826.49908124168, 193976.986615351], |
198
|
|
|
[94826.49908124168, 193976.986615351], |
199
|
|
|
[94820.99908124168, 193974.486615351], |
200
|
|
|
[94824.99908124168, 193967.986615351], |
201
|
|
|
[94830.99908124168, 193972.986615351], |
202
|
|
|
[94826.49908124168, 193977.986615351]] |
203
|
|
|
remove_dupl_values(a) |
204
|
|
|
self.assertEqual( |
205
|
|
|
[[94826.49908124168, 193977.986615351], |
206
|
|
|
[94826.49908124168, 193976.986615351], |
207
|
|
|
[94820.99908124168, 193974.486615351], |
208
|
|
|
[94824.99908124168, 193967.986615351], |
209
|
|
|
[94830.99908124168, 193972.986615351], |
210
|
|
|
[94826.49908124168, 193977.986615351]], a) |
211
|
|
|
|
212
|
|
|
def test_remove_dupl_coords(self): |
213
|
|
|
a = { |
214
|
|
|
"crs": {"type": "name", "properties": {"name": "urn:ogc:def:crs:EPSG::31370"}}, |
215
|
|
|
"type": "MultiPolygon", |
216
|
|
|
"coordinates": [ |
217
|
|
|
[ |
218
|
|
|
[ |
219
|
|
|
[94826.49908124168, 193977.986615351], |
220
|
|
|
[94826.49908124168, 193976.986615351], |
221
|
|
|
[94826.49908124168, 193976.986615351], |
222
|
|
|
[94820.99908124168, 193974.486615351], |
223
|
|
|
[94824.99908124168, 193967.986615351], |
224
|
|
|
[94830.99908124168, 193972.986615351], |
225
|
|
|
[94826.49908124168, 193977.986615351] |
226
|
|
|
] |
227
|
|
|
] |
228
|
|
|
] |
229
|
|
|
} |
230
|
|
|
remove_dupl_coords(a["coordinates"]) |
231
|
|
|
self.assertEqual( |
232
|
|
|
[[[[94826.49908124168, 193977.986615351], |
233
|
|
|
[94826.49908124168, 193976.986615351], |
234
|
|
|
[94820.99908124168, 193974.486615351], |
235
|
|
|
[94824.99908124168, 193967.986615351], |
236
|
|
|
[94830.99908124168, 193972.986615351], |
237
|
|
|
[94826.49908124168, 193977.986615351]]]], a["coordinates"]) |
238
|
|
|
|