from unittest.mock import patch from src.utils import s3_backoff_utils as s3u def test_s3_key_exists_true(): with patch.object(s3u, 'head_object_backoff', return_value=None): assert s3u.s3_key_exists('key', 'bucket') is True def test_s3_key_exists_false(): from botocore.exceptions import ClientError # type: ignore err = ClientError({'Error': {'Code': '404'}}, 'HeadObject') with patch.object(s3u, 'head_object_backoff', side_effect=err): assert s3u.s3_key_exists('key', 'bucket') is False def test_filter_file_keys_keeps_txt_and_leaf_objects(monkeypatch): class Obj: def __init__(self, key): self.key = key fake = [ Obj('dir/'), Obj('dir/file.txt'), Obj('dir/file.csv'), Obj('file.txt'), ] class BucketObjects: def filter(self, Prefix=None): return fake class Bucket: def __init__(self, name): self.name = name self.objects = BucketObjects() monkeypatch.setattr( s3u, 's3_resource', type('SR', (), {'Bucket': lambda name: Bucket(name)}), ) out = s3u.filter_file_keys('dir', 'bucket', file_ext='.txt') # Both 'dir/file.txt' and 'file.txt' collapse to 'file.txt' leaf assert out == ['file.txt', 'file.txt']