141 lines
3.7 KiB
Python
141 lines
3.7 KiB
Python
from __future__ import annotations
|
|
|
|
import json
|
|
import os
|
|
import subprocess
|
|
from pathlib import Path
|
|
from typing import Any
|
|
|
|
import pytest
|
|
|
|
import jprm
|
|
|
|
TEST_DATA_DIR = Path(os.path.dirname(os.path.realpath(__file__))) / 'data'
|
|
|
|
# datafiles is from pytest-datafiles
|
|
datafiles = pytest.mark.datafiles(
|
|
TEST_DATA_DIR / 'jprm.yaml',
|
|
TEST_DATA_DIR / 'jprm.json',
|
|
)
|
|
|
|
|
|
def json_load(path: Path, **kwargs: Any) -> Any:
|
|
with open(path, encoding='utf8') as handle:
|
|
return json.load(handle, **kwargs)
|
|
|
|
|
|
@datafiles # type: ignore[untyped-decorator]
|
|
def test_load_manifest(datafiles: Path) -> None:
|
|
assert jprm.load_build_config(datafiles / 'jprm.yaml') == json_load(datafiles / 'jprm.json')
|
|
|
|
|
|
@datafiles # type: ignore[untyped-decorator]
|
|
def test_get_config(datafiles: Path) -> None:
|
|
assert jprm.get_config(datafiles) == json_load(datafiles / 'jprm.json')
|
|
|
|
|
|
@datafiles # type: ignore[untyped-decorator]
|
|
def test_get_config_old(datafiles: Path) -> None:
|
|
(datafiles / 'jprm.yaml').replace(datafiles / 'build.yaml')
|
|
assert jprm.get_config(datafiles) == json_load(datafiles / 'jprm.json')
|
|
|
|
|
|
def test_invalid_manifest(tmp_path: Path) -> None:
|
|
with open(tmp_path / 'jprm.yaml', 'w', encoding='utf8') as fh:
|
|
fh.write(']]]')
|
|
assert jprm.get_config(tmp_path) is None
|
|
|
|
|
|
def test_no_manifest(tmp_path: Path) -> None:
|
|
assert jprm.get_config(tmp_path) is None
|
|
|
|
|
|
def test_version() -> None:
|
|
ver = jprm.Version('1.2.3.0')
|
|
assert ver.major == 1
|
|
assert ver.minor == 2
|
|
assert ver.build == 3
|
|
assert ver.revision == 0
|
|
assert str(ver) == '1.2.3.0'
|
|
assert ver.values() == (1, 2, 3, 0)
|
|
assert ver.keys() == ('major', 'minor', 'build', 'revision')
|
|
assert dict(ver.items()) == {'major': 1, 'minor': 2, 'build': 3, 'revision': 0}
|
|
assert 'major' in ver
|
|
assert len(ver) == 4
|
|
|
|
del ver['revision']
|
|
assert str(ver) == '1.2.3'
|
|
ver.major = 2
|
|
assert str(ver) == '2.2.3'
|
|
ver.minor = 0
|
|
assert str(ver) == '2.0.3'
|
|
ver.build = None
|
|
assert str(ver) == '2.0'
|
|
|
|
ver['major'] = 3
|
|
assert str(ver) == '3.0'
|
|
|
|
ver['minor'] = None
|
|
assert str(ver) == '3'
|
|
|
|
assert ver == jprm.Version(ver)
|
|
|
|
assert repr(ver) == "<Version('3')>"
|
|
assert [x for x in ver] == [3, None, None, None]
|
|
|
|
assert ver.get('foo', False) is False
|
|
assert ver.get('minor', False) is None
|
|
assert ver.get('major', False) == 3
|
|
|
|
assert ver == jprm.Version(3)
|
|
|
|
with pytest.raises(ValueError):
|
|
jprm.Version('1.2.3-beta.2')
|
|
|
|
with pytest.raises(TypeError):
|
|
jprm.Version(3.5)
|
|
|
|
with pytest.raises(KeyError):
|
|
print(ver['__len__'])
|
|
|
|
assert ver.full() == '3.0.0.0'
|
|
|
|
|
|
def test_find_git(tmp_path: Path) -> None:
|
|
subprocess.check_call(
|
|
('git', 'init', 'subpath'),
|
|
cwd=tmp_path,
|
|
)
|
|
repo_path = tmp_path / 'subpath'
|
|
subpath = repo_path / 'something/else'
|
|
subpath.mkdir(parents=True)
|
|
|
|
found = jprm.find_git(repo_path)
|
|
assert found == repo_path
|
|
|
|
found = jprm.find_git(subpath)
|
|
assert found == repo_path
|
|
|
|
found = jprm.find_git(tmp_path)
|
|
assert found == repo_path
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
'origin,expected',
|
|
(
|
|
('https://example.com/owner/project.git', ('example.com', 'owner', 'project')),
|
|
('https://example.com/owner/project', ('example.com', 'owner', 'project')),
|
|
),
|
|
) # type: ignore[untyped-decorator]
|
|
def test_get_repo_owner(tmp_path: Path, origin: str, expected: tuple[str, str, str]) -> None:
|
|
subprocess.check_call(
|
|
('git', 'init', '.'),
|
|
cwd=tmp_path,
|
|
)
|
|
subprocess.check_call(
|
|
('git', 'remote', 'add', 'origin', origin),
|
|
cwd=tmp_path,
|
|
)
|
|
found = jprm.get_repo_owner(tmp_path)
|
|
assert found == expected
|