Projet

Général

Profil

0001-opengis-add-tests-on-projections-55284.patch

Nicolas Roche (absent jusqu'au 3 avril), 02 juillet 2021 13:51

Télécharger (11,6 ko)

Voir les différences:

Subject: [PATCH 1/2] opengis: add tests on projections (#55284)

 tests/test_opengis.py | 147 ++++++++++++++++++++++++++++++++----------
 1 file changed, 113 insertions(+), 34 deletions(-)
tests/test_opengis.py
161 161
    "*" ...
162 162
    "+" ...
163 163
    "-" ...
164 164
     Parsing : strEqualsIgnoreCase(nom_commune, &amp;apos;Grenoble&amp;apos;) = true AND strEqualsIgnoreCase(nom_voie, &amp;apos;rue albert recoura&amp;apos;) = true AND numero=8 BIS.</ows:ExceptionText>
165 165
  </ows:Exception>
166 166
</ows:ExceptionReport>
167 167
'''
168 168

  
169
'''
170
17, BOULEVARD EDOUARD REY 38000 Grenoble
171
    1914059.51,  # 5.72465  (lat, wgs84)
172
    4224699.2    # 45.18988 (lon, wgs84)
173

  
174
2, place victor hugo 38000 Grenoble
175
    1914042.47,  # 5.72434  (lat, wgs84)
176
    4224665.2    # 45.18967 (lon, wgs84)
177

  
178
28, BOULEVARD EDOUARD REY 38000 Grenoble
179
    1914035.7,  # 45.18985  (lat, wgs84)
180
    4224700.42  # 5.72427   (lon, wgs84)
181

  
182
4, place victor hugo 38000 Grenoble
183
    1914018.64, # 45.18947  (lat, wgs84)
184
    4224644.61  # 5.72403   (lon, wgs84)
185
'''
169 186
FAKE_GEOLOCATED_FEATURE = '''{
170 187
    "crs": {
171 188
        "properties": {
172 189
            "name": "urn:ogc:def:crs:EPSG::3945"
173 190
        },
174 191
        "type": "name"
175 192
    },
176 193
    "features": [
......
349 366

  
350 367

  
351 368
def geoserver_circle_responses(url, **kwargs):
352 369
    if kwargs['params'].get('request') == 'GetCapabilities':
353 370
        return utils.FakedResponse(status_code=200, content=FAKE_SERVICE_CAPABILITIES)
354 371
    return utils.FakedResponse(status_code=200, content=json.dumps(FAKE_GEOLOCATED_FEATURE_CIRCLE))
355 372

  
356 373

  
374
@pytest.mark.parametrize(
375
    'projection, bbox',
376
    [
377
        ('EPSG:2154', '838570.184096,6523472.766191,838585.214059,6523495.321646'),
378
        ('EPSG:3857', '532556.896735,5747844.261214,532579.160633,5747876.194333'),
379
        ('EPSG:3945', '1838692.984807,4290077.106679,1838708.041015,4290099.673366'),
380
        ('EPSG:4326', '45.796790,4.784040,45.796990,4.784240'),
381
    ],
382
)
357 383
@mock.patch('passerelle.utils.Request.get')
358
def test_feature_info(mocked_get, app, connector):
384
def test_feature_info(mocked_get, app, connector, projection, bbox):
359 385
    endpoint = utils.generic_endpoint_url('opengis', 'feature_info', slug=connector.slug)
360 386
    assert endpoint == '/opengis/test/feature_info'
361 387
    mocked_get.return_value = utils.FakedResponse(content=FAKE_FEATURE_INFO, status_code=200)
388
    connector.projection = projection
389
    connector.save()
390

  
362 391
    resp = app.get(endpoint, params={'lat': '45.796890', 'lon': '4.784140'})
363
    assert (
364
        mocked_get.call_args[1]['params']['bbox']
365
        == '532556.896735,5747844.261214,532579.160633,5747876.194333'
366
    )
367
    assert mocked_get.call_args[1]['params']['crs'] == 'EPSG:3857'
392
    assert mocked_get.call_args[1]['params']['bbox'] == bbox
393
    assert mocked_get.call_args[1]['params']['crs'] == projection
368 394
    assert (
369 395
        resp.json['data']['cad_cadastrecadparcelle_layer']['cad_cadastrecadparcelle_feature'][
370 396
            'natureproprietaire'
371 397
        ]
372 398
        == 'Particulier'
373 399
    )
374
    connector.projection = 'EPSG:4326'
375
    connector.save()
376
    resp = app.get(endpoint, params={'lat': '45.796890', 'lon': '4.784140'})
377
    assert mocked_get.call_args[1]['params']['bbox'] == '45.796790,4.784040,45.796990,4.784240'
378
    assert mocked_get.call_args[1]['params']['crs'] == 'EPSG:4326'
379 400

  
380 401

  
381 402
@mock.patch('passerelle.utils.Request.get')
382 403
@pytest.mark.parametrize(
383 404
    'lat,lon',
384 405
    [
385 406
        ('bad-value', '4.784140'),
386 407
        ('45.796890', 'bad-value'),
......
390 411
    endpoint = utils.generic_endpoint_url('opengis', 'feature_info', slug=connector.slug)
391 412
    assert endpoint == '/opengis/test/feature_info'
392 413
    mocked_get.return_value = utils.FakedResponse(content=FAKE_FEATURE_INFO, status_code=200)
393 414
    resp = app.get(endpoint, params={'lat': lat, 'lon': lon})
394 415
    assert resp.json['err'] == 1
395 416
    assert resp.json['err_desc'] == 'Bad coordinates format'
396 417

  
397 418

  
419
@pytest.mark.parametrize(
420
    'projection, bbox',
421
    [
422
        ('EPSG:2154', '843407.715537,6519055.898748,843824.642554,6519491.379063'),
423
        ('EPSG:3857', '539339.671580,5741338.068556,539951.167806,5741949.564782'),
424
        ('EPSG:3945', '1843532.148941,4285653.552517,1843949.695865,4286089.160315'),
425
        ('EPSG:4326', '45.756026,4.844971,45.759859,4.850464'),
426
    ],
427
)
398 428
@mock.patch('passerelle.utils.Request.get')
399
def test_tile(mocked_get, app, connector):
429
def test_tile(mocked_get, app, connector, projection, bbox):
400 430
    endpoint = utils.generic_endpoint_url('opengis', 'tile', slug=connector.slug)
401 431
    assert endpoint == '/opengis/test/tile'
402 432
    mocked_get.return_value = utils.FakedResponse(content=b'\x89PNG\r\n\x1a\n\x00\x00...', status_code=200)
403
    resp = app.get(endpoint + '/16/33650/23378.png')
404
    assert mocked_get.call_args[1]['params']['crs'] == 'EPSG:3857'
405
    assert (
406
        mocked_get.call_args[1]['params']['bbox']
407
        == '539339.671580,5741338.068556,539951.167806,5741949.564782'
408
    )
409
    connector.projection = 'EPSG:4326'
433
    connector.projection = projection
410 434
    connector.save()
411 435
    resp = app.get(endpoint + '/16/33650/23378.png')
412
    assert mocked_get.call_args[1]['params']['crs'] == 'EPSG:4326'
413
    assert mocked_get.call_args[1]['params']['bbox'] == '45.756026,4.844971,45.759859,4.850464'
436
    assert mocked_get.call_args[1]['params']['crs'] == projection
437
    assert mocked_get.call_args[1]['params']['bbox'] == bbox
414 438
    assert resp.content == b'\x89PNG\r\n\x1a\n\x00\x00...'
415 439

  
416 440

  
417 441
@mock.patch('passerelle.utils.Request.get')
418 442
def test_get_feature_with_no_wfs_url(mocked_get, app, connector):
419 443
    connector.wfs_service_url = ''
420 444
    connector.save()
421 445
    endpoint = utils.generic_endpoint_url('opengis', 'features', slug=connector.slug)
......
565 589
    assert resp.json['lat'] == '45.189397'
566 590
    assert resp.json['address']['house_number'] == '4'
567 591
    assert resp.json['address']['road'] == 'place victor hugo'
568 592
    assert resp.json['address']['postcode'] == '38000'
569 593
    assert resp.json['address']['city'] == 'Grenoble'
570 594

  
571 595

  
572 596
@mock.patch('passerelle.utils.Request.get')
573
def test_reverse_geocoding_closest(mocked_get, app, connector):
597
def test_reverse_geocoding_error(mocked_get, app, connector):
574 598
    connector.search_radius = 45
575 599
    connector.projection = 'EPSG:3945'
576 600
    connector.save()
577 601
    endpoint = utils.generic_endpoint_url('opengis', 'reverse', slug=connector.slug)
578 602
    assert endpoint == '/opengis/test/reverse'
579 603

  
580 604
    def side_effect(url, **kwargs):
581 605
        if kwargs['params'].get('request') == 'GetCapabilities':
582 606
            return utils.FakedResponse(status_code=200, content=FAKE_SERVICE_CAPABILITIES)
583 607
        return mock.DEFAULT
584 608

  
585 609
    mocked_get.side_effect = side_effect
586 610
    mocked_get.return_value = utils.FakedResponse(content=FAKE_GEOLOCATED_FEATURE, status_code=200)
587
    resp = app.get(endpoint, params={'lat': '45.1893469606986', 'lon': '5.72462060798'})
588
    assert (
589
        mocked_get.call_args[1]['params']['cql_filter']
590
        == 'DWITHIN(the_geom,Point(1914061.486036 4224640.457791),45,meters)'
591
    )
592
    assert resp.json['lon'] == '5.724077'
593
    assert resp.json['lat'] == '45.189397'
594
    assert resp.json['address']['house_number'] == '4'
595
    assert resp.json['address']['road'] == 'place victor hugo'
596
    assert resp.json['address']['postcode'] == '38000'
597
    assert resp.json['address']['city'] == 'Grenoble'
598

  
599 611
    resp = app.get(
600 612
        endpoint,
601 613
        params={
602 614
            'lat': '45.1893469606986',
603 615
            'lon': '5.72462060798',
604 616
            'addressdetails': 'details',
605 617
            'accept-language': 'fr',
606 618
        },
......
620 632
    assert resp.json['err_desc'] == 'Unable to geocode'
621 633

  
622 634
    mocked_get.return_value = utils.FakedResponse(status_code=404, content='{}', ok=False)
623 635
    resp = app.get(endpoint, params={'lat': '45.183784', 'lon': '5.714885'})
624 636
    assert resp.json['err'] == 1
625 637
    assert resp.json['err_desc'] == 'Webservice returned status code 404'
626 638

  
627 639

  
640
@pytest.mark.parametrize(
641
    'projection, x, y, lon, lat, house_number, road',
642
    [
643
        (
644
            'EPSG:2154',
645
            '913930.322365',
646
            '6458139.491904',
647
            '14.292822',
648
            '24.779874',
649
            '28',
650
            'boulevard édouard rey',
651
        ),
652
        (
653
            'EPSG:3857',
654
            '637261.851065',
655
            '5651379.708172',
656
            '17.194075',
657
            '35.446317',
658
            '28',
659
            'boulevard édouard rey',
660
        ),
661
        ('EPSG:3945', '1914061.486036', '4224640.457791', '5.724077', '45.189397', '4', 'place victor hugo'),
662
        ('EPSG:4326', '5.724621', '45.189347', '1914018.640000', '4224644.610000', '4', 'place victor hugo'),
663
    ],
664
)
665
@pytest.mark.parametrize('search_radius', [45, 10])
666
@mock.patch('passerelle.utils.Request.get')
667
def test_reverse_geocoding_closest(
668
    mocked_get, app, connector, search_radius, projection, x, y, lon, lat, house_number, road
669
):
670
    connector.search_radius = search_radius
671
    connector.projection = projection
672
    connector.save()
673
    endpoint = utils.generic_endpoint_url('opengis', 'reverse', slug=connector.slug)
674
    assert endpoint == '/opengis/test/reverse'
675

  
676
    def side_effect(url, **kwargs):
677
        if kwargs['params'].get('request') == 'GetCapabilities':
678
            return utils.FakedResponse(status_code=200, content=FAKE_SERVICE_CAPABILITIES)
679
        return mock.DEFAULT
680

  
681
    # adapt locations to selected projection
682
    fake_geolocated_feature = json.loads(FAKE_GEOLOCATED_FEATURE)
683
    # fake_geolocated_feature['crs']['properties']['name'] = "urn:ogc:def:crs:EPSG::3945"
684
    for feature in fake_geolocated_feature['features']:
685
        wgs84_lon, wgs84_lat = feature['geometry']['coordinates']
686
        proj_lon, proj_lat = connector.convert_coordinates(wgs84_lon, wgs84_lat, reverse=True)
687
        feature['geometry']['coordinates'] = [proj_lon, proj_lat]
688
        fake_geolocated_feature = json.dumps(fake_geolocated_feature)
689

  
690
    req_lon, req_lat = connector.convert_coordinates('5.72462060798', '45.1893469606986', reverse=True)
691
    mocked_get.side_effect = side_effect
692
    mocked_get.return_value = utils.FakedResponse(content=FAKE_GEOLOCATED_FEATURE, status_code=200)
693
    resp = app.get(endpoint, params={'lat': '45.1893469606986', 'lon': '5.72462060798'})
694
    assert mocked_get.call_args[1]['params']['cql_filter'] == 'DWITHIN(the_geom,Point(%s %s),%s,meters)' % (
695
        x,
696
        y,
697
        search_radius,
698
    )
699
    assert resp.json['lon'] == lon
700
    assert resp.json['lat'] == lat
701
    assert resp.json['address']['house_number'] == house_number
702
    assert resp.json['address']['road'] == road
703
    assert resp.json['address']['postcode'] == '38000'
704
    assert resp.json['address']['city'] == 'Grenoble'
705

  
706

  
628 707
@mock.patch('passerelle.utils.Request.get')
629 708
def test_opengis_query_cache_update(mocked_get, app, connector, query):
630 709
    mocked_get.side_effect = geoserver_geolocated_responses
631 710
    query.update_cache()
632 711

  
633 712
    assert mocked_get.call_args[1]['params']['filter'] == query.filter_expression
634 713
    assert mocked_get.call_args[1]['params']['typenames'] == query.typename
635 714
    assert FeatureCache.objects.count() == 4
636
-