Completed
Push — master ( 6d87e4...977fd7 )
by Bart
01:16
created

test_closesr_crab_location_crabpy_gateway()   A

Complexity

Conditions 1

Size

Total Lines 19

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 19
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
)
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