X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/1facfd019b3e0c86b3cfb1a25ae0837cce4bdcae..513504140512d17ddbe0769b2ec3887ee16f7e31:/test/python/api/test_server_glue_v1.py diff --git a/test/python/api/test_server_glue_v1.py b/test/python/api/test_server_glue_v1.py index a374bdcf..a731e720 100644 --- a/test/python/api/test_server_glue_v1.py +++ b/test/python/api/test_server_glue_v1.py @@ -32,9 +32,9 @@ FakeResponse = namedtuple('FakeResponse', ['status', 'output', 'content_type']) class FakeAdaptor(glue.ASGIAdaptor): - def __init__(self, params={}, headers={}, config=None): - self.params = params - self.headers = headers + def __init__(self, params=None, headers=None, config=None): + self.params = params or {} + self.headers = headers or {} self._config = config or Configuration(None) @@ -123,7 +123,7 @@ def test_accepted_languages_from_param(): def test_accepted_languages_from_header(): - a = FakeAdaptor(headers={'http_accept_language': 'de'}) + a = FakeAdaptor(headers={'accept-language': 'de'}) assert a.get_accepted_languages() == 'de' @@ -135,13 +135,13 @@ def test_accepted_languages_from_default(monkeypatch): def test_accepted_languages_param_over_header(): a = FakeAdaptor(params={'accept-language': 'de'}, - headers={'http_accept_language': 'en'}) + headers={'accept-language': 'en'}) assert a.get_accepted_languages() == 'de' def test_accepted_languages_header_over_default(monkeypatch): monkeypatch.setenv('NOMINATIM_DEFAULT_LANGUAGE', 'en') - a = FakeAdaptor(headers={'http_accept_language': 'de'}) + a = FakeAdaptor(headers={'accept-language': 'de'}) assert a.get_accepted_languages() == 'de' @@ -197,14 +197,14 @@ def test_raise_error_during_debug(): loglib.log().section('Ongoing') with pytest.raises(FakeError) as excinfo: - a.raise_error('bad state') + a.raise_error('badstate') content = ET.fromstring(excinfo.value.msg) assert content.tag == 'html' assert '>Ongoing<' in excinfo.value.msg - assert 'bad state' in excinfo.value.msg + assert 'badstate' in excinfo.value.msg # ASGIAdaptor.build_response @@ -335,7 +335,7 @@ class TestDetailsEndpoint: self.lookup_args.extend(args[1:]) return self.result - monkeypatch.setattr(napi.NominatimAPIAsync, 'lookup', _lookup) + monkeypatch.setattr(napi.NominatimAPIAsync, 'details', _lookup) @pytest.mark.asyncio @@ -384,3 +384,228 @@ class TestDetailsEndpoint: with pytest.raises(FakeError, match='^404 -- .*found'): await glue.details_endpoint(napi.NominatimAPIAsync(Path('/invalid')), a) + + +# reverse_endpoint() +class TestReverseEndPoint: + + @pytest.fixture(autouse=True) + def patch_reverse_func(self, monkeypatch): + self.result = napi.ReverseResult(napi.SourceTable.PLACEX, + ('place', 'thing'), + napi.Point(1.0, 2.0)) + async def _reverse(*args, **kwargs): + return self.result + + monkeypatch.setattr(napi.NominatimAPIAsync, 'reverse', _reverse) + + + @pytest.mark.asyncio + @pytest.mark.parametrize('params', [{}, {'lat': '3.4'}, {'lon': '6.7'}]) + async def test_reverse_no_params(self, params): + a = FakeAdaptor() + a.params = params + a.params['format'] = 'xml' + + with pytest.raises(FakeError, match='^400 -- (?s:.*)missing'): + await glue.reverse_endpoint(napi.NominatimAPIAsync(Path('/invalid')), a) + + + @pytest.mark.asyncio + @pytest.mark.parametrize('params', [{'lat': '45.6', 'lon': '4563'}]) + async def test_reverse_success(self, params): + a = FakeAdaptor() + a.params = params + a.params['format'] = 'json' + + res = await glue.reverse_endpoint(napi.NominatimAPIAsync(Path('/invalid')), a) + + assert res == '' + + + @pytest.mark.asyncio + async def test_reverse_success(self): + a = FakeAdaptor() + a.params['lat'] = '56.3' + a.params['lon'] = '6.8' + + assert await glue.reverse_endpoint(napi.NominatimAPIAsync(Path('/invalid')), a) + + + @pytest.mark.asyncio + async def test_reverse_from_search(self): + a = FakeAdaptor() + a.params['q'] = '34.6 2.56' + a.params['format'] = 'json' + + res = await glue.search_endpoint(napi.NominatimAPIAsync(Path('/invalid')), a) + + assert len(json.loads(res.output)) == 1 + + +# lookup_endpoint() + +class TestLookupEndpoint: + + @pytest.fixture(autouse=True) + def patch_lookup_func(self, monkeypatch): + self.results = [napi.SearchResult(napi.SourceTable.PLACEX, + ('place', 'thing'), + napi.Point(1.0, 2.0))] + async def _lookup(*args, **kwargs): + return napi.SearchResults(self.results) + + monkeypatch.setattr(napi.NominatimAPIAsync, 'lookup', _lookup) + + + @pytest.mark.asyncio + async def test_lookup_no_params(self): + a = FakeAdaptor() + a.params['format'] = 'json' + + res = await glue.lookup_endpoint(napi.NominatimAPIAsync(Path('/invalid')), a) + + assert res.output == '[]' + + + @pytest.mark.asyncio + @pytest.mark.parametrize('param', ['w', 'bad', '']) + async def test_lookup_bad_params(self, param): + a = FakeAdaptor() + a.params['format'] = 'json' + a.params['osm_ids'] = f'W34,{param},N33333' + + res = await glue.lookup_endpoint(napi.NominatimAPIAsync(Path('/invalid')), a) + + assert len(json.loads(res.output)) == 1 + + + @pytest.mark.asyncio + @pytest.mark.parametrize('param', ['p234234', '4563']) + async def test_lookup_bad_osm_type(self, param): + a = FakeAdaptor() + a.params['format'] = 'json' + a.params['osm_ids'] = f'W34,{param},N33333' + + res = await glue.lookup_endpoint(napi.NominatimAPIAsync(Path('/invalid')), a) + + assert len(json.loads(res.output)) == 1 + + + @pytest.mark.asyncio + async def test_lookup_working(self): + a = FakeAdaptor() + a.params['format'] = 'json' + a.params['osm_ids'] = 'N23,W34' + + res = await glue.lookup_endpoint(napi.NominatimAPIAsync(Path('/invalid')), a) + + assert len(json.loads(res.output)) == 1 + + +# search_endpoint() + +class TestSearchEndPointSearch: + + @pytest.fixture(autouse=True) + def patch_lookup_func(self, monkeypatch): + self.results = [napi.SearchResult(napi.SourceTable.PLACEX, + ('place', 'thing'), + napi.Point(1.0, 2.0))] + async def _search(*args, **kwargs): + return napi.SearchResults(self.results) + + monkeypatch.setattr(napi.NominatimAPIAsync, 'search', _search) + + + @pytest.mark.asyncio + async def test_search_free_text(self): + a = FakeAdaptor() + a.params['q'] = 'something' + + res = await glue.search_endpoint(napi.NominatimAPIAsync(Path('/invalid')), a) + + assert len(json.loads(res.output)) == 1 + + + @pytest.mark.asyncio + async def test_search_free_text_xml(self): + a = FakeAdaptor() + a.params['q'] = 'something' + a.params['format'] = 'xml' + + res = await glue.search_endpoint(napi.NominatimAPIAsync(Path('/invalid')), a) + + assert res.status == 200 + assert res.output.index('something') > 0 + + + @pytest.mark.asyncio + async def test_search_free_and_structured(self): + a = FakeAdaptor() + a.params['q'] = 'something' + a.params['city'] = 'ignored' + + res = await glue.search_endpoint(napi.NominatimAPIAsync(Path('/invalid')), a) + + assert len(json.loads(res.output)) == 1 + + + @pytest.mark.asyncio + @pytest.mark.parametrize('dedupe,numres', [(True, 1), (False, 2)]) + async def test_search_dedupe(self, dedupe, numres): + self.results = self.results * 2 + a = FakeAdaptor() + a.params['q'] = 'something' + if not dedupe: + a.params['dedupe'] = '0' + + res = await glue.search_endpoint(napi.NominatimAPIAsync(Path('/invalid')), a) + + assert len(json.loads(res.output)) == numres + + +class TestSearchEndPointSearchAddress: + + @pytest.fixture(autouse=True) + def patch_lookup_func(self, monkeypatch): + self.results = [napi.SearchResult(napi.SourceTable.PLACEX, + ('place', 'thing'), + napi.Point(1.0, 2.0))] + async def _search(*args, **kwargs): + return napi.SearchResults(self.results) + + monkeypatch.setattr(napi.NominatimAPIAsync, 'search_address', _search) + + + @pytest.mark.asyncio + async def test_search_structured(self): + a = FakeAdaptor() + a.params['street'] = 'something' + + res = await glue.search_endpoint(napi.NominatimAPIAsync(Path('/invalid')), a) + + assert len(json.loads(res.output)) == 1 + + +class TestSearchEndPointSearchCategory: + + @pytest.fixture(autouse=True) + def patch_lookup_func(self, monkeypatch): + self.results = [napi.SearchResult(napi.SourceTable.PLACEX, + ('place', 'thing'), + napi.Point(1.0, 2.0))] + async def _search(*args, **kwargs): + return napi.SearchResults(self.results) + + monkeypatch.setattr(napi.NominatimAPIAsync, 'search_category', _search) + + + @pytest.mark.asyncio + async def test_search_category(self): + a = FakeAdaptor() + a.params['q'] = '[shop=fog]' + + res = await glue.search_endpoint(napi.NominatimAPIAsync(Path('/invalid')), a) + + assert len(json.loads(res.output)) == 1