From 72be074a795e4ab57f9aaa1c75daf7b938c2f16d Mon Sep 17 00:00:00 2001 From: "Antoine R. Dumont (@ardumont)" Date: Wed, 27 Jan 2021 18:02:08 +0100 Subject: [PATCH] gitlab: Deal with missing or trailing / in url input --- swh/lister/gitlab/lister.py | 7 +++++-- swh/lister/gitlab/tests/test_lister.py | 10 ++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/swh/lister/gitlab/lister.py b/swh/lister/gitlab/lister.py index 0014f7a..2528e25 100644 --- a/swh/lister/gitlab/lister.py +++ b/swh/lister/gitlab/lister.py @@ -106,7 +106,10 @@ class GitLabLister(Lister[GitLabListerState, PageResult]): if instance is None: instance = parse_url(url).host super().__init__( - scheduler=scheduler, url=url, instance=instance, credentials=credentials, + scheduler=scheduler, + url=url.rstrip("/"), + instance=instance, + credentials=credentials, ) self.incremental = incremental self.last_page: Optional[str] = None @@ -161,7 +164,7 @@ class GitLabLister(Lister[GitLabListerState, PageResult]): } if id_after is not None: parameters["id_after"] = str(id_after) - return f"{self.url}projects?{urlencode(parameters)}" + return f"{self.url}/projects?{urlencode(parameters)}" def get_pages(self) -> Iterator[PageResult]: next_page: Optional[str] diff --git a/swh/lister/gitlab/tests/test_lister.py b/swh/lister/gitlab/tests/test_lister.py index 2fe722c..2a381ae 100644 --- a/swh/lister/gitlab/tests/test_lister.py +++ b/swh/lister/gitlab/tests/test_lister.py @@ -216,6 +216,16 @@ def test_lister_gitlab_credentials(swh_scheduler): assert lister.session.headers["Authorization"] == "Bearer api-token" +@pytest.mark.parametrize("url", [api_url("gitlab").rstrip("/"), api_url("gitlab"),]) +def test_lister_gitlab_url_computation(url, swh_scheduler): + lister = GitLabLister(scheduler=swh_scheduler, url=url) + assert not lister.url.endswith("/") + + page_url = lister.page_url() + # ensure the generated url contains the separated / + assert page_url.startswith(f"{lister.url}/projects") + + @pytest.mark.parametrize( "url,expected_result", [