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