Completed
Push — master ( 494879...6d7f06 )
by
unknown
01:24
created

GeoUtilTests.test_remove_dupl_values_simple()   A

Complexity

Conditions 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

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