108 lines
3.3 KiB
Python
108 lines
3.3 KiB
Python
|
|
"""Tests for the SemVer comparison module."""
|
||
|
|
|
||
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
import pytest
|
||
|
|
|
||
|
|
from app.plugins.semver import (
|
||
|
|
SemVer,
|
||
|
|
compare_versions,
|
||
|
|
is_breaking_change,
|
||
|
|
is_compatible,
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
class TestSemVerParse:
|
||
|
|
def test_parse_simple(self):
|
||
|
|
v = SemVer.parse("1.2.3")
|
||
|
|
assert v.major == 1
|
||
|
|
assert v.minor == 2
|
||
|
|
assert v.patch == 3
|
||
|
|
assert v.prerelease == ""
|
||
|
|
|
||
|
|
def test_parse_with_prerelease(self):
|
||
|
|
v = SemVer.parse("1.0.0-alpha.1")
|
||
|
|
assert v.major == 1
|
||
|
|
assert v.minor == 0
|
||
|
|
assert v.patch == 0
|
||
|
|
assert v.prerelease == "alpha.1"
|
||
|
|
|
||
|
|
def test_parse_with_v_prefix(self):
|
||
|
|
v = SemVer.parse("v2.0.0")
|
||
|
|
assert v.major == 2
|
||
|
|
|
||
|
|
def test_parse_invalid(self):
|
||
|
|
with pytest.raises(ValueError):
|
||
|
|
SemVer.parse("not-a-version")
|
||
|
|
|
||
|
|
def test_parse_empty(self):
|
||
|
|
with pytest.raises(ValueError):
|
||
|
|
SemVer.parse("")
|
||
|
|
|
||
|
|
def test_parse_two_parts(self):
|
||
|
|
with pytest.raises(ValueError):
|
||
|
|
SemVer.parse("1.2")
|
||
|
|
|
||
|
|
def test_parse_four_parts(self):
|
||
|
|
with pytest.raises(ValueError):
|
||
|
|
SemVer.parse("1.2.3.4")
|
||
|
|
|
||
|
|
|
||
|
|
class TestSemVerComparison:
|
||
|
|
def test_equal(self):
|
||
|
|
assert SemVer.parse("1.0.0") == SemVer.parse("1.0.0")
|
||
|
|
|
||
|
|
def test_less_than(self):
|
||
|
|
assert SemVer.parse("1.0.0") < SemVer.parse("1.0.1")
|
||
|
|
assert SemVer.parse("1.0.0") < SemVer.parse("1.1.0")
|
||
|
|
assert SemVer.parse("1.0.0") < SemVer.parse("2.0.0")
|
||
|
|
|
||
|
|
def test_greater_than(self):
|
||
|
|
assert SemVer.parse("1.0.1") > SemVer.parse("1.0.0")
|
||
|
|
assert SemVer.parse("2.0.0") > SemVer.parse("1.9.9")
|
||
|
|
|
||
|
|
def test_prerelease_lower_than_release(self):
|
||
|
|
assert SemVer.parse("1.0.0-alpha") < SemVer.parse("1.0.0")
|
||
|
|
assert SemVer.parse("1.0.0-beta.1") < SemVer.parse("1.0.0")
|
||
|
|
|
||
|
|
def test_prerelease_ordering(self):
|
||
|
|
assert SemVer.parse("1.0.0-alpha.1") < SemVer.parse("1.0.0-alpha.2")
|
||
|
|
assert SemVer.parse("1.0.0-alpha") < SemVer.parse("1.0.0-beta")
|
||
|
|
|
||
|
|
def test_str(self):
|
||
|
|
assert str(SemVer.parse("1.2.3")) == "1.2.3"
|
||
|
|
assert str(SemVer.parse("1.0.0-beta.1")) == "1.0.0-beta.1"
|
||
|
|
|
||
|
|
|
||
|
|
class TestSemVerCompatibility:
|
||
|
|
def test_breaking_change(self):
|
||
|
|
assert is_breaking_change("1.0.0", "2.0.0")
|
||
|
|
assert not is_breaking_change("1.0.0", "1.5.0")
|
||
|
|
|
||
|
|
def test_compatible_same_major(self):
|
||
|
|
assert is_compatible("1.5.0", "1.0.0")
|
||
|
|
assert not is_compatible("1.0.0", "1.5.0")
|
||
|
|
|
||
|
|
def test_compatible_higher_major(self):
|
||
|
|
assert is_compatible("2.0.0", "1.0.0")
|
||
|
|
assert not is_compatible("1.0.0", "2.0.0")
|
||
|
|
|
||
|
|
def test_is_upgrade_from(self):
|
||
|
|
assert SemVer.parse("1.1.0").is_upgrade_from(SemVer.parse("1.0.0"))
|
||
|
|
assert not SemVer.parse("1.0.0").is_upgrade_from(SemVer.parse("1.1.0"))
|
||
|
|
|
||
|
|
def test_is_downgrade_from(self):
|
||
|
|
assert SemVer.parse("1.0.0").is_downgrade_from(SemVer.parse("1.1.0"))
|
||
|
|
assert not SemVer.parse("1.1.0").is_downgrade_from(SemVer.parse("1.0.0"))
|
||
|
|
|
||
|
|
|
||
|
|
class TestCompareVersions:
|
||
|
|
def test_compare_equal(self):
|
||
|
|
assert compare_versions("1.0.0", "1.0.0") == 0
|
||
|
|
|
||
|
|
def test_compare_less(self):
|
||
|
|
assert compare_versions("1.0.0", "1.0.1") == -1
|
||
|
|
|
||
|
|
def test_compare_greater(self):
|
||
|
|
assert compare_versions("1.1.0", "1.0.0") == 1
|