salt/tests/unit/states/mac_package_test.py

374 lines
16 KiB
Python
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# -*- coding: utf-8 -*-
# Import Python libs
from __future__ import absolute_import
# Import Salt Libs
from salt.states import mac_package as macpackage
# Import Salt Testing Libs
from salttesting import TestCase
from salttesting.helpers import ensure_in_syspath
from salttesting.mock import (
MagicMock,
patch
)
ensure_in_syspath('../../')
macpackage.__salt__ = {}
macpackage.__grains__ = {}
class MacPackageTestCase(TestCase):
@patch('salt.states.mac_package._mod_run_check')
def test_installed_pkg(self, _mod_run_check_mock):
'''
Test installing a PKG file
'''
expected = {
'changes': {'installed': ['some.other.id']},
'comment': '/path/to/file.pkg installed',
'name': '/path/to/file.pkg',
'result': True
}
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})
_mod_run_check_mock.return_value = True
with patch.dict(macpackage.__salt__, {'macpackage.installed_pkgs': installed_mock,
'macpackage.get_pkg_id': get_pkg_id_mock,
'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)
self.assertEqual(out, expected)
@patch('salt.states.mac_package._mod_run_check')
def test_installed_pkg_exists(self, _mod_run_check_mock):
'''
Test installing a PKG file where it's already installed
'''
expected = {
'changes': {},
'comment': '',
'name': '/path/to/file.pkg',
'result': True
}
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})
_mod_run_check_mock.return_value = True
with patch.dict(macpackage.__salt__, {'macpackage.installed_pkgs': installed_mock,
'macpackage.get_pkg_id': get_pkg_id_mock,
'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
self.assertEqual(out, expected)
@patch('salt.states.mac_package._mod_run_check')
def test_installed_pkg_version_succeeds(self, _mod_run_check_mock):
'''
Test installing a PKG file where the version number matches the current installed version
'''
expected = {
'changes': {},
'comment': 'Version already matches .*5\\.1\\.[0-9]',
'name': '/path/to/file.pkg',
'result': True
}
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})
cmd_mock = MagicMock(return_value='Version of this: 5.1.9')
_mod_run_check_mock.return_value = True
with patch.dict(macpackage.__salt__, {'macpackage.installed_pkgs': installed_mock,
'macpackage.get_pkg_id': get_pkg_id_mock,
'macpackage.install': install_mock,
'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
self.assertEqual(out, expected)
@patch('salt.states.mac_package._mod_run_check')
def test_installed_pkg_version_fails(self, _mod_run_check_mock):
'''
Test installing a PKG file where the version number if different from the expected one
'''
expected = {
'changes': {'installed': ['some.other.id']},
'comment': 'Version Version of this: 1.8.9 doesn\'t match .*5\\.1\\.[0-9]. /path/to/file.pkg installed',
'name': '/path/to/file.pkg',
'result': True
}
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})
cmd_mock = MagicMock(return_value='Version of this: 1.8.9')
_mod_run_check_mock.return_value = True
with patch.dict(macpackage.__salt__, {'macpackage.installed_pkgs': installed_mock,
'macpackage.get_pkg_id': get_pkg_id_mock,
'macpackage.install': install_mock,
'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)
self.assertEqual(out, expected)
@patch('salt.states.mac_package._mod_run_check')
def test_installed_dmg(self, _mod_run_check_mock):
'''
Test installing a DMG file
'''
expected = {
'changes': {'installed': ['some.other.id']},
'comment': '/path/to/file.dmg installed',
'name': '/path/to/file.dmg',
'result': True
}
mount_mock = MagicMock(return_value=['success', '/tmp/dmg-X'])
unmount_mock = MagicMock()
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})
_mod_run_check_mock.return_value = True
with patch.dict(macpackage.__salt__, {'macpackage.mount': mount_mock,
'macpackage.unmount': unmount_mock,
'macpackage.installed_pkgs': installed_mock,
'macpackage.get_pkg_id': get_pkg_id_mock,
'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)
self.assertEqual(out, expected)
@patch('salt.states.mac_package._mod_run_check')
def test_installed_dmg_exists(self, _mod_run_check_mock):
'''
Test installing a DMG file when the package already exists
'''
expected = {
'changes': {},
'comment': '',
'name': '/path/to/file.dmg',
'result': True
}
mount_mock = MagicMock(return_value=['success', '/tmp/dmg-X'])
unmount_mock = MagicMock()
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})
_mod_run_check_mock.return_value = True
with patch.dict(macpackage.__salt__, {'macpackage.mount': mount_mock,
'macpackage.unmount': unmount_mock,
'macpackage.installed_pkgs': installed_mock,
'macpackage.get_pkg_id': get_pkg_id_mock,
'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
self.assertEqual(out, expected)
@patch('os.path.exists')
@patch('salt.states.mac_package._mod_run_check')
def test_installed_app(self, _mod_run_check_mock, exists_mock):
'''
Test installing an APP file
'''
expected = {
'changes': {'installed': ['file.app']},
'comment': 'file.app installed',
'name': '/path/to/file.app',
'result': True
}
install_mock = MagicMock()
_mod_run_check_mock.return_value = True
exists_mock.return_value = False
with patch.dict(macpackage.__salt__, {'macpackage.install_app': install_mock}):
out = macpackage.installed('/path/to/file.app', app=True)
install_mock.assert_called_once_with('/path/to/file.app', '/Applications/')
self.assertEqual(out, expected)
@patch('os.path.exists')
@patch('salt.states.mac_package._mod_run_check')
def test_installed_app_exists(self, _mod_run_check_mock, exists_mock):
'''
Test installing an APP file that already exists
'''
expected = {
'changes': {},
'comment': '',
'name': '/path/to/file.app',
'result': True
}
install_mock = MagicMock()
_mod_run_check_mock.return_value = True
exists_mock.return_value = True
with patch.dict(macpackage.__salt__, {'macpackage.install_app': install_mock}):
out = macpackage.installed('/path/to/file.app', app=True)
assert not install_mock.called
self.assertEqual(out, expected)
@patch('os.path.exists')
@patch('salt.states.mac_package._mod_run_check')
def test_installed_app_dmg(self, _mod_run_check_mock, exists_mock):
'''
Test installing an APP file contained in a DMG file
'''
expected = {
'changes': {'installed': ['file.app']},
'comment': 'file.app installed',
'name': '/path/to/file.dmg',
'result': True
}
install_mock = MagicMock()
mount_mock = MagicMock(return_value=['success', '/tmp/dmg-X'])
unmount_mock = MagicMock()
cmd_mock = MagicMock(return_value='file.app')
_mod_run_check_mock.return_value = True
exists_mock.return_value = False
with patch.dict(macpackage.__salt__, {'macpackage.install_app': install_mock,
'macpackage.mount': mount_mock,
'macpackage.unmount': unmount_mock,
'cmd.run': cmd_mock}):
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/')
self.assertEqual(out, expected)
@patch('os.path.exists')
@patch('salt.states.mac_package._mod_run_check')
def test_installed_app_dmg_exists(self, _mod_run_check_mock, exists_mock):
'''
Test installing an APP file contained in a DMG file where the file exists
'''
expected = {
'changes': {},
'comment': '',
'name': '/path/to/file.dmg',
'result': True
}
install_mock = MagicMock()
mount_mock = MagicMock(return_value=['success', '/tmp/dmg-X'])
unmount_mock = MagicMock()
cmd_mock = MagicMock(return_value='file.app')
_mod_run_check_mock.return_value = True
exists_mock.return_value = True
with patch.dict(macpackage.__salt__, {'macpackage.install_app': install_mock,
'macpackage.mount': mount_mock,
'macpackage.unmount': unmount_mock,
'cmd.run': cmd_mock}):
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
self.assertEqual(out, expected)
def test_installed_pkg_only_if_pass(self):
'''
Test installing a PKG file where the only if call passes
'''
expected = {
'changes': {'installed': ['some.other.id']},
'comment': '/path/to/file.pkg installed',
'name': '/path/to/file.pkg',
'result': True
}
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})
cmd_mock = MagicMock(return_value=0)
with patch.dict(macpackage.__salt__, {'macpackage.installed_pkgs': installed_mock,
'macpackage.get_pkg_id': get_pkg_id_mock,
'macpackage.install': install_mock,
'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)
self.assertEqual(out, expected)
def test_installed_pkg_onlyif_fail(self,):
'''
Test installing a PKG file where the onlyif call fails
'''
expected = {
'changes': {},
'comment': 'onlyif execution failed',
'skip_watch': True,
'result': True,
'name': '/path/to/file.pkg',
}
mock = MagicMock(return_value=1)
with patch.dict(macpackage.__salt__, {'cmd.retcode': mock}):
out = macpackage.installed('/path/to/file.pkg', onlyif='some command')
self.assertEqual(out, expected)
def test_installed_pkg_unless_fail(self,):
'''
Test installing a PKG file where the unless run fails
'''
expected = {
'changes': {},
'comment': 'unless execution succeeded',
'skip_watch': True,
'result': True,
'name': '/path/to/file.pkg',
}
mock = MagicMock(return_value=0)
with patch.dict(macpackage.__salt__, {'cmd.retcode': mock}):
out = macpackage.installed('/path/to/file.pkg', unless='some command')
self.assertEqual(out, expected)
if __name__ == '__main__':
from integration import run_tests
run_tests(MacPackageTestCase, needs_daemon=False)