Skip to content

Commit 5efa647

Browse files
finished up unit tests
1 parent c204e8f commit 5efa647

File tree

6 files changed

+243
-23
lines changed

6 files changed

+243
-23
lines changed

SoftLayer/CLI/user/detail.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,16 +78,16 @@ def basic_info(user, keys):
7878
table.add_row(['Company', user.get('companyName')])
7979
table.add_row(['Created', user.get('createDate')])
8080
table.add_row(['Phone Number', user.get('officePhone')])
81-
if user['parentId']:
81+
if user.get('parentId', False):
8282
table.add_row(['Parent User', utils.lookup(user, 'parent', 'username')])
8383
table.add_row(['Status', utils.lookup(user, 'userStatus', 'name')])
8484
table.add_row(['PPTP VPN', user.get('pptpVpnAllowedFlag', 'No')])
8585
table.add_row(['SSL VPN', user.get('sslVpnAllowedFlag', 'No')])
86-
for login in user.get('unsuccessfulLogins'):
86+
for login in user.get('unsuccessfulLogins', {}):
8787
login_string = "%s From: %s" % (login.get('createDate'), login.get('ipAddress'))
8888
table.add_row(['Last Failed Login', login_string])
8989
break
90-
for login in user.get('successfulLogins'):
90+
for login in user.get('successfulLogins', {}):
9191
login_string = "%s From: %s" % (login.get('createDate'), login.get('ipAddress'))
9292
table.add_row(['Last Login', login_string])
9393
break

SoftLayer/fixtures/SoftLayer_User_Customer.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,3 +76,6 @@
7676

7777
addBulkPortalPermission = True
7878
removeBulkPortalPermission = True
79+
createObject = getObject
80+
editObject = True
81+
addApiAuthenticationKey = True

SoftLayer/fixtures/SoftLayer_User_Customer_CustomerPermission_Permission.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,25 @@
1818
"key": "T_4",
1919
"keyName": "TEST_4",
2020
"name": "A Testing Permission 4"
21+
},
22+
{
23+
"key": "T_5",
24+
"keyName": "ACCESS_ALL_HARDWARE",
25+
"name": "A Testing Permission 5"
26+
},
27+
{
28+
'key': 'ALL_1',
29+
'keyName': 'ACCESS_ALL_HARDWARE',
30+
'name': 'All Hardware Access'
31+
},
32+
{
33+
'key': 'A_1',
34+
'keyName': 'ACCOUNT_SUMMARY_VIEW',
35+
'name': 'View Account Summary'
36+
},
37+
{
38+
'key': 'A_10',
39+
'keyName': 'ADD_SERVICE_STORAGE',
40+
'name': 'Add/Upgrade Storage (StorageLayer)'
2141
}
2242
]

SoftLayer/managers/user.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ def get_logins(self, user_id, start_date=None):
154154
"""
155155

156156
if start_date is None:
157-
date_object = datetime.date.today() - datetime.timedelta(days=30)
157+
date_object = datetime.datetime.today() - datetime.timedelta(days=30)
158158
start_date = date_object.strftime("%m/%d/%Y 0:0:0")
159159

160160
date_filter = {
@@ -178,7 +178,7 @@ def get_events(self, user_id, start_date=None):
178178
"""
179179

180180
if start_date is None:
181-
date_object = datetime.date.today() - datetime.timedelta(days=30)
181+
date_object = datetime.datetime.today() - datetime.timedelta(days=30)
182182
start_date = date_object.strftime("%Y-%m-%dT00:00:00")
183183

