use shutils / tests

This commit is contained in:
Derek Schaller 2023-03-25 15:51:20 -07:00 committed by Megan Wilhite
parent 9d5b65435b
commit fbac15ee92
2 changed files with 162 additions and 90 deletions

View file

@ -26,6 +26,7 @@ Install any kind of pkg, dmg or app file on macOS:
import logging
import os
import re
import shutil
import salt.utils.platform
from salt.exceptions import CommandExecutionError
@ -231,7 +232,9 @@ def installed(
finally:
if dmg:
# Unmount to be kind
__salt__["macpackage.unmount"](mount_point)
__salt__["cmd.run"]("rm -rf {}".format(mount_point))
out = __salt__["macpackage.unmount"](mount_point)
# If unmount succeeded cleanup mount point
if out["retcode"] == 0:
shutil.rmtree(mount_point)
return ret

View file

@ -33,13 +33,14 @@ def test_installed_pkg():
"macpackage.install": install_mock,
},
):
out = macpackage.installed("/path/to/file.pkg")
installed_mock.assert_called_once_with()
get_pkg_id_mock.assert_called_once_with("/path/to/file.pkg")
install_mock.assert_called_once_with(
"/path/to/file.pkg", "LocalSystem", False, False
)
assert out == expected
with patch("shutil.rmtree", MagicMock()):
out = macpackage.installed("/path/to/file.pkg")
installed_mock.assert_called_once_with()
get_pkg_id_mock.assert_called_once_with("/path/to/file.pkg")
install_mock.assert_called_once_with(
"/path/to/file.pkg", "LocalSystem", False, False
)
assert out == expected
@pytest.mark.skip_on_windows(reason="Not a Windows test")
@ -66,11 +67,12 @@ def test_installed_pkg_exists():
"macpackage.install": install_mock,
},
):
out = macpackage.installed("/path/to/file.pkg")
installed_mock.assert_called_once_with()
get_pkg_id_mock.assert_called_once_with("/path/to/file.pkg")
assert not install_mock.called
assert out == expected
with patch("shutil.rmtree", MagicMock()):
out = macpackage.installed("/path/to/file.pkg")
installed_mock.assert_called_once_with()
get_pkg_id_mock.assert_called_once_with("/path/to/file.pkg")
assert not install_mock.called
assert out == expected
@pytest.mark.skip_on_windows(reason="Not a Windows test")
@ -99,17 +101,18 @@ def test_installed_pkg_version_succeeds():
"cmd.run": cmd_mock,
},
):
out = macpackage.installed(
"/path/to/file.pkg",
version_check=r"/usr/bin/runme --version=.*5\.1\.[0-9]",
)
cmd_mock.assert_called_once_with(
"/usr/bin/runme --version", output_loglevel="quiet", ignore_retcode=True
)
assert not installed_mock.called
assert not get_pkg_id_mock.called
assert not install_mock.called
assert out == expected
with patch("shutil.rmtree", MagicMock()):
out = macpackage.installed(
"/path/to/file.pkg",
version_check=r"/usr/bin/runme --version=.*5\.1\.[0-9]",
)
cmd_mock.assert_called_once_with(
"/usr/bin/runme --version", output_loglevel="quiet", ignore_retcode=True
)
assert not installed_mock.called
assert not get_pkg_id_mock.called
assert not install_mock.called
assert out == expected
@pytest.mark.skip_on_windows(reason="Not a Windows test")
@ -141,19 +144,20 @@ def test_installed_pkg_version_fails():
"cmd.run": cmd_mock,
},
):
out = macpackage.installed(
"/path/to/file.pkg",
version_check=r"/usr/bin/runme --version=.*5\.1\.[0-9]",
)
cmd_mock.assert_called_once_with(
"/usr/bin/runme --version", output_loglevel="quiet", ignore_retcode=True
)
installed_mock.assert_called_once_with()
get_pkg_id_mock.assert_called_once_with("/path/to/file.pkg")
install_mock.assert_called_once_with(
"/path/to/file.pkg", "LocalSystem", False, False
)
assert out == expected
with patch("shutil.rmtree", MagicMock()):
out = macpackage.installed(
"/path/to/file.pkg",
version_check=r"/usr/bin/runme --version=.*5\.1\.[0-9]",
)
cmd_mock.assert_called_once_with(
"/usr/bin/runme --version", output_loglevel="quiet", ignore_retcode=True
)
installed_mock.assert_called_once_with()
get_pkg_id_mock.assert_called_once_with("/path/to/file.pkg")
install_mock.assert_called_once_with(
"/path/to/file.pkg", "LocalSystem", False, False
)
assert out == expected
@pytest.mark.skip_on_windows(reason="Not a Windows test")
@ -167,9 +171,9 @@ def test_installed_dmg():
"name": "/path/to/file.dmg",
"result": True,
}
mount_mock = MagicMock(return_value=["success", "/tmp/dmg-X"])
unmount_mock = MagicMock()
unmount_mock = MagicMock(return_value={"retcode": 0})
installed_mock = MagicMock(return_value=["com.apple.id"])
get_pkg_id_mock = MagicMock(return_value=["some.other.id"])
install_mock = MagicMock(return_value={"retcode": 0})
@ -184,15 +188,16 @@ def test_installed_dmg():
"macpackage.install": install_mock,
},
):
out = macpackage.installed("/path/to/file.dmg", dmg=True)
mount_mock.assert_called_once_with("/path/to/file.dmg")
unmount_mock.assert_called_once_with("/tmp/dmg-X")
installed_mock.assert_called_once_with()
get_pkg_id_mock.assert_called_once_with("/tmp/dmg-X/*.pkg")
install_mock.assert_called_once_with(
"/tmp/dmg-X/*.pkg", "LocalSystem", False, False
)
assert out == expected
with patch("shutil.rmtree", MagicMock()):
out = macpackage.installed("/path/to/file.dmg", dmg=True)
mount_mock.assert_called_once_with("/path/to/file.dmg")
unmount_mock.assert_called_once_with("/tmp/dmg-X")
installed_mock.assert_called_once_with()
get_pkg_id_mock.assert_called_once_with("/tmp/dmg-X/*.pkg")
install_mock.assert_called_once_with(
"/tmp/dmg-X/*.pkg", "LocalSystem", False, False
)
assert out == expected
@pytest.mark.skip_on_windows(reason="Not a Windows test")
@ -208,7 +213,7 @@ def test_installed_dmg_exists():
}
mount_mock = MagicMock(return_value=["success", "/tmp/dmg-X"])
unmount_mock = MagicMock()
unmount_mock = MagicMock(return_value={"retcode": 0})
installed_mock = MagicMock(return_value=["com.apple.id", "some.other.id"])
get_pkg_id_mock = MagicMock(return_value=["some.other.id"])
install_mock = MagicMock(return_value={"retcode": 0})
@ -223,13 +228,14 @@ def test_installed_dmg_exists():
"macpackage.install": install_mock,
},
):
out = macpackage.installed("/path/to/file.dmg", dmg=True)
mount_mock.assert_called_once_with("/path/to/file.dmg")
unmount_mock.assert_called_once_with("/tmp/dmg-X")
installed_mock.assert_called_once_with()
get_pkg_id_mock.assert_called_once_with("/tmp/dmg-X/*.pkg")
assert not install_mock.called
assert out == expected
with patch("shutil.rmtree", MagicMock()):
out = macpackage.installed("/path/to/file.dmg", dmg=True)
mount_mock.assert_called_once_with("/path/to/file.dmg")
unmount_mock.assert_called_once_with("/tmp/dmg-X")
installed_mock.assert_called_once_with()
get_pkg_id_mock.assert_called_once_with("/tmp/dmg-X/*.pkg")
assert not install_mock.called
assert out == expected
@pytest.mark.skip_on_windows(reason="Not a Windows test")
@ -249,10 +255,11 @@ def test_installed_app():
exists_mock.return_value = False
with patch.dict(macpackage.__salt__, {"macpackage.install_app": install_mock}):
out = macpackage.installed("/path/to/file.app", app=True)
with patch("shutil.rmtree", MagicMock()):
out = macpackage.installed("/path/to/file.app", app=True)
install_mock.assert_called_once_with("/path/to/file.app", "/Applications/")
assert out == expected
install_mock.assert_called_once_with("/path/to/file.app", "/Applications/")
assert out == expected
@pytest.mark.skip_on_windows(reason="Not a Windows test")
@ -272,10 +279,11 @@ def test_installed_app_exists():
exists_mock.return_value = True
with patch.dict(macpackage.__salt__, {"macpackage.install_app": install_mock}):
out = macpackage.installed("/path/to/file.app", app=True)
with patch("shutil.rmtree", MagicMock()):
out = macpackage.installed("/path/to/file.app", app=True)
assert not install_mock.called
assert out == expected
assert not install_mock.called
assert out == expected
@pytest.mark.skip_on_windows(reason="Not a Windows test")
@ -293,7 +301,7 @@ def test_installed_app_dmg():
install_mock = MagicMock()
mount_mock = MagicMock(return_value=["success", "/tmp/dmg-X"])
unmount_mock = MagicMock()
unmount_mock = MagicMock(return_value={"retcode": 0})
cmd_mock = MagicMock(return_value="file.app")
exists_mock.return_value = False
@ -306,17 +314,18 @@ def test_installed_app_dmg():
"cmd.run": cmd_mock,
},
):
out = macpackage.installed("/path/to/file.dmg", app=True, dmg=True)
with patch("shutil.rmtree", MagicMock()):
out = macpackage.installed("/path/to/file.dmg", app=True, dmg=True)
mount_mock.assert_called_once_with("/path/to/file.dmg")
unmount_mock.assert_called_once_with("/tmp/dmg-X")
cmd_mock.assert_called_once_with(
"ls -d *.app", python_shell=True, cwd="/tmp/dmg-X"
)
install_mock.assert_called_once_with(
"/tmp/dmg-X/file.app", "/Applications/"
)
assert out == expected
mount_mock.assert_called_once_with("/path/to/file.dmg")
unmount_mock.assert_called_once_with("/tmp/dmg-X")
cmd_mock.assert_called_once_with(
"ls -d *.app", python_shell=True, cwd="/tmp/dmg-X"
)
install_mock.assert_called_once_with(
"/tmp/dmg-X/file.app", "/Applications/"
)
assert out == expected
@pytest.mark.skip_on_windows(reason="Not a Windows test")
@ -334,7 +343,7 @@ def test_installed_app_dmg_exists():
install_mock = MagicMock()
mount_mock = MagicMock(return_value=["success", "/tmp/dmg-X"])
unmount_mock = MagicMock()
unmount_mock = MagicMock(return_value={"retcode": 0})
cmd_mock = MagicMock(return_value="file.app")
exists_mock.return_value = True
@ -347,15 +356,16 @@ def test_installed_app_dmg_exists():
"cmd.run": cmd_mock,
},
):
out = macpackage.installed("/path/to/file.dmg", app=True, dmg=True)
with patch("shutil.rmtree", MagicMock()):
out = macpackage.installed("/path/to/file.dmg", app=True, dmg=True)
mount_mock.assert_called_once_with("/path/to/file.dmg")
unmount_mock.assert_called_once_with("/tmp/dmg-X")
cmd_mock.assert_called_once_with(
"ls -d *.app", python_shell=True, cwd="/tmp/dmg-X"
)
assert not install_mock.called
assert out == expected
mount_mock.assert_called_once_with("/path/to/file.dmg")
unmount_mock.assert_called_once_with("/tmp/dmg-X")
cmd_mock.assert_called_once_with(
"ls -d *.app", python_shell=True, cwd="/tmp/dmg-X"
)
assert not install_mock.called
assert out == expected
@pytest.mark.skip_on_windows(reason="Not a Windows test")
@ -384,10 +394,69 @@ def test_installed_pkg_only_if_pass():
"cmd.retcode": cmd_mock,
},
):
out = macpackage.installed("/path/to/file.pkg")
installed_mock.assert_called_once_with()
get_pkg_id_mock.assert_called_once_with("/path/to/file.pkg")
install_mock.assert_called_once_with(
"/path/to/file.pkg", "LocalSystem", False, False
)
assert out == expected
with patch("shutil.rmtree", MagicMock()):
out = macpackage.installed("/path/to/file.pkg")
installed_mock.assert_called_once_with()
get_pkg_id_mock.assert_called_once_with("/path/to/file.pkg")
install_mock.assert_called_once_with(
"/path/to/file.pkg", "LocalSystem", False, False
)
assert out == expected
@pytest.mark.skip_on_windows(reason="Not a Windows test")
def test_unmounted_dir_cleans_up():
"""
Test an unmounted volume removes the mount dir.
"""
expected = {
"changes": {"installed": ["some.other.id"]},
"comment": "/path/to/file.dmg installed",
"name": "/path/to/file.dmg",
"result": True,
}
rmtree_mock = MagicMock()
with patch.dict(
macpackage.__salt__,
{
"macpackage.mount": MagicMock(return_value=["success", "/tmp/dmg-X"]),
"macpackage.unmount": MagicMock(return_value={"retcode": 0}),
"macpackage.installed_pkgs": MagicMock(return_value=["com.apple.id"]),
"macpackage.get_pkg_id": MagicMock(return_value=["some.other.id"]),
"macpackage.install": MagicMock(return_value={"retcode": 0}),
},
):
with patch("shutil.rmtree", rmtree_mock):
out = macpackage.installed("/path/to/file.dmg", dmg=True)
rmtree_mock.assert_called_once_with("/path/to/file.dmg")
assert out == expected
@pytest.mark.skip_on_windows(reason="Not a Windows test")
def test_failed_unmount_leaves_dir():
"""
Test a mounted volume that fails to unmount does not attempt to remove the mount dir.
"""
expected = {
"changes": {"installed": ["some.other.id"]},
"comment": "/path/to/file.dmg installed",
"name": "/path/to/file.dmg",
"result": True,
}
rmtree_mock = MagicMock()
with patch.dict(
macpackage.__salt__,
{
"macpackage.mount": MagicMock(return_value=["success", "/tmp/dmg-X"]),
"macpackage.unmount": MagicMock(return_value={"retcode": 1}),
"macpackage.installed_pkgs": MagicMock(return_value=["com.apple.id"]),
"macpackage.get_pkg_id": MagicMock(return_value=["some.other.id"]),
"macpackage.install": MagicMock(return_value={"retcode": 0}),
},
):
with patch("shutil.rmtree", rmtree_mock):
out = macpackage.installed("/path/to/file.dmg", dmg=True)
rmtree_mock.assert_not_called()