|
21 | 21 | import time
|
22 | 22 | from email.utils import formatdate
|
23 | 23 |
|
| 24 | +import six |
24 | 25 | import mock
|
25 | 26 | import pytest
|
26 | 27 | import requests
|
27 | 28 |
|
28 | 29 | from conftest import mock_connection_params, MockResponse
|
29 |
| -from umapi_client import Connection, UnavailableError, ServerError, RequestError |
| 30 | +from umapi_client import Connection, UnavailableError, ServerError, RequestError, UserAction, GroupTypes, \ |
| 31 | + IdentityTypes, RoleTypes |
30 | 32 | from umapi_client import __version__ as umapi_version
|
31 | 33 |
|
32 | 34 |
|
@@ -242,3 +244,178 @@ def test_post_request_fail():
|
242 | 244 | mock_post.return_value = MockResponse(400, text="400 test request failure")
|
243 | 245 | conn = Connection(**mock_connection_params)
|
244 | 246 | pytest.raises(RequestError, conn.make_call, "", "[3, 5]")
|
| 247 | + |
| 248 | + |
| 249 | +def test_large_group_assignment_split(): |
| 250 | + """ |
| 251 | + Ensure that large group list can be split into multiple commands |
| 252 | + :return: |
| 253 | + """ |
| 254 | + group_prefix = "G" |
| 255 | + add_groups = [group_prefix+six.text_type(n+1) for n in range(0, 15)] |
| 256 | + user = UserAction( id_type=IdentityTypes. enterpriseID, email="[email protected]") |
| 257 | + user.add_to_groups(groups=add_groups, group_type=GroupTypes.usergroup) |
| 258 | + assert user.maybe_split_groups(10) is True |
| 259 | + assert len(user.commands) == 2 |
| 260 | + assert user.commands[0]["add"][GroupTypes.usergroup.name] == add_groups[0:10] |
| 261 | + assert user.commands[1]["add"][GroupTypes.usergroup.name] == add_groups[10:] |
| 262 | + |
| 263 | + |
| 264 | +def test_large_group_assignment_split_recursive(): |
| 265 | + """ |
| 266 | + Test group list large enough to trigger recursive split |
| 267 | + :return: |
| 268 | + """ |
| 269 | + group_prefix = "G" |
| 270 | + add_groups = [group_prefix+six.text_type(n+1) for n in range(0, 100)] |
| 271 | + user = UserAction( id_type=IdentityTypes. enterpriseID, email="[email protected]") |
| 272 | + user.add_to_groups(groups=add_groups, group_type=GroupTypes.usergroup) |
| 273 | + assert user.maybe_split_groups(10) is True |
| 274 | + assert len(user.commands) == 10 |
| 275 | + |
| 276 | + |
| 277 | +def test_large_group_mix_split(): |
| 278 | + """ |
| 279 | + Ensure that group split works on add and remove |
| 280 | + Each "add" and "remove" group should be split into 2 groups each |
| 281 | + :return: |
| 282 | + """ |
| 283 | + group_prefix = "G" |
| 284 | + add_groups = [group_prefix+six.text_type(n+1) for n in range(0, 15)] |
| 285 | + remove_groups = [group_prefix+six.text_type(n+1) for n in range(15, 30)] |
| 286 | + user = UserAction( id_type=IdentityTypes. enterpriseID, email="[email protected]") |
| 287 | + user.add_to_groups(groups=add_groups, group_type=GroupTypes.usergroup) \ |
| 288 | + .remove_from_groups(groups=remove_groups, group_type=GroupTypes.usergroup) |
| 289 | + assert user.maybe_split_groups(10) is True |
| 290 | + assert len(user.commands) == 4 |
| 291 | + assert user.commands[0]["add"][GroupTypes.usergroup.name] == add_groups[0:10] |
| 292 | + assert user.commands[1]["add"][GroupTypes.usergroup.name] == add_groups[10:] |
| 293 | + assert user.commands[2]["remove"][GroupTypes.usergroup.name] == remove_groups[0:10] |
| 294 | + assert user.commands[3]["remove"][GroupTypes.usergroup.name] == remove_groups[10:] |
| 295 | + |
| 296 | + |
| 297 | +def test_large_group_action_split(): |
| 298 | + """ |
| 299 | + Ensure that very large group lists (100+) will be handled appropriately |
| 300 | + Connection.execute_multiple splits commands and splits actions |
| 301 | + Result should be 2 actions, even though we only created one action |
| 302 | + :return: |
| 303 | + """ |
| 304 | + with mock.patch("umapi_client.connection.requests.Session.post") as mock_post: |
| 305 | + mock_post.return_value = MockResponse(200, {"result": "success"}) |
| 306 | + conn = Connection(**mock_connection_params) |
| 307 | + |
| 308 | + group_prefix = "G" |
| 309 | + add_groups = [group_prefix+six.text_type(n+1) for n in range(0, 150)] |
| 310 | + user = UserAction( id_type=IdentityTypes. enterpriseID, email="[email protected]") |
| 311 | + user.add_to_groups(groups=add_groups, group_type=GroupTypes.usergroup) |
| 312 | + assert conn.execute_single(user, immediate=True) == (0, 2, 2) |
| 313 | + |
| 314 | + |
| 315 | +def test_group_size_limit(): |
| 316 | + """ |
| 317 | + Test with different 'throttle_groups' value, which governs the max size of the group list before commands are split |
| 318 | + :return: |
| 319 | + """ |
| 320 | + with mock.patch("umapi_client.connection.requests.Session.post") as mock_post: |
| 321 | + mock_post.return_value = MockResponse(200, {"result": "success"}) |
| 322 | + params = mock_connection_params |
| 323 | + params['throttle_groups'] = 5 |
| 324 | + conn = Connection(**params) |
| 325 | + |
| 326 | + group_prefix = "G" |
| 327 | + add_groups = [group_prefix+six.text_type(n+1) for n in range(0, 150)] |
| 328 | + user = UserAction( id_type=IdentityTypes. enterpriseID, email="[email protected]") |
| 329 | + user.add_to_groups(groups=add_groups, group_type=GroupTypes.usergroup) |
| 330 | + assert conn.execute_single(user, immediate=True) == (0, 3, 3) |
| 331 | + |
| 332 | + |
| 333 | +def test_split_add_user(): |
| 334 | + """ |
| 335 | + Make sure split doesn't do anything when we have a non-add/remove group action |
| 336 | + :return: |
| 337 | + """ |
| 338 | + user = UserAction( id_type=IdentityTypes. enterpriseID, email="[email protected]") |
| 339 | + user. create( first_name="Example", last_name="User", country="US", email="[email protected]") |
| 340 | + user.update(first_name="EXAMPLE") |
| 341 | + assert user.maybe_split_groups(10) is False |
| 342 | + assert len(user.commands) == 2 |
| 343 | + assert user.wire_dict() == {'do': [{'createEnterpriseID': {'country': 'US', |
| 344 | + |
| 345 | + 'firstname': 'Example', |
| 346 | + 'lastname': 'User', |
| 347 | + 'option': 'ignoreIfAlreadyExists'}}, |
| 348 | + {'update': {'firstname': 'EXAMPLE'}}], |
| 349 | + |
| 350 | + |
| 351 | + |
| 352 | +def test_split_role_assignment(): |
| 353 | + group_prefix = "G" |
| 354 | + add_groups = [group_prefix+six.text_type(n+1) for n in range(0, 25)] |
| 355 | + user = UserAction( id_type=IdentityTypes. enterpriseID, email="[email protected]") |
| 356 | + user.add_role(groups=add_groups, role_type=RoleTypes.admin) |
| 357 | + assert user.maybe_split_groups(10) is True |
| 358 | + assert len(user.commands) == 3 |
| 359 | + |
| 360 | + |
| 361 | +def test_no_group_split(): |
| 362 | + """ |
| 363 | + maybe_split should return false if nothing was split |
| 364 | + :return: |
| 365 | + """ |
| 366 | + group_prefix = "G" |
| 367 | + add_groups = [group_prefix+six.text_type(n+1) for n in range(0, 5)] |
| 368 | + user = UserAction( id_type=IdentityTypes. enterpriseID, email="[email protected]") |
| 369 | + user.add_to_groups(groups=add_groups, group_type=GroupTypes.usergroup) |
| 370 | + assert user.maybe_split_groups(10) is False |
| 371 | + assert len(user.commands) == 1 |
| 372 | + |
| 373 | + |
| 374 | +def test_complex_group_split(): |
| 375 | + """ |
| 376 | + Test a complex command with add and remove directive, with multiple group types |
| 377 | + UserAction's interface doesn't support this, so we build our own command array |
| 378 | + :return: |
| 379 | + """ |
| 380 | + group_prefix = "G" |
| 381 | + add_groups = [group_prefix+six.text_type(n+1) for n in range(0, 150)] |
| 382 | + add_products = [group_prefix+six.text_type(n+1) for n in range(0, 26)] |
| 383 | + user = UserAction( id_type=IdentityTypes. enterpriseID, email="[email protected]") |
| 384 | + user.commands = [{ |
| 385 | + "add": { |
| 386 | + GroupTypes.usergroup.name: add_groups, |
| 387 | + GroupTypes.product.name: add_products, |
| 388 | + }, |
| 389 | + }] |
| 390 | + assert user.maybe_split_groups(10) is True |
| 391 | + assert len(user.commands) == 15 |
| 392 | + assert len([c for c in user.commands if 'product' in c['add']]) == 3 |
| 393 | + assert GroupTypes.product.name not in user.commands[3]['add'] |
| 394 | + |
| 395 | + |
| 396 | +def test_split_remove_all(): |
| 397 | + """ |
| 398 | + Don't split groups if "remove" is "all" instead of list |
| 399 | + :return: |
| 400 | + """ |
| 401 | + group_prefix = "G" |
| 402 | + add_groups = [group_prefix+six.text_type(n+1) for n in range(0, 11)] |
| 403 | + user = UserAction( id_type=IdentityTypes. enterpriseID, email="[email protected]") |
| 404 | + user.remove_from_groups(all_groups=True) |
| 405 | + assert user.maybe_split_groups(1) is False |
| 406 | + assert user. wire_dict() == { 'do': [{ 'remove': 'all'}], 'user': '[email protected]'} |
| 407 | + user.add_to_groups(groups=add_groups) |
| 408 | + assert user.maybe_split_groups(10) is True |
| 409 | + assert user.wire_dict() == {'do': [{'remove': 'all'}, |
| 410 | + {'add': {'product': ['G1', |
| 411 | + 'G2', |
| 412 | + 'G3', |
| 413 | + 'G4', |
| 414 | + 'G5', |
| 415 | + 'G6', |
| 416 | + 'G7', |
| 417 | + 'G8', |
| 418 | + 'G9', |
| 419 | + 'G10']}}, |
| 420 | + {'add': {'product': ['G11']}}], |
| 421 | + |
0 commit comments