def test_object_restore(app, db, dummy_location): """Restore object.""" f1 = FileInstance(uri="f1", size=1, checksum="mychecksum") f2 = FileInstance(uri="f2", size=2, checksum="mychecksum2") db.session.add(f1) db.session.add(f2) b1 = Bucket.create() obj1 = ObjectVersion.create(b1, "test").set_file(f1) ObjectVersion.create(b1, "test").set_file(f2) obj_deleted = ObjectVersion.delete(b1, "test") db.session.commit() assert ObjectVersion.query.count() == 3 # Cannot restore a deleted version. pytest.raises(InvalidOperationError, obj_deleted.restore) # Restore first version obj_new = obj1.restore() db.session.commit() assert ObjectVersion.query.count() == 4 assert obj_new.is_head is True assert obj_new.version_id != obj1.version_id assert obj_new.key == obj1.key assert obj_new.file_id == obj1.file_id assert obj_new.bucket == obj1.bucket
def test_object_set_file(app, db, dummy_location): """Test object set file.""" b = Bucket.create() f = FileInstance(uri="f1", size=1, checksum="mychecksum") obj = ObjectVersion.create(b, "test").set_file(f) db.session.commit() assert obj.file == f assert pytest.raises(FileInstanceAlreadySetError, obj.set_file, f)
def test_object_version_tags(app, db, dummy_location): """Test object version tags.""" f = FileInstance(uri="f1", size=1, checksum="mychecksum") db.session.add(f) db.session.commit() b = Bucket.create() obj1 = ObjectVersion.create(b, "test").set_file(f) ObjectVersionTag.create(obj1, "mykey", "testvalue") ObjectVersionTag.create(obj1, "another_key", "another value") db.session.commit() # Duplicate key pytest.raises( IntegrityError, ObjectVersionTag.create, obj1, "mykey", "newvalue") # Test get assert ObjectVersionTag.query.count() == 2 assert ObjectVersionTag.get(obj1, "mykey").value == "testvalue" assert ObjectVersionTag.get_value(obj1.version_id, "another_key") \ == "another value" assert ObjectVersionTag.get_value(obj1, "invalid") is None # Test delete ObjectVersionTag.delete(obj1, "mykey") assert ObjectVersionTag.query.count() == 1 ObjectVersionTag.delete(obj1, "invalid") assert ObjectVersionTag.query.count() == 1 # Create or update ObjectVersionTag.create_or_update(obj1, "another_key", "newval") ObjectVersionTag.create_or_update(obj1.version_id, "newkey", "testval") db.session.commit() assert ObjectVersionTag.get_value(obj1, "another_key") == "newval" assert ObjectVersionTag.get_value(obj1, "newkey") == "testval" # Get tags as dictionary assert obj1.get_tags() == dict(another_key="newval", newkey="testval") obj2 = ObjectVersion.create(b, 'test2') assert obj2.get_tags() == dict() # Copy object version obj_copy = obj1.copy() db.session.commit() assert obj_copy.get_tags() == dict(another_key="newval", newkey="testval") assert ObjectVersionTag.query.count() == 4 # Cascade delete ObjectVersion.query.delete() db.session.commit() assert ObjectVersionTag.query.count() == 0
def test_object_copy(app, db, dummy_location): """Copy object.""" f = FileInstance(uri="f1", size=1, checksum="mychecksum") db.session.add(f) db.session.commit() b1 = Bucket.create() b2 = Bucket.create() # Delete markers cannot be copied obj_deleted = ObjectVersion.create(b1, "deleted") with pytest.raises(InvalidOperationError) as excinfo: obj_deleted.copy(b2) assert excinfo.value.get_body() != {} # Copy onto self. obj = ObjectVersion.create(b1, "selftest").set_file(f) db.session.commit() obj_copy = obj.copy() db.session.commit() assert obj_copy.version_id != obj.version_id assert obj_copy.key == obj.key assert obj_copy.bucket == obj.bucket assert obj_copy.file_id == obj.file_id versions = ObjectVersion.get_versions(b1, "selftest").all() assert versions[0] == obj_copy assert versions[1] == obj # Copy new key obj_copy2 = obj_copy.copy(key='newkeytest') db.session.commit() assert obj_copy2.version_id != obj_copy.version_id assert obj_copy2.key == "newkeytest" assert obj_copy2.bucket == obj_copy.bucket assert obj_copy2.file_id == obj_copy.file_id # Copy to bucket obj_copy3 = obj_copy2.copy(bucket=b2) assert obj_copy3.version_id != obj_copy2.version_id assert obj_copy3.key == obj_copy2.key assert obj_copy3.bucket == b2 assert obj_copy3.file_id == obj_copy2.file_id
def from_dict(cls, data, bucket): """Construct a file wrapper from a dictionary.""" file_args = dict( id=data['file_id'], storage_class=data.get('storage_class'), size=data.get('size'), checksum=data.get('checksum'), ) if 'uri' in data: file_args['uri'] = data['uri'] fi = FileInstance(**file_args) obj = ObjectVersion( version_id=data['version_id'], key=data['key'], file_id=data['file_id'], _mimetype=data['mimetype'], is_head=True, bucket=bucket, bucket_id=data.get('bucket_id', bucket.id), ) return cls(object_model=obj, file_model=fi)
def create_file(self, bucket, f): """Create a single file.""" # Ensure that file instance get's created with the same ID as it is # used in the REST API. fileinstance = FileInstance( id=f['id'], writable=True, readable=False, size=0, ) db.session.add(fileinstance) fileinstance.set_uri(f['uri'], f['size'], f['checksum']) obj = ObjectVersion.create(bucket, f['key']).set_file(fileinstance) return (dict( bucket=str(obj.bucket.id), key=obj.key, checksum=obj.file.checksum, size=obj.file.size, version_id=str(obj.version_id), type=f['type'], ), fileinstance)