Easily download releases from sites like Github and Gitea
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

145 lines
4.6 KiB

from __future__ import annotations
import unittest
from pathlib import Path
from typing import Any
from typing import Callable
from typing import NamedTuple
from typing import Optional
from unittest.mock import MagicMock
from unittest.mock import mock_open
from unittest.mock import patch
import requests
import release_gitter
class TestExpression(NamedTuple):
t: unittest.TestCase
args: list[Any]
kwargs: dict[str, Any]
expected: Any
exception: Optional[type[Exception]] = None
def run(self, f: Callable):
with self.t.subTest(f=f, args=self.args, kwargs=self.kwargs):
try:
result = f(*self.args, **self.kwargs)
self.t.assertIsNone(
self.exception,
f"Expected an exception of type {self.exception}, but found none",
)
self.t.assertEqual(self.expected, result)
return result
except Exception as e:
if self.exception and isinstance(e, self.exception):
return e
raise
class TestGeneral(unittest.TestCase):
def test_removesuffix(self):
for test_case in (
TestExpression(self, ["repo.git", ".git"], {}, "repo"),
TestExpression(self, ["repo", ".git"], {}, "repo"),
):
test_case.run(release_gitter.removesuffix)
class TestRemoteInfo(unittest.TestCase):
def test_parse_remote_info(self):
for test_case in (
TestExpression(
self,
["https://github.com/owner/repo"],
{},
release_gitter.GitRemoteInfo("github.com", "owner", "repo"),
None,
),
TestExpression(
self,
["git@github.com:owner/repo"],
{},
release_gitter.GitRemoteInfo("github.com", "owner", "repo"),
None,
),
TestExpression(
self,
["ssh://git@git.iamthefij.com/owner/repo"],
{},
release_gitter.GitRemoteInfo("git.iamthefij.com", "owner", "repo"),
None,
),
TestExpression(
self,
["https://git@example.com/repo"],
{},
None,
release_gitter.InvalidRemoteError,
),
):
test_case.run(release_gitter.parse_git_remote)
def test_generate_release_url(self):
for subtest in (
TestExpression(
self,
[release_gitter.GitRemoteInfo("github.com", "owner", "repo")],
{},
"https://api.github.com/repos/owner/repo/releases",
None,
),
TestExpression(
self,
[release_gitter.GitRemoteInfo("git.iamthefij.com", "owner", "repo")],
{},
"https://git.iamthefij.com/api/v1/repos/owner/repo/releases",
None,
),
TestExpression(
self,
[release_gitter.GitRemoteInfo("gitlab.com", "owner", "repo")],
{},
None,
release_gitter.InvalidRemoteError,
),
):
mock_response = MagicMock(spec=requests.Response)
mock_response.json = MagicMock()
if subtest.args[0].hostname == "git.iamthefij.com":
mock_response.json.return_value = {
"paths": {"/repos/{owner}/{repo}/releases": {}},
"basePath": "/api/v1",
}
with patch("requests.get", return_value=mock_response):
subtest.run(release_gitter.GitRemoteInfo.get_releases_url)
class TestVersionInfo(unittest.TestCase):
def test_no_cargo_file(self):
with patch("pathlib.Path.exists", return_value=False):
version = release_gitter.read_version()
self.assertIsNone(version)
@patch("pathlib.Path.exists", return_value=True)
@patch(
"pathlib.Path.open",
mock_open(read_data="\n".join(["[package]", 'version = "1.0.0"'])),
)
def test_cargo_file_has_version(self, *_):
version = release_gitter.read_version()
self.assertEqual(version, "1.0.0")
@patch("pathlib.Path.exists", return_value=True)
@patch(
"pathlib.Path.open",
mock_open(read_data="\n".join(["[package]"])),
)
def test_cargo_file_missing_version(self, *_):
with self.assertRaises(ValueError):
release_gitter.read_version()
if __name__ == "__main__":
unittest.main()