mirror of
https://github.com/arcan1s/ahriman.git
synced 2025-07-29 13:49:57 +00:00
* add models tests (#1) also replace single quote to double one to confort PEP docstring + move _check_output to class properties to make it available for mocking * alpm tests implementation * try to replace os with pathlib * update tests for pathlib * fix includes glob and trim version from dependencies * build_tools package tests * repository component tests * add sign tests * complete status tests * handle exceptions in actual_version calls * complete core tests * move configuration to root conftest * application tests * complete application tests * change copyright to more generic one * base web tests * complete web tests * complete testkit also add argument parsers test
This commit is contained in:
19
tests/ahriman/models/conftest.py
Normal file
19
tests/ahriman/models/conftest.py
Normal file
@ -0,0 +1,19 @@
|
||||
import pytest
|
||||
|
||||
from ahriman.models.build_status import BuildStatus, BuildStatusEnum
|
||||
from ahriman.models.package import Package
|
||||
from ahriman.models.package_desciption import PackageDescription
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def build_status_failed() -> BuildStatus:
|
||||
return BuildStatus(BuildStatusEnum.Failed, 42)
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def package_tpacpi_bat_git() -> Package:
|
||||
return Package(
|
||||
base="tpacpi-bat-git",
|
||||
version="3.1.r12.g4959b52-1",
|
||||
aur_url="https://aur.archlinux.org",
|
||||
packages={"tpacpi-bat-git": PackageDescription()})
|
38
tests/ahriman/models/test_build_status.py
Normal file
38
tests/ahriman/models/test_build_status.py
Normal file
@ -0,0 +1,38 @@
|
||||
from ahriman.models.build_status import BuildStatus, BuildStatusEnum
|
||||
|
||||
|
||||
def test_build_status_enum_badges_color() -> None:
|
||||
"""
|
||||
status color must be one of shields.io supported
|
||||
"""
|
||||
SUPPORTED_COLORS = [
|
||||
"brightgreen", "green", "yellowgreen", "yellow", "orange", "red", "blue", "lightgrey",
|
||||
"success", "important", "critical", "informational", "inactive", "blueviolet"
|
||||
]
|
||||
|
||||
for status in BuildStatusEnum:
|
||||
assert status.badges_color() in SUPPORTED_COLORS
|
||||
|
||||
|
||||
def test_build_status_init_1() -> None:
|
||||
"""
|
||||
must construct status object from None
|
||||
"""
|
||||
status = BuildStatus()
|
||||
assert status.status == BuildStatusEnum.Unknown
|
||||
assert status.timestamp > 0
|
||||
|
||||
|
||||
def test_build_status_init_2(build_status_failed: BuildStatus) -> None:
|
||||
"""
|
||||
must construct status object from objects
|
||||
"""
|
||||
status = BuildStatus(BuildStatusEnum.Failed, 42)
|
||||
assert status == build_status_failed
|
||||
|
||||
|
||||
def test_build_status_from_json_view(build_status_failed: BuildStatus) -> None:
|
||||
"""
|
||||
must construct same object from json
|
||||
"""
|
||||
assert BuildStatus.from_json(build_status_failed.view()) == build_status_failed
|
130
tests/ahriman/models/test_package.py
Normal file
130
tests/ahriman/models/test_package.py
Normal file
@ -0,0 +1,130 @@
|
||||
from pathlib import Path
|
||||
from pytest_mock import MockerFixture
|
||||
|
||||
from ahriman.models.package import Package
|
||||
from ahriman.models.repository_paths import RepositoryPaths
|
||||
|
||||
|
||||
def test_git_url(package_ahriman: Package) -> None:
|
||||
"""
|
||||
must generate valid git url
|
||||
"""
|
||||
assert package_ahriman.git_url.endswith(".git")
|
||||
assert package_ahriman.git_url.startswith(package_ahriman.aur_url)
|
||||
assert package_ahriman.base in package_ahriman.git_url
|
||||
|
||||
|
||||
def test_is_single_package_false(package_python_schedule: Package) -> None:
|
||||
"""
|
||||
python-schedule must not be single package
|
||||
"""
|
||||
assert not package_python_schedule.is_single_package
|
||||
|
||||
|
||||
def test_is_single_package_true(package_ahriman: Package) -> None:
|
||||
"""
|
||||
ahriman must be single package
|
||||
"""
|
||||
assert package_ahriman.is_single_package
|
||||
|
||||
|
||||
def test_is_vcs_false(package_ahriman: Package) -> None:
|
||||
"""
|
||||
ahriman must not be VCS package
|
||||
"""
|
||||
assert not package_ahriman.is_vcs
|
||||
|
||||
|
||||
def test_is_vcs_true(package_tpacpi_bat_git: Package) -> None:
|
||||
"""
|
||||
tpacpi-bat-git must be VCS package
|
||||
"""
|
||||
assert package_tpacpi_bat_git.is_vcs
|
||||
|
||||
|
||||
def test_web_url(package_ahriman: Package) -> None:
|
||||
"""
|
||||
must generate valid web url
|
||||
"""
|
||||
assert package_ahriman.web_url.startswith(package_ahriman.aur_url)
|
||||
assert package_ahriman.base in package_ahriman.web_url
|
||||
|
||||
|
||||
def test_from_json_view_1(package_ahriman: Package) -> None:
|
||||
"""
|
||||
must construct same object from json
|
||||
"""
|
||||
assert Package.from_json(package_ahriman.view()) == package_ahriman
|
||||
|
||||
|
||||
def test_from_json_view_2(package_python_schedule: Package) -> None:
|
||||
"""
|
||||
must construct same object from json
|
||||
"""
|
||||
assert Package.from_json(package_python_schedule.view()) == package_python_schedule
|
||||
|
||||
|
||||
def test_from_json_view_3(package_tpacpi_bat_git: Package) -> None:
|
||||
"""
|
||||
must construct same object from json
|
||||
"""
|
||||
assert Package.from_json(package_tpacpi_bat_git.view()) == package_tpacpi_bat_git
|
||||
|
||||
|
||||
def test_dependencies_with_version(mocker: MockerFixture, resource_path_root: Path) -> None:
|
||||
"""
|
||||
must load correct list of dependencies with version
|
||||
"""
|
||||
srcinfo = (resource_path_root / "models" / "package_yay_srcinfo").read_text()
|
||||
|
||||
mocker.patch("pathlib.Path.read_text", return_value=srcinfo)
|
||||
|
||||
assert Package.dependencies(Path("path")) == {"git", "go", "pacman"}
|
||||
|
||||
|
||||
def test_actual_version(package_ahriman: Package, repository_paths: RepositoryPaths) -> None:
|
||||
"""
|
||||
must return same actual_version as version is
|
||||
"""
|
||||
assert package_ahriman.actual_version(repository_paths) == package_ahriman.version
|
||||
|
||||
|
||||
def test_actual_version_vcs(package_tpacpi_bat_git: Package, repository_paths: RepositoryPaths,
|
||||
mocker: MockerFixture, resource_path_root: Path) -> None:
|
||||
"""
|
||||
must return valid actual_version for VCS package
|
||||
"""
|
||||
srcinfo = (resource_path_root / "models" / "package_tpacpi-bat-git_srcinfo").read_text()
|
||||
|
||||
mocker.patch("ahriman.models.package.Package._check_output", return_value=srcinfo)
|
||||
mocker.patch("ahriman.core.build_tools.task.Task.fetch")
|
||||
|
||||
assert package_tpacpi_bat_git.actual_version(repository_paths) == "3.1.r13.g4959b52-1"
|
||||
|
||||
|
||||
def test_actual_version_vcs_failed(package_tpacpi_bat_git: Package, repository_paths: RepositoryPaths,
|
||||
mocker: MockerFixture) -> None:
|
||||
"""
|
||||
must return same version in case if exception occurred
|
||||
"""
|
||||
mocker.patch("ahriman.models.package.Package._check_output", side_effect=Exception())
|
||||
mocker.patch("ahriman.core.build_tools.task.Task.fetch")
|
||||
|
||||
assert package_tpacpi_bat_git.actual_version(repository_paths) == package_tpacpi_bat_git.version
|
||||
|
||||
|
||||
def test_is_outdated_false(package_ahriman: Package, repository_paths: RepositoryPaths) -> None:
|
||||
"""
|
||||
must be not outdated for the same package
|
||||
"""
|
||||
assert not package_ahriman.is_outdated(package_ahriman, repository_paths)
|
||||
|
||||
|
||||
def test_is_outdated_true(package_ahriman: Package, repository_paths: RepositoryPaths) -> None:
|
||||
"""
|
||||
must be outdated for the new version
|
||||
"""
|
||||
other = Package.from_json(package_ahriman.view())
|
||||
other.version = other.version.replace("-1", "-2")
|
||||
|
||||
assert package_ahriman.is_outdated(other, repository_paths)
|
17
tests/ahriman/models/test_package_desciption.py
Normal file
17
tests/ahriman/models/test_package_desciption.py
Normal file
@ -0,0 +1,17 @@
|
||||
from ahriman.models.package_desciption import PackageDescription
|
||||
|
||||
|
||||
def test_filepath(package_description_ahriman: PackageDescription) -> None:
|
||||
"""
|
||||
must generate correct filepath if set
|
||||
"""
|
||||
assert package_description_ahriman.filepath is not None
|
||||
assert package_description_ahriman.filepath.name == package_description_ahriman.filename
|
||||
|
||||
|
||||
def test_filepath_empty(package_description_ahriman: PackageDescription) -> None:
|
||||
"""
|
||||
must return None for missing filename
|
||||
"""
|
||||
package_description_ahriman.filename = None
|
||||
assert package_description_ahriman.filepath is None
|
20
tests/ahriman/models/test_report_settings.py
Normal file
20
tests/ahriman/models/test_report_settings.py
Normal file
@ -0,0 +1,20 @@
|
||||
import pytest
|
||||
|
||||
from ahriman.core.exceptions import InvalidOption
|
||||
from ahriman.models.report_settings import ReportSettings
|
||||
|
||||
|
||||
def test_from_option_invalid() -> None:
|
||||
"""
|
||||
must raise exception on invalid option
|
||||
"""
|
||||
with pytest.raises(InvalidOption, match=".* `invalid`$"):
|
||||
ReportSettings.from_option("invalid")
|
||||
|
||||
|
||||
def test_from_option_valid() -> None:
|
||||
"""
|
||||
must return value from valid options
|
||||
"""
|
||||
assert ReportSettings.from_option("html") == ReportSettings.HTML
|
||||
assert ReportSettings.from_option("HTML") == ReportSettings.HTML
|
23
tests/ahriman/models/test_repository_paths.py
Normal file
23
tests/ahriman/models/test_repository_paths.py
Normal file
@ -0,0 +1,23 @@
|
||||
from pytest_mock import MockerFixture
|
||||
from unittest import mock
|
||||
|
||||
from ahriman.models.repository_paths import RepositoryPaths
|
||||
|
||||
|
||||
def test_create_tree(repository_paths: RepositoryPaths, mocker: MockerFixture) -> None:
|
||||
"""
|
||||
must create whole tree
|
||||
"""
|
||||
paths = {
|
||||
prop
|
||||
for prop in dir(repository_paths)
|
||||
if not prop.startswith("_") and prop not in ("architecture", "create_tree", "root")
|
||||
}
|
||||
mkdir_mock = mocker.patch("pathlib.Path.mkdir")
|
||||
|
||||
repository_paths.create_tree()
|
||||
mkdir_mock.assert_has_calls(
|
||||
[
|
||||
mock.call(mode=0o755, parents=True, exist_ok=True)
|
||||
for _ in paths
|
||||
])
|
26
tests/ahriman/models/test_sign_settings.py
Normal file
26
tests/ahriman/models/test_sign_settings.py
Normal file
@ -0,0 +1,26 @@
|
||||
import pytest
|
||||
|
||||
from ahriman.core.exceptions import InvalidOption
|
||||
from ahriman.models.sign_settings import SignSettings
|
||||
|
||||
|
||||
def test_from_option_invalid() -> None:
|
||||
"""
|
||||
must raise exception on invalid option
|
||||
"""
|
||||
with pytest.raises(InvalidOption, match=".* `invalid`$"):
|
||||
SignSettings.from_option("invalid")
|
||||
|
||||
|
||||
def test_from_option_valid() -> None:
|
||||
"""
|
||||
must return value from valid options
|
||||
"""
|
||||
assert SignSettings.from_option("package") == SignSettings.SignPackages
|
||||
assert SignSettings.from_option("PACKAGE") == SignSettings.SignPackages
|
||||
assert SignSettings.from_option("packages") == SignSettings.SignPackages
|
||||
assert SignSettings.from_option("sign-package") == SignSettings.SignPackages
|
||||
|
||||
assert SignSettings.from_option("repository") == SignSettings.SignRepository
|
||||
assert SignSettings.from_option("REPOSITORY") == SignSettings.SignRepository
|
||||
assert SignSettings.from_option("sign-repository") == SignSettings.SignRepository
|
23
tests/ahriman/models/test_upload_settings.py
Normal file
23
tests/ahriman/models/test_upload_settings.py
Normal file
@ -0,0 +1,23 @@
|
||||
import pytest
|
||||
|
||||
from ahriman.core.exceptions import InvalidOption
|
||||
from ahriman.models.upload_settings import UploadSettings
|
||||
|
||||
|
||||
def test_from_option_invalid() -> None:
|
||||
"""
|
||||
must raise exception on invalid option
|
||||
"""
|
||||
with pytest.raises(InvalidOption, match=".* `invalid`$"):
|
||||
UploadSettings.from_option("invalid")
|
||||
|
||||
|
||||
def test_from_option_valid() -> None:
|
||||
"""
|
||||
must return value from valid options
|
||||
"""
|
||||
assert UploadSettings.from_option("rsync") == UploadSettings.Rsync
|
||||
assert UploadSettings.from_option("RSYNC") == UploadSettings.Rsync
|
||||
|
||||
assert UploadSettings.from_option("s3") == UploadSettings.S3
|
||||
assert UploadSettings.from_option("S3") == UploadSettings.S3
|
Reference in New Issue
Block a user