Skip to content

Commit eb6f7f6

Browse files
committed
Add tests for S3OptimizedUploadStorage
1 parent 10a1809 commit eb6f7f6

File tree

2 files changed

+57
-0
lines changed

2 files changed

+57
-0
lines changed

s3file/storages.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
from django.core.files.storage import FileSystemStorage, default_storage
99
from django.utils._os import safe_join
1010

11+
from s3file.storages_optimized import S3OptimizedUploadStorage
12+
1113

1214
class S3MockStorage(FileSystemStorage):
1315
@property
@@ -52,6 +54,24 @@ class bucket:
5254
name = "test-bucket"
5355

5456

57+
class S3OptimizedMockStorage(S3OptimizedUploadStorage):
58+
created_objects = {}
59+
60+
class bucket:
61+
name = "test-bucket"
62+
63+
class Object:
64+
def __init__(self, key):
65+
self.key = key
66+
self.copy_from_bucket = None
67+
self.copy_from_key = None
68+
S3OptimizedMockStorage.created_objects[self.key] = self
69+
70+
def copy(self, s3_object, ExtraArgs):
71+
self.copy_from_bucket = s3_object["Bucket"]
72+
self.copy_from_key = s3_object["Key"]
73+
74+
5575
local_dev = isinstance(default_storage, FileSystemStorage)
5676

5777
storage = default_storage if not local_dev else S3MockStorage()

tests/test_storages.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import pytest
2+
3+
from django.core.files.base import ContentFile
4+
5+
from s3file import storages
6+
7+
8+
class TestStorages:
9+
url = "/__s3_mock__/"
10+
11+
def test_post__save_optimized(self):
12+
storage = storages.S3OptimizedMockStorage()
13+
obj = storage.bucket.Object("tmp/s3file/s3_file.txt")
14+
15+
class Content:
16+
def __init__(self, obj):
17+
self.obj = obj
18+
19+
content = Content(obj)
20+
key = storage._save("tmp/s3file/s3_file_copied.txt", content)
21+
stored_object = storage.created_objects[
22+
"custom/location/tmp/s3file/s3_file_copied.txt"
23+
]
24+
25+
assert key == "tmp/s3file/s3_file_copied.txt"
26+
assert stored_object.copy_from_bucket == storage.bucket.name
27+
assert stored_object.copy_from_key == "tmp/s3file/s3_file.txt"
28+
29+
def test_post__save_optimized_fail(self):
30+
storage = storages.S3OptimizedMockStorage()
31+
32+
with pytest.raises(RuntimeError) as excinfo:
33+
storage._save("tmp/s3file/s3_file_copied.txt", ContentFile(b"s3file"))
34+
35+
assert "The content object must be a S3 object and contain a valid key." in str(
36+
excinfo.value
37+
)

0 commit comments

Comments
 (0)