Completed
Push — master ( bbc248...c9c1e2 )
by
unknown
01:20
created

GeoUtilTests.test_closed_crab_location_2()   A

Complexity

Conditions 1

Size

Total Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 1 Features 0
Metric Value
cc 1
c 1
b 1
f 0
dl 0
loc 7
rs 9.4285
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
    provincie_niscode)
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_2(self):
100
        closed_adres = {'straat': 'Krijgsbaan', 'land': 'BE', 'postcode': '2100',
101
                         'omschrijving_straat': 'Krijgsbaan, 150', 'huisnummer': '150', 'gemeente': 'Antwerpen'}
102
        self.assertDictEqual(closed_adres, nearest_location(
103
            {"type": "MultiPolygon",
104
             "coordinates": [[[[158788, 211982], [158789, 211982], [158789, 211983], [158788, 211982]]]],
105
             "crs": {"type": "name", "properties": {"name": "urn:ogc:def:crs:EPSG::31370"}}}))
106
107
    def test_closed_crab_location_none(self):
108
        self.assertIsNone(nearest_location(testdata.test_json_intersects_flanders))
109
110
    def test_closed_crab_location_False(self):
111
        self.assertFalse(nearest_location(testdata.test_json_outside_flanders))
112
113
    def test_closesr_crab_location_crabpy_gateway(self):
114
        n75 = Mock()
115
        n75.id = 102
116
        n75.huisnummer = "75"
117
        fonteinstraat = Mock()
118
        fonteinstraat.id = 101
119
        fonteinstraat.label = "Fonteinstraat"
120
        fonteinstraat.huisnummers = [n75]
121
        leuven = Mock()
122
        leuven.id = 100
123
        leuven.naam = "Leuven"
124
        leuven.straten = [fonteinstraat]
125
        gemeenten = [leuven]
126
        crabpy_gateway = Mock()
127
        crabpy_gateway.list_gemeenten = Mock(return_value=gemeenten)
128
        closed_adres = {'omschrijving_straat': u'Fonteinstraat, 75', 'huisnummer': u'75', 'huisnummer_id': 102,
129
                        'straat': u'Fonteinstraat', 'straat_id': 101,
130
                        'postcode': u'3000', 'gemeente': u'Leuven', 'gemeente_id': 100, 'land': 'BE'}
131
        self.assertDictEqual(closed_adres, nearest_location(testdata.test_geojson_valid, crabpy_gateway))
132
133
    def test_check_in_flanders(self):
134
        self.assertTrue(check_in_flanders(testdata.test_geojson_valid))
135
        self.assertTrue(check_in_flanders(testdata.test_json_intersects_flanders))
136
        self.assertFalse(check_in_flanders(testdata.test_json_outside_flanders))
137
138
    def test_check_within_flanders(self):
139
        self.assertTrue(check_within_flanders(testdata.test_geojson_valid))
140
        self.assertFalse(check_within_flanders(testdata.test_json_intersects_flanders))
141
        self.assertFalse(check_within_flanders(testdata.test_json_outside_flanders))
142
143
    def test_convert_geojson_to_wktelement_none(self):
144
        self.assertIsNone(convert_geojson_to_wktelement(None))
145
146
    @responses.activate
147
    def test_admin_grenzen_client(self):
148
        base_url = mock_geozoekdiensten_response()
149
        gemeenten = AdminGrenzenClient(base_url).get_gemeenten(self.geojson_valid)
150
        self.assertIsInstance(gemeenten, list)
151
        self.assertGreater(len(gemeenten), 0)
152
153
    @responses.activate
154
    def test_admin_grenzen_client_outside_flanders(self):
155
        base_url = mock_geozoekdiensten_response()
156
        gemeenten = AdminGrenzenClient(base_url).get_gemeenten(testdata.test_json_outside_flanders)
157
        self.assertIsInstance(gemeenten, list)
158
        self.assertEqual(len(gemeenten), 0)
159
160
    @responses.activate
161
    def test_admin_grenzen_client_raise_service_error(self):
162
        base_url = mock_geozoekdiensten_response(response_status=500)
163
        with self.assertRaises(Exception) as ex:
164
            AdminGrenzenClient(base_url).get_gemeenten(self.geojson_valid)
