Skip to content

Commit 24a5d18

Browse files
author
Juliya Smith
authored
Chore/Incorporate-update-user-custom-errors (#306)
1 parent 57bfdb2 commit 24a5d18

File tree

11 files changed

+128
-121
lines changed

11 files changed

+128
-121
lines changed

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
"keyrings.alt==3.2.0",
4040
"ipython>=7.16.1",
4141
"pandas>=1.1.3",
42-
"py42>=1.15.1",
42+
"py42>=1.16.0",
4343
],
4444
extras_require={
4545
"dev": [

src/code42cli/click_ext/groups.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@
88
from py42.exceptions import Py42DescriptionLimitExceededError
99
from py42.exceptions import Py42ForbiddenError
1010
from py42.exceptions import Py42HTTPError
11+
from py42.exceptions import Py42InvalidEmailError
12+
from py42.exceptions import Py42InvalidPasswordError
1113
from py42.exceptions import Py42InvalidRuleOperationError
14+
from py42.exceptions import Py42InvalidUsernameError
1215
from py42.exceptions import Py42LegalHoldNotFoundOrPermissionDeniedError
1316
from py42.exceptions import Py42UpdateClosedCaseError
1417
from py42.exceptions import Py42UserAlreadyAddedError
@@ -69,6 +72,9 @@ def invoke(self, ctx):
6972
Py42CaseAlreadyHasEventError,
7073
Py42UpdateClosedCaseError,
7174
Py42UsernameMustBeEmailError,
75+
Py42InvalidEmailError,
76+
Py42InvalidPasswordError,
77+
Py42InvalidUsernameError,
7278
) as err:
7379
self.logger.log_error(err)
7480
raise Code42CLIError(str(err))

tests/cmds/conftest.py

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
1+
import json
12
import json as json_module
23
import threading
34

45
import pytest
56
from py42.exceptions import Py42UserAlreadyAddedError
67
from py42.exceptions import Py42UserNotOnListError
7-
from py42.response import Py42Response
88
from py42.sdk import SDKClient
99
from requests import HTTPError
10-
from requests import Request
1110
from requests import Response
1211
from tests.conftest import convert_str_to_date
12+
from tests.conftest import create_mock_http_error
13+
from tests.conftest import create_mock_response
1314
from tests.conftest import TEST_ID
1415

1516
from code42cli.logger import CliLogger
@@ -20,12 +21,8 @@
2021

2122
def get_user_not_on_list_side_effect(mocker, list_name):
2223
def side_effect(*args, **kwargs):
23-
err = mocker.MagicMock(spec=HTTPError)
24-
resp = mocker.MagicMock(spec=Response)
25-
resp.text = "TEST_ERR"
26-
err.response = resp
27-
err.response.request = mocker.MagicMock(spec=Request)
28-
raise Py42UserNotOnListError(err, TEST_ID, list_name)
24+
mock_http_error = create_mock_http_error(mocker, data="TEST_ERR")
25+
raise Py42UserNotOnListError(mock_http_error, TEST_ID, list_name)
2926

3027
return side_effect
3128

@@ -114,12 +111,13 @@ def f(*args):
114111

115112

116113
def get_generator_for_get_all(mocker, mock_return_items):
117-
mock_return_items = mock_return_items or ""
114+
if not mock_return_items:
115+
mock_return_items = []
116+
elif not isinstance(mock_return_items, dict):
117+
mock_return_items = [json.loads(mock_return_items)]
118118

119119
def gen(*args, **kwargs):
120-
response = mocker.MagicMock(spec=Request)
121-
response.text = f'{{"items": [{mock_return_items}]}}'
122-
yield Py42Response(response)
120+
yield create_mock_response(mocker, data={"items": mock_return_items})
123121

124122
return gen
125123

tests/cmds/detectionlists/test_init.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
import pytest
2-
from py42.response import Py42Response
3-
from requests import Response
2+
from tests.conftest import create_mock_response
43

54
from code42cli.cmds.detectionlists import update_user
65

7-
86
MOCK_USER_ID = "USER-ID"
97
MOCK_USER_NAME = "[email protected]"
108
MOCK_ALIAS = "alias@example"
@@ -24,9 +22,7 @@
2422

2523
@pytest.fixture
2624
def user_response_with_cloud_aliases(mocker):
27-
response = mocker.MagicMock(spec=Response)
28-
response.text = MOCK_USER_PROFILE_RESPONSE
29-
return Py42Response(response)
25+
return create_mock_response(mocker, data=MOCK_USER_PROFILE_RESPONSE)
3026

3127

3228
@pytest.fixture

tests/cmds/search/test_extraction.py

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import pytest
22
from c42eventextractor.extractors import BaseExtractor
3-
from py42.response import Py42Response
4-
from requests import Response
3+
from tests.conftest import create_mock_response
54

65
from code42cli import errors
76
from code42cli.cmds.search.cursor_store import BaseCursorStore
@@ -10,7 +9,6 @@
109
from code42cli.cmds.search.extraction import try_get_default_header
1110
from code42cli.output_formats import OutputFormat
1211

13-
1412
key = "events"
1513

1614

@@ -59,10 +57,9 @@ def _get_timestamp_from_item(self, item):
5957
handlers = create_handlers(
6058
sdk, TestExtractor, cursor_store, "chk-name", formatter, force_pager=False
6159
)
62-
http_response = mocker.MagicMock(spec=Response)
6360
events = [{"property": "bar"}]
64-
http_response.text = f'{{"{key}": [{{"property": "bar"}}]}}'
65-
py42_response = Py42Response(http_response)
61+
data = f'{{"{key}": [{{"property": "bar"}}]}}'
62+
py42_response = create_mock_response(mocker, data=data)
6663
handlers.handle_response(py42_response)
6764
formatter.echo_formatted_list.assert_called_once_with(events, force_pager=False)
6865

@@ -82,9 +79,8 @@ def _get_timestamp_from_item(self, item):
8279
handlers = create_send_to_handlers(
8380
sdk, TestExtractor, cursor_store, "chk-name", event_extractor_logger
8481
)
85-
http_response = mocker.MagicMock(spec=Response)
8682
events = [{"property": "bar"}]
87-
http_response.text = f'{{"{key}": [{{"property": "bar"}}]}}'
88-
py42_response = Py42Response(http_response)
83+
data = f'{{"{key}": [{{"property": "bar"}}]}}'
84+
py42_response = create_mock_response(mocker, data=data)
8985
handlers.handle_response(py42_response)
9086
event_extractor_logger.info.assert_called_once_with(events[0])

tests/cmds/test_alert_rules.py

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,23 @@
1-
import json
21
import logging
32

43
import pytest
54
from py42.exceptions import Py42BadRequestError
65
from py42.exceptions import Py42InternalServerError
76
from py42.exceptions import Py42InvalidRuleOperationError
8-
from py42.response import Py42Response
97
from requests import HTTPError
108
from requests import Request
119
from requests import Response
10+
from tests.conftest import create_mock_http_error
11+
from tests.conftest import create_mock_response
1212

1313
from code42cli.main import cli
1414

1515
TEST_RULE_ID = "rule-id"
1616
TEST_USER_ID = "test-user-id"
1717
TEST_USERNAME = "[email protected]"
1818
TEST_SOURCE = "rule source"
19-
2019
TEST_EMPTY_RULE_RESPONSE = {"ruleMetadata": []}
21-
2220
ALERT_RULES_COMMAND = "alert-rules"
23-
2421
TEST_RULE_RESPONSE = {
2522
"ruleMetadata": [
2623
{
@@ -33,7 +30,6 @@
3330
}
3431
]
3532
}
36-
3733
TEST_GET_ALL_RESPONSE_EXFILTRATION = {
3834
"ruleMetadata": [
3935
{"observerRuleId": TEST_RULE_ID, "type": "FED_ENDPOINT_EXFILTRATION"}
@@ -51,30 +47,22 @@
5147

5248
def get_rule_not_found_side_effect(mocker):
5349
def side_effect(*args, **kwargs):
54-
response = mocker.MagicMock(spec=Response)
55-
response.text = json.dumps(TEST_EMPTY_RULE_RESPONSE)
56-
return Py42Response(response)
50+
return create_mock_response(mocker, data=TEST_EMPTY_RULE_RESPONSE)
5751

5852
return side_effect
5953

6054

6155
def get_user_not_on_alert_rule_side_effect(mocker):
6256
def side_effect(*args, **kwargs):
63-
err = mocker.MagicMock(spec=HTTPError)
64-
resp = mocker.MagicMock(spec=Response)
65-
resp.text = "TEST_ERR"
66-
err.response = resp
57+
err = create_mock_http_error(mocker, data="TEST_ERR", status=400)
6758
raise Py42BadRequestError(err)
6859

6960
return side_effect
7061

7162

7263
def create_invalid_rule_type_side_effect(mocker):
7364
def side_effect(*args, **kwargs):
74-
err = mocker.MagicMock(spec=HTTPError)
75-
resp = mocker.MagicMock(spec=Response)
76-
resp.text = "TEST_ERR"
77-
err.response = resp
65+
err = create_mock_http_error(mocker, data="TEST_ERR", status=400)
7866
raise Py42InvalidRuleOperationError(err, TEST_RULE_ID, TEST_SOURCE)
7967

8068
return side_effect

tests/cmds/test_alerts.py

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,11 @@
55
import pytest
66
from c42eventextractor.extractors import AlertExtractor
77
from py42.exceptions import Py42NotFoundError
8-
from py42.response import Py42Response
98
from py42.sdk.queries.alerts.filters import AlertState
10-
from requests import Response
119
from tests.cmds.conftest import filter_term_is_in_call_args
1210
from tests.cmds.conftest import get_filter_value_from_json
1311
from tests.cmds.conftest import get_mark_for_search_and_send_to
12+
from tests.conftest import create_mock_response
1413
from tests.conftest import get_test_date_str
1514

1615
from code42cli import errors
@@ -344,9 +343,7 @@ def send_to_logger_factory(mocker):
344343

345344
@pytest.fixture
346345
def full_alert_details_response(mocker):
347-
response = mocker.MagicMock(spec=Response)
348-
response.text = json.dumps(ALERT_DETAILS_FULL_RESPONSE)
349-
return Py42Response(response)
346+
return create_mock_response(mocker, data=ALERT_DETAILS_FULL_RESPONSE)
350347

351348

352349
@search_and_send_to_test
@@ -992,11 +989,11 @@ def test_show_when_alert_has_note_includes_note(
992989
def test_show_when_alert_has_no_note_excludes_note(
993990
mocker, cli_state, runner, full_alert_details_response
994991
):
995-
response = mocker.MagicMock(spec=Response)
996-
sans_note_text = dict(ALERT_DETAILS_FULL_RESPONSE)
997-
sans_note_text["alerts"][0]["note"] = None
998-
response.text = json.dumps(sans_note_text)
999-
cli_state.sdk.alerts.get_details.return_value = Py42Response(response)
992+
response_data = dict(ALERT_DETAILS_FULL_RESPONSE)
993+
response_data["alerts"][0]["note"] = None
994+
cli_state.sdk.alerts.get_details.return_value = create_mock_response(
995+
mocker, data=response_data
996+
)
1000997
result = runner.invoke(cli, ["alerts", "show", "TEST-ALERT-ID"], obj=cli_state)
1001998
# Note is included in `full_alert_details_response` initially.
1002999
assert "Note" not in result.output
@@ -1037,11 +1034,11 @@ def test_show_when_alert_has_observations_and_excludes_observations_does_not_out
10371034
def test_show_when_alert_does_not_have_observations_and_includes_observations_outputs_no_observations(
10381035
mocker, cli_state, runner
10391036
):
1040-
response = mocker.MagicMock(spec=Response)
1041-
response_text = dict(ALERT_DETAILS_FULL_RESPONSE)
1042-
response_text["alerts"][0]["observations"] = None
1043-
response.text = json.dumps(response_text)
1044-
cli_state.sdk.alerts.get_details.return_value = Py42Response(response)
1037+
response_data = dict(ALERT_DETAILS_FULL_RESPONSE)
1038+
response_data["alerts"][0]["observations"] = None
1039+
cli_state.sdk.alerts.get_details.return_value = create_mock_response(
1040+
mocker, data=response_data
1041+
)
10451042
result = runner.invoke(
10461043
cli,
10471044
["alerts", "show", "TEST-ALERT-ID", "--include-observations"],

tests/cmds/test_auditlogs.py

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -105,10 +105,10 @@ def send_to_logger(mocker, send_to_logger_factory):
105105
@pytest.fixture
106106
def mock_audit_log_response(mocker):
107107
response1 = create_mock_response(
108-
mocker, json.dumps({"events": TEST_EVENTS_WITH_SAME_TIMESTAMP})
108+
mocker, data={"events": TEST_EVENTS_WITH_SAME_TIMESTAMP}
109109
)
110110
response2 = create_mock_response(
111-
mocker, json.dumps({"events": TEST_EVENTS_WITH_DIFFERENT_TIMESTAMPS})
111+
mocker, data={"events": TEST_EVENTS_WITH_DIFFERENT_TIMESTAMPS}
112112
)
113113

114114
def response_gen():
@@ -120,10 +120,10 @@ def response_gen():
120120

121121
@pytest.fixture
122122
def mock_audit_log_response_with_10_records(mocker):
123-
text = json.dumps({"events": TEST_EVENTS_WITH_SAME_TIMESTAMP})
123+
data = json.dumps({"events": TEST_EVENTS_WITH_SAME_TIMESTAMP})
124124
responses = []
125125
for _ in range(0, 10):
126-
responses.append(create_mock_response(mocker, text))
126+
responses.append(create_mock_response(mocker, data=data))
127127

128128
def response_gen():
129129
yield from responses
@@ -133,10 +133,10 @@ def response_gen():
133133

134134
@pytest.fixture
135135
def mock_audit_log_response_with_only_same_timestamps(mocker):
136-
text = json.dumps({"events": TEST_EVENTS_WITH_SAME_TIMESTAMP})
136+
data = {"events": TEST_EVENTS_WITH_SAME_TIMESTAMP}
137137

138138
def response_gen():
139-
yield create_mock_response(mocker, text)
139+
yield create_mock_response(mocker, data=data)
140140

141141
return response_gen()
142142

@@ -146,10 +146,9 @@ def mock_audit_log_response_with_missing_ms_timestamp(mocker):
146146
event = dict(TEST_EVENTS_WITH_SAME_TIMESTAMP[0])
147147
event["timestamp"] = "2020-01-01T12:00:00Z"
148148
response_data = {"events": [event]}
149-
text = json.dumps(response_data)
150149

151150
def response_gen():
152-
yield create_mock_response(mocker, text)
151+
yield create_mock_response(mocker, data=response_data)
153152

154153
return response_gen()
155154

@@ -158,11 +157,9 @@ def response_gen():
158157
def mock_audit_log_response_with_micro_seconds(mocker):
159158
event = dict(TEST_EVENTS_WITH_SAME_TIMESTAMP[0])
160159
event["timestamp"] = "2021-07-01T14:47:13.093616Z"
161-
response_data = {"events": [event]}
162-
text = json.dumps(response_data)
163160

164161
def response_gen():
165-
yield create_mock_response(mocker, text)
162+
yield create_mock_response(mocker, data={"events": [event]})
166163

167164
return response_gen()
168165

@@ -171,11 +168,9 @@ def response_gen():
171168
def mock_audit_log_response_with_nano_seconds(mocker):
172169
event = dict(TEST_EVENTS_WITH_SAME_TIMESTAMP[0])
173170
event["timestamp"] = "2021-07-01T14:47:13.093616500Z"
174-
response_data = {"events": [event]}
175-
text = json.dumps(response_data)
176171

177172
def response_gen():
178-
yield create_mock_response(mocker, text)
173+
yield create_mock_response(mocker, data={"events": [event]})
179174

180175
return response_gen()
181176

@@ -185,13 +180,12 @@ def mock_audit_log_response_with_error_causing_timestamp(mocker):
185180
good_event = dict(TEST_EVENTS_WITH_SAME_TIMESTAMP[0])
186181
bad_event = dict(TEST_EVENTS_WITH_SAME_TIMESTAMP[0])
187182
bad_event["timestamp"] = "I AM NOT A TIMESTAMP" # Will cause a ValueError.
188-
response_data = {
189-
"events": [good_event, bad_event]
190-
} # good_event should still get processed.
191-
text = json.dumps(response_data)
183+
184+
# good_event should still get processed.
185+
response_data = {"events": [good_event, bad_event]}
192186

193187
def response_gen():
194-
yield create_mock_response(mocker, text)
188+
yield create_mock_response(mocker, data=response_data)
195189

196190
return response_gen()
197191

0 commit comments

Comments
 (0)