From 5cd3883f9ba98f3e78a818988860da0071c9480b Mon Sep 17 00:00:00 2001 From: drebs Date: Sun, 10 Dec 2017 21:22:13 -0200 Subject: [bug] use namespace when uploading blobs --- src/leap/soledad/client/_db/blobs/__init__.py | 5 +++-- tests/blobs/test_blob_manager.py | 23 +++++++++++++++++++++++ tests/blobs/test_fs_backend.py | 13 +++++++++++++ 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/leap/soledad/client/_db/blobs/__init__.py b/src/leap/soledad/client/_db/blobs/__init__.py index 95814d46..4db7df6a 100644 --- a/src/leap/soledad/client/_db/blobs/__init__.py +++ b/src/leap/soledad/client/_db/blobs/__init__.py @@ -321,8 +321,9 @@ class BlobManager(BlobsSynchronizer): # In fact, some kind of pipe is needed here, where each write on db # handle gets forwarded into a write on the connection handle fd = yield self.local.get(blob_id, namespace=namespace) - yield self._encrypt_and_upload(blob_id, fd) - yield self.local.update_sync_status(blob_id, SyncStatus.SYNCED) + yield self._encrypt_and_upload(blob_id, fd, namespace=namespace) + yield self.local.update_sync_status(blob_id, SyncStatus.SYNCED, + namespace=namespace) def set_flags(self, blob_id, flags, namespace=''): """ diff --git a/tests/blobs/test_blob_manager.py b/tests/blobs/test_blob_manager.py index 76ebcd03..761ede44 100644 --- a/tests/blobs/test_blob_manager.py +++ b/tests/blobs/test_blob_manager.py @@ -81,6 +81,29 @@ class BlobManagerTestCase(unittest.TestCase): self.assertEquals(result.getvalue(), msg) self.assertTrue(self.manager._encrypt_and_upload.called) + @defer.inlineCallbacks + @pytest.mark.usefixtures("method_tmpdir") + def test_put_stores_on_local_db_with_namespace(self): + self.manager._encrypt_and_upload = Mock(return_value=None) + self.manager._download_and_decrypt = Mock(return_value=None) + msg, blob_id = "Hey Joe", uuid4().hex + doc = BlobDoc(BytesIO(msg), blob_id=blob_id) + + yield self.manager.put(doc, size=len(msg), namespace='custom') + self.assertTrue(self.manager._encrypt_and_upload.called) + + arg1, arg2 = self.manager._encrypt_and_upload.call_args[0] + kwargs = self.manager._encrypt_and_upload.call_args[1] + self.assertEquals(arg1, blob_id) + self.assertTrue(isinstance(arg2, BytesIO)) + self.assertEquals(kwargs, {'namespace': 'custom'}) + + result = yield self.manager.local.get(blob_id) + self.assertEquals(result, None) + + result = yield self.manager.local.get(blob_id, namespace='custom') + self.assertEquals(result.getvalue(), msg) + @defer.inlineCallbacks @pytest.mark.usefixtures("method_tmpdir") def test_put_local_only_doesnt_send_to_server(self): diff --git a/tests/blobs/test_fs_backend.py b/tests/blobs/test_fs_backend.py index 94b628c4..da328dab 100644 --- a/tests/blobs/test_fs_backend.py +++ b/tests/blobs/test_fs_backend.py @@ -214,3 +214,16 @@ class FilesystemBackendTestCase(unittest.TestCase): unlink_mock.assert_any_call(backend._get_path('user', 'blob_id', 'trash') + '.flags') + + @pytest.mark.usefixtures("method_tmpdir") + @defer.inlineCallbacks + def test_write_blob_using_namespace(self): + backend = _blobs.FilesystemBlobsBackend(blobs_path=self.tempdir) + request = DummyRequest(['']) + request.content = BytesIO('content') + yield backend.write_blob('user', 'blob_id', request, + namespace='custom') + default = yield backend.list_blobs('user', request) + custom = yield backend.list_blobs('user', request, namespace='custom') + self.assertEquals([], json.loads(default)) + self.assertEquals(['blob_id'], json.loads(custom)) -- cgit v1.2.3