import pytest from hugin_core.resolution import Subscription, ResolutionError, Available, resolve V = { "pub-a": [Available("1.0.0"), Available("1.2.0"), Available("2.0.0"), Available("2.1.0", channel="test")], "pub-b": [Available("1.0.0", deprecated=True), Available("1.1.0")], "pub-pflicht": [Available("3.0.0")], } def versions(subscriptions, installed=None, major=False, mandatory=(), unsubscribed=()): result = resolve([Subscription.read(a) for a in subscriptions], list(mandatory), list(unsubscribed), V, installed or {}, major) return result @pytest.mark.parametrize("subscription, installed, major, expected", [ ("pub-a", None, False, "2.0.0"), ("pub-a@stable", {"pub-a": "1.0.0"}, False, "1.2.0"), ("pub-a@stable", {"pub-a": "1.0.0"}, True, "2.0.0"), ("pub-a@test", None, False, "2.1.0"), ("pub-a@^1", None, False, "1.2.0"), ("pub-a@1.0.0", None, False, "1.0.0"), ("pub-b@1.0.0", None, False, "1.0.0"), # veraltet bleibt abrufbar (→ 9.1) ("pub-b", None, False, "1.1.0"), ]) def test_choose(subscription, installed, major, expected): assert versions([subscription], installed, major).versions[subscription.split("@")[0]] == expected def test_major_is_reported(): result = versions(["pub-a"], {"pub-a": "1.0.0"}) assert result.major_available == {"pub-a": "2.0.0"} def test_mandatory_comes_always(): result = versions(["pub-b"], mandatory=["pub-pflicht"], unsubscribed=["pub-pflicht", "pub-b"]) assert result.versions == {"pub-pflicht": "3.0.0"} assert result.mandatory == {"pub-pflicht"} @pytest.mark.parametrize("subscription", ["pub-x", "pub-a@^9", "pub-a@9.9.9"]) def test_not_resolvable(subscription): with pytest.raises(ResolutionError): versions([subscription]) def test_invalid_subscription(): with pytest.raises(ResolutionError): Subscription.read("pub-a@latest")