Files

108 lines
3.3 KiB
Python
Raw Permalink Normal View History

"""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