|
12 | 12 | # language governing permissions and limitations under the License.
|
13 | 13 | import os
|
14 | 14 |
|
| 15 | +from botocore.exceptions import ClientError |
15 | 16 | from s3transfer.manager import TransferManager
|
16 | 17 |
|
17 | 18 | from awscli.compat import queue
|
@@ -679,38 +680,39 @@ def test_submit_move_adds_delete_source_subscriber(self):
|
679 | 680 | for i, actual_subscriber in enumerate(actual_subscribers):
|
680 | 681 | self.assertIsInstance(actual_subscriber, ref_subscribers[i])
|
681 | 682 |
|
682 |
| - def test_submit_with_no_overwrite_flag_when_file_exists_at_destination( |
683 |
| - self, |
684 |
| - ): |
685 |
| - # Setting up the CLI params with no_overwrite flag as True |
| 683 | + def test_skip_download_when_no_overwrite_and_file_exists(self): |
| 684 | + """Testing warn_if_file_exists_with_no_overwrite handler when file exists at destination""" |
686 | 685 | self.cli_params['no_overwrite'] = True
|
687 | 686 | fileinfo = self.create_file_info(self.key)
|
688 |
| - # Mocking os.path.exists to simulate that file already exists |
689 | 687 | with mock.patch('os.path.exists', return_value=True):
|
690 |
| - # Submitting download request |
691 | 688 | future = self.transfer_request_submitter.submit(fileinfo)
|
692 |
| - # Asserting that the future is None, as the file already exists |
693 |
| - self.assertIsNone(future) |
694 |
| - # Asserting that no download happened |
695 |
| - self.assert_no_downloads_happened() |
696 | 689 |
|
697 |
| - def test_submit_with_no_overwrite_flag_when_file_does_not_exist_at_destination( |
698 |
| - self, |
699 |
| - ): |
700 |
| - # Setting up the CLI params with no_overwrite flag as True |
| 690 | + # Result Queue should be empty because it was specified to ignore no-overwrite warnings. |
| 691 | + self.assertTrue(self.result_queue.empty()) |
| 692 | + # The transfer should be skipped, so future should be None |
| 693 | + self.assertIsNone(future) |
| 694 | + self.assert_no_downloads_happened() |
| 695 | + |
| 696 | + def test_proceed_download_when_no_overwrite_and_file_not_exists(self): |
| 697 | + """Testing warn_if_file_exists_with_no_overwrite handler when file does not exist at destination""" |
701 | 698 | self.cli_params['no_overwrite'] = True
|
702 | 699 | fileinfo = self.create_file_info(self.key)
|
703 |
| - # Mocking os.path.exists to return False, to simulate that file does not exist |
704 | 700 | with mock.patch('os.path.exists', return_value=False):
|
705 |
| - # Submitting download request |
706 | 701 | future = self.transfer_request_submitter.submit(fileinfo)
|
707 |
| - # Asserting that the future is the same object returned by transfer_manager.download |
708 |
| - # This confirms that download was actually initiated |
709 |
| - self.assertIs(self.transfer_manager.download.return_value, future) |
710 |
| - # Asserting that download happened |
711 |
| - self.assertEqual( |
712 |
| - len(self.transfer_manager.download.call_args_list), 1 |
713 |
| - ) |
| 702 | + # The transfer should proceed, so future should be the transfer manager's return value |
| 703 | + self.assertIs(self.transfer_manager.download.return_value, future) |
| 704 | + # And download should have happened |
| 705 | + self.assertEqual(len(self.transfer_manager.download.call_args_list), 1) |
| 706 | + |
| 707 | + def test_warn_if_file_exists_without_no_overwrite_flag(self): |
| 708 | + self.cli_params['no_overwrite'] = False |
| 709 | + fileinfo = self.create_file_info(self.key) |
| 710 | + with mock.patch('os.path.exists', return_value=True): |
| 711 | + future = self.transfer_request_submitter.submit(fileinfo) |
| 712 | + # The transfer should proceed, so future should be the transfer manager's return value |
| 713 | + self.assertIs(self.transfer_manager.download.return_value, future) |
| 714 | + # And download should have happened |
| 715 | + self.assertEqual(len(self.transfer_manager.download.call_args_list), 1) |
714 | 716 |
|
715 | 717 |
|
716 | 718 | class TestCopyRequestSubmitter(BaseTransferRequestSubmitterTest):
|
@@ -957,6 +959,77 @@ def test_submit_move_adds_delete_source_subscriber(self):
|
957 | 959 | for i, actual_subscriber in enumerate(actual_subscribers):
|
958 | 960 | self.assertIsInstance(actual_subscriber, ref_subscribers[i])
|
959 | 961 |
|
| 962 | + def test_skip_copy_with_no_overwrite_and_zero_byte_file_exists(self): |
| 963 | + """Testing warn_if_zero_byte_file_exists_with_no_overwrite handler when zero byte exists""" |
| 964 | + self.cli_params['no_overwrite'] = True |
| 965 | + fileinfo = FileInfo( |
| 966 | + src=self.source_bucket + "/" + self.source_key, |
| 967 | + dest=self.bucket + "/" + self.key, |
| 968 | + operation_name='copy', |
| 969 | + size=0, |
| 970 | + source_client=mock.Mock(), |
| 971 | + ) |
| 972 | + fileinfo.source_client.head_object.return_value = {} |
| 973 | + future = self.transfer_request_submitter.submit(fileinfo) |
| 974 | + # The transfer should be skipped, so future should be None |
| 975 | + self.assertIsNone(future) |
| 976 | + # Result Queue should be empty because it was specified to ignore no-overwrite warnings. |
| 977 | + self.assertTrue(self.result_queue.empty()) |
| 978 | + self.assertEqual(len(self.transfer_manager.copy.call_args_list), 0) |
| 979 | + |
| 980 | + def test_proceed_copy_with_no_overwrite_and_zero_byte_file_does_not_exist( |
| 981 | + self, |
| 982 | + ): |
| 983 | + """Testing warn_if_zero_byte_file_exists_with_no_overwrite handler when zero byte does not exist""" |
| 984 | + self.cli_params['no_overwrite'] = True |
| 985 | + fileinfo = FileInfo( |
| 986 | + src=self.source_bucket + "/" + self.source_key, |
| 987 | + dest=self.bucket + "/" + self.key, |
| 988 | + operation_name='copy', |
| 989 | + size=0, |
| 990 | + source_client=mock.Mock(), |
| 991 | + ) |
| 992 | + fileinfo.source_client.head_object.side_effect = ClientError( |
| 993 | + {'Error': {'Code': '404', 'Message': 'Not Found'}}, |
| 994 | + 'HeadObject', |
| 995 | + ) |
| 996 | + future = self.transfer_request_submitter.submit(fileinfo) |
| 997 | + # The transfer should proceed, so future should be the transfer manager's return value |
| 998 | + self.assertIs(self.transfer_manager.copy.return_value, future) |
| 999 | + self.assertEqual(len(self.transfer_manager.copy.call_args_list), 1) |
| 1000 | + |
| 1001 | + def test_proceed_copy_with_no_overwrite_for_non_zero_byte_file(self): |
| 1002 | + self.cli_params['no_overwrite'] = True |
| 1003 | + fileinfo = FileInfo( |
| 1004 | + src=self.source_bucket + "/" + self.source_key, |
| 1005 | + dest=self.bucket + "/" + self.key, |
| 1006 | + operation_name='copy', |
| 1007 | + size=100, |
| 1008 | + source_client=mock.Mock(), |
| 1009 | + ) |
| 1010 | + future = self.transfer_request_submitter.submit(fileinfo) |
| 1011 | + # The transfer should proceed, so future should be the transfer manager's return value |
| 1012 | + self.assertIs(self.transfer_manager.copy.return_value, future) |
| 1013 | + self.assertEqual(len(self.transfer_manager.copy.call_args_list), 1) |
| 1014 | + # Head should not be called when no_overwrite is false |
| 1015 | + fileinfo.source_client.head_object.assert_not_called() |
| 1016 | + |
| 1017 | + def test_file_exists_without_no_overwrite(self): |
| 1018 | + self.cli_params['no_overwrite'] = False |
| 1019 | + fileinfo = FileInfo( |
| 1020 | + src=self.source_bucket + "/" + self.source_key, |
| 1021 | + dest=self.bucket + "/" + self.key, |
| 1022 | + operation_name='copy', |
| 1023 | + size=100, |
| 1024 | + source_client=mock.Mock(), |
| 1025 | + ) |
| 1026 | + future = self.transfer_request_submitter.submit(fileinfo) |
| 1027 | + # The transfer should proceed, so future should be the transfer manager's return value |
| 1028 | + self.assertIs(self.transfer_manager.copy.return_value, future) |
| 1029 | + self.assertEqual(len(self.transfer_manager.copy.call_args_list), 1) |
| 1030 | + # Head should not be called when no_overwrite is false |
| 1031 | + fileinfo.source_client.head_object.assert_not_called() |
| 1032 | + |
960 | 1033 |
|
961 | 1034 | class TestUploadStreamRequestSubmitter(BaseTransferRequestSubmitterTest):
|
962 | 1035 | def setUp(self):
|
|
0 commit comments