Skip to content

Commit c1a7075

Browse files
added update user method (#304)
1 parent 3dae923 commit c1a7075

File tree

3 files changed

+105
-0
lines changed

3 files changed

+105
-0
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ how a consumer would use the library (e.g. adding unit tests, updating documenta
1616

1717
- `sdk.legalhold.get_all_events()` to search for legal hold events.
1818

19+
- `sdk.users.update_user()` to update an existing user in Code42.
20+
1921
### Fixed
2022

2123
- Bug where proxy settings were not being applied correctly.

src/py42/services/users.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,3 +330,43 @@ def remove_role(self, user_id, role_name):
330330
role_name = quote(role_name)
331331
uri = u"/api/UserRole?userId={}&roleName={}".format(user_id, role_name)
332332
return self._connection.delete(uri)
333+
334+
def update_user(
335+
self,
336+
user_uid,
337+
username=None,
338+
email=None,
339+
password=None,
340+
first_name=None,
341+
last_name=None,
342+
notes=None,
343+
quota=None,
344+
):
345+
"""Updates an existing user.
346+
`REST Documentation <https://console.us.code42.com/apidocviewer/#User-put>`__
347+
348+
Args:
349+
user_uid (int): A Code42 user UID.
350+
username (str, optional): The username to which the user's username will be changed. Defaults to None.
351+
email (str, optional): The email to which the user's email will be changed. Defaults to None.
352+
password (str, optional): The password to which the user's password will be changed. Defaults to None.
353+
first_name (str, optional): The first name to which the user's first name will be changed. Defaults to None.
354+
last_name (str, optional): The last name to which the user's last name will be changed. Defaults to None.
355+
notes (str, optional): Descriptive information about the user. Defaults to None.
356+
quota (int, optional): The quota in bytes that limits the user's archive size. Defaults to None.
357+
358+
Returns:
359+
:class:`py42.response.Py42Response`
360+
"""
361+
362+
uri = u"/api/User/{}?idType=uid".format(user_uid)
363+
data = {
364+
u"username": username,
365+
u"email": email,
366+
u"password": password,
367+
u"firstName": first_name,
368+
u"lastName": last_name,
369+
u"notes": notes,
370+
u"quota": quota,
371+
}
372+
return self._connection.put(uri, json=data)

tests/services/test_users.py

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,14 @@ def post_api_mock_response(self, mocker):
5252
response.text = MOCK_text
5353
return Py42Response(response)
5454

55+
@pytest.fixture
56+
def put_api_mock_response(self, mocker):
57+
response = mocker.MagicMock(spec=Response)
58+
response.status_code = 200
59+
response.encoding = "utf-8"
60+
response.text = MOCK_text
61+
return Py42Response(response)
62+
5563
@pytest.fixture
5664
def post_api_mock_error_response(self, mocker):
5765
response = mocker.MagicMock(spec=Response)
@@ -215,3 +223,58 @@ def side_effect(url, json):
215223

216224
expected = u"Cannot deactivate the user with ID 1234 as the user is involved in a legal hold matter."
217225
assert str(err.value) == expected
226+
227+
def test_update_user_calls_put_with_expected_url_and_params(
228+
self, mock_connection, put_api_mock_response
229+
):
230+
user_service = UserService(mock_connection)
231+
mock_connection.post.return_value = put_api_mock_response
232+
user_id = "TEST_USER_ID"
233+
expected_uri = "{}/{}?idType=uid".format(USER_URI, user_id)
234+
username = "[email protected]"
235+
236+
password = "password"
237+
first_name = "FIRSTNAME"
238+
last_name = "LASTNAME"
239+
note = "Test Note"
240+
quota = 12345
241+
user_service.update_user(
242+
user_id,
243+
username=username,
244+
email=email,
245+
password=password,
246+
first_name=first_name,
247+
last_name=last_name,
248+
notes=note,
249+
quota=quota,
250+
)
251+
expected_params = {
252+
u"username": username,
253+
u"email": email,
254+
u"password": password,
255+
u"firstName": first_name,
256+
u"lastName": last_name,
257+
u"notes": note,
258+
u"quota": quota,
259+
}
260+
mock_connection.put.assert_called_once_with(expected_uri, json=expected_params)
261+
262+
def test_update_user_does_not_include_empty_params(
263+
self, mock_connection, put_api_mock_response
264+
):
265+
user_service = UserService(mock_connection)
266+
mock_connection.post.return_value = put_api_mock_response
267+
user_id = "TEST_USER_ID"
268+
expected_uri = "{}/{}?idType=uid".format(USER_URI, user_id)
269+
username = "[email protected]"
270+
user_service.update_user(user_id, username=username)
271+
expected_params = {
272+
u"username": username,
273+
u"email": None,
274+
u"password": None,
275+
u"firstName": None,
276+
u"lastName": None,
277+
u"notes": None,
278+
u"quota": None,
279+
}
280+
mock_connection.put.assert_called_once_with(expected_uri, json=expected_params)

0 commit comments

Comments
 (0)