184184
object_filter = {

tests/CLI/modules/user_tests.py

Lines changed: 157 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,13 @@
44
55
Tests for the user cli command
66
"""
7-
from SoftLayer import testing
8-
97
import json
8+
import sys
9+
10+
import mock
11+
import testtools
12+
13+
from SoftLayer import testing
1014

1115

1216
class UserCLITests(testing.TestCase):
@@ -69,6 +73,42 @@ def test_detail_events(self):
6973
self.assert_no_fail(result)
7074
self.assert_called_with('SoftLayer_Event_Log', 'getAllObjects')
7175

76+
def test_print_hardware_access(self):
77+
mock = self.set_mock('SoftLayer_User_Customer', 'getObject')
78+
mock.return_value = {
79+
'accountId': 12345,
80+
'address1': '315 Test Street',
81+
'city': 'Houston',
82+
'companyName': 'SoftLayer Development Community',
83+
'country': 'US',
84+
'displayName': 'Test',
85+
'email': 'test@us.ibm.com',
86+
'firstName': 'Test',
87+
'id': 244956,
88+
'lastName': 'Testerson',
89+
'postalCode': '77002',
90+
'state': 'TX',
91+
'statusDate': None,
92+
'hardware': [
93+
{'id': 1234,
94+
'fullyQualifiedDomainName': 'test.test.test',
95+
'provisionDate': '2018-05-08T15:28:32-06:00',
96+
'primaryBackendIpAddress': '175.125.126.118',
97+
'primaryIpAddress': '175.125.126.118'}
98+
],
99+
'dedicatedHosts': [
100+
{'id': 1234,
101+
'fullyQualifiedDomainName': 'test.test.test',
102+
'provisionDate': '2018-05-08T15:28:32-06:00',
103+
'primaryBackendIpAddress': '175.125.126.118',
104+
'primaryIpAddress': '175.125.126.118'}
105+
],
106+
}
107+
result = self.run_command(['user', 'detail', '11100', '-h'])
108+
self.assert_no_fail(result)
109+
self.assert_called_with('SoftLayer_User_Customer', 'getObject', identifier=11100,
110+
mask="mask[id, hardware, dedicatedHosts]")
111+
72112
"""User permissions tests"""
73113

74114
def test_permissions_list(self):
@@ -95,3 +135,118 @@ def test_edit_perms_off(self):
95135
result = self.run_command(['user', 'edit-permissions', '11100', '--disable', '-p', 'TEST'])
96136
self.assert_no_fail(result)
97137
self.assert_called_with('SoftLayer_User_Customer', 'removeBulkPortalPermission', identifier=11100)
138+
139+
@mock.patch('SoftLayer.CLI.user.edit_permissions.click')
140+
def test_edit_perms_off_failure(self, click):
141+
permission_mock = self.set_mock('SoftLayer_User_Customer', 'removeBulkPortalPermission')
142+
permission_mock.return_value = False
143+
result = self.run_command(['user', 'edit-permissions', '11100', '--disable', '-p', 'TEST'])
144+
click.secho.assert_called_with('Failed to update permissions: TEST', fg='red')
145+
self.assert_no_fail(result)
146+
self.assert_called_with('SoftLayer_User_Customer', 'removeBulkPortalPermission', identifier=11100)
147+
148+
def test_edit_perms_from_user(self):
149+
result = self.run_command(['user', 'edit-permissions', '11100', '-u', '1234'])
150+
self.assert_no_fail(result)
151+
self.assert_called_with('SoftLayer_User_Customer', 'getPermissions', identifier=1234)
152+
self.assert_called_with('SoftLayer_User_Customer', 'removeBulkPortalPermission', identifier=11100)
153+
self.assert_called_with('SoftLayer_User_Customer', 'addBulkPortalPermission', identifier=11100)
154+
155+
"""User create tests"""
156+
@mock.patch('SoftLayer.CLI.formatting.confirm')
157+
def test_create_user(self, confirm_mock):
158+
confirm_mock.return_value = True
159+
result = self.run_command(['user', 'create', 'test', '-e', 'test@us.ibm.com', '-p', 'testword'])
160+
self.assert_no_fail(result)
161+
self.assertIn('test@us.ibm.com', result.output)
162+
self.assert_called_with('SoftLayer_Account', 'getCurrentUser')
163+
self.assert_called_with('SoftLayer_User_Customer', 'createObject', args=mock.ANY)
164+
165+
@mock.patch('SoftLayer.CLI.formatting.confirm')
166+
def test_create_user_no_confirm(self, confirm_mock):
167+
confirm_mock.return_value = False
168+
result = self.run_command(['user', 'create', 'test', '-e', 'test@us.ibm.com', '-p', 'testword'])
169+
self.assertEqual(result.exit_code, 2)
170+
171+
@testtools.skipIf(sys.version_info < (3, 6), "Secrets module only exists in version 3.6+")
172+
@mock.patch('secrets.choice')
173+
@mock.patch('SoftLayer.CLI.formatting.confirm')
174+
def test_create_user_generate_password_36(self, confirm_mock, secrets):
175+
secrets.return_value = 'Q'
176+
confirm_mock.return_value = True
177+
result = self.run_command(['user', 'create', 'test', '-e', 'test@us.ibm.com', '-p', 'generate'])
178+
179+
self.assert_no_fail(result)
180+
self.assertIn('test@us.ibm.com', result.output)
181+
self.assertIn('QQQQQQQQQQQQQQQQQQQQQQ', result.output)
182+
self.assert_called_with('SoftLayer_Account', 'getCurrentUser')
183+
self.assert_called_with('SoftLayer_User_Customer', 'createObject', args=mock.ANY)
184+
185+
@mock.patch('SoftLayer.CLI.formatting.confirm')
186+
def test_create_user_generate_password_2(self, confirm_mock):
187+
if sys.version_info >= (3, 6):
188+
self.skipTest("Python needs to be < 3.6 for this test.")
189+
190+
confirm_mock.return_value = True
191+
result = self.run_command(['user', 'create', 'test', '-e', 'test@us.ibm.com', '-p', 'generate'])
192+
self.assertIn(result.output, "ImportError")
193+
194+
@mock.patch('SoftLayer.CLI.formatting.confirm')
195+
def test_create_user_and_apikey(self, confirm_mock):
196+
confirm_mock.return_value = True
197+
result = self.run_command(['user', 'create', 'test', '-e', 'test@us.ibm.com', '-a'])
198+
self.assert_no_fail(result)
199+
self.assert_called_with('SoftLayer_User_Customer', 'addApiAuthenticationKey')
200+
201+
@mock.patch('SoftLayer.CLI.formatting.confirm')
202+
def test_create_user_with_template(self, confirm_mock):
203+
confirm_mock.return_value = True
204+
result = self.run_command(['user', 'create', 'test', '-e', 'test@us.ibm.com',
205+
'-t', '{"firstName": "Supermand"}'])
206+
self.assertIn('Supermand', result.output)
207+
208+
@mock.patch('SoftLayer.CLI.formatting.confirm')
209+
def test_create_user_with_bad_template(self, confirm_mock):
210+
confirm_mock.return_value = True
211+
result = self.run_command(['user', 'create', 'test', '-e', 'test@us.ibm.com',
212+
'-t', '{firstName: "Supermand"}'])
213+
self.assertIn("Argument Error", result.exception.message)
214+
self.assertEqual(result.exit_code, 2)
215+
216+
@mock.patch('SoftLayer.CLI.formatting.confirm')
217+
def test_create_user_with_no_confirm(self, confirm_mock):
218+
confirm_mock.return_value = False
219+
result = self.run_command(['user', 'create', 'test', '-e', 'test@us.ibm.com'])
220+
self.assertIn("Canceling creation!", result.exception.message)
221+
self.assertEqual(result.exit_code, 2)
222+
223+
@mock.patch('SoftLayer.CLI.formatting.confirm')
224+
def test_create_user_from_user(self, confirm_mock):
225+
confirm_mock.return_value = True
226+
result = self.run_command(['user', 'create', 'test', '-e', 'test@us.ibm.com', '-u', '1234'])
227+
self.assert_no_fail(result)
228+
self.assert_called_with('SoftLayer_User_Customer', 'getObject', identifier=1234)
229+
230+
"""User edit-details tests"""
231+
@mock.patch('SoftLayer.CLI.user.edit_details.click')
232+
def test_edit_details(self, click):
233+
result = self.run_command(['user', 'edit-details', '1234', '-t', '{"firstName":"Supermand"}'])
234+
click.secho.assert_called_with('1234 updated successfully', fg='green')
235+
self.assert_no_fail(result)
236+
self.assert_called_with('SoftLayer_User_Customer', 'editObject',
237+
args=({'firstName': 'Supermand'},), identifier=1234)
238+
239+
@mock.patch('SoftLayer.CLI.user.edit_details.click')
240+
def test_edit_details_failure(self, click):
241+
mock = self.set_mock('SoftLayer_User_Customer', 'editObject')
242+
mock.return_value = False
243+
result = self.run_command(['user', 'edit-details', '1234', '-t', '{"firstName":"Supermand"}'])
244+
click.secho.assert_called_with('Failed to update 1234', fg='red')
245+
self.assert_no_fail(result)
246+
self.assert_called_with('SoftLayer_User_Customer', 'editObject',
247+
args=({'firstName': 'Supermand'},), identifier=1234)
248+
249+
def test_edit_details_bad_json(self):
250+
result = self.run_command(['user', 'edit-details', '1234', '-t', '{firstName:"Supermand"}'])
251+
self.assertIn("Argument Error", result.exception.message)
252+
self.assertEqual(result.exit_code, 2)

tests/managers/user_tests.py

Lines changed: 58 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,46 @@
33
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
44
55
"""
6+
import datetime
67
import mock
78
import SoftLayer
89
from SoftLayer import exceptions
910
from SoftLayer import testing
1011

1112

12-
class UserTests(testing.TestCase):
13+
real_datetime_class = datetime.datetime
14+
15+
16+
def mock_datetime(target, datetime_module):
17+
"""A way to use specific datetimes in tests. Just mocking datetime doesn't work because of pypy
18+
19+
https://solidgeargroup.com/mocking-the-time
20+
"""
21+
class DatetimeSubclassMeta(type):
22+
@classmethod
23+
def __instancecheck__(mcs, obj):
24+
return isinstance(obj, real_datetime_class)
25+
26+
class BaseMockedDatetime(real_datetime_class):
27+
@classmethod
28+
def now(cls, tz=None):
29+
return target.replace(tzinfo=tz)
30+
31+
@classmethod
32+
def utcnow(cls):
33+
return target
34+
35+
@classmethod
36+
def today(cls):
37+
return target
38+
39+
# Python2 & Python3-compatible metaclass
40+
MockedDatetime = DatetimeSubclassMeta('datetime', (BaseMockedDatetime,), {})
41+
42+
return mock.patch.object(datetime_module, 'datetime', MockedDatetime)
43+
44+
45+
class UserManagerTests(testing.TestCase):
1346

1447
def set_up(self):
1548
self.manager = SoftLayer.UserManager(self.client)
@@ -57,11 +90,8 @@ def test_remove_permissions(self):
5790
args=expected_args, identifier=1234)
5891

