|
| 1 | +import json |
1 | 2 | from datetime import date
|
2 | 3 |
|
| 4 | +import numpy as np |
3 | 5 | import pytest
|
4 | 6 | from pandas import DataFrame
|
| 7 | +from pandas import Series |
| 8 | +from pandas._testing import assert_frame_equal |
| 9 | +from pandas._testing import assert_series_equal |
5 | 10 | from py42.exceptions import Py42BadRequestError
|
6 | 11 | from py42.exceptions import Py42ForbiddenError
|
7 | 12 | from py42.exceptions import Py42NotFoundError
|
|
10 | 15 |
|
11 | 16 | from code42cli import PRODUCT_NAME
|
12 | 17 | from code42cli.cmds.devices import _add_backup_set_settings_to_dataframe
|
| 18 | +from code42cli.cmds.devices import _add_legal_hold_membership_to_device_dataframe |
13 | 19 | from code42cli.cmds.devices import _add_usernames_to_device_dataframe
|
| 20 | +from code42cli.cmds.devices import _break_backup_usage_into_total_storage |
14 | 21 | from code42cli.cmds.devices import _get_device_dataframe
|
15 | 22 | from code42cli.main import cli
|
16 | 23 |
|
|
76 | 83 | "836476656572622471","serverName":"cif-sea","serverHostName":"https://cif-sea.crashplan.com",
|
77 | 84 | "isProvider":false,"archiveGuid":"843293524842941560","archiveFormat":"ARCHIVE_V1","activity":
|
78 | 85 | {"connected":false,"backingUp":false,"restoring":false,"timeRemainingInMs":0,
|
79 |
| -"remainingFiles":0,"remainingBytes":0}}]}}""" |
| 86 | +"remainingFiles":0,"remainingBytes":0}},{"targetComputerParentId":null,"targetComputerParentGuid": |
| 87 | +null,"targetComputerGuid":"43","targetComputerName":"PROe Cloud, US","targetComputerOsName":null, |
| 88 | +"targetComputerType":"SERVER","selectedFiles":1599,"selectedBytes":1529420143,"todoFiles":0, |
| 89 | +"todoBytes":0,"archiveBytes":56848550,"billableBytes":1529420143,"sendRateAverage":0, |
| 90 | +"completionRateAverage":0,"lastBackup":"2019-12-02T09:34:28.364-06:00","lastCompletedBackup": |
| 91 | +"2019-12-02T09:34:28.364-06:00","lastConnected":"2019-12-02T11:02:36.108-06:00","lastMaintenanceDate": |
| 92 | +"2021-02-16T07:01:11.697-06:00","lastCompactDate":"2021-02-16T07:01:11.694-06:00","modificationDate": |
| 93 | +"2021-02-17T04:57:27.222-06:00","creationDate":"2019-09-26T15:27:38.806-05:00","using":true, |
| 94 | +"alertState":16,"alertStates":["CriticalBackupAlert"],"percentComplete":100.0,"storePointId":10989, |
| 95 | +"storePointName":"fsa-iad-2","serverId":160024121,"serverGuid":"883282371081742804","serverName": |
| 96 | +"fsa-iad","serverHostName":"https://web-fsa-iad.crashplan.com","isProvider":false,"archiveGuid": |
| 97 | +"92077743916530001","archiveFormat":"ARCHIVE_V1","activity":{"connected":false,"backingUp":false, |
| 98 | +"restoring":false,"timeRemainingInMs":0,"remainingFiles":0,"remainingBytes":0}}]}}""" |
80 | 99 | TEST_EMPTY_BACKUPUSAGE_RESPONSE = """{"metadata":{"timestamp":"2020-10-13T12:51:28.410Z","params":
|
81 | 100 | {"incBackupUsage":"True","idType":"guid"}},"data":{"computerId":1767,"name":"SNWINTEST1",
|
82 | 101 | "osHostname":"UNKNOWN","guid":"843290890230648046","type":"COMPUTER","status":"Active",
|
|
221 | 240 | },
|
222 | 241 | ],
|
223 | 242 | }
|
| 243 | +MATTER_RESPONSE = { |
| 244 | + "legalHolds": [ |
| 245 | + { |
| 246 | + "legalHoldUid": "123456789", |
| 247 | + "name": "Test legal hold matter", |
| 248 | + "description": "", |
| 249 | + "notes": None, |
| 250 | + "holdExtRef": None, |
| 251 | + "active": True, |
| 252 | + "creationDate": "2020-08-05T10:49:58.353-05:00", |
| 253 | + "lastModified": "2020-08-05T10:49:58.358-05:00", |
| 254 | + "creator": { |
| 255 | + "userUid": "12345", |
| 256 | + "username": "user@code42.com", |
| 257 | + "email": "user@code42.com", |
| 258 | + "userExtRef": None, |
| 259 | + }, |
| 260 | + "holdPolicyUid": "966191295667423997", |
| 261 | + }, |
| 262 | + { |
| 263 | + "legalHoldUid": "987654321", |
| 264 | + "name": "Another Matter", |
| 265 | + "description": "", |
| 266 | + "notes": None, |
| 267 | + "holdExtRef": None, |
| 268 | + "active": True, |
| 269 | + "creationDate": "2020-05-20T15:58:31.375-05:00", |
| 270 | + "lastModified": "2020-05-28T13:49:16.098-05:00", |
| 271 | + "creator": { |
| 272 | + "userUid": "76543", |
| 273 | + "username": "user2@code42.com", |
| 274 | + "email": "user2@code42.com", |
| 275 | + "userExtRef": None, |
| 276 | + }, |
| 277 | + "holdPolicyUid": "946178665645035826", |
| 278 | + }, |
| 279 | + ] |
| 280 | +} |
| 281 | +ALL_CUSTODIANS_RESPONSE = { |
| 282 | + "legalHoldMemberships": [ |
| 283 | + { |
| 284 | + "legalHoldMembershipUid": "99999", |
| 285 | + "active": True, |
| 286 | + "creationDate": "2020-07-16T08:50:23.405Z", |
| 287 | + "legalHold": { |
| 288 | + "legalHoldUid": "123456789", |
| 289 | + "name": "Test legal hold matter", |
| 290 | + }, |
| 291 | + "user": { |
| 292 | + "userUid": "840103986007089121", |
| 293 | + "username": "ttranda_deactivated@ttrantest.com", |
| 294 | + "email": "ttranda_deactivated@ttrantest.com", |
| 295 | + "userExtRef": None, |
| 296 | + }, |
| 297 | + }, |
| 298 | + { |
| 299 | + "legalHoldMembershipUid": "88888", |
| 300 | + "active": True, |
| 301 | + "creationDate": "2020-07-16T08:50:23.405Z", |
| 302 | + "legalHold": {"legalHoldUid": "987654321", "name": "Another Matter"}, |
| 303 | + "user": { |
| 304 | + "userUid": "840103986007089121", |
| 305 | + "username": "ttranda_deactivated@ttrantest.com", |
| 306 | + "email": "ttranda_deactivated@ttrantest.com", |
| 307 | + "userExtRef": None, |
| 308 | + }, |
| 309 | + }, |
| 310 | + ] |
| 311 | +} |
224 | 312 |
|
225 | 313 |
|
226 | 314 | def _create_py42_response(mocker, text):
|
@@ -274,6 +362,14 @@ def users_list_generator():
|
274 | 362 | yield TEST_USERS_LIST_PAGE
|
275 | 363 |
|
276 | 364 |
|
| 365 | +def matter_list_generator(): |
| 366 | + yield MATTER_RESPONSE |
| 367 | + |
| 368 | + |
| 369 | +def custodian_list_generator(): |
| 370 | + yield ALL_CUSTODIANS_RESPONSE |
| 371 | + |
| 372 | + |
277 | 373 | @pytest.fixture
|
278 | 374 | def backupusage_response(mocker):
|
279 | 375 | return _create_py42_response(mocker, TEST_BACKUPUSAGE_RESPONSE)
|
@@ -356,6 +452,18 @@ def get_all_users_success(cli_state):
|
356 | 452 | cli_state.sdk.users.get_all.return_value = users_list_generator()
|
357 | 453 |
|
358 | 454 |
|
| 455 | +@pytest.fixture |
| 456 | +def get_all_matter_success(cli_state): |
| 457 | + cli_state.sdk.legalhold.get_all_matters.return_value = matter_list_generator() |
| 458 | + |
| 459 | + |
| 460 | +@pytest.fixture |
| 461 | +def get_all_custodian_success(cli_state): |
| 462 | + cli_state.sdk.legalhold.get_all_matter_custodians.return_value = ( |
| 463 | + custodian_list_generator() |
| 464 | + ) |
| 465 | + |
| 466 | + |
359 | 467 | def test_deactivate_deactivates_device(
|
360 | 468 | runner, cli_state, deactivate_device_success, get_device_by_guid_success
|
361 | 469 | ):
|
@@ -558,6 +666,79 @@ def test_add_usernames_to_device_dataframe_adds_usernames_to_dataframe(
|
558 | 666 | assert "username" in result.columns
|
559 | 667 |
|
560 | 668 |
|
| 669 | +def test_add_legal_hold_membership_to_device_dataframe_adds_legal_hold_columns_to_dataframe( |
| 670 | + cli_state, get_all_matter_success, get_all_custodian_success |
| 671 | +): |
| 672 | + testdf = DataFrame.from_records( |
| 673 | + [ |
| 674 | + {"userUid": "840103986007089121", "status": "Active"}, |
| 675 | + {"userUid": "836473273124890369", "status": "Active, Deauthorized"}, |
| 676 | + ] |
| 677 | + ) |
| 678 | + result = _add_legal_hold_membership_to_device_dataframe(cli_state.sdk, testdf) |
| 679 | + assert "legalHoldUid" in result.columns |
| 680 | + assert "legalHoldName" in result.columns |
| 681 | + |
| 682 | + |
| 683 | +def test_list_include_legal_hold_membership_pops_legal_hold_if_device_deactivated( |
| 684 | + cli_state, get_all_matter_success, get_all_custodian_success |
| 685 | +): |
| 686 | + testdf = DataFrame.from_records( |
| 687 | + [ |
| 688 | + {"userUid": "840103986007089121", "status": "Deactivated"}, |
| 689 | + {"userUid": "840103986007089121", "status": "Active"}, |
| 690 | + ] |
| 691 | + ) |
| 692 | + |
| 693 | + testdf_result = DataFrame.from_records( |
| 694 | + [ |
| 695 | + { |
| 696 | + "userUid": "840103986007089121", |
| 697 | + "status": "Deactivated", |
| 698 | + "legalHoldUid": np.nan, |
| 699 | + "legalHoldName": np.nan, |
| 700 | + }, |
| 701 | + { |
| 702 | + "userUid": "840103986007089121", |
| 703 | + "status": "Active", |
| 704 | + "legalHoldUid": "123456789,987654321", |
| 705 | + "legalHoldName": "Test legal hold matter,Another Matter", |
| 706 | + }, |
| 707 | + ] |
| 708 | + ) |
| 709 | + result = _add_legal_hold_membership_to_device_dataframe(cli_state.sdk, testdf) |
| 710 | + |
| 711 | + assert_frame_equal(result, testdf_result) |
| 712 | + |
| 713 | + |
| 714 | +def test_list_include_legal_hold_membership_merges_in_and_concats_legal_hold_info( |
| 715 | + runner, |
| 716 | + cli_state, |
| 717 | + get_all_devices_success, |
| 718 | + get_all_custodian_success, |
| 719 | + get_all_matter_success, |
| 720 | +): |
| 721 | + result = runner.invoke( |
| 722 | + cli, ["devices", "list", "--include-legal-hold-membership"], obj=cli_state |
| 723 | + ) |
| 724 | + |
| 725 | + assert "Test legal hold matter,Another Matter" in result.output |
| 726 | + assert "123456789,987654321" in result.output |
| 727 | + |
| 728 | + |
| 729 | +def test_break_backup_usage_into_total_storage_correctly_calculates_values(): |
| 730 | + test_backupusage_cell = json.loads(TEST_BACKUPUSAGE_RESPONSE)["data"]["backupUsage"] |
| 731 | + result = _break_backup_usage_into_total_storage(test_backupusage_cell) |
| 732 | + |
| 733 | + test_empty_backupusage_cell = json.loads(TEST_EMPTY_BACKUPUSAGE_RESPONSE)["data"][ |
| 734 | + "backupUsage" |
| 735 | + ] |
| 736 | + empty_result = _break_backup_usage_into_total_storage(test_empty_backupusage_cell) |
| 737 | + |
| 738 | + assert_series_equal(result, Series([2, 56968051])) |
| 739 | + assert_series_equal(empty_result, Series([0, 0])) |
| 740 | + |
| 741 | + |
561 | 742 | def test_last_connected_after_filters_appropriate_results(
|
562 | 743 | cli_state, runner, get_all_devices_success
|
563 | 744 | ):
|
|
0 commit comments