Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions contentcuration/contentcuration/tests/test_gcs_storage.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
from google.cloud.storage.blob import Blob
from mixer.main import mixer

from contentcuration.utils.files import hex_to_base64
from contentcuration.utils.gcs_storage import CompositeGCS
from contentcuration.utils.gcs_storage import GoogleCloudStorage

Expand Down Expand Up @@ -232,3 +233,21 @@ def test_get_created_time(self):
self.storage.get_created_time("blob"),
self.blob_cls.return_value.time_created,
)

def test_get_stored_object_md5(self):
mock_blob = self.blob_cls("blob", "blob")
mock_blob.md5_hash = hex_to_base64("d41d8cd98f00b204e9800998ecf8427e")
self.mock_default_bucket.get_blob.return_value = mock_blob
self.assertEqual(
self.storage.get_stored_object_md5("blob"),
"d41d8cd98f00b204e9800998ecf8427e",
)

def test_get_stored_object_md5__returns_none_if_not_found(self):
# Regression: a not-yet-uploaded object is in no backend, so
# _get_readable_backend raises FileNotFoundError. get_stored_object_md5
# must swallow that and return None (else the resumable upload_url
# endpoint 500s on every new file), not propagate the error.
self.mock_default_bucket.get_blob.return_value = None
self.mock_anon_bucket.get_blob.return_value = None
self.assertIsNone(self.storage.get_stored_object_md5("blob"))
9 changes: 8 additions & 1 deletion contentcuration/contentcuration/utils/gcs_storage.py
Original file line number Diff line number Diff line change
Expand Up @@ -302,4 +302,11 @@ def create_resumable_upload_session(self, name, md5_b64, size):
)

def get_stored_object_md5(self, name):
return self._get_readable_backend(name).get_stored_object_md5(name)
# A not-yet-uploaded object exists in no backend; treat that as "no
# stored md5" (None) rather than raising, matching
# GoogleCloudStorage.get_stored_object_md5 for a missing blob.
try:
backend = self._get_readable_backend(name)
except FileNotFoundError:
return None
return backend.get_stored_object_md5(name)
Loading