gnome-extension-download-url/tests/test_get_gnome_extension_do...

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