|
2 | 2 | from collections import OrderedDict
|
3 | 3 |
|
4 | 4 | import pytest
|
| 5 | +from numpy import NaN |
5 | 6 | from pandas import DataFrame
|
6 | 7 |
|
7 | 8 | import code42cli.output_formats as output_formats_module
|
8 | 9 | from code42cli.maps import FILE_EVENT_TO_SIGNATURE_ID_MAP
|
| 10 | +from code42cli.output_formats import DataFrameOutputFormatter |
9 | 11 | from code42cli.output_formats import FileEventsOutputFormat
|
10 | 12 | from code42cli.output_formats import FileEventsOutputFormatter
|
| 13 | +from code42cli.output_formats import OutputFormat |
11 | 14 | from code42cli.output_formats import to_cef
|
12 | 15 |
|
13 |
| - |
14 | 16 | TEST_DATA = [
|
15 | 17 | {
|
16 | 18 | "type$": "RULE_METADATA",
|
@@ -771,53 +773,61 @@ def test_security_data_output_format_has_expected_options():
|
771 | 773 |
|
772 | 774 |
|
773 | 775 | class TestDataFrameOutputFormatter:
|
774 |
| - def test_init_sets_format_func_to_formatted_json_function_when_json_format_option_is_passed( |
775 |
| - self, mock_dataframe_to_json |
776 |
| - ): |
777 |
| - output_format = output_formats_module.OutputFormat.RAW |
778 |
| - formatter = output_formats_module.DataFrameOutputFormatter(output_format) |
779 |
| - formatter.echo_formatted_dataframe(TEST_DATAFRAME) |
780 |
| - mock_dataframe_to_json.assert_called_once_with( |
781 |
| - TEST_DATAFRAME, |
782 |
| - orient="records", |
783 |
| - lines=False, |
784 |
| - index=True, |
785 |
| - default_handler=str, |
| 776 | + test_df = DataFrame( |
| 777 | + [ |
| 778 | + {"string_column": "string1", "int_column": 42, "null_column": None}, |
| 779 | + {"string_column": "string2", "int_column": 43, "null_column": NaN}, |
| 780 | + ] |
| 781 | + ) |
| 782 | + |
| 783 | + def test_format_when_none_passed_defaults_to_table(self): |
| 784 | + formatter = DataFrameOutputFormatter(output_format=None) |
| 785 | + assert formatter.output_format == OutputFormat.TABLE |
| 786 | + |
| 787 | + def test_format_when_unknown_format_raises_value_error(self): |
| 788 | + with pytest.raises(ValueError): |
| 789 | + formatter = DataFrameOutputFormatter("NOT_A_FORMAT") |
| 790 | + formatter.get_formatted_output(self.test_df) |
| 791 | + |
| 792 | + def test_json_formatter_converts_to_expected_string(self): |
| 793 | + formatter = DataFrameOutputFormatter(OutputFormat.JSON) |
| 794 | + output = formatter.get_formatted_output(self.test_df) |
| 795 | + assert ( |
| 796 | + output |
| 797 | + == '{"string_column":"string1","int_column":42,"null_column":null}\n{"string_column":"string2","int_column":43,"null_column":null}' |
786 | 798 | )
|
787 | 799 |
|
788 |
| - def test_init_sets_format_func_to_json_function_when_raw_json_format_option_is_passed( |
789 |
| - self, mock_dataframe_to_json |
790 |
| - ): |
791 |
| - output_format = output_formats_module.OutputFormat.JSON |
792 |
| - formatter = output_formats_module.DataFrameOutputFormatter(output_format) |
793 |
| - formatter.echo_formatted_dataframe(TEST_DATAFRAME) |
794 |
| - mock_dataframe_to_json.assert_called_once_with( |
795 |
| - TEST_DATAFRAME, |
796 |
| - orient="records", |
797 |
| - lines=True, |
798 |
| - index=True, |
799 |
| - default_handler=str, |
| 800 | + def test_raw_formatter_converts_to_expected_string(self): |
| 801 | + formatter = DataFrameOutputFormatter(OutputFormat.RAW) |
| 802 | + output = formatter.get_formatted_output(self.test_df) |
| 803 | + assert ( |
| 804 | + output |
| 805 | + == '[{"string_column":"string1","int_column":42,"null_column":null},{"string_column":"string2","int_column":43,"null_column":null}]' |
800 | 806 | )
|
801 | 807 |
|
802 |
| - def test_init_sets_format_func_to_table_function_when_table_format_option_is_passed( |
803 |
| - self, mock_dataframe_to_string |
804 |
| - ): |
805 |
| - output_format = output_formats_module.OutputFormat.TABLE |
806 |
| - formatter = output_formats_module.DataFrameOutputFormatter(output_format) |
807 |
| - formatter.echo_formatted_dataframe(TEST_DATAFRAME) |
808 |
| - mock_dataframe_to_string.assert_called_once_with(TEST_DATAFRAME, index=False) |
| 808 | + def test_csv_formatter_converts_to_expected_string(self): |
| 809 | + formatter = DataFrameOutputFormatter(OutputFormat.CSV) |
| 810 | + output = formatter.get_formatted_output(self.test_df) |
| 811 | + assert ( |
| 812 | + output == "string_column,int_column,null_column\nstring1,42,\nstring2,43,\n" |
| 813 | + ) |
809 | 814 |
|
810 |
| - def test_init_sets_format_func_to_csv_function_when_csv_format_option_is_passed( |
811 |
| - self, mock_dataframe_to_csv |
812 |
| - ): |
813 |
| - output_format = output_formats_module.OutputFormat.CSV |
814 |
| - formatter = output_formats_module.DataFrameOutputFormatter(output_format) |
815 |
| - formatter.echo_formatted_dataframe(TEST_DATAFRAME) |
816 |
| - mock_dataframe_to_csv.assert_called_once_with(TEST_DATAFRAME, index=False) |
| 815 | + def test_table_formatter_converts_to_expected_string(self): |
| 816 | + formatter = DataFrameOutputFormatter(OutputFormat.TABLE) |
| 817 | + output = formatter.get_formatted_output(self.test_df) |
| 818 | + assert output == ( |
| 819 | + "string_column int_column null_column\n" |
| 820 | + " string1 42 \n" |
| 821 | + " string2 43 " |
| 822 | + ) |
817 | 823 |
|
818 |
| - def test_init_sets_format_func_to_table_function_when_no_format_option_is_passed( |
819 |
| - self, mock_dataframe_to_string |
820 |
| - ): |
821 |
| - formatter = output_formats_module.DataFrameOutputFormatter(None) |
822 |
| - formatter.echo_formatted_dataframe(TEST_DATAFRAME) |
823 |
| - mock_dataframe_to_string.assert_called_once_with(TEST_DATAFRAME, index=False) |
| 824 | + def test_echo_formatted_dataframe_uses_pager_when_gt_10_rows(self, mocker): |
| 825 | + mock_echo = mocker.patch("click.echo") |
| 826 | + mock_pager = mocker.patch("click.echo_via_pager") |
| 827 | + formatter = DataFrameOutputFormatter(OutputFormat.TABLE) |
| 828 | + big_df = DataFrame([{"column": val} for val in range(11)]) |
| 829 | + small_df = DataFrame([{"column": val} for val in range(5)]) |
| 830 | + formatter.echo_formatted_dataframe(big_df) |
| 831 | + formatter.echo_formatted_dataframe(small_df) |
| 832 | + assert mock_echo.call_count == 1 |
| 833 | + assert mock_pager.call_count == 1 |
0 commit comments