2014-12-30 06:48:25 +00:00
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
'''
|
|
|
|
:codeauthor: :email:`Jayesh Kariya <jayeshk@saltstack.com>`
|
|
|
|
'''
|
|
|
|
|
2015-01-08 02:37:23 +00:00
|
|
|
# Import Python libs
|
|
|
|
from __future__ import absolute_import
|
|
|
|
|
2014-12-30 06:48:25 +00:00
|
|
|
# Import Salt Testing Libs
|
|
|
|
from salttesting import TestCase, skipIf
|
|
|
|
from salttesting.mock import (
|
|
|
|
MagicMock,
|
|
|
|
patch,
|
|
|
|
NO_MOCK,
|
|
|
|
NO_MOCK_REASON
|
|
|
|
)
|
|
|
|
|
|
|
|
# Import Salt Libs
|
|
|
|
from salt.modules import useradd
|
|
|
|
from salt.exceptions import CommandExecutionError
|
|
|
|
import pwd
|
|
|
|
|
|
|
|
# Globals
|
|
|
|
useradd.__grains__ = {}
|
|
|
|
useradd.__salt__ = {}
|
|
|
|
useradd.__context__ = {}
|
|
|
|
|
|
|
|
|
|
|
|
@skipIf(NO_MOCK, NO_MOCK_REASON)
|
|
|
|
class UserAddTestCase(TestCase):
|
|
|
|
'''
|
|
|
|
Test cases for salt.modules.useradd
|
|
|
|
'''
|
|
|
|
mock_pwall = {'gid': 0,
|
|
|
|
'groups': ['root'],
|
|
|
|
'home': '/root',
|
|
|
|
'name': 'root',
|
|
|
|
'passwd': 'x',
|
|
|
|
'shell': '/bin/bash',
|
|
|
|
'uid': 0,
|
|
|
|
'fullname': 'root',
|
|
|
|
'roomnumber': '',
|
|
|
|
'workphone': '',
|
|
|
|
'homephone': ''}
|
|
|
|
|
|
|
|
# 'add' function tests: 1
|
|
|
|
|
|
|
|
def test_add(self):
|
|
|
|
'''
|
|
|
|
Test for adding a user
|
|
|
|
'''
|
|
|
|
with patch.dict(useradd.__grains__, {'kernel': 'OpenBSD'}):
|
|
|
|
mock_primary = MagicMock(return_value='Salt')
|
|
|
|
with patch.dict(useradd.__salt__,
|
|
|
|
{'file.gid_to_group': mock_primary}):
|
|
|
|
mock = MagicMock(return_value={'retcode': 0})
|
|
|
|
with patch.dict(useradd.__salt__, {'cmd.run_all': mock}):
|
|
|
|
self.assertTrue(useradd.add('Salt'))
|
|
|
|
|
|
|
|
mock = MagicMock(return_value={'retcode': 1})
|
|
|
|
with patch.dict(useradd.__salt__, {'cmd.run_all': mock}):
|
|
|
|
self.assertFalse(useradd.add('Salt'))
|
|
|
|
|
|
|
|
# 'getent' function tests: 2
|
|
|
|
|
|
|
|
@patch('salt.modules.useradd.__context__', MagicMock(return_value='Salt'))
|
|
|
|
def test_getent(self):
|
|
|
|
'''
|
|
|
|
Test if user.getent already have a value
|
|
|
|
'''
|
|
|
|
self.assertTrue(useradd.getent())
|
|
|
|
|
|
|
|
@patch('salt.modules.useradd._format_info',
|
|
|
|
MagicMock(return_value=mock_pwall))
|
|
|
|
@patch('pwd.getpwall', MagicMock(return_value=['']))
|
|
|
|
def test_getent_user(self):
|
|
|
|
'''
|
|
|
|
Tests the return information on all users
|
|
|
|
'''
|
|
|
|
ret = [{'gid': 0,
|
|
|
|
'groups': ['root'],
|
|
|
|
'home': '/root',
|
|
|
|
'name': 'root',
|
|
|
|
'passwd': 'x',
|
|
|
|
'shell': '/bin/bash',
|
|
|
|
'uid': 0,
|
|
|
|
'fullname': 'root',
|
|
|
|
'roomnumber': '',
|
|
|
|
'workphone': '',
|
|
|
|
'homephone': ''}]
|
|
|
|
self.assertEqual(useradd.getent(), ret)
|
|
|
|
|
|
|
|
# 'chuid' function tests: 1
|
|
|
|
|
|
|
|
def test_chuid(self):
|
|
|
|
'''
|
|
|
|
Test if the uid of a user change
|
|
|
|
'''
|
|
|
|
mock = MagicMock(return_value={'uid': 11})
|
|
|
|
with patch.object(useradd, 'info', mock):
|
|
|
|
self.assertTrue(useradd.chuid('name', 11))
|
|
|
|
|
|
|
|
mock_run = MagicMock(return_value=None)
|
|
|
|
with patch.dict(useradd.__salt__, {'cmd.run': mock_run}):
|
|
|
|
mock = MagicMock(side_effect=[{'uid': 11}, {'uid': 11}])
|
|
|
|
with patch.object(useradd, 'info', mock):
|
|
|
|
self.assertFalse(useradd.chuid('name', 22))
|
|
|
|
|
|
|
|
with patch.dict(useradd.__salt__, {'cmd.run': mock_run}):
|
|
|
|
mock = MagicMock(side_effect=[{'uid': 11}, {'uid': 22}])
|
|
|
|
with patch.object(useradd, 'info', mock):
|
|
|
|
self.assertTrue(useradd.chuid('name', 11))
|
|
|
|
|
|
|
|
# 'chgid' function tests: 1
|
|
|
|
|
|
|
|
def test_chgid(self):
|
|
|
|
'''
|
|
|
|
Test the default group of the user
|
|
|
|
'''
|
|
|
|
mock = MagicMock(return_value={'gid': 11})
|
|
|
|
with patch.object(useradd, 'info', mock):
|
|
|
|
self.assertTrue(useradd.chgid('name', 11))
|
|
|
|
|
|
|
|
mock_run = MagicMock(return_value=None)
|
|
|
|
with patch.dict(useradd.__salt__, {'cmd.run': mock_run}):
|
|
|
|
mock = MagicMock(side_effect=[{'gid': 22}, {'gid': 22}])
|
|
|
|
with patch.object(useradd, 'info', mock):
|
|
|
|
self.assertFalse(useradd.chgid('name', 11))
|
|
|
|
|
|
|
|
with patch.dict(useradd.__salt__, {'cmd.run': mock_run}):
|
|
|
|
mock = MagicMock(side_effect=[{'gid': 11}, {'gid': 22}])
|
|
|
|
with patch.object(useradd, 'info', mock):
|
|
|
|
self.assertTrue(useradd.chgid('name', 11))
|
|
|
|
|
|
|
|
# 'chshell' function tests: 1
|
|
|
|
|
|
|
|
def test_chshell(self):
|
|
|
|
'''
|
|
|
|
Test the default shell of user
|
|
|
|
'''
|
|
|
|
mock = MagicMock(return_value={'shell': '/bin/bash'})
|
|
|
|
with patch.object(useradd, 'info', mock):
|
|
|
|
self.assertTrue(useradd.chshell('name', '/bin/bash'))
|
|
|
|
|
|
|
|
mock_run = MagicMock(return_value=None)
|
|
|
|
with patch.dict(useradd.__salt__, {'cmd.run': mock_run}):
|
|
|
|
mock = MagicMock(side_effect=[{'shell': '/bin/bash'},
|
|
|
|
{'shell': '/bin/bash'}])
|
|
|
|
with patch.object(useradd, 'info', mock):
|
|
|
|
self.assertFalse(useradd.chshell('name', '/usr/bash'))
|
|
|
|
|
|
|
|
with patch.dict(useradd.__salt__, {'cmd.run': mock_run}):
|
|
|
|
mock = MagicMock(side_effect=[{'shell': '/bin/bash'},
|
|
|
|
{'shell': '/usr/bash'}])
|
|
|
|
with patch.object(useradd, 'info', mock):
|
|
|
|
self.assertTrue(useradd.chshell('name', '/bin/bash'))
|
|
|
|
|
|
|
|
# 'chhome' function tests: 1
|
|
|
|
|
|
|
|
def test_chhome(self):
|
|
|
|
'''
|
|
|
|
Test if home directory given is same as previous home directory
|
|
|
|
'''
|
|
|
|
mock = MagicMock(return_value={'home': '/root'})
|
|
|
|
with patch.object(useradd, 'info', mock):
|
|
|
|
self.assertTrue(useradd.chhome('name', '/root'))
|
|
|
|
|
|
|
|
mock = MagicMock(return_value=None)
|
|
|
|
with patch.dict(useradd.__salt__, {'cmd.run': mock}):
|
|
|
|
mock = MagicMock(side_effect=[{'home': '/root'}, {'home': '/root'}])
|
|
|
|
with patch.object(useradd, 'info', mock):
|
|
|
|
self.assertFalse(useradd.chhome('name', '/user'))
|
|
|
|
|
|
|
|
mock = MagicMock(return_value=None)
|
|
|
|
with patch.dict(useradd.__salt__, {'cmd.run': mock}):
|
|
|
|
mock = MagicMock(side_effect=[{'home': '/root'}, {'home': '/root'}])
|
|
|
|
with patch.object(useradd, 'info', mock):
|
|
|
|
self.assertTrue(useradd.chhome('name', '/root'))
|
|
|
|
|
|
|
|
# 'chgroups' function tests: 1
|
|
|
|
|
|
|
|
def test_chgroups(self):
|
|
|
|
'''
|
|
|
|
Test if user groups changed
|
|
|
|
'''
|
|
|
|
mock = MagicMock(return_value=['wheel', 'root'])
|
|
|
|
with patch.object(useradd, 'list_groups', mock):
|
|
|
|
self.assertTrue(useradd.chgroups('foo', 'wheel,root'))
|
|
|
|
|
|
|
|
mock = MagicMock(return_value=['wheel', 'root'])
|
|
|
|
with patch.object(useradd, 'list_groups', mock):
|
|
|
|
with patch.dict(useradd.__grains__, {'kernel': 'OpenBSD'}):
|
|
|
|
mock_runall = MagicMock(return_value={'retcode': False,
|
|
|
|
'stderr': ''})
|
|
|
|
with patch.dict(useradd.__salt__, {'cmd.run_all': mock_runall}):
|
|
|
|
self.assertTrue(useradd.chgroups('foo', 'wheel,test,root'))
|
|
|
|
|
|
|
|
mock_runall = MagicMock(return_value={'retcode': True,
|
|
|
|
'stderr': ''})
|
|
|
|
with patch.dict(useradd.__salt__, {'cmd.run_all': mock_runall}):
|
|
|
|
self.assertFalse(useradd.chgroups('foo', 'wheel,test,root'))
|
|
|
|
|
|
|
|
# 'chfullname' function tests: 1
|
|
|
|
|
|
|
|
def test_chfullname(self):
|
|
|
|
'''
|
|
|
|
Test if the user's Full Name is changed
|
|
|
|
'''
|
|
|
|
mock = MagicMock(return_value=False)
|
|
|
|
with patch.object(useradd, '_get_gecos', mock):
|
|
|
|
self.assertFalse(useradd.chfullname('Salt', 'SaltStack'))
|
|
|
|
|
|
|
|
mock = MagicMock(return_value={'fullname': 'SaltStack'})
|
|
|
|
with patch.object(useradd, '_get_gecos', mock):
|
|
|
|
self.assertTrue(useradd.chfullname('Salt', 'SaltStack'))
|
|
|
|
|
|
|
|
mock = MagicMock(return_value={'fullname': 'SaltStack'})
|
|
|
|
with patch.object(useradd, '_get_gecos', mock):
|
|
|
|
mock = MagicMock(return_value=None)
|
|
|
|
with patch.dict(useradd.__salt__, {'cmd.run': mock}):
|
|
|
|
mock = MagicMock(return_value={'fullname': 'SaltStack2'})
|
|
|
|
with patch.object(useradd, 'info', mock):
|
|
|
|
self.assertFalse(useradd.chfullname('Salt', 'SaltStack1'))
|
|
|
|
|
|
|
|
mock = MagicMock(return_value={'fullname': 'SaltStack2'})
|
|
|
|
with patch.object(useradd, '_get_gecos', mock):
|
|
|
|
mock = MagicMock(return_value=None)
|
|
|
|
with patch.dict(useradd.__salt__, {'cmd.run': mock}):
|
|
|
|
mock = MagicMock(return_value={'fullname': 'SaltStack2'})
|
|
|
|
with patch.object(useradd, 'info', mock):
|
|
|
|
self.assertFalse(useradd.chfullname('Salt', 'SaltStack1'))
|
|
|
|
|
|
|
|
# 'chroomnumber' function tests: 1
|
|
|
|
|
|
|
|
def test_chroomnumber(self):
|
|
|
|
'''
|
|
|
|
Test if the user's Room Number is changed
|
|
|
|
'''
|
|
|
|
mock = MagicMock(return_value=False)
|
|
|
|
with patch.object(useradd, '_get_gecos', mock):
|
|
|
|
self.assertFalse(useradd.chroomnumber('salt', 1))
|
|
|
|
|
|
|
|
mock = MagicMock(return_value={'roomnumber': '1'})
|
|
|
|
with patch.object(useradd, '_get_gecos', mock):
|
|
|
|
self.assertTrue(useradd.chroomnumber('salt', 1))
|
|
|
|
|
|
|
|
mock = MagicMock(return_value={'roomnumber': '2'})
|
|
|
|
with patch.object(useradd, '_get_gecos', mock):
|
|
|
|
mock = MagicMock(return_value=None)
|
|
|
|
with patch.dict(useradd.__salt__, {'cmd.run': mock}):
|
|
|
|
mock = MagicMock(return_value={'roomnumber': '3'})
|
|
|
|
with patch.object(useradd, 'info', mock):
|
|
|
|
self.assertFalse(useradd.chroomnumber('salt', 1))
|
|
|
|
|
|
|
|
mock = MagicMock(return_value={'roomnumber': '3'})
|
|
|
|
with patch.object(useradd, '_get_gecos', mock):
|
|
|
|
mock = MagicMock(return_value=None)
|
|
|
|
with patch.dict(useradd.__salt__, {'cmd.run': mock}):
|
|
|
|
mock = MagicMock(return_value={'roomnumber': '3'})
|
|
|
|
with patch.object(useradd, 'info', mock):
|
|
|
|
self.assertFalse(useradd.chroomnumber('salt', 1))
|
|
|
|
|
|
|
|
# 'chworkphone' function tests: 1
|
|
|
|
|
|
|
|
def test_chworkphone(self):
|
|
|
|
'''
|
|
|
|
Test if the user's Work Phone is changed
|
|
|
|
'''
|
|
|
|
mock = MagicMock(return_value=False)
|
|
|
|
with patch.object(useradd, '_get_gecos', mock):
|
|
|
|
self.assertFalse(useradd.chworkphone('salt', 1))
|
|
|
|
|
|
|
|
mock = MagicMock(return_value={'workphone': '1'})
|
|
|
|
with patch.object(useradd, '_get_gecos', mock):
|
|
|
|
self.assertTrue(useradd.chworkphone('salt', 1))
|
|
|
|
|
|
|
|
mock = MagicMock(return_value={'workphone': '2'})
|
|
|
|
with patch.object(useradd, '_get_gecos', mock):
|
|
|
|
mock = MagicMock(return_value=None)
|
|
|
|
with patch.dict(useradd.__salt__, {'cmd.run': mock}):
|
|
|
|
mock = MagicMock(return_value={'workphone': '3'})
|
|
|
|
with patch.object(useradd, 'info', mock):
|
|
|
|
self.assertFalse(useradd.chworkphone('salt', 1))
|
|
|
|
|
|
|
|
mock = MagicMock(return_value={'workphone': '3'})
|
|
|
|
with patch.object(useradd, '_get_gecos', mock):
|
|
|
|
mock = MagicMock(return_value=None)
|
|
|
|
with patch.dict(useradd.__salt__, {'cmd.run': mock}):
|
|
|
|
mock = MagicMock(return_value={'workphone': '3'})
|
|
|
|
with patch.object(useradd, 'info', mock):
|
|
|
|
self.assertFalse(useradd.chworkphone('salt', 1))
|
|
|
|
|
|
|
|
# 'chhomephone' function tests: 1
|
|
|
|
|
|
|
|
def test_chhomephone(self):
|
|
|
|
'''
|
|
|
|
Test if the user's Home Phone is changed
|
|
|
|
'''
|
|
|
|
mock = MagicMock(return_value=False)
|
|
|
|
with patch.object(useradd, '_get_gecos', mock):
|
|
|
|
self.assertFalse(useradd.chhomephone('salt', 1))
|
|
|
|
|
|
|
|
mock = MagicMock(return_value={'homephone': '1'})
|
|
|
|
with patch.object(useradd, '_get_gecos', mock):
|
|
|
|
self.assertTrue(useradd.chhomephone('salt', 1))
|
|
|
|
|
|
|
|
mock = MagicMock(return_value={'homephone': '2'})
|
|
|
|
with patch.object(useradd, '_get_gecos', mock):
|
|
|
|
mock = MagicMock(return_value=None)
|
|
|
|
with patch.dict(useradd.__salt__, {'cmd.run': mock}):
|
|
|
|
mock = MagicMock(return_value={'homephone': '3'})
|
|
|
|
with patch.object(useradd, 'info', mock):
|
|
|
|
self.assertFalse(useradd.chhomephone('salt', 1))
|
|
|
|
|
|
|
|
mock = MagicMock(return_value={'homephone': '3'})
|
|
|
|
with patch.object(useradd, '_get_gecos', mock):
|
|
|
|
mock = MagicMock(return_value=None)
|
|
|
|
with patch.dict(useradd.__salt__, {'cmd.run': mock}):
|
|
|
|
mock = MagicMock(return_value={'homephone': '3'})
|
|
|
|
with patch.object(useradd, 'info', mock):
|
|
|
|
self.assertFalse(useradd.chhomephone('salt', 1))
|
|
|
|
|
|
|
|
# 'info' function tests: 1
|
|
|
|
|
|
|
|
def test_info(self):
|
|
|
|
'''
|
|
|
|
Test the user information
|
|
|
|
'''
|
2016-08-23 16:49:53 +00:00
|
|
|
self.assertEqual(useradd.info('username-that-doesnt-exist'), {})
|
2014-12-30 06:48:25 +00:00
|
|
|
|
|
|
|
mock = MagicMock(return_value=pwd.struct_passwd(('_TEST_GROUP',
|
|
|
|
'*',
|
|
|
|
83,
|
|
|
|
83,
|
|
|
|
'AMaViS Daemon',
|
|
|
|
'/var/virusmails',
|
|
|
|
'/usr/bin/false')))
|
|
|
|
with patch.object(pwd, 'getpwnam', mock):
|
2016-08-23 16:49:53 +00:00
|
|
|
self.assertEqual(useradd.info('username-that-doesnt-exist')['name'], '_TEST_GROUP')
|
2014-12-30 06:48:25 +00:00
|
|
|
|
|
|
|
# 'list_groups' function tests: 1
|
|
|
|
|
|
|
|
@patch('salt.utils.get_group_list', MagicMock(return_value='Salt'))
|
|
|
|
def test_list_groups(self):
|
|
|
|
'''
|
|
|
|
Test if it return a list of groups the named user belongs to
|
|
|
|
'''
|
|
|
|
self.assertEqual(useradd.list_groups('name'), 'Salt')
|
|
|
|
|
|
|
|
# 'list_users' function tests: 1
|
|
|
|
|
|
|
|
def test_list_users(self):
|
|
|
|
'''
|
|
|
|
Test if it returns a list of all users
|
|
|
|
'''
|
|
|
|
self.assertTrue(useradd.list_users())
|
|
|
|
|
|
|
|
# 'list_users' function tests: 1
|
|
|
|
|
|
|
|
def test_rename(self):
|
|
|
|
'''
|
|
|
|
Test if the username for a named user changed
|
|
|
|
'''
|
|
|
|
mock = MagicMock(return_value=False)
|
|
|
|
with patch.object(useradd, 'info', mock):
|
|
|
|
self.assertRaises(CommandExecutionError, useradd.rename, 'salt', 1)
|
|
|
|
|
|
|
|
mock = MagicMock(return_value=True)
|
|
|
|
with patch.object(useradd, 'info', mock):
|
|
|
|
self.assertRaises(CommandExecutionError, useradd.rename, 'salt', 1)
|
|
|
|
|
|
|
|
mock = MagicMock(return_value=None)
|
|
|
|
with patch.dict(useradd.__salt__, {'cmd.run': mock}):
|
|
|
|
mock = MagicMock(side_effect=[{'name': ''}, False,
|
|
|
|
{'name': 'salt'}])
|
|
|
|
with patch.object(useradd, 'info', mock):
|
|
|
|
self.assertTrue(useradd.rename('name', 'salt'))
|
|
|
|
|
|
|
|
mock = MagicMock(return_value=None)
|
|
|
|
with patch.dict(useradd.__salt__, {'cmd.run': mock}):
|
|
|
|
mock = MagicMock(side_effect=[{'name': ''}, False, {'name': ''}])
|
|
|
|
with patch.object(useradd, 'info', mock):
|
|
|
|
self.assertFalse(useradd.rename('salt', 'salt'))
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
from integration import run_tests
|
|
|
|
run_tests(UserAddTestCase, needs_daemon=False)
|