Migrate zypper.upgrade tests to pytest

This commit is contained in:
Alexander Graul 2022-05-02 17:25:49 +02:00 committed by Megan Wilhite
parent c4c84ac403
commit 4398d59c10
2 changed files with 124 additions and 185 deletions

View file

@ -4,17 +4,26 @@
import os
import textwrap
import pytest
import salt.modules.pkg_resource as pkg_resource
import salt.modules.zypperpkg as zypper
from salt.exceptions import CommandExecutionError
from tests.support.mock import MagicMock, patch
@pytest.fixture
def configure_loader_modules():
return {zypper: {"rpm": None}, pkg_resource: {}}
return {
zypper: {
"rpm": None,
"_systemd_scope": MagicMock(return_value=False),
"osrelease_info": [15, 3],
},
pkg_resource: {},
}
def test_list_pkgs_no_context():
@ -212,3 +221,117 @@ def test_pkg_list_holds():
ret = zypper.list_holds()
assert len(ret) == 1
assert "bar-2:2.3.4-2.1.*" in ret
@pytest.mark.parametrize(
"package,pre_version,post_version,fromrepo_param",
[
("vim", "1.1", "1.2", []),
("kernel-default", "1.1", "1.1,1.2", ["dummy", "dummy2"]),
],
)
@patch.object(zypper, "refresh_db", MagicMock(return_value=True))
def test_upgrade(package, pre_version, post_version, fromrepo_param):
with patch(
"salt.modules.zypperpkg.__zypper__.noraise.call"
) as zypper_mock, patch.object(
zypper,
"list_pkgs",
MagicMock(side_effect=[{package: pre_version}, {package: post_version}]),
):
expected_call = ["update", "--auto-agree-with-licenses"]
for repo in fromrepo_param:
expected_call.extend(["--repo", repo])
result = zypper.upgrade(fromrepo=fromrepo_param)
zypper_mock.assert_any_call(*expected_call)
assert result == {package: {"old": pre_version, "new": post_version}}
@pytest.mark.parametrize(
"package,pre_version,post_version,fromrepo_param",
[
("vim", "1.1", "1.2", []),
("emacs", "1.1", "1.2", ["Dummy", "Dummy2"]),
],
)
@patch.object(zypper, "refresh_db", MagicMock(return_value=True))
def test_dist_upgrade(package, pre_version, post_version, fromrepo_param):
with patch(
"salt.modules.zypperpkg.__zypper__.noraise.call"
) as zypper_mock, patch.object(
zypper,
"list_pkgs",
MagicMock(side_effect=[{package: pre_version}, {package: post_version}]),
):
expected_call = ["dist-upgrade", "--auto-agree-with-licenses"]
for repo in fromrepo_param:
expected_call.extend(["--from", repo])
result = zypper.upgrade(dist_upgrade=True, fromrepo=fromrepo_param)
zypper_mock.assert_any_call(*expected_call)
assert result == {package: {"old": pre_version, "new": post_version}}
@pytest.mark.parametrize(
"package,pre_version,post_version,fromrepo_param",
[
("vim", "1.1", "1.1", []),
("emacs", "1.1", "1.1", ["Dummy", "Dummy2"]),
],
)
@patch.object(zypper, "refresh_db", MagicMock(return_value=True))
def test_dist_upgrade_dry_run(package, pre_version, post_version, fromrepo_param):
with patch(
"salt.modules.zypperpkg.__zypper__.noraise.call"
) as zypper_mock, patch.object(
zypper,
"list_pkgs",
MagicMock(side_effect=[{package: pre_version}, {package: post_version}]),
):
expected_call = ["dist-upgrade", "--auto-agree-with-licenses", "--dry-run"]
for repo in fromrepo_param:
expected_call.extend(["--from", repo])
zypper.upgrade(dist_upgrade=True, dryrun=True, fromrepo=fromrepo_param)
zypper_mock.assert_any_call(*expected_call)
# dryrun=True causes two calls, one with a trailing --debug-solver flag
expected_call.append("--debug-solver")
zypper_mock.assert_any_call(*expected_call)
@patch.object(zypper, "refresh_db", MagicMock(return_value=True))
def test_dist_upgrade_failure():
zypper_output = textwrap.dedent(
"""\
Loading repository data...
Reading installed packages...
Computing distribution upgrade...
Use 'zypper repos' to get the list of defined repositories.
Repository 'DUMMY' not found by its alias, number, or URI.
"""
)
call_spy = MagicMock()
zypper_mock = MagicMock()
zypper_mock.stdout = zypper_output
zypper_mock.stderr = ""
zypper_mock.exit_code = 3
zypper_mock.noraise.call = call_spy
with patch("salt.modules.zypperpkg.__zypper__", zypper_mock), patch.object(
zypper, "list_pkgs", MagicMock(side_effect=[{"vim": 1.1}, {"vim": 1.1}])
):
expected_call = [
"dist-upgrade",
"--auto-agree-with-licenses",
"--from",
"Dummy",
]
with pytest.raises(CommandExecutionError) as exc:
zypper.upgrade(dist_upgrade=True, fromrepo=["Dummy"])
call_spy.assert_called_with(*expected_call)
assert exc.exception.info["changes"] == {}
assert exc.exception.info["result"]["stdout"] == zypper_output