5992
def test_get_logins_default(self):
60-
from datetime import date
61-
with mock.patch('SoftLayer.managers.user.datetime.date') as mock_date:
62-
mock_date.today.return_value = date(2018, 5, 15)
63-
mock_date.side_effect = lambda *args, **kw: date(*args, **kw)
64-
93+
target = datetime.datetime(2018, 5, 15)
94+
with mock_datetime(target, datetime):
6595
self.manager.get_logins(1234)
6696
expected_filter = {
6797
'loginAttempts': {
@@ -74,10 +104,8 @@ def test_get_logins_default(self):
74104
self.assert_called_with('SoftLayer_User_Customer', 'getLoginAttempts', filter=expected_filter)
75105

76106
def test_get_events_default(self):
77-
from datetime import date
78-
with mock.patch('SoftLayer.managers.user.datetime.date') as mock_date:
79-
mock_date.today.return_value = date(2018, 5, 15)
80-
mock_date.side_effect = lambda *args, **kw: date(*args, **kw)
107+
target = datetime.datetime(2018, 5, 15)
108+
with mock_datetime(target, datetime):
81109

82110
self.manager.get_events(1234)
83111
expected_filter = {
@@ -106,8 +134,12 @@ def test_permissions_from_user(self, user_permissions):
106134
{"keyName": "TEST"}
107135
]
108136
removed_permissions = [
109-
{"keyName": "TEST_3"},
110-
{"keyName": "TEST_4"}
137+
{'keyName': 'ACCESS_ALL_HARDWARE'},
138+
{'keyName': 'ACCESS_ALL_HARDWARE'},
139+
{'keyName': 'ACCOUNT_SUMMARY_VIEW'},
140+
{'keyName': 'ADD_SERVICE_STORAGE'},
141+
{'keyName': 'TEST_3'},
142+
{'keyName': 'TEST_4'}
111143
]
112144
self.manager.permissions_from_user(1234, 5678)
113145
self.assert_called_with('SoftLayer_User_Customer', 'addBulkPortalPermission',
@@ -139,13 +171,23 @@ def test_format_permission_object(self):
139171
self.assertEqual([{'keyName': 'TEST'}], result)
140172

141173
def test_format_permission_object_all(self):
142-
result = self.manager.format_permission_object(['ALL'])
143-
service_name = 'SoftLayer_User_Customer_CustomerPermission_Permission'
144174
expected = [
145175
{'key': 'T_2', 'keyName': 'TEST', 'name': 'A Testing Permission'},
146-
{'key': 'T_3', 'keyName': 'TEST_3', 'name': 'A Testing Permission 3'},
147-
{'key': 'T_4', 'keyName': 'TEST_4', 'name': 'A Testing Permission 4'},
148176
{'key': 'T_1', 'keyName': 'TICKET_VIEW', 'name': 'View Tickets'}
149177
]
178+
service_name = 'SoftLayer_User_Customer_CustomerPermission_Permission'
179+
permission_mock = self.set_mock(service_name, 'getAllObjects')
180+
permission_mock.return_value = expected
181+
result = self.manager.format_permission_object(['ALL'])
150182
self.assert_called_with(service_name, 'getAllObjects')
151183
self.assertEqual(expected, result)
184+
185+
def test_get_current_user(self):
186+
result = self.manager.get_current_user()
187+
self.assert_called_with('SoftLayer_Account', 'getCurrentUser', mask=mock.ANY)
188+
self.assertEqual(result['id'], 12345)
189+
190+
def test_get_current_user_mask(self):
191+
result = self.manager.get_current_user(objectmask="mask[id]")
192+
self.assert_called_with('SoftLayer_Account', 'getCurrentUser', mask="mask[id]")
193+
self.assertEqual(result['id'], 12345)

0 commit comments

Comments
 (0)