| |
@@ -0,0 +1,102 @@
|
| |
+ import random
|
| |
+ from unittest import mock
|
| |
+
|
| |
+ import pytest
|
| |
+
|
| |
+ from rpmautospec import misc
|
| |
+
|
| |
+
|
| |
+ class TestMisc:
|
| |
+ """Test the rpmautospec.misc module"""
|
| |
+
|
| |
+ builds_lower_higher = (
|
| |
+ {"epoch": None, "version": "1.0", "release": "1"},
|
| |
+ {"epoch": None, "version": "1.0", "release": "2"},
|
| |
+ {"epoch": None, "version": "1.0", "release": "3"},
|
| |
+ {"epoch": 1, "version": "0.1", "release": "1"},
|
| |
+ )
|
| |
+
|
| |
+ evr_str_expected = {
|
| |
+ "2:2.10.18-1.fc31": (2, "2.10.18", "1.fc31"),
|
| |
+ "1.0-1.fc32": (0, "1.0", "1.fc32"),
|
| |
+ "not:an:evr": ValueError,
|
| |
+ }
|
| |
+
|
| |
+ tag_expected = {
|
| |
+ "1": (1, None, None),
|
| |
+ "1.fc31": (1, ".fc31", None),
|
| |
+ "2.fc30.1": (2, ".fc30", 1),
|
| |
+ "3.fc32.a": (3, ".fc32.a", None),
|
| |
+ "not a valid release": (None, None, None),
|
| |
+ }
|
| |
+
|
| |
+ def test_rpmvercmp_key(self):
|
| |
+ """Test sorting with rpmvercmp_key"""
|
| |
+ # Ensure we have a build that counts as "same".
|
| |
+ builds_in_order = list(self.builds_lower_higher[:3] + self.builds_lower_higher[2:])
|
| |
+
|
| |
+ # Shuffle.
|
| |
+ builds = random.sample(builds_in_order, len(builds_in_order))
|
| |
+
|
| |
+ assert sorted(builds, key=misc.rpmvercmp_key) == builds_in_order
|
| |
+
|
| |
+ @pytest.mark.parametrize("evr_str", evr_str_expected.keys())
|
| |
+ def test_parse_evr(self, evr_str):
|
| |
+ """Test the parse_evr() function"""
|
| |
+ expected = self.evr_str_expected[evr_str]
|
| |
+ if isinstance(expected, type) and issubclass(expected, Exception):
|
| |
+ with pytest.raises(expected) as excinfo:
|
| |
+ misc.parse_evr(evr_str)
|
| |
+ assert str(excinfo.value) == evr_str
|
| |
+ else:
|
| |
+ assert misc.parse_evr(evr_str) == expected
|
| |
+
|
| |
+ @pytest.mark.parametrize("tag", tag_expected.keys())
|
| |
+ def test_parse_release_tag(self, tag):
|
| |
+ """Test the parse_release_tag() function"""
|
| |
+ expected = self.tag_expected[tag]
|
| |
+ assert misc.parse_release_tag(tag) == expected
|
| |
+
|
| |
+ @mock.patch.object(misc, "_kojiclient", new=mock.MagicMock())
|
| |
+ @mock.patch("rpmautospec.misc.koji.ClientSession")
|
| |
+ def test_koji_init(self, client_session):
|
| |
+ """Test the koji_init() function"""
|
| |
+ client_session.return_value = "Boo!"
|
| |
+ assert misc.koji_init("https://192.0.2.1") == "Boo!"
|
| |
+ client_session.assert_called_once_with("https://192.0.2.1")
|
| |
+ assert misc._kojiclient == "Boo!"
|
| |
+
|
| |
+ @pytest.mark.parametrize("phenomenon", ("normal", "kojiclient unset", "unknown package"))
|
| |
+ @mock.patch("rpmautospec.misc._kojiclient")
|
| |
+ def test_get_package_builds(self, kojiclient_global, phenomenon):
|
| |
+ """Test the get_package_builds() function"""
|
| |
+ getPackageID = kojiclient_global.getPackageID
|
| |
+ listBuilds = kojiclient_global.listBuilds
|
| |
+
|
| |
+ if phenomenon == "kojiclient unset":
|
| |
+ misc._kojiclient = None
|
| |
+ elif phenomenon == "unknown package":
|
| |
+ getPackageID.return_value = None
|
| |
+ else: # normal
|
| |
+ getPackageID.return_value = 12345
|
| |
+ listBuilds.return_value = expected = ["foo-1.0-1.fc31", "foo-0.9-1.fc30"]
|
| |
+
|
| |
+ if phenomenon == "kojiclient unset":
|
| |
+ with pytest.raises(AssertionError):
|
| |
+ misc.get_package_builds("foo")
|
| |
+ elif phenomenon == "unknown package":
|
| |
+ with pytest.raises(ValueError):
|
| |
+ misc.get_package_builds("foo")
|
| |
+ else:
|
| |
+ result = misc.get_package_builds("foo")
|
| |
+
|
| |
+ if phenomenon == "kojiclient unset":
|
| |
+ getPackageID.assert_not_called()
|
| |
+ else:
|
| |
+ getPackageID.assert_called_once_with("foo")
|
| |
+
|
| |
+ if phenomenon == "normal":
|
| |
+ listBuilds.assert_called_once_with(12345, type="rpm", queryOpts={"order": "-nvr"})
|
| |
+ assert result == expected
|
| |
+ else:
|
| |
+ listBuilds.assert_not_called()
|
| |
WIP: Not finished yet and needs PR#13 to be merged first (first commit).