rust2rpm/test.py
Igor Raits ea59cb27d1 Always require upper-bound dependency with ~ sign
Proper fix is quite complex and given we do not package pre-release
versions very often (and esp. not multiple versions of them), this is
good enough (not nice though).

Signed-off-by: Igor Raits <igor.raits@gmail.com>

Fixes https://pagure.io/fedora-rust/rust2rpm/issue/70.
2021-11-22 13:46:56 +01:00

253 lines
11 KiB
Python

import pytest
import rust2rpm
from rust2rpm.metadata import Version
@pytest.mark.parametrize("req, rpmdep", [
("^1.2.3",
"(crate(test) >= 1.2.3 with crate(test) < 2.0.0~)"),
("^1.2",
"(crate(test) >= 1.2.0 with crate(test) < 2.0.0~)"),
("^1",
"(crate(test) >= 1.0.0 with crate(test) < 2.0.0~)"),
("^0.2.3",
"(crate(test) >= 0.2.3 with crate(test) < 0.3.0~)"),
("^0.2",
"(crate(test) >= 0.2.0 with crate(test) < 0.3.0~)"),
("^0.0.3",
"(crate(test) >= 0.0.3 with crate(test) < 0.0.4~)"),
("^0.0",
"(crate(test) >= 0.0.0 with crate(test) < 0.1.0~)"),
("^0",
"(crate(test) >= 0.0.0 with crate(test) < 1.0.0~)"),
("~1.2.3",
"(crate(test) >= 1.2.3 with crate(test) < 1.3.0~)"),
("~1.2",
"(crate(test) >= 1.2.0 with crate(test) < 1.3.0~)"),
("~1",
"(crate(test) >= 1.0.0 with crate(test) < 2.0.0~)"),
("*",
"crate(test) >= 0.0.0"),
("1.*",
"(crate(test) >= 1.0.0 with crate(test) < 2.0.0~)"),
("1.2.*",
"(crate(test) >= 1.2.0 with crate(test) < 1.3.0~)"),
("1.*.*",
"(crate(test) >= 1.0.0 with crate(test) < 2.0.0~)"),
(">= 1.2.0",
"crate(test) >= 1.2.0"),
("> 1",
"crate(test) > 1.0.0"),
("< 2",
"crate(test) < 2.0.0~"),
("= 1.2.3",
"crate(test) = 1.2.3"),
(">= 1.2, < 1.5",
"(crate(test) >= 1.2.0 with crate(test) < 1.5.0~)"),
("^1.0.0-alpha.6",
"(crate(test) >= 1.0.0~alpha.6 with crate(test) < 2.0.0~)"),
("^0.1.0-alpha.6",
"(crate(test) >= 0.1.0~alpha.6 with crate(test) < 0.2.0~)"),
("^0.0.1-alpha.6",
"(crate(test) >= 0.0.1~alpha.6 with crate(test) < 0.0.2~)"),
("^0.0.0-alpha.6",
"(crate(test) >= 0.0.0~alpha.6 with crate(test) < 0.0.1~)"),
])
def test_dependency(req, rpmdep):
dep = rust2rpm.Dependency("test", req)
assert str(dep) == rpmdep
@pytest.mark.parametrize('version, parsed_version', [
('', (None, None, None, None, None)),
('0', (0, None, None, None, None)),
('1.0', (1, 0, None, None, None)),
('2.1.0', (2, 1, 0, None, None)),
('2.1.0+build1', (2, 1, 0, None, 'build1')),
('2.1.0-alpha1', (2, 1, 0, 'alpha1', None)),
('2.1.0-alpha1+build1', (2, 1, 0, 'alpha1', 'build1')),
])
def test_parse_version(version, parsed_version):
result = rust2rpm.metadata.CargoSemVer.parse_version(version)
assert result == parsed_version
@pytest.mark.parametrize('parsed_version, version', [
(Version(0, None, None, None, None), '0.0.0'),
(Version(1, 0, None, None, None), '1.0.0'),
(Version(2, 1, 0, None, None), '2.1.0'),
(Version(2, 1, 0, None, 'build1'), '2.1.0+build1'),
(Version(2, 1, 0, None, 'snapshot-preview-build1'), '2.1.0+snapshot_preview_build1'),
(Version(2, 1, 0, 'alpha1', None), '2.1.0-alpha1'),
(Version(2, 1, 0, 'snapshot-preview-alpha1', None), '2.1.0-snapshot_preview_alpha1'),
(Version(2, 1, 0, 'alpha1', 'build1'), '2.1.0-alpha1+build1'),
(Version(2, 1, 0, 'snapshot-preview-alpha1', 'snapshot-preview-build1'), '2.1.0-snapshot_preview_alpha1+snapshot_preview_build1'),
])
def test_unparse_version(parsed_version, version):
result = rust2rpm.metadata.CargoSemVer.unparse_version(parsed_version)
assert result == version
@pytest.mark.parametrize('parsed_version, version', [
(Version(2, 1, 0, None, None), '2.1.0'),
(Version(2, 1, 0, None, 'build1'), '2.1.0+build1'),
(Version(2, 1, 0, None, 'snapshot-preview-build1'), '2.1.0+snapshot_preview_build1'),
(Version(2, 1, 0, 'alpha1', None), '2.1.0~alpha1'),
(Version(2, 1, 0, 'snapshot-preview-alpha1', None), '2.1.0~snapshot_preview_alpha1'),
(Version(2, 1, 0, 'alpha1', 'build1'), '2.1.0~alpha1+build1'),
(Version(2, 1, 0, 'snapshot-preview-alpha1', 'snapshot-preview-build1'), '2.1.0~snapshot_preview_alpha1+snapshot_preview_build1'),
])
def test_unparse_version_sep(parsed_version, version):
result = rust2rpm.metadata.CargoSemVer.unparse_version(
parsed_version, sep='~')
assert result == version
@pytest.mark.parametrize('requirement, parsed_requirement', [
('*', ('*', (None, None, None, None, None))),
('0.*', ('*', (0, None, None, None, None))),
('0.1.*', ('*', (0, 1, None, None, None))),
('0.*.*', ('*', (0, None, None, None, None))),
('<0', ('<', (0, None, None, None, None))),
('<0.1', ('<', (0, 1, None, None, None))),
('<0.1.2', ('<', (0, 1, 2, None, None))),
('<0.1.2-alpha1', ('<', (0, 1, 2, 'alpha1', None))),
('<=0.1.2', ('<=', (0, 1, 2, None, None))),
('=0.1.2', ('=', (0, 1, 2, None, None))),
('==0.1.2', ('==', (0, 1, 2, None, None))),
('>=0.1.2', ('>=', (0, 1, 2, None, None))),
('>0.1.2', ('>', (0, 1, 2, None, None))),
('0.1.2', ('', (0, 1, 2, None, None))),
('!=0.1.2', ('!=', (0, 1, 2, None, None))),
('^0.1.2', ('^', (0, 1, 2, None, None))),
('~0.1.2', ('~', (0, 1, 2, None, None))),
('~=0.1.2', ('~=', (0, 1, 2, None, None))),
])
def test_parse(requirement, parsed_requirement):
result = rust2rpm.metadata.CargoSemVer.parse(requirement)
assert result == parsed_requirement
@pytest.mark.parametrize('version, coerced_version', [
(Version(0, None, None, None, None),
(0, 0, 0, None, None)),
(Version(1, 0, None, None, None),
(1, 0, 0, None, None)),
(Version(2, 1, 0, None, None),
(2, 1, 0, None, None)),
(Version(2, 1, 0, None, 'build1'),
(2, 1, 0, None, 'build1')),
(Version(2, 1, 0, 'alpha1', None),
(2, 1, 0, 'alpha1', None)),
(Version(2, 1, 0, 'alpha1', 'build1'),
(2, 1, 0, 'alpha1', 'build1')),
])
def test_coerce(version, coerced_version):
result = rust2rpm.metadata.CargoSemVer.coerce(version)
assert result == coerced_version
@pytest.mark.parametrize('version, next_version', [
((0, None, None, None, None), (1, 0, 0, None, None)),
((1, 0, None, None, None), (2, 0, 0, None, None)),
((2, 1, 0, None, None), (3, 0, 0, None, None)),
((2, 0, 0, None, 'build1'), (3, 0, 0, None, None)),
((2, None, None, 'alpha1', None), (2, 0, 0, None, None)),
((2, 0, None, 'alpha1', None), (2, 0, 0, None, None)),
((2, 0, 0, 'alpha1', None), (2, 0, 0, None, None)),
((2, 1, None, 'alpha1', None), (3, 0, 0, None, None)),
((2, 1, 0, 'alpha1', None), (3, 0, 0, None, None)),
((2, 1, 1, 'alpha1', None), (3, 0, 0, None, None)),
((2, 0, 1, 'alpha1', 'build1'), (3, 0, 0, None, None)),
])
def test_next_major(version, next_version):
result = rust2rpm.metadata.CargoSemVer.next_major(version)
assert result == next_version
@pytest.mark.parametrize('version, next_version', [
((0, None, None, None, None), (0, 1, 0, None, None)),
((1, 0, None, None, None), (1, 1, 0, None, None)),
((2, 1, 0, None, None), (2, 2, 0, None, None)),
((2, 1, 0, None, 'build1'), (2, 2, 0, None, None)),
((2, None, None, 'alpha1', None), (2, 0, 0, None, None)),
((2, 0, None, 'alpha1', None), (2, 0, 0, None, None)),
((2, 0, 0, 'alpha1', None), (2, 0, 0, None, None)),
((2, 1, None, 'alpha1', None), (2, 1, 0, None, None)),
((2, 1, 0, 'alpha1', None), (2, 1, 0, None, None)),
((2, 1, 1, 'alpha1', None), (2, 2, 0, None, None)),
((2, 1, 0, 'alpha1', 'build1'), (2, 1, 0, None, None)),
])
def test_next_minor(version, next_version):
result = rust2rpm.metadata.CargoSemVer.next_minor(version)
assert result == next_version
@pytest.mark.parametrize('version, next_version', [
((0, None, None, None, None), (0, 0, 1, None, None)),
((1, 0, None, None, None), (1, 0, 1, None, None)),
((2, 1, 0, None, None), (2, 1, 1, None, None)),
((2, 1, 0, None, 'build1'), (2, 1, 1, None, None)),
((2, None, None, 'alpha1', None), (2, 0, 0, None, None)),
((2, 0, None, 'alpha1', None), (2, 0, 0, None, None)),
((2, 0, 0, 'alpha1', None), (2, 0, 0, None, None)),
((2, 1, None, 'alpha1', None), (2, 1, 0, None, None)),
((2, 1, 0, 'alpha1', None), (2, 1, 0, None, None)),
((2, 1, 1, 'alpha1', None), (2, 1, 1, None, None)),
((2, 1, 0, 'alpha1', 'build1'), (2, 1, 0, None, None)),
])
def test_next_patch(version, next_version):
result = rust2rpm.metadata.CargoSemVer.next_patch(version)
assert result == next_version
@pytest.mark.parametrize("requirement, normalized_requirement", [
(('^', Version(1, 2, 3, None, None)),
[('>=', (1, 2, 3, None, None)), ('<', (2, 0, 0, None, None))]),
(('^', Version(1, 2, None, None, None)),
[('>=', (1, 2, 0, None, None)), ('<', (2, 0, 0, None, None))]),
(('^', Version(1, None, None, None, None)),
[('>=', (1, 0, 0, None, None)), ('<', (2, 0, 0, None, None))]),
(('^', Version(0, 2, 3, None, None)),
[('>=', (0, 2, 3, None, None)), ('<', (0, 3, 0, None, None))]),
(('^', Version(0, 2, None, None, None)),
[('>=', (0, 2, 0, None, None)), ('<', (0, 3, 0, None, None))]),
(('^', Version(0, 0, 3, None, None)),
[('>=', (0, 0, 3, None, None)), ('<', (0, 0, 4, None, None))]),
(('^', Version(0, 0, None, None, None)),
[('>=', (0, 0, 0, None, None)), ('<', (0, 1, 0, None, None))]),
(('^', Version(0, None, None, None, None)),
[('>=', (0, 0, 0, None, None)), ('<', (1, 0, 0, None, None))]),
(('~', Version(1, 2, 3, None, None)),
[('>=', (1, 2, 3, None, None)), ('<', (1, 3, 0, None, None))]),
(('~', Version(1, 2, None, None, None)),
[('>=', (1, 2, 0, None, None)), ('<', (1, 3, 0, None, None))]),
(('~', Version(1, None, None, None, None)),
[('>=', (1, 0, 0, None, None)), ('<', (2, 0, 0, None, None))]),
(('*', Version(None, None, None, None, None)),
[('>=', (0, 0, 0, None, None))]),
(('*', Version(1, None, None, None, None)),
[('>=', (1, 0, 0, None, None)), ('<', (2, 0, 0, None, None))]),
(('*', Version(1, 2, None, None, None)),
[('>=', (1, 2, 0, None, None)), ('<', (1, 3, 0, None, None))]),
(('>=', Version(1, 2, 0, None, None)),
[('>=', (1, 2, 0, None, None))]),
(('>', Version(1, None, None, None, None)),
[('>', (1, 0, 0, None, None))]),
(('<', Version(2, None, None, None, None)),
[('<', (2, 0, 0, None, None))]),
(('=', Version(1, 2, 3, None, None)),
[('=', (1, 2, 3, None, None))]),
(('^', Version(1, 0, 0, 'alpha.6', None)),
[('>=', (1, 0, 0, 'alpha.6', None)), ('<', (2, 0, 0, None, None))]),
(('^', Version(0, 1, 0, 'alpha.6', None)),
[('>=', (0, 1, 0, 'alpha.6', None)), ('<', (0, 2, 0, None, None))]),
(('^', Version(0, 0, 1, 'alpha.6', None)),
[('>=', (0, 0, 1, 'alpha.6', None)), ('<', (0, 0, 2, None, None))]),
(('^', Version(0, 0, 0, 'alpha.6', None)),
[('>=', (0, 0, 0, 'alpha.6', None)), ('<', (0, 0, 1, None, None))]),
])
def test_normalize(requirement, normalized_requirement):
result = rust2rpm.metadata.CargoSemVer.normalize(requirement)
assert result == normalized_requirement