123 lines
4.9 KiB
Python
123 lines
4.9 KiB
Python
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
|