View file

@ -624,144 +624,6 @@ class ZypperTestCase(TestCase, LoaderModuleMockMixin):
{"vim": "7.4.326-2.62", "fakepkg": ""},
)
def test_upgrade_success(self):
"""
Test system upgrade and dist-upgrade success.
:return:
"""
with patch.dict(zypper.__grains__, {"osrelease_info": [12, 1]}), patch(
"salt.modules.zypperpkg.refresh_db", MagicMock(return_value=True)
), patch(
"salt.modules.zypperpkg._systemd_scope", MagicMock(return_value=False)
):
with patch(
"salt.modules.zypperpkg.__zypper__.noraise.call", MagicMock()
) as zypper_mock:
with patch(
"salt.modules.zypperpkg.list_pkgs",
MagicMock(side_effect=[{"vim": "1.1"}, {"vim": "1.2"}]),
):
ret = zypper.upgrade()
self.assertDictEqual(ret, {"vim": {"old": "1.1", "new": "1.2"}})
zypper_mock.assert_any_call("update", "--auto-agree-with-licenses")
with patch(
"salt.modules.zypperpkg.list_pkgs",
MagicMock(
side_effect=[
{"kernel-default": "1.1"},
{"kernel-default": "1.1,1.2"},
]
),
):
ret = zypper.upgrade()
self.assertDictEqual(
ret, {"kernel-default": {"old": "1.1", "new": "1.1,1.2"}}
)
zypper_mock.assert_any_call("update", "--auto-agree-with-licenses")
with patch(
"salt.modules.zypperpkg.list_pkgs",
MagicMock(side_effect=[{"vim": "1.1"}, {"vim": "1.1,1.2"}]),
):
ret = zypper.upgrade()
self.assertDictEqual(ret, {"vim": {"old": "1.1", "new": "1.1,1.2"}})
zypper_mock.assert_any_call("update", "--auto-agree-with-licenses")
with patch(
"salt.modules.zypperpkg.list_pkgs",
MagicMock(side_effect=[{"vim": "1.1"}, {"vim": "1.2"}]),
):
ret = zypper.upgrade(dist_upgrade=True)
self.assertDictEqual(ret, {"vim": {"old": "1.1", "new": "1.2"}})
zypper_mock.assert_any_call(
"dist-upgrade", "--auto-agree-with-licenses"
)
with patch(
"salt.modules.zypperpkg.list_pkgs",
MagicMock(side_effect=[{"vim": "1.1"}, {"vim": "1.1"}]),
):
ret = zypper.upgrade(dist_upgrade=True, dryrun=True)
zypper_mock.assert_any_call(
"dist-upgrade", "--auto-agree-with-licenses", "--dry-run"
)
zypper_mock.assert_any_call(
"dist-upgrade",
"--auto-agree-with-licenses",
"--dry-run",
"--debug-solver",
)
with patch(
"salt.modules.zypperpkg.list_pkgs",
MagicMock(side_effect=[{"vim": "1.1"}, {"vim": "1.1"}]),
):
ret = zypper.upgrade(
dist_upgrade=True,
dryrun=True,
fromrepo=["Dummy", "Dummy2"],
novendorchange=True,
)
zypper_mock.assert_any_call(
"dist-upgrade",
"--auto-agree-with-licenses",
"--dry-run",
"--from",
"Dummy",
"--from",
"Dummy2",
"--no-allow-vendor-change",
)
zypper_mock.assert_any_call(
"dist-upgrade",
"--auto-agree-with-licenses",
"--dry-run",
"--from",
"Dummy",
"--from",
"Dummy2",
"--no-allow-vendor-change",
"--debug-solver",
)
with patch(
"salt.modules.zypperpkg.list_pkgs",
MagicMock(side_effect=[{"vim": "1.1"}, {"vim": "1.1"}]),
):
ret = zypper.upgrade(
dist_upgrade=False, fromrepo=["Dummy", "Dummy2"], dryrun=False
)
zypper_mock.assert_any_call(
"update",
"--auto-agree-with-licenses",
"--repo",
"Dummy",
"--repo",
"Dummy2",
)
with patch(
"salt.modules.zypperpkg.list_pkgs",
MagicMock(side_effect=[{"vim": "1.1"}, {"vim": "1.2"}]),
):
ret = zypper.upgrade(
dist_upgrade=True,
fromrepo=["Dummy", "Dummy2"],
novendorchange=True,
)
self.assertDictEqual(ret, {"vim": {"old": "1.1", "new": "1.2"}})
zypper_mock.assert_any_call(
"dist-upgrade",
"--auto-agree-with-licenses",
"--from",
"Dummy",
"--from",
"Dummy2",
"--no-allow-vendor-change",
)
def test_upgrade_kernel(self):
"""
Test kernel package upgrade success.
@ -806,52 +668,6 @@ class ZypperTestCase(TestCase, LoaderModuleMockMixin):
},
)
def test_upgrade_failure(self):
"""
Test system upgrade failure.
:return:
"""
zypper_out = """
Loading repository data...
Reading installed packages...
Computing distribution upgrade...
Use 'zypper repos' to get the list of defined repositories.
Repository 'DUMMY' not found by its alias, number, or URI.
"""
class FailingZypperDummy:
def __init__(self):
self.stdout = zypper_out
self.stderr = ""
self.pid = 1234
self.exit_code = 555
self.noraise = MagicMock()
self.SUCCESS_EXIT_CODES = [0]
def __call__(self, *args, **kwargs):
return self
with patch.dict(zypper.__grains__, {"osrelease_info": [12, 1]}), patch(
"salt.modules.zypperpkg.__zypper__", FailingZypperDummy()
) as zypper_mock, patch(
"salt.modules.zypperpkg.refresh_db", MagicMock(return_value=True)
), patch(
"salt.modules.zypperpkg._systemd_scope", MagicMock(return_value=False)
):
zypper_mock.noraise.call = MagicMock()
with patch(
"salt.modules.zypperpkg.list_pkgs",
MagicMock(side_effect=[{"vim": "1.1"}, {"vim": "1.1"}]),
):
with self.assertRaises(CommandExecutionError) as cmd_exc:
ret = zypper.upgrade(dist_upgrade=True, fromrepo=["DUMMY"])
self.assertEqual(cmd_exc.exception.info["changes"], {})
self.assertEqual(cmd_exc.exception.info["result"]["stdout"], zypper_out)
zypper_mock.noraise.call.assert_called_with(
"dist-upgrade", "--auto-agree-with-licenses", "--from", "DUMMY"
)
def test_upgrade_available(self):
"""
Test whether or not an upgrade is available for a given package.