Skip to content

Commit 683633f

Browse files
author
Juliya Smith
authored
Chore/agent str (#33)
1 parent d27f6db commit 683633f

16 files changed

Lines changed: 130 additions & 84 deletions

src/code42cli/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1+
PRODUCT_NAME = u"code42cli"

src/code42cli/cmds/securitydata/extraction.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
from code42cli.compat import str
1818
from code42cli.util import is_interactive, print_bold, print_error, print_to_stderr
1919

20+
2021
_EXCEPTIONS_OCCURRED = False
2122
_TOTAL_EVENTS = 0
2223

src/code42cli/main.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import platform
22
import sys
33

4+
from py42.sdk.settings import set_user_agent_suffix
5+
6+
from code42cli import PRODUCT_NAME
47
from code42cli.cmds import profile
58
from code42cli.cmds.detectionlists import main as dlmain
69
from code42cli.cmds.securitydata import main as secmain
@@ -19,6 +22,11 @@
1922
windll.kernel32.SetConsoleMode(c_int(stdout_handle), mode)
2023

2124

25+
# Sets part of the user agent string that py42 attaches to requests for the purposes of
26+
# identifying CLI users.
27+
set_user_agent_suffix(PRODUCT_NAME)
28+
29+
2230
def main():
2331
top = Command(u"", u"", subcommand_loader=_load_top_commands)
2432
invoker = CommandInvoker(top)

src/code42cli/password.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,9 @@
44

55
import keyring
66

7+
from code42cli import PRODUCT_NAME
78
from code42cli.util import does_user_agree
89

9-
_ROOT_SERVICE_NAME = u"code42cli"
10-
1110

1211
def get_stored_password(profile):
1312
"""Gets your currently stored password for the given profile name."""
@@ -31,7 +30,7 @@ def set_password(profile, new_password):
3130

3231

3332
def _get_keyring_service_name(profile_name):
34-
return u"{}::{}".format(_ROOT_SERVICE_NAME, profile_name)
33+
return u"{}::{}".format(PRODUCT_NAME, profile_name)
3534

3635

3736
def _prompt_for_alternative_store():
Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import pytest
22

3+
from code42cli import PRODUCT_NAME
34
from code42cli.cmds.detectionlists.high_risk import (
45
generate_csv_file,
56
add_high_risk_employee,
@@ -9,7 +10,16 @@
910

1011
@pytest.fixture
1112
def bulk_template_generator(mocker):
12-
return mocker.patch("code42cli.cmds.detectionlists.high_risk.generate_template")
13+
return mocker.patch("{}.cmds.detectionlists.high_risk.generate_template".format(PRODUCT_NAME))
14+
15+
16+
@pytest.fixture
17+
def bulk_processor_factory(mocker, bulk_processor):
18+
factory = mocker.patch(
19+
"{}.cmds.detectionlists.high_risk.create_bulk_processor".format(PRODUCT_NAME)
20+
)
21+
factory.return_value = bulk_processor
22+
return factory
1323

1424

1525
def test_generate_csv_file_generates_template(bulk_template_generator):
@@ -18,15 +28,11 @@ def test_generate_csv_file_generates_template(bulk_template_generator):
1828
bulk_template_generator.assert_called_once_with(add_high_risk_employee, path)
1929

2030

21-
def test_bulk_add_high_risk_employees_runs(mocker, bulk_processor, sdk, profile):
22-
factory = mocker.patch("code42cli.cmds.detectionlists.high_risk.create_bulk_processor")
23-
factory.return_value = bulk_processor
31+
def test_bulk_add_high_risk_employees_runs(sdk, profile, bulk_processor, bulk_processor_factory):
2432
bulk_add_high_risk_employees(sdk, profile, "")
2533
assert bulk_processor.run.call_count == 1
2634

2735

28-
def test_bulk_add_high_risk_employees_creates_processor(mocker, bulk_processor, sdk, profile):
29-
factory = mocker.patch("code42cli.cmds.detectionlists.high_risk.create_bulk_processor")
30-
factory.return_value = bulk_processor
36+
def test_bulk_add_high_risk_employees_creates_processor(sdk, profile, bulk_processor_factory):
3137
bulk_add_high_risk_employees(sdk, profile, "csv_test")
32-
assert factory.call_args[0][0] == "csv_test"
38+
assert bulk_processor_factory.call_args[0][0] == "csv_test"

tests/cmds/securitydata/conftest.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33

44
import pytest
55

6-
SECURITYDATA_NAMESPACE = "code42cli.cmds.securitydata"
6+
from code42cli import PRODUCT_NAME
7+
8+
SECURITYDATA_NAMESPACE = "{}.cmds.securitydata".format(PRODUCT_NAME)
79

810

911
def get_filter_value_from_json(json, filter_index):

tests/cmds/securitydata/test_cursor_store.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
from os import path
22

33
from c42eventextractor.extractors import INSERTION_TIMESTAMP_FIELD_NAME
4+
5+
from code42cli import PRODUCT_NAME
46
from code42cli.cmds.shared.cursor_store import BaseCursorStore, FileEventCursorStore
57

68

@@ -27,7 +29,9 @@ class TestFileEventCursorStore(object):
2729
def test_init_when_called_twice_with_different_profile_names_creates_two_rows(
2830
self, mocker, sqlite_connection
2931
):
30-
mock = mocker.patch("code42cli.cmds.shared.cursor_store.FileEventCursorStore._row_exists")
32+
mock = mocker.patch(
33+
"{}.cmds.shared.cursor_store.FileEventCursorStore._row_exists".format(PRODUCT_NAME)
34+
)
3135
mock.return_value = False
3236
spy = mocker.spy(FileEventCursorStore, "_insert_new_row")
3337
FileEventCursorStore("Profile A", self.MOCK_TEST_DB_NAME)

tests/cmds/securitydata/test_extraction.py

Lines changed: 48 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1-
import code42cli.cmds.securitydata.extraction as extraction_module
21
import pytest
3-
from code42cli.cmds.securitydata.enums import ExposureType as ExposureTypeOptions
2+
43
from py42.sdk import SDKClient
54
from py42.sdk.queries.fileevents.filters import *
65

6+
from code42cli import PRODUCT_NAME
7+
from code42cli.cmds.securitydata.enums import ExposureType as ExposureTypeOptions
8+
import code42cli.cmds.securitydata.extraction as extraction_module
79
from .conftest import (
810
SECURITYDATA_NAMESPACE,
911
begin_date_str,
@@ -34,6 +36,11 @@ def error_logger(mocker):
3436
return mocker.patch("{0}.extraction.get_error_logger".format(SECURITYDATA_NAMESPACE))
3537

3638

39+
@pytest.fixture
40+
def error_printer(mocker):
41+
return mocker.patch("{}.cmds.securitydata.extraction.print_error".format(PRODUCT_NAME))
42+
43+
3744
@pytest.fixture
3845
def extractor(mocker):
3946
mock = mocker.MagicMock()
@@ -50,6 +57,32 @@ def namespace_with_begin(namespace):
5057
return namespace
5158

5259

60+
@pytest.fixture
61+
def is_interactive_function(mocker):
62+
return mocker.patch("{}.cmds.securitydata.extraction.is_interactive".format(PRODUCT_NAME))
63+
64+
65+
@pytest.fixture
66+
def interactive_mode(is_interactive_function):
67+
is_interactive_function.return_value = True
68+
return is_interactive_function
69+
70+
71+
@pytest.fixture
72+
def non_interactive_mode(is_interactive_function):
73+
is_interactive_function.return_value = False
74+
return is_interactive_function
75+
76+
77+
@pytest.fixture
78+
def checkpoint(mocker):
79+
return mocker.patch(
80+
"{}.cmds.shared.cursor_store.FileEventCursorStore.get_stored_insertion_timestamp".format(
81+
PRODUCT_NAME
82+
)
83+
)
84+
85+
5386
def filter_term_is_in_call_args(extractor, term):
5487
arg_filters = extractor.extract.call_args[0]
5588
for f in arg_filters:
@@ -292,27 +325,21 @@ def test_extract_when_end_date_is_before_begin_date_causes_exit(
292325

293326

294327
def test_when_given_begin_date_past_90_days_and_is_incremental_and_a_stored_cursor_exists_and_not_given_end_date_does_not_use_any_event_timestamp_filter(
295-
mocker, sdk, profile, logger, namespace, extractor
328+
sdk, profile, logger, namespace, extractor, checkpoint
296329
):
297330
namespace.begin = "2019-01-01"
298331
namespace.incremental = True
299-
mock_checkpoint = mocker.patch(
300-
"code42cli.cmds.shared.cursor_store.FileEventCursorStore.get_stored_insertion_timestamp"
301-
)
302-
mock_checkpoint.return_value = 22624624
332+
checkpoint.return_value = 22624624
303333
extraction_module.extract(sdk, profile, logger, namespace)
304334
assert not filter_term_is_in_call_args(extractor, EventTimestamp._term)
305335

306336

307337
def test_when_given_begin_date_and_not_interactive_mode_and_cursor_exists_uses_begin_date(
308-
mocker, sdk, profile, logger, namespace, extractor
338+
sdk, profile, logger, namespace, extractor
309339
):
310340
namespace.begin = get_test_date_str(days_ago=1)
311341
namespace.incremental = False
312-
mock_checkpoint = mocker.patch(
313-
"code42cli.cmds.shared.cursor_store.FileEventCursorStore.get_stored_insertion_timestamp"
314-
)
315-
mock_checkpoint.return_value = 22624624
342+
checkpoint.return_value = 22624624
316343
extraction_module.extract(sdk, profile, logger, namespace)
317344

318345
actual_ts = get_filter_value_from_json(extractor.extract.call_args[0][0], filter_index=0)
@@ -322,14 +349,11 @@ def test_when_given_begin_date_and_not_interactive_mode_and_cursor_exists_uses_b
322349

323350

324351
def test_when_not_given_begin_date_and_is_incremental_but_no_stored_checkpoint_exists_causes_exit(
325-
mocker, sdk, profile, logger, namespace, extractor
352+
sdk, profile, logger, namespace, extractor
326353
):
327354
namespace.begin = None
328355
namespace.is_incremental = True
329-
mock_checkpoint = mocker.patch(
330-
"code42cli.cmds.shared.cursor_store.FileEventCursorStore.get_stored_insertion_timestamp"
331-
)
332-
mock_checkpoint.return_value = None
356+
checkpoint.return_value = None
333357
with pytest.raises(SystemExit):
334358
extraction_module.extract(sdk, profile, logger, namespace)
335359

@@ -492,42 +516,27 @@ def side_effect():
492516

493517

494518
def test_extract_when_global_variable_is_true_and_is_interactive_prints_error(
495-
mocker, sdk, profile, logger, namespace_with_begin, extractor
519+
sdk, profile, logger, namespace_with_begin, extractor, error_printer, interactive_mode
496520
):
497-
mock_error_printer = mocker.patch("code42cli.cmds.securitydata.extraction.print_error")
498-
mock_is_interactive_function = mocker.patch(
499-
"code42cli.cmds.securitydata.extraction.is_interactive"
500-
)
501-
mock_is_interactive_function.return_value = True
502521
extraction_module._EXCEPTIONS_OCCURRED = True
503522
extraction_module.extract(sdk, profile, logger, namespace_with_begin)
504-
assert mock_error_printer.call_count
523+
assert error_printer.call_count
505524

506525

507526
def test_extract_when_global_variable_is_true_and_not_is_interactive_does_not_print_error(
508-
mocker, sdk, profile, logger, namespace_with_begin, extractor
527+
sdk, profile, logger, namespace_with_begin, extractor, error_printer, non_interactive_mode
509528
):
510-
mock_error_printer = mocker.patch("code42cli.cmds.securitydata.extraction.print_error")
511-
mock_is_interactive_function = mocker.patch(
512-
"code42cli.cmds.securitydata.extraction.is_interactive"
513-
)
514-
mock_is_interactive_function.return_value = False
515529
extraction_module._EXCEPTIONS_OCCURRED = True
516530
extraction_module.extract(sdk, profile, logger, namespace_with_begin)
517-
assert not mock_error_printer.call_count
531+
assert not error_printer.call_count
518532

519533

520534
def test_extract_when_global_variable_is_false_and_is_interactive_does_not_print_error(
521-
mocker, sdk, profile, logger, namespace_with_begin, extractor
535+
sdk, profile, logger, namespace_with_begin, extractor, error_printer, interactive_mode
522536
):
523-
mock_error_printer = mocker.patch("code42cli.cmds.securitydata.extraction.print_error")
524-
mock_is_interactive_function = mocker.patch(
525-
"code42cli.cmds.securitydata.extraction.is_interactive"
526-
)
527-
mock_is_interactive_function.return_value = True
528537
extraction_module._EXCEPTIONS_OCCURRED = False
529538
extraction_module.extract(sdk, profile, logger, namespace_with_begin)
530-
assert not mock_error_printer.call_count
539+
assert not error_printer.call_count
531540

532541

533542
def test_when_sdk_raises_exception_global_variable_gets_set(
@@ -537,7 +546,7 @@ def test_when_sdk_raises_exception_global_variable_gets_set(
537546
mock_sdk = mocker.MagicMock()
538547

539548
# For ease
540-
mock = mocker.patch("code42cli.cmds.securitydata.extraction.is_interactive")
549+
mock = mocker.patch("{}.cmds.securitydata.extraction.is_interactive".format(PRODUCT_NAME))
541550
mock.return_value = False
542551

543552
def sdk_side_effect(self, *args):

tests/cmds/securitydata/test_main.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
1+
from code42cli import PRODUCT_NAME
12
import code42cli.cmds.securitydata.main as main
23
import pytest
34

45

56
@pytest.fixture
67
def mock_logger_factory(mocker):
7-
return mocker.patch("code42cli.cmds.securitydata.main.logger_factory")
8+
return mocker.patch("{}.cmds.securitydata.main.logger_factory".format(PRODUCT_NAME))
89

910

1011
@pytest.fixture
1112
def mock_extract(mocker):
12-
return mocker.patch("code42cli.cmds.securitydata.main.extract")
13+
return mocker.patch("{}.cmds.securitydata.main.extract".format(PRODUCT_NAME))
1314

1415

1516
def test_print_out(sdk, profile, namespace, mocker, mock_logger_factory, mock_extract):

tests/cmds/test_profile.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,38 @@
11
import code42cli.cmds.profile as profilecmd
22
import pytest
33

4+
from code42cli import PRODUCT_NAME
45
from ..conftest import create_mock_profile
56

67

78
@pytest.fixture
89
def user_agreement(mocker):
9-
mock = mocker.patch("code42cli.cmds.profile.does_user_agree")
10+
mock = mocker.patch("{}.cmds.profile.does_user_agree".format(PRODUCT_NAME))
1011
mock.return_value = True
1112
return mocker
1213

1314

1415
@pytest.fixture
1516
def user_disagreement(mocker):
16-
mock = mocker.patch("code42cli.cmds.profile.does_user_agree")
17+
mock = mocker.patch("{}.cmds.profile.does_user_agree".format(PRODUCT_NAME))
1718
mock.return_value = False
1819
return mocker
1920

2021

2122
@pytest.fixture
2223
def mock_cliprofile_namespace(mocker):
23-
return mocker.patch("code42cli.cmds.profile.cliprofile")
24+
return mocker.patch("{}.cmds.profile.cliprofile".format(PRODUCT_NAME))
2425

2526

2627
@pytest.fixture(autouse=True)
2728
def mock_getpass(mocker):
28-
mock = mocker.patch("code42cli.cmds.profile.getpass")
29+
mock = mocker.patch("{}.cmds.profile.getpass".format(PRODUCT_NAME))
2930
mock.return_value = "newpassword"
3031

3132

3233
@pytest.fixture
3334
def mock_verify(mocker):
34-
return mocker.patch("code42cli.cmds.profile.validate_connection")
35+
return mocker.patch("{}.cmds.profile.validate_connection".format(PRODUCT_NAME))
3536

3637

3738
@pytest.fixture

0 commit comments

Comments
 (0)