from unittest import TestCase from unittest.mock import Mock, MagicMock from apollo_delphi_migration.s3 import RegexKeyMatcher, Bucket class RegexKeyMatcherTestCase(TestCase): def test_match_should_not_match_value(self): matcher = RegexKeyMatcher('[0-9]*') self.assertFalse(matcher.match('qwerty')) def test_match_should_match_value(self): matcher = RegexKeyMatcher('[0-9]*') self.assertTrue(matcher.match('12345678')) class BucketTestCase(TestCase): def setUp(self) -> None: self.__logger_mock = Mock() self.__s3_client_mock = Mock() self.__bucket = Bucket(self.__logger_mock, self.__s3_client_mock, 'bucket') self.__matcher = Mock() self.__paginator_mock = Mock() self.__s3_client_mock.get_paginator.return_value = self.__paginator_mock def test_find_all_should_return_empty_list_when_no_keys_found(self): self.__paginator_mock.paginate.side_effect = [[{ 'Contents': [] }]] self.assertEqual([], self.__bucket.find_all('prefix')) self.__s3_client_mock.get_paginator.assert_called_with('list_objects') self.__paginator_mock.paginate.assert_called_with(Bucket='bucket', Prefix='prefix') def test_find_all_should_return_empty_list_when_no_keys_match(self): self.__paginator_mock.paginate.side_effect = [[{ 'Contents': [ {'Key': 'key'} ] }]] self.__matcher.match = MagicMock(return_value=False) self.assertEqual([], self.__bucket.find_all('prefix', self.__matcher)) self.__s3_client_mock.get_paginator.assert_called_with('list_objects') self.__paginator_mock.paginate.assert_called_with(Bucket='bucket', Prefix='prefix') def test_find_all_should_return_all_keys_if_no_matcher_provided(self): self.__paginator_mock.paginate.side_effect = [[{ 'Contents': [ {'Key': 'key1'}, {'Key': 'key2'} ] }]] self.assertEqual(['key1', 'key2'], self.__bucket.find_all('prefix')) self.__s3_client_mock.get_paginator.assert_called_with('list_objects') self.__paginator_mock.paginate.assert_called_with(Bucket='bucket', Prefix='prefix') def test_find_all_should_return_matched_keys_only(self): self.__matcher.match.side_effect = lambda x: x == 'key2' self.__paginator_mock.paginate.side_effect = [[{ 'Contents': [ {'Key': 'key1'}, {'Key': 'key2'} ] }]] self.assertEqual(['key2'], self.__bucket.find_all('prefix', self.__matcher)) self.__s3_client_mock.get_paginator.assert_called_with('list_objects') self.__paginator_mock.paginate.assert_called_with(Bucket='bucket', Prefix='prefix') def test_find_all_should_return_all_keys(self): self.__paginator_mock.paginate.side_effect = [[{ 'Contents': [ {'Key': 'key1'} ] }, { 'Contents': [ {'Key': 'key2'} ] }]] self.assertEqual(['key1', 'key2'], self.__bucket.find_all('prefix', self.__matcher)) self.__s3_client_mock.get_paginator.assert_called_with('list_objects') self.__paginator_mock.paginate.assert_called_with(Bucket='bucket', Prefix='prefix') def test_copy_should_pass(self): self.__bucket.copy('src_key', 'dst_bucket', 'dst_key') self.__s3_client_mock.copy.assert_called_with(Bucket='dst_bucket', CopySource={'Bucket': 'bucket', 'Key': 'src_key'}, Key='dst_key')