def test_prevent_delete_bucket_by_mistake(self): info = self.db.put(BytesIO(b"content"), get_id()) id_mistake = None with self.assertRaises(ArgumentError): self.db.delete(id_mistake, mod.DEFAULT_BUCKET) # blobs in default bucket should not be deleted with self.db.get(info.identifier) as fh: self.assertEqual(fh.read(), b"content") self.assertTrue(self.db.delete(bucket=mod.DEFAULT_BUCKET))
def test_put_and_size(self): identifier = get_id() with patch_datadog() as stats: info = self.db.put(BytesIO(b"content"), identifier) size = len(b'content') self.assertEqual(sum(s for s in stats["commcare.blobs.added.count"]), 1) self.assertEqual(sum(s for s in stats["commcare.blobs.added.bytes"]), size) self.assertEqual(self.db.size(info.identifier), size)
def test_delete(self): bucket = "doc.4" info = self.db.put(StringIO(b"content"), get_id(), bucket=bucket) self.assertTrue(self.db.delete(info.identifier, bucket), 'delete failed') with self.assertRaises(mod.NotFound): self.db.get(info.identifier, bucket) return info, bucket
def test_put_with_timeout(self): info = self.db.put(BytesIO(b"content"), identifier=get_id(), timeout=60) with self.db.get(identifier=info.identifier) as fh: self.assertEqual(fh.read(), b"content") exp = BlobExpiration.objects.get(identifier=info.identifier) self.assertLessEqual( exp.expires_on - datetime.utcnow(), timedelta(minutes=60), )
def test_copy_blob_masks_old_blob(self): content = StringIO(b"fs content") info = self.fsdb.put(content, get_id()) content.seek(0) self.db.copy_blob(content, info, DEFAULT_BUCKET) self.assertEndsWith( self.fsdb.get_path(info.identifier), "/" + self.db.get_path(info.identifier)) with replattr(self.fsdb, "get", blow_up, sigcheck=False): with self.assertRaises(Boom): self.fsdb.get(info.identifier) with self.db.get(info.identifier) as fh: self.assertEqual(fh.read(), b"fs content")
def test_delete_bucket(self): bucket = join("doctype", "ys7v136b") info = self.db.put(BytesIO(b"content"), get_id(), bucket=bucket) with patch_datadog() as stats: self.assertTrue(self.db.delete(bucket=bucket)) self.assertEqual(sum(s for s in stats["commcare.blobs.deleted.count"]), 1) self.assertEqual(sum(s for s in stats["commcare.blobs.deleted.bytes"]), 7) self.assertTrue(info.identifier) with self.assertRaises(mod.NotFound): self.db.get(info.identifier, bucket=bucket)
def test_bulk_delete(self): blobs = [ ('test.5', 'doc.5'), ('test.6', 'doc.6'), ] infos = [ self.db.put(StringIO(b"content-{}".format(blob[0])), get_id(), bucket=blob[1]) for blob in blobs ] blob_infos = zip(blobs, infos) paths = [self.db.get_path(info.identifier, blob[1]) for blob, info in blob_infos] self.assertTrue(self.db.bulk_delete(paths), 'delete failed') for blob, info in blob_infos: with self.assertRaises(mod.NotFound): self.db.get(info.identifier, blob[1]) return paths
def test_put_with_bucket_and_get_without_bucket(self): bucket = "doc.3" info = self.db.put(BytesIO(b"content"), get_id(), bucket=bucket) with self.assertRaises(mod.NotFound): self.db.get(info.identifier)
def test_put_and_get_with_bucket(self): bucket = "doc.2" info = self.db.put(BytesIO(b"content"), get_id(), bucket=bucket) with self.db.get(info.identifier, bucket) as fh: self.assertEqual(fh.read(), b"content")
def test_put_and_size(self): identifier = get_id() info = self.db.put(StringIO(b"content"), identifier) self.assertEqual(self.db.size(info.identifier), len(b'content'))
def test_put_and_get_with_unicode_names(self): bucket = "doc.4500" info = self.db.put(StringIO(b"content"), get_id(), bucket=bucket) with self.db.get(info.identifier, bucket) as fh: self.assertEqual(fh.read(), b"content")
def test_bucket_path(self): bucket = join("doctype", "8cd98f0") self.db.put(BytesIO(b"content"), get_id(), bucket=bucket) path = self.db.get_path(bucket=bucket) self.assertTrue(isdir(path), path) self.assertTrue(os.listdir(path))
def test_put_and_get(self): identifier = get_id() info = self.db.put(BytesIO(b"content"), identifier) self.assertEqual(identifier, info.identifier) with self.db.get(info.identifier) as fh: self.assertEqual(fh.read(), b"content")
def test_put(self): with AtomicBlobs(self.db) as db: info = db.put(StringIO(b"content"), get_id()) with self.db.get(info.identifier) as fh: self.assertEqual(fh.read(), b"content")
def test_empty_attachment_name(self): info = self.db.put(BytesIO(b"content"), get_id()) self.assertNotIn(".", info.identifier) return info
def test_bucket_path(self): bucket = join("doctype", "8cd98f0") self.db.put(StringIO(b"content"), get_id(), bucket=bucket) self.assertEqual(self.db.get_path(bucket=bucket), bucket)
def test_exists(self): bucket = "doc.3.0" info = self.db.put(BytesIO(b"content"), get_id(), bucket=bucket) self.assertTrue(self.db.exists(info.identifier, bucket), 'not found')
def test_delete(self): info = self.db.put(StringIO(b"content"), get_id()) with AtomicBlobs(self.db) as db: db.delete(info.identifier) with self.assertRaises(NotFound): self.db.get(info.identifier)
def test_put_outside_context(self): with AtomicBlobs(self.db) as db: pass with self.assertRaises(InvalidContext): db.put(StringIO(b"content"), get_id())
def test_put_failed(self): with self.assertRaises(Boom), AtomicBlobs(self.db) as db: info = db.put(StringIO(b"content"), get_id()) raise Boom() with self.assertRaises(NotFound): self.db.get(info.identifier)
def test_put_with_double_dotted_name(self): info = self.db.put(BytesIO(b"content"), get_id()) with self.db.get(info.identifier) as fh: self.assertEqual(fh.read(), b"content")
def test_put_with_colliding_blob_id(self): ident = get_id() self.db.put(BytesIO(b"bing"), ident) self.db.put(BytesIO(b"bang"), ident) with self.db.get(ident) as fh: self.assertEqual(fh.read(), b"bang")
def test_put_from_get_stream(self): old = self.db.put(BytesIO(b"content"), get_id(), bucket="old_bucket") with self.db.get(old.identifier, "old_bucket") as fh: new = self.db.put(fh, get_id(), bucket="new_bucket") with self.db.get(new.identifier, "new_bucket") as fh: self.assertEqual(fh.read(), b"content")
def test_fall_back_to_fsdb(self): info = self.fsdb.put(StringIO(b"content"), get_id()) with self.db.get(info.identifier) as fh: self.assertEqual(fh.read(), b"content")
def test_delete_not_exists(self): bucket = "doc.3.1" info = self.db.put(BytesIO(b"content"), get_id(), bucket=bucket) self.db.delete(info.identifier, bucket) self.assertFalse(self.db.exists(info.identifier, bucket), 'not deleted')
def test_delete_identifier_in_default_bucket(self): info = self.db.put(BytesIO(b"content"), get_id()) self.assertTrue(self.db.delete(info.identifier), 'delete failed') with self.assertRaises(mod.NotFound): self.db.get(info.identifier)