Projet

Général

Profil

0001-geolocation-record-LoggedError-on-address-string-err.patch

Lauréline Guérin, 16 mars 2021 11:58

Télécharger (7,02 ko)

Voir les différences:

Subject: [PATCH] geolocation: record LoggedError on address string error
 (#51773)

 tests/test_workflows.py | 51 +++++++++++++++++++++++++----------------
 wcs/wf/geolocate.py     | 12 ++++++----
 2 files changed, 39 insertions(+), 24 deletions(-)
tests/test_workflows.py
3159 3159
    assert formdata.get_criticality_level_object().name == 'green'
3160 3160

  
3161 3161

  
3162
def test_geolocate_address(pub):
3162
def test_geolocate_address(two_pubs):
3163
    if two_pubs.is_using_postgresql():
3164
        two_pubs.loggederror_class.wipe()
3163 3165
    formdef = FormDef()
3164 3166
    formdef.geolocations = {'base': 'bla'}
3165 3167
    formdef.name = 'baz'
......
3172 3174
    formdata.data = {'1': '169 rue du chateau'}
3173 3175
    formdata.just_created()
3174 3176
    formdata.store()
3175
    pub.substitutions.feed(formdata)
3177
    two_pubs.substitutions.feed(formdata)
3176 3178

  
3177 3179
    item = GeolocateWorkflowStatusItem()
3178 3180
    item.method = 'address_string'
......
3191 3193
        assert int(formdata.geolocations['base']['lat']) == 48
3192 3194
        assert int(formdata.geolocations['base']['lon']) == 2
3193 3195

  
3194
    pub.load_site_options()
3195
    pub.site_options.set('options', 'nominatim_key', 'KEY')
3196
    two_pubs.load_site_options()
3197
    two_pubs.site_options.set('options', 'nominatim_key', 'KEY')
3196 3198
    with mock.patch('wcs.wf.geolocate.http_get_page') as http_get_page:
3197 3199
        http_get_page.return_value = (
3198 3200
            None,
......
3207 3209
        assert int(formdata.geolocations['base']['lat']) == 48
3208 3210
        assert int(formdata.geolocations['base']['lon']) == 2
3209 3211

  
3210
    pub.load_site_options()
3211
    pub.site_options.set('options', 'geocoding_service_url', 'http://example.net/')
3212
    two_pubs.load_site_options()
3213
    two_pubs.site_options.set('options', 'geocoding_service_url', 'http://example.net/')
3212 3214
    with mock.patch('wcs.wf.geolocate.http_get_page') as http_get_page:
3213 3215
        http_get_page.return_value = (
3214 3216
            None,
......
3219 3221
        item.perform(formdata)
3220 3222
        assert 'http://example.net/?q=' in http_get_page.call_args[0][0]
3221 3223

  
3222
    pub.site_options.set('options', 'geocoding_service_url', 'http://example.net/?param=value')
3224
    two_pubs.site_options.set('options', 'geocoding_service_url', 'http://example.net/?param=value')
3223 3225
    with mock.patch('wcs.wf.geolocate.http_get_page') as http_get_page:
3224 3226
        http_get_page.return_value = (
3225 3227
            None,
......
3235 3237
    formdata.geolocations = None
3236 3238
    item.perform(formdata)
3237 3239
    assert formdata.geolocations == {}
3240
    if two_pubs.is_using_postgresql():
3241
        assert two_pubs.loggederror_class.count() == 1
3242
        logged_error = two_pubs.loggederror_class.select()[0]
3243
        assert (
3244
            logged_error.summary
3245
            == 'error in template for address string [syntax error in ezt template: unclosed block at line 1 and column 24]'
3246
        )
3247
        assert logged_error.formdata_id == str(formdata.id)
3248
        assert logged_error.exception_class == 'TemplateError'
3249
        assert (
3250
            logged_error.exception_message
3251
            == 'syntax error in ezt template: unclosed block at line 1 and column 24'
3252
        )
3238 3253

  
3239 3254
    # check for None
3240 3255
    item.address_string = '=None'
......
3242 3257
    item.perform(formdata)
3243 3258
    assert formdata.geolocations == {}
3244 3259

  
3245
    # check for nominatim server error
3246
    formdata.geolocations = None
3247
    with mock.patch('wcs.wf.geolocate.http_get_page') as http_get_page:
3248
        http_get_page.return_value = (
3249
            None,
3250
            500,
3251
            force_bytes(json.dumps([{'lat': '48.8337085', 'lon': '2.3233693'}])),
3252
            None,
3253
        )
3254
        item.perform(formdata)
3255
        assert formdata.geolocations == {}
3256

  
3257 3260
    # check for nominatim returning an empty result set
3261
    item.address_string = '[form_var_string], paris, france'
3258 3262
    formdata.geolocations = None
3259 3263
    with mock.patch('wcs.wf.geolocate.http_get_page') as http_get_page:
3260 3264
        http_get_page.return_value = (None, 200, force_bytes(json.dumps([])), None)
......
3271 3275
    # check for nominatim connection error
3272 3276
    formdata.geolocations = None
3273 3277
    with mock.patch('wcs.wf.geolocate.http_get_page') as http_get_page:
3274
        http_get_page.side_effect = ConnectionError
3278
        http_get_page.side_effect = ConnectionError('some error')
3275 3279
        item.perform(formdata)
3276 3280
        assert formdata.geolocations == {}
3281
    if two_pubs.is_using_postgresql():
3282
        assert two_pubs.loggederror_class.count() == 2
3283
        logged_error = two_pubs.loggederror_class.select()[1]
3284
        assert logged_error.summary == 'error calling geocoding service [some error]'
3285
        assert logged_error.formdata_id == str(formdata.id)
3286
        assert logged_error.exception_class == 'ConnectionError'
3287
        assert logged_error.exception_message == 'some error'
3277 3288

  
3278 3289

  
3279 3290
def test_geolocate_image(pub):
wcs/wf/geolocate.py
136 136
            try:
137 137
                address = self.compute(self.address_string, raises=True)
138 138
            except Exception as e:
139
                get_logger().error('error in template for address string [%r]', e)
139
                get_publisher().record_error(
140
                    _('error in template for address string [%s]') % str(e), formdata=formdata, exception=e
141
                )
140 142
                return
141 143
        else:
142 144
            # this is when the action is being executed to prefill a map field;
......
158 160
        try:
159 161
            response, status, data, auth_header = http_get_page(url, raise_on_http_errors=True)
160 162
        except ConnectionError as e:
161
            get_logger().error('error calling geocoding service [%s]', str(e))
163
            get_publisher().record_error(
164
                _('error calling geocoding service [%s]') % str(e), formdata=formdata, exception=e
165
            )
162 166
            return
163 167
        try:
164 168
            data = json.loads(force_str(data))
165 169
        except ValueError:
166
            get_logger().error('non-JSON response from geocoding service')
170
            get_logger().debug('non-JSON response from geocoding service')
167 171
            return
168 172
        if len(data) == 0 or isinstance(data, dict):
169
            get_logger().info('error finding location')
173
            get_logger().debug('error finding location')
170 174
            return
171 175
        coords = data[0]
172 176
        return normalize_geolocation({'lon': coords['lon'], 'lat': coords['lat']})
173
-