import json import re from urllib.parse import urlparse, parse_qs import pytest import requests from src.gnome_extension_download_url.__main__ import \ get_gnome_extension_download_url from tests.fixtures.version_request_values import \ values as version_request_values class MockResponse: def __init__(self, *args): self.status_code = 200 self.url = args[0] self._path = urlparse(self.url).path self._query = urlparse(self.url).query self._extension_version = self._get_extension_version_from_path() def json(self): if not self.url: raise Exception("URL not set yet in MockResponse object.") # If a specific extension version is requested if self._extension_version: version = [v for v in version_request_values if v["version"] == int(self._extension_version)] if len(version) > 0: assert len(version) == 1 return version[0] # If version not found else: self.status_code = 404 return { "detail": "No ExtensionVersion matches the given query."} # If no specific version is requested, return paginated results with open( f"tests/fixtures/request_values_{self._get_page_parameter()}.json", "r") as f: return json.loads(f.read()) def _get_page_parameter(self): query = urlparse(self.url).query params = parse_qs(query) return int(params.get("page", [1])[0]) def _get_extension_version_from_path(self): version_expression = r"^.+/versions/(\d[\d\.]*)$" match = re.match(version_expression, self._path) return match.group(1) if match else None @pytest.mark.parametrize("ext_uuid, ext_ver, gnome_shell_ver, exception_msg", [ ("", None, None, "Extension UUID cannot be empty"), ("extension-uuid", "invalid-version", None, "Invalid GNOME extension version: invalid-version"), ("extension-uuid", None, "invalid-version", "Invalid GNOME shell version: invalid-version"), ("extension-uuid", "66", "invalid-version", "Invalid GNOME shell version: invalid-version"), ("extension-uuid", "invalid-version", "3.38", "Invalid GNOME extension version: invalid-version"), ("extension-uuid", "-1", None, "Invalid GNOME extension version: -1"), ]) def test_get_gnome_extension_download_url_invalid_args( ext_uuid, ext_ver, gnome_shell_ver, exception_msg, mocker): mock_requests_get = mocker.patch("requests.get") try: get_gnome_extension_download_url( ext_uuid, ext_ver, gnome_shell_ver) except Exception as e: assert str(e.__str__()) == exception_msg mock_requests_get.assert_not_called() @pytest.mark.parametrize("ext_ver, gnome_shell_ver, expected_url", [ (None, None, "https://extensions.gnome.org/api/v1/extensions/gsconnect@andyholmes.github.io/versions/66/?format=zip"), ("latest", None, "https://extensions.gnome.org/api/v1/extensions/gsconnect@andyholmes.github.io/versions/66/?format=zip"), (None, "latest", "https://extensions.gnome.org/api/v1/extensions/gsconnect@andyholmes.github.io/versions/66/?format=zip"), ("latest", "latest", "https://extensions.gnome.org/api/v1/extensions/gsconnect@andyholmes.github.io/versions/66/?format=zip"), ("43", None, "https://extensions.gnome.org/api/v1/extensions/gsconnect@andyholmes.github.io/versions/43/?format=zip"), ("43", "3.38", "https://extensions.gnome.org/api/v1/extensions/gsconnect@andyholmes.github.io/versions/43/?format=zip"), ("latest", "3.36", "https://extensions.gnome.org/api/v1/extensions/gsconnect@andyholmes.github.io/versions/53/?format=zip"), ("latest", "43", "https://extensions.gnome.org/api/v1/extensions/gsconnect@andyholmes.github.io/versions/64/?format=zip"), ]) def test_get_gnome_extension_download_url_valid_versions( ext_ver, gnome_shell_ver, expected_url, monkeypatch): monkeypatch.setattr(requests, "get", MockResponse) download_url = get_gnome_extension_download_url( "gsconnect@andyholmes.github.io", ext_ver, gnome_shell_ver) assert download_url == expected_url @pytest.mark.parametrize("ext_ver, gnome_shell_ver, expected_result", [ (0, None, "Extension 'gsconnect@andyholmes.github.io' version 0 not found"), ("66", "0", "Extension version 66 is not compatible with GNOME shell version 0"), ("latest", "0", "No compatible version found for GNOME shell version 0"), ]) def test_get_gnome_extension_download_url_invalid_versions( ext_ver, gnome_shell_ver, expected_result, monkeypatch): monkeypatch.setattr(requests, "get", MockResponse) try: get_gnome_extension_download_url( "gsconnect@andyholmes.github.io", ext_ver, gnome_shell_ver) except Exception as e: assert str(e) == expected_result