"""Tests for file_loader.""" import datetime from unittest.mock import MagicMock from unittest.mock import patch import config from json_contract_file_import import file_loader from json_contract_file_import.constants.json_contract_file_import import \ DEFAULT_ENCODING from json_contract_file_import.entity_import_result import EntityImportResult from json_contract_file_import.file_loader import get_latest_file_version_info mock_datetime_now = datetime.datetime(1995, 5, 31, 9, 15, 10) mock_datetime_formatted = '19950531_091510' @patch('json_contract_file_import.connectors.s3.list_objects_metadata') def test_list_file_keys(mock_list_objects, mock_s3_response): """Test for list file keys with all json files.""" mock_list_objects.return_value = mock_s3_response files = file_loader.list_file_keys() assert ['file1.json', 'file2.json'] == files @patch('json_contract_file_import.connectors.s3.list_objects_metadata') def test_list_file_keys_with_not_json_files( mock_list_objects, mock_s3_response_with_not_json_files ): """Test for list file keys with not only json files.""" mock_list_objects.return_value = mock_s3_response_with_not_json_files files = file_loader.list_file_keys() assert ['file1.json'] == files @patch('json_contract_file_import.connectors.s3.list_objects_metadata') def test_list_file_keys_with_no_files( mock_list_objects, mock_s3_response_with_no_files ): """Test for list file keys without files.""" mock_list_objects.return_value = mock_s3_response_with_no_files files = file_loader.list_file_keys() assert [] == files @patch('json_contract_file_import.connectors.s3.list_objects_metadata') def test_list_file_keys_with_prefix( mock_list_objects, mock_s3_response_with_file_in_directory ): """Test for list file keys with file in a directory.""" mock_list_objects.return_value = mock_s3_response_with_file_in_directory files = file_loader.list_file_keys('test1/') mock_list_objects.assert_called_once_with(config.S3_BUCKET_NAME, 'test1/') assert ['test1/file1.json'] == files @patch('json_contract_file_import.connectors.s3.get_object') def test_get_file_content_bytes(mock_get_object): """Test get file content bytes.""" file_key = 'key' mock_file_body = MagicMock() mock_file_bytes = bytes('file content', DEFAULT_ENCODING) mock_get_object.return_value = { 'Body': mock_file_body } mock_file_body.read.return_value = mock_file_bytes file_bytes = file_loader.get_file_content_bytes(file_key) assert file_bytes == mock_file_bytes mock_get_object.assert_called_once_with(config.S3_BUCKET_NAME, file_key) @patch('json_contract_file_import.connectors.s3.get_object_versions') def test_get_latest_file_version_info( mock_get_object_versions, mock_s3_versions_response, ): """Test get latest file version.""" mock_get_object_versions.return_value = mock_s3_versions_response version_info = get_latest_file_version_info('file_key') assert version_info.latest_version_id == '3ungq_45pmZ3NnfpBOwwad4IwY0uNBMn' assert version_info.owner_display_name == 'devit' @patch('json_contract_file_import.connectors.s3.get_object_versions') def test_get_latest_file_version_when_empty_response( mock_get_object_versions, ): """Test get latest file version when empty response.""" mock_get_object_versions.return_value = {} version_info = get_latest_file_version_info('file_key') assert version_info is None @patch('json_contract_file_import.connectors.s3.copy_key') @patch('json_contract_file_import.connectors.s3.delete_key') def test_move_file_to_processed(mock_delete_key, mock_copy_key): """Test move file to processed.""" file_key = 'file_1.json' moved_file_key = file_loader.move_file_to_processed(file_key) assert moved_file_key == 'processed/file_1.json' mock_copy_key.assert_called_once_with(config.S3_BUCKET_NAME, file_key, 'processed/' + file_key) mock_delete_key.assert_called_once_with(config.S3_BUCKET_NAME, file_key) @patch('json_contract_file_import.file_loader.json') def test__convert_entity_import_results_to_json(mock_json): """Test convert entities import results to JSON.""" mock_dumps_return_value = '[{}]' mock_json.dumps.return_value = mock_dumps_return_value entity_import_result = EntityImportResult( EntityImportResult.ACCOUNT, '20', True, additional_info='additional_info' ) result = file_loader._convert_entity_import_results_to_json( [entity_import_result]) assert result == mock_dumps_return_value mock_json.dumps.assert_called_once_with([entity_import_result.__dict__]) @patch('json_contract_file_import.connectors.s3.create_object') @patch('json_contract_file_import.file_loader.datetime') @patch('json_contract_file_import.file_loader.json') def test_create_report_file(mock_json, mock_datetime, mock_create_object): """Test creation report file.""" file_key = 'file_1.json' entity_import_result = EntityImportResult( EntityImportResult.ACCOUNT, '111', True, additional_info='Some additional info' ) content = [entity_import_result] mock_datetime.datetime.now.return_value = mock_datetime_now expected_report_name = f'reports/{mock_datetime_formatted}_file_1.json' mock_json_dumps = 'mock_json_dumps' mock_json.dumps.return_value = mock_json_dumps report_file_name = file_loader.create_report_file(file_key, content) assert report_file_name == expected_report_name mock_json.dumps.assert_called_once_with([entity_import_result.__dict__]) mock_create_object.assert_called_once_with(config.S3_BUCKET_NAME, expected_report_name, mock_json_dumps) @patch('json_contract_file_import.file_loader.datetime') def test__build_report_file_name_root_file( mock_datetime, ): """Test build report file name when the file is in the root.""" file_key = 'file_1.json' mock_datetime.datetime.now.return_value = mock_datetime_now '20241210_235141' expected_report_name = f'reports/{mock_datetime_formatted}_file_1.json' result_file_name = file_loader._build_report_file_name(file_key) assert result_file_name == expected_report_name @patch('json_contract_file_import.file_loader.datetime') def test__build_report_file_name_when_file_in_directory( mock_datetime, ): """Test build report file name when the file is in the directory.""" file_key = 'directory/file_1.json' mock_datetime.datetime.now.return_value = mock_datetime_now expected_report_name = f'reports/{mock_datetime_formatted}_directory_file_1.json' result_file_name = file_loader._build_report_file_name(file_key) assert result_file_name == expected_report_name