lib/valkyrie/specs/shared_specs/storage_adapter.rb in valkyrie-3.0.3 vs lib/valkyrie/specs/shared_specs/storage_adapter.rb in valkyrie-3.1.0
- old
+ new
@@ -14,11 +14,16 @@
subject { storage_adapter }
it { is_expected.to respond_to(:handles?).with_keywords(:id) }
it { is_expected.to respond_to(:find_by).with_keywords(:id) }
it { is_expected.to respond_to(:delete).with_keywords(:id) }
it { is_expected.to respond_to(:upload).with_keywords(:file, :resource, :original_filename) }
+ it { is_expected.to respond_to(:supports?) }
+ it "returns false for non-existing features" do
+ expect(storage_adapter.supports?(:bad_feature_not_real_dont_implement)).to eq false
+ end
+
it "can upload a file which is just an IO" do
io_file = Tempfile.new('temp_io')
io_file.write "Stuff"
io_file.rewind
sha1 = Digest::SHA1.file(io_file).to_s
@@ -48,11 +53,11 @@
def open_files
`lsof +D .`.split("\n").map { |r| r.split("\t").last }
end
it "can upload, validate, re-fetch, and delete a file" do
- resource = Valkyrie::Specs::CustomResource.new(id: "test")
+ resource = Valkyrie::Specs::CustomResource.new(id: "test#{SecureRandom.uuid}")
sha1 = Digest::SHA1.file(file).to_s
size = file.size
expect(uploaded_file = storage_adapter.upload(file: file, original_filename: 'foo.jpg', resource: resource, fake_upload_argument: true)).to be_kind_of Valkyrie::StorageAdapter::File
expect(uploaded_file).to respond_to(:checksum).with_keywords(:digests)
@@ -74,7 +79,67 @@
expect { IO.copy_stream(file, new_file) }.not_to raise_error
storage_adapter.delete(id: uploaded_file.id)
expect { storage_adapter.find_by(id: uploaded_file.id) }.to raise_error Valkyrie::StorageAdapter::FileNotFound
expect { storage_adapter.find_by(id: Valkyrie::ID.new("noexist")) }.to raise_error Valkyrie::StorageAdapter::FileNotFound
+ end
+
+ it "can upload and find new versions" do
+ pending "Versioning not supported" unless storage_adapter.supports?(:versions)
+ resource = Valkyrie::Specs::CustomResource.new(id: "test#{SecureRandom.uuid}")
+ uploaded_file = storage_adapter.upload(file: file, original_filename: 'foo.jpg', resource: resource, fake_upload_argument: true)
+ expect(uploaded_file.version_id).not_to be_blank
+
+ f = Tempfile.new
+ f.puts "Test File"
+ f.rewind
+
+ # upload_version
+ new_version = storage_adapter.upload_version(id: uploaded_file.id, file: f)
+ expect(uploaded_file.id).to eq new_version.id
+ expect(uploaded_file.version_id).not_to eq new_version.version_id
+
+ # find_versions
+ # Two versions of the same file have the same id, but different version_ids,
+ # use case: I want to store metadata about a file when it's uploaded as a
+ # version and refer to it consistently.
+ versions = storage_adapter.find_versions(id: new_version.id)
+ expect(versions.length).to eq 2
+ expect(versions.first.id).to eq new_version.id
+ expect(versions.first.version_id).to eq new_version.version_id
+
+ expect(versions.last.id).to eq uploaded_file.id
+ expect(versions.last.version_id).to eq uploaded_file.version_id
+
+ expect(versions.first.size).not_to eq versions.last.size
+
+ expect(storage_adapter.find_by(id: uploaded_file.version_id).version_id).to eq uploaded_file.version_id
+
+ # Deleting a version should leave the current versions
+ if storage_adapter.supports?(:version_deletion)
+ storage_adapter.delete(id: uploaded_file.version_id)
+ expect(storage_adapter.find_versions(id: uploaded_file.id).length).to eq 1
+ expect { storage_adapter.find_by(id: uploaded_file.version_id) }.to raise_error Valkyrie::StorageAdapter::FileNotFound
+ end
+ current_length = storage_adapter.find_versions(id: new_version.id).length
+
+ # Restoring a previous version is just pumping its file into upload_version
+ newest_version = storage_adapter.upload_version(file: new_version, id: new_version.id)
+ expect(newest_version.version_id).not_to eq new_version.id
+ expect(storage_adapter.find_by(id: newest_version.id).version_id).to eq newest_version.version_id
+
+ # I can restore a version twice
+ newest_version = storage_adapter.upload_version(file: new_version, id: new_version.id)
+ expect(newest_version.version_id).not_to eq new_version.id
+ expect(storage_adapter.find_by(id: newest_version.id).version_id).to eq newest_version.version_id
+ expect(storage_adapter.find_versions(id: newest_version.id).length).to eq current_length + 2
+
+ # NOTE: We originally wanted deleting the current record to push it into the
+ # versions history, but FCRepo 4/5/6 doesn't work that way, so we changed to
+ # instead make deleting delete everything.
+ storage_adapter.delete(id: new_version.id)
+ expect { storage_adapter.find_by(id: new_version.id) }.to raise_error Valkyrie::StorageAdapter::FileNotFound
+ expect(storage_adapter.find_versions(id: new_version.id).length).to eq 0
+ ensure
+ f&.close
end
end