diff --git a/swh/web/api/utils.py b/swh/web/api/utils.py --- a/swh/web/api/utils.py +++ b/swh/web/api/utils.py @@ -1,9 +1,9 @@ -# Copyright (C) 2015-2019 The Software Heritage developers +# Copyright (C) 2015-2020 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU Affero General Public License version 3, or any later version # See top-level LICENSE file for more information -from typing import Any, Dict, Optional +from typing import Any, Dict, List, Optional, Tuple from django.http import HttpRequest @@ -296,6 +296,23 @@ return origin +def enrich_origin_search_result( + origin_search_result: Tuple[List[Dict[str, Any]], Optional[str]], + request: Optional[HttpRequest] = None, +) -> Tuple[List[Dict[str, Any]], Optional[str]]: + """Enrich origin search result with additional links + + Args: + origin_search_result: tuple returned when searching origins + request: Absolute URIs will be generated if provided + + Returns: + An enriched origin search result filled with additional urls + """ + origins, page_token = origin_search_result + return [enrich_origin(origin, request=request) for origin in origins], page_token + + def enrich_origin_visit( origin_visit: Dict[str, Any], *, diff --git a/swh/web/api/views/origin.py b/swh/web/api/views/origin.py --- a/swh/web/api/views/origin.py +++ b/swh/web/api/views/origin.py @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2019 The Software Heritage developers +# Copyright (C) 2015-2020 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU Affero General Public License version 3, or any later version # See top-level LICENSE file for more information @@ -8,7 +8,11 @@ from swh.web.api.apidoc import api_doc, format_docstring from swh.web.api.apiurls import api_route -from swh.web.api.utils import enrich_origin, enrich_origin_visit +from swh.web.api.utils import ( + enrich_origin, + enrich_origin_search_result, + enrich_origin_visit, +) from swh.web.api.views.utils import api_lookup from swh.web.common import archive from swh.web.common.exc import BadInputExc @@ -193,7 +197,7 @@ limit, bool(strtobool(with_visit)), page_token, - enrich_fn=enrich_origin, + enrich_fn=enrich_origin_search_result, request=request, ) diff --git a/swh/web/tests/api/test_utils.py b/swh/web/tests/api/test_utils.py --- a/swh/web/tests/api/test_utils.py +++ b/swh/web/tests/api/test_utils.py @@ -1,4 +1,4 @@ -# Copyright (C) 2015-2019 The Software Heritage developers +# Copyright (C) 2015-2020 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU Affero General Public License version 3, or any later version # See top-level LICENSE file for more information @@ -549,7 +549,7 @@ @given(origin()) -def test_enrich_origin(api_request_factory, archive_data, origin): +def test_enrich_origin(api_request_factory, origin): url = reverse("api-1-origin", url_args={"origin_url": origin["url"]}) request = api_request_factory.get(url) @@ -564,7 +564,32 @@ @given(origin()) -def test_enrich_origin_visit(api_request_factory, archive_data, origin): +def test_enrich_origin_search_result(api_request_factory, origin): + url = reverse("api-1-origin-search", url_args={"url_pattern": origin["url"]}) + request = api_request_factory.get(url) + + origin_visits_url = reverse( + "api-1-origin-visits", url_args={"origin_url": origin["url"]}, request=request + ) + + origin_search_result_data = ( + [{"url": origin["url"]}], + None, + ) + + enriched_origin_search_result = ( + [{"url": origin["url"], "origin_visits_url": origin_visits_url}], + None, + ) + + assert ( + utils.enrich_origin_search_result(origin_search_result_data, request=request) + == enriched_origin_search_result + ) + + +@given(origin()) +def test_enrich_origin_visit(api_request_factory, origin): origin_visit = random.choice(get_origin_visits(origin)) diff --git a/swh/web/tests/api/views/test_origin.py b/swh/web/tests/api/views/test_origin.py --- a/swh/web/tests/api/views/test_origin.py +++ b/swh/web/tests/api/views/test_origin.py @@ -436,6 +436,10 @@ rv = check_api_get_responses(api_client, url, status_code=200) assert len(rv.data) == 1 assert {origin["url"] for origin in rv.data} <= expected_origins + assert rv.data == [ + enrich_origin({"url": origin["url"]}, request=rv.wsgi_request) + for origin in rv.data + ] # Search for 'github.com', get all url = reverse( @@ -445,6 +449,10 @@ ) rv = check_api_get_responses(api_client, url, status_code=200) assert {origin["url"] for origin in rv.data} == expected_origins + assert rv.data == [ + enrich_origin({"url": origin["url"]}, request=rv.wsgi_request) + for origin in rv.data + ] # Search for 'github.com', get more than available url = reverse( @@ -454,6 +462,10 @@ ) rv = check_api_get_responses(api_client, url, status_code=200) assert {origin["url"] for origin in rv.data} == expected_origins + assert rv.data == [ + enrich_origin({"url": origin["url"]}, request=rv.wsgi_request) + for origin in rv.data + ] @pytest.mark.parametrize("backend", ["swh-search", "swh-storage"])