165
166
    @responses.activate
167
    def test_get_gemeente_2(self):
168
        base_url = mock_geozoekdiensten_get_gemeente_response(len_results=2)
169
        gemeente = AdminGrenzenClient(base_url).get_gemeente(testdata.test_geojson_mulipolygon)
170
        self.assertDictEqual({'naam': 'Antwerpen', 'niscode': '11002'}, gemeente)
171
172
    @responses.activate
173
    def test_get_gemeente_1(self):
174
        base_url = mock_geozoekdiensten_get_gemeente_response(len_results=1)
175
        gemeente = AdminGrenzenClient(base_url).get_gemeente(testdata.test_geojson_mulipolygon)
176
        self.assertDictEqual({'naam': 'gemeente', 'niscode': 'niscode'}, gemeente)
177
178
    @responses.activate
179
    def test_get_gemeente_0(self):
180
        base_url = mock_geozoekdiensten_get_gemeente_response(len_results=0)
181
        gemeente = AdminGrenzenClient(base_url).get_gemeente(testdata.test_geojson_mulipolygon)
182
        self.assertIsNone(gemeente)
183
184
    @responses.activate
185
    def test_get_provincie(self):
186
        base_url = 'http://geozoekdienst.en/provincies'
187
        responses.add(responses.POST, base_url, body=json.dumps(get_provincie_results))
188
        provincie = AdminGrenzenClient(base_url).get_provincie(testdata.test_geojson_mulipolygon)
189
        self.assertDictEqual({'naam': 'Antwerpen', 'niscode': '10000'}, provincie)
190
191
    @responses.activate
192
    def test_get_provincies(self):
193
        base_url = 'http://geozoekdienst.en/provincies'
194
        responses.add(responses.POST, base_url, body=json.dumps(get_provincie_results))
195
        provincies = AdminGrenzenClient(base_url).get_provincies(testdata.test_geojson_mulipolygon)
196
        self.assertListEqual(['Antwerpen', 'Vlaams Brabant'], provincies)
197
198
    def test_remove_dupl_values_simple(self):
199
        a = [1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5, 1]
200
        remove_dupl_values(a)
201
        self.assertEqual([1, 2, 3, 4, 5, 1], a)
202
203
    def test_remove_dupl_values(self):
204
        a = [[94826.49908124168, 193977.986615351],
205
             [94826.49908124168, 193976.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]]
211
        remove_dupl_values(a)
212
        self.assertEqual(
213
            [[94826.49908124168, 193977.986615351],
214
             [94826.49908124168, 193976.986615351],
215
             [94820.99908124168, 193974.486615351],
216
             [94824.99908124168, 193967.986615351],
217
             [94830.99908124168, 193972.986615351],
218
             [94826.49908124168, 193977.986615351]], a)
219
220
    def test_remove_dupl_coords(self):
221
        a = {
222
            "crs": {"type": "name", "properties": {"name": "urn:ogc:def:crs:EPSG::31370"}},
223
            "type": "MultiPolygon",
224
            "coordinates": [
225
                [
226
                    [
227
                        [94826.49908124168, 193977.986615351],
228
                        [94826.49908124168, 193976.986615351],
229
                        [94826.49908124168, 193976.986615351],
230
                        [94820.99908124168, 193974.486615351],
231
                        [94824.99908124168, 193967.986615351],
232
                        [94830.99908124168, 193972.986615351],
233
                        [94826.49908124168, 193977.986615351]
234
                    ]
235
                ]
236
            ]
237
        }
238
        remove_dupl_coords(a["coordinates"])
239
        self.assertEqual(
240
            [[[[94826.49908124168, 193977.986615351],
241
               [94826.49908124168, 193976.986615351],
242
               [94820.99908124168, 193974.486615351],
243
               [94824.99908124168, 193967.986615351],
244
               [94830.99908124168, 193972.986615351],
245
               [94826.49908124168, 193977.986615351]]]], a["coordinates"])
246
247
    def test_provincie_niscode(self):
248
        pniscode = provincie_niscode(12021)
249
        self.assertEqual(10000, pniscode)
250
251
    def test_provincie_niscode_vlb(self):
252
        pniscode = provincie_niscode(24062)
253
        self.assertEqual(20001, pniscode)
254