require 'spec_helper'
describe GenericFile do
subject { GenericFile.new }
before do
subject.apply_depositor_metadata('jcoyne')
end
describe '#to_s' do
it 'uses the provided titles' do
subject.title = ["Hello", "World"]
expect(subject.to_s).to eq("Hello | World")
end
it 'falls back on label if no titles are given' do
subject.title = []
subject.label = 'Spam'
expect(subject.to_s).to eq("Spam")
end
it 'with no label or titles it is "No Title"' do
subject.title = []
subject.label = nil
expect(subject.to_s).to eq("No Title")
end
end
describe "assign_pid" do
it "should use the noid id service" do
expect_any_instance_of(Rubydora::Fc3Service).to_not receive(:next_pid)
GenericFile.assign_pid(nil)
end
end
describe "mime type recognition" do
context "when image?" do
it "should be true for jpeg2000" do
subject.mime_type = 'image/jp2'
expect(subject).to be_image
end
it "should be true for jpeg" do
subject.mime_type = 'image/jpg'
expect(subject).to be_image
end
it "should be true for png" do
subject.mime_type = 'image/png'
expect(subject).to be_image
end
it "should be true for tiff" do
subject.mime_type = 'image/tiff'
expect(subject).to be_image
end
end
context "when pdf?" do
it "should be true for pdf" do
subject.mime_type = 'application/pdf'
subject.should be_pdf
end
end
context "when audio?" do
it "should be true for wav" do
subject.mime_type = 'audio/x-wave'
subject.should be_audio
subject.mime_type = 'audio/x-wav'
subject.should be_audio
end
it "should be true for mpeg" do
subject.mime_type = 'audio/mpeg'
subject.should be_audio
subject.mime_type = 'audio/mp3'
subject.should be_audio
end
it "should be true for ogg" do
subject.mime_type = 'audio/ogg'
subject.should be_audio
end
end
context "when video?" do
it "should be true for avi" do
subject.mime_type = 'video/avi'
subject.should be_video
end
it "should be true for webm" do
subject.mime_type = 'video/webm'
subject.should be_video
end
it "should be true for mpeg" do
subject.mime_type = 'video/mp4'
subject.should be_video
subject.mime_type = 'video/mpeg'
subject.should be_video
end
it "should be true for quicktime" do
subject.mime_type = 'video/quicktime'
subject.should be_video
end
it "should be true for mxf" do
subject.mime_type = 'application/mxf'
subject.should be_video
end
end
end
describe "visibility" do
it "should not be changed when it's new" do
subject.should_not be_visibility_changed
end
it "should be changed when it has been changed" do
subject.visibility= 'open'
subject.should be_visibility_changed
end
it "should not be changed when it's set to its previous value" do
subject.visibility= 'restricted'
subject.should_not be_visibility_changed
end
end
describe "attributes" do
it "should have rightsMetadata" do
subject.rightsMetadata.should be_instance_of ParanoidRightsDatastream
end
it "should have properties datastream for depositor" do
subject.properties.should be_instance_of PropertiesDatastream
end
it "should have apply_depositor_metadata" do
subject.rightsMetadata.edit_access.should == ['jcoyne']
subject.depositor.should == 'jcoyne'
end
it "should have a set of permissions" do
subject.read_groups=['group1', 'group2']
subject.edit_users=['user1']
subject.read_users=['user2', 'user3']
subject.permissions.should == [{type: "group", access: "read", name: "group1"},
{type: "group", access: "read", name: "group2"},
{type: "user", access: "read", name: "user2"},
{type: "user", access: "read", name: "user3"},
{type: "user", access: "edit", name: "user1"}]
end
describe "updating permissions" do
it "should create new group permissions" do
subject.permissions = {new_group_name: {'group1'=>'read'}}
subject.permissions.should == [{type: "group", access: "read", name: "group1"},
{type: "user", access: "edit", name: "jcoyne"}]
end
it "should create new user permissions" do
subject.permissions = {new_user_name: {'user1'=>'read'}}
subject.permissions.should == [{type: "user", access: "read", name: "user1"},
{type: "user", access: "edit", name: "jcoyne"}]
end
it "should not replace existing groups" do
subject.permissions = {new_group_name: {'group1' => 'read'}}
subject.permissions = {new_group_name: {'group2' => 'read'}}
subject.permissions.should == [{type: "group", access: "read", name: "group1"},
{type: "group", access: "read", name: "group2"},
{type: "user", access: "edit", name: "jcoyne"}]
end
it "should not replace existing users" do
subject.permissions = {new_user_name:{'user1'=>'read'}}
subject.permissions = {new_user_name:{'user2'=>'read'}}
subject.permissions.should == [{type: "user", access: "read", name: "user1"},
{type: "user", access: "read", name: "user2"},
{type: "user", access: "edit", name: "jcoyne"}]
end
it "should update permissions on existing users" do
subject.permissions = {new_user_name:{'user1'=>'read'}}
subject.permissions = {user:{'user1'=>'edit'}}
subject.permissions.should == [{type: "user", access: "edit", name: "user1"},
{type: "user", access: "edit", name: "jcoyne"}]
end
it "should update permissions on existing groups" do
subject.permissions = {new_group_name:{'group1'=>'read'}}
subject.permissions = {group:{'group1'=>'edit'}}
subject.permissions.should == [{type: "group", access: "edit", name: "group1"},
{type: "user", access: "edit", name: "jcoyne"}]
end
end
it "should have a characterization datastream" do
subject.characterization.should be_kind_of FitsDatastream
end
it "should have a dc desc metadata" do
subject.descMetadata.should be_kind_of GenericFileRdfDatastream
end
it "should have content datastream" do
subject.add_file(File.open(fixture_path + '/world.png'), 'content', 'world.png')
subject.content.should be_kind_of FileContentDatastream
end
end
describe "delegations" do
it "should delegate methods to properties metadata" do
subject.should respond_to(:relative_path)
subject.should respond_to(:depositor)
end
it "should delegate methods to descriptive metadata" do
subject.should respond_to(:related_url)
subject.should respond_to(:based_near)
subject.should respond_to(:part_of)
subject.should respond_to(:contributor)
subject.should respond_to(:creator)
subject.should respond_to(:title)
subject.should respond_to(:description)
subject.should respond_to(:publisher)
subject.should respond_to(:date_created)
subject.should respond_to(:date_uploaded)
subject.should respond_to(:date_modified)
subject.should respond_to(:subject)
subject.should respond_to(:language)
subject.should respond_to(:rights)
subject.should respond_to(:resource_type)
subject.should respond_to(:identifier)
end
it "should delegate methods to characterization metadata" do
subject.should respond_to(:format_label)
subject.should respond_to(:mime_type)
subject.should respond_to(:file_size)
subject.should respond_to(:last_modified)
subject.should respond_to(:filename)
subject.should respond_to(:original_checksum)
subject.should respond_to(:well_formed)
subject.should respond_to(:file_title)
subject.should respond_to(:file_author)
subject.should respond_to(:page_count)
end
it "should redefine to_param to make redis keys more recognizable" do
subject.to_param.should == subject.noid
end
describe "that have been saved" do
# This file has no content, so it doesn't characterize
# before(:each) do
# Sufia.queue.should_receive(:push).once
# end
after(:each) do
unless subject.inner_object.class == ActiveFedora::UnsavedDigitalObject
begin
subject.delete
rescue ActiveFedora::ObjectNotFoundError
# do nothing
end
end
end
it "should have activity stream-related methods defined" do
subject.save
f = subject.reload
f.should respond_to(:stream)
f.should respond_to(:events)
f.should respond_to(:create_event)
f.should respond_to(:log_event)
end
it "should be able to set values via delegated methods" do
subject.related_url = ["http://example.org/"]
subject.creator = ["John Doe"]
subject.title = ["New work"]
subject.save
f = subject.reload
f.related_url.should == ["http://example.org/"]
f.creator.should == ["John Doe"]
f.title.should == ["New work"]
end
it "should be able to be added to w/o unexpected graph behavior" do
subject.creator = ["John Doe"]
subject.title = ["New work"]
subject.save
f = subject.reload
f.creator.should == ["John Doe"]
f.title.should == ["New work"]
f.creator = ["Jane Doe"]
f.title << "Newer work"
f.save
f = subject.reload
f.creator.should == ["Jane Doe"]
f.title.should == ["New work", "Newer work"]
end
end
end
describe "to_solr" do
before do
allow(subject).to receive(:pid).and_return('stubbed_pid')
subject.part_of = ["Arabiana"]
subject.contributor = ["Mohammad"]
subject.creator = ["Allah"]
subject.title = ["The Work"]
subject.description = ["The work by Allah"]
subject.publisher = ["Vertigo Comics"]
subject.date_created = ["1200-01-01"]
subject.date_uploaded = Date.parse("2011-01-01")
subject.date_modified = Date.parse("2012-01-01")
subject.subject = ["Theology"]
subject.language = ["Arabic"]
subject.rights = ["Wide open, buddy."]
subject.resource_type = ["Book"]
subject.identifier = ["urn:isbn:1234567890"]
subject.based_near = ["Medina, Saudi Arabia"]
subject.related_url = ["http://example.org/TheWork/"]
subject.mime_type = "image/jpeg"
subject.format_label = ["JPEG Image"]
subject.full_text.content = 'abcxyz'
end
it "supports to_solr" do
local = subject.to_solr
expect(local[Solrizer.solr_name("desc_metadata__part_of")]).to be_nil
expect(local[Solrizer.solr_name("desc_metadata__date_uploaded")]).to be_nil
expect(local[Solrizer.solr_name("desc_metadata__date_modified")]).to be_nil
expect(local[Solrizer.solr_name("desc_metadata__date_uploaded", :stored_sortable, type: :date)]).to eq '2011-01-01T00:00:00Z'
expect(local[Solrizer.solr_name("desc_metadata__date_modified", :stored_sortable, type: :date)]).to eq '2012-01-01T00:00:00Z'
expect(local[Solrizer.solr_name("desc_metadata__rights")]).to eq ["Wide open, buddy."]
expect(local[Solrizer.solr_name("desc_metadata__related_url")]).to eq ["http://example.org/TheWork/"]
expect(local[Solrizer.solr_name("desc_metadata__contributor")]).to eq ["Mohammad"]
expect(local[Solrizer.solr_name("desc_metadata__creator")]).to eq ["Allah"]
expect(local[Solrizer.solr_name("desc_metadata__title")]).to eq ["The Work"]
expect(local["desc_metadata__title_sim"]).to eq ["The Work"]
expect(local[Solrizer.solr_name("desc_metadata__description")]).to eq ["The work by Allah"]
expect(local[Solrizer.solr_name("desc_metadata__publisher")]).to eq ["Vertigo Comics"]
expect(local[Solrizer.solr_name("desc_metadata__subject")]).to eq ["Theology"]
expect(local[Solrizer.solr_name("desc_metadata__language")]).to eq ["Arabic"]
expect(local[Solrizer.solr_name("desc_metadata__date_created")]).to eq ["1200-01-01"]
expect(local[Solrizer.solr_name("desc_metadata__resource_type")]).to eq ["Book"]
expect(local[Solrizer.solr_name("file_format")]).to eq "jpeg (JPEG Image)"
expect(local[Solrizer.solr_name("desc_metadata__identifier")]).to eq ["urn:isbn:1234567890"]
expect(local[Solrizer.solr_name("desc_metadata__based_near")]).to eq ["Medina, Saudi Arabia"]
expect(local[Solrizer.solr_name("mime_type")]).to eq ["image/jpeg"]
expect(local["noid_tsi"]).to eq 'stubbed_pid'
expect(local['all_text_timv']).to eq('abcxyz')
end
end
it "should support multi-valued fields in solr" do
subject.tag = ["tag1", "tag2"]
lambda { subject.save }.should_not raise_error
subject.delete
end
it "should support setting and getting the relative_path value" do
subject.relative_path = "documents/research/NSF/2010"
subject.relative_path.should == "documents/research/NSF/2010"
end
describe "create_thumbnail" do
before do
@f = GenericFile.new
@f.apply_depositor_metadata('mjg36')
end
after do
@f.delete
end
describe "with a video", if: Sufia.config.enable_ffmpeg do
before do
@f.stub(mime_type: 'video/quicktime') #Would get set by the characterization job
@f.add_file(File.open("#{fixture_path}/countdown.avi", 'rb'), 'content', 'countdown.avi')
@f.save
end
it "should make a png thumbnail" do
@f.create_thumbnail
@f.thumbnail.content.size.should == 4768 # this is a bad test. I just want to show that it did something.
@f.thumbnail.mimeType.should == 'image/png'
end
end
end
describe "trophies" do
before do
u = FactoryGirl.find_or_create(:jill)
@f = GenericFile.new.tap do |gf|
gf.apply_depositor_metadata(u)
gf.save!
end
@t = Trophy.create(user_id: u.id, generic_file_id: @f.noid)
end
it "should have a trophy" do
expect(Trophy.where(generic_file_id: @f.noid).count).to eq 1
end
it "should remove all trophies when file is deleted" do
@f.destroy
expect(Trophy.where(generic_file_id: @f.noid).count).to eq 0
end
end
describe "audit" do
before do
u = FactoryGirl.find_or_create(:jill)
f = GenericFile.new
f.add_file(File.open(fixture_path + '/world.png'), 'content', 'world.png')
f.apply_depositor_metadata(u)
f.save!
@f = f.reload
end
it "should schedule a audit job for each datastream" do
s0 = double('zero')
AuditJob.should_receive(:new).with(@f.pid, 'descMetadata', "descMetadata.0").and_return(s0)
Sufia.queue.should_receive(:push).with(s0)
s1 = double('one')
AuditJob.should_receive(:new).with(@f.pid, 'DC', "DC1.0").and_return(s1)
Sufia.queue.should_receive(:push).with(s1)
s2 = double('two')
AuditJob.should_receive(:new).with(@f.pid, 'RELS-EXT', "RELS-EXT.0").and_return(s2)
Sufia.queue.should_receive(:push).with(s2)
s3 = double('three')
AuditJob.should_receive(:new).with(@f.pid, 'rightsMetadata', "rightsMetadata.0").and_return(s3)
Sufia.queue.should_receive(:push).with(s3)
s4 = double('four')
AuditJob.should_receive(:new).with(@f.pid, 'properties', "properties.0").and_return(s4)
Sufia.queue.should_receive(:push).with(s4)
s5 = double('five')
AuditJob.should_receive(:new).with(@f.pid, 'content', "content.0").and_return(s5)
Sufia.queue.should_receive(:push).with(s5)
@f.audit!
end
it "should log a failing audit" do
@f.datastreams.each { |ds| ds.stub(:dsChecksumValid).and_return(false) }
GenericFile.stub(:run_audit).and_return(double(:respose, pass:1, created_at: '2005-12-20', pid: 'foo:123', dsid: 'foo', version: '1'))
@f.audit!
expect(ChecksumAuditLog.all).to be_all { |cal| cal.pass == 0 }
end
it "should log a passing audit" do
GenericFile.stub(:run_audit).and_return(double(:respose, pass:1, created_at: '2005-12-20', pid: 'foo:123', dsid: 'foo', version: '1'))
@f.audit!
expect(ChecksumAuditLog.all).to be_all { |cal| cal.pass == 1 }
end
it "should return true on audit_status" do
expect(@f.audit_stat).to be_truthy
end
end
describe "run_audit" do
before do
@f = GenericFile.new
@f.add_file(File.open(fixture_path + '/world.png'), 'content', 'world.png')
@f.apply_depositor_metadata('mjg36')
@f.save!
@version = @f.datastreams['content'].versions.first
@old = ChecksumAuditLog.create(pid: @f.pid, dsid: @version.dsid, version: @version.versionID, pass: 1, created_at: 2.minutes.ago)
@new = ChecksumAuditLog.create(pid: @f.pid, dsid: @version.dsid, version: @version.versionID, pass: 0)
end
it "should not prune failed audits" do
@version.should_receive(:dsChecksumValid).and_return(true)
GenericFile.run_audit(@version)
@version.should_receive(:dsChecksumValid).and_return(false)
GenericFile.run_audit(@version)
@version.should_receive(:dsChecksumValid).and_return(false)
GenericFile.run_audit(@version)
@version.should_receive(:dsChecksumValid).and_return(true)
GenericFile.run_audit(@version)
@version.should_receive(:dsChecksumValid).and_return(false)
GenericFile.run_audit(@version)
@f.logs(@version.dsid).map(&:pass).should == [0, 1, 0, 0, 1, 0, 1]
end
end
describe "#related_files" do
let!(:f1) do
GenericFile.new.tap do |f|
f.apply_depositor_metadata('mjg36')
f.batch_id = batch_id
f.save
end
end
let!(:f2) do
GenericFile.new.tap do |f|
f.apply_depositor_metadata('mjg36')
f.batch_id = batch_id
f.save
end
end
let!(:f3) do
GenericFile.new.tap do |f|
f.apply_depositor_metadata('mjg36')
f.batch_id = batch_id
f.save
end
end
context "when the files belong to a batch" do
let(:batch) { Batch.create }
let(:batch_id) { batch.id }
it "shouldn't return itself from the related_files method" do
expect(f1.related_files).to match_array [f2, f3]
expect(f2.related_files).to match_array [f1, f3]
expect(f3.related_files).to match_array [f1, f2]
end
end
context "when there are no related files" do
let(:batch_id) { nil }
it "should return an empty array when there are no related files" do
expect(f1.related_files).to eq []
end
end
end
describe "noid integration" do
before(:all) do
@new_file = GenericFile.new(pid: 'ns:123')
@new_file.apply_depositor_metadata('mjg36')
@new_file.save
end
after(:all) do
@new_file.delete
end
it "should support the noid method" do
@new_file.should respond_to(:noid)
end
it "should return the expected identifier" do
@new_file.noid.should == '123'
end
it "should work outside of an instance" do
new_id = Sufia::IdService.mint
noid = new_id.split(':').last
Sufia::Noid.noidify(new_id).should == noid
end
end
describe "characterize" do
it "should return expected results when called", unless: $in_travis do
subject.add_file(File.open(fixture_path + '/world.png'), 'content', 'world.png')
subject.characterize
doc = Nokogiri::XML.parse(subject.characterization.content)
doc.root.xpath('//ns:imageWidth/text()', {'ns'=>'http://hul.harvard.edu/ois/xml/ns/fits/fits_output'}).inner_text.should == '50'
end
context "after characterization" do
before(:all) do
myfile = GenericFile.new
myfile.add_file(File.open(fixture_path + '/sufia/sufia_test4.pdf', 'rb').read, 'content', 'sufia_test4.pdf')
myfile.label = 'label123'
myfile.apply_depositor_metadata('mjg36')
# characterize method saves
myfile.characterize
@myfile = myfile.reload
end
after(:all) do
@myfile.destroy
end
it "should return expected results after a save" do
@myfile.file_size.should == ['218882']
@myfile.original_checksum.should == ['5a2d761cab7c15b2b3bb3465ce64586d']
end
it "should return a hash of all populated values from the characterization terminology" do
@myfile.characterization_terms[:format_label].should == ["Portable Document Format"]
@myfile.characterization_terms[:mime_type].should == "application/pdf"
@myfile.characterization_terms[:file_size].should == ["218882"]
@myfile.characterization_terms[:original_checksum].should == ["5a2d761cab7c15b2b3bb3465ce64586d"]
@myfile.characterization_terms.keys.should include(:last_modified)
@myfile.characterization_terms.keys.should include(:filename)
end
it "should append metadata from the characterization" do
@myfile.title.should include("Microsoft Word - sample.pdf.docx")
@myfile.filename[0].should == @myfile.label
end
it "should append each term only once" do
@myfile.append_metadata
@myfile.format_label.should == ["Portable Document Format"]
@myfile.title.should include("Microsoft Word - sample.pdf.docx")
end
it 'includes extracted full-text content' do
expect(@myfile.full_text.content).to eq("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nMicrosoft Word - sample.pdf.docx\n\n\n \n \n\n \n\n \n\n \n\nThis PDF file was created using CutePDF. \n\nwww.cutepdf.com")
end
end
end
describe "label" do
it "should set the inner label" do
subject.label = "My New Label"
subject.inner_object.label.should == "My New Label"
end
end
context "with rightsMetadata" do
subject do
m = GenericFile.new()
m.rightsMetadata.update_permissions("person"=>{"person1"=>"read","person2"=>"read"}, "group"=>{'group-6' => 'read', "group-7"=>'read', 'group-8'=>'edit'})
#m.save
m
end
it "should have read groups accessor" do
subject.read_groups.should == ['group-6', 'group-7']
end
it "should have read groups string accessor" do
subject.read_groups_string.should == 'group-6, group-7'
end
it "should have read groups writer" do
subject.read_groups = ['group-2', 'group-3']
subject.rightsMetadata.groups.should == {'group-2' => 'read', 'group-3'=>'read', 'group-8' => 'edit'}
subject.rightsMetadata.users.should == {"person1"=>"read","person2"=>"read", 'jcoyne' => 'edit'}
end
it "should have read groups string writer" do
subject.read_groups_string = 'umg/up.dlt.staff, group-3'
subject.rightsMetadata.groups.should == {'umg/up.dlt.staff' => 'read', 'group-3'=>'read', 'group-8' => 'edit'}
subject.rightsMetadata.users.should == {"person1"=>"read","person2"=>"read", 'jcoyne' => 'edit'}
end
it "should only revoke eligible groups" do
subject.set_read_groups(['group-2', 'group-3'], ['group-6'])
# 'group-7' is not eligible to be revoked
subject.rightsMetadata.groups.should == {'group-2' => 'read', 'group-3'=>'read', 'group-7' => 'read', 'group-8' => 'edit'}
subject.rightsMetadata.users.should == {"person1"=>"read","person2"=>"read", 'jcoyne' => 'edit'}
end
end
describe "permissions validation" do
context "depositor must have edit access" do
before(:each) do
@file = GenericFile.new
@file.apply_depositor_metadata('mjg36')
@rightsmd = @file.rightsMetadata
end
before(:all) do
@rights_xml = <<-RIGHTS
mjg36
RIGHTS
end
it "should work via permissions=()" do
@file.permissions = {user: {'mjg36' => 'read'}}
lambda { @file.save }.should_not raise_error
expect(@file).to be_new_record
@file.errors.should include(:edit_users)
@file.errors[:edit_users].should include('Depositor must have edit access')
expect(@file).to_not be_valid
end
it "should work via update_attributes" do
# automatically triggers save
lambda { @file.update_attributes(read_users_string: 'mjg36') }.should_not raise_error
expect(@file).to be_new_record
@file.errors.should include(:edit_users)
@file.errors[:edit_users].should include('Depositor must have edit access')
expect(@file).to_not be_valid
end
it "should work via update_indexed_attributes" do
@rightsmd.update_indexed_attributes([:edit_access, :person] => '')
lambda { @file.save }.should_not raise_error
expect(@file).to be_new_record
@file.errors.should include(:edit_users)
@file.errors[:edit_users].should include('Depositor must have edit access')
expect(@file).to_not be_valid
end
it "should work via permissions()" do
@rightsmd.permissions({person: "mjg36"}, "read")
lambda { @file.save }.should_not raise_error
expect(@file).to be_new_record
@file.errors.should include(:edit_users)
@file.errors[:edit_users].should include('Depositor must have edit access')
expect(@file).to_not be_valid
end
it "should work via update_permissions()" do
@rightsmd.update_permissions({"person" => {"mjg36" => "read"}})
lambda { @file.save }.should_not raise_error
expect(@file).to be_new_record
@file.errors.should include(:edit_users)
@file.errors[:edit_users].should include('Depositor must have edit access')
expect(@file).to_not be_valid
end
it "should work via content=()" do
@rightsmd.content=(@rights_xml)
lambda { @file.save }.should_not raise_error
expect(@file).to be_new_record
@file.errors.should include(:edit_users)
@file.errors[:edit_users].should include('Depositor must have edit access')
expect(@file).to_not be_valid
end
it "should work via ng_xml=()" do
@rightsmd.ng_xml=(Nokogiri::XML::Document.parse(@rights_xml))
lambda { @file.save }.should_not raise_error
expect(@file).to be_new_record
@file.errors.should include(:edit_users)
@file.errors[:edit_users].should include('Depositor must have edit access')
expect(@file).to_not be_valid
end
it "should work via update_values()" do
@rightsmd.update_values([:edit_access, :person] => '')
lambda { @file.save }.should_not raise_error
expect(@file).to be_new_record
@file.errors.should include(:edit_users)
@file.errors[:edit_users].should include('Depositor must have edit access')
expect(@file).to_not be_valid
end
end
context "public must not have edit access" do
before(:each) do
@file = GenericFile.new
@file.apply_depositor_metadata('mjg36')
@file.read_groups = ['public']
@rightsmd = @file.rightsMetadata
end
before(:all) do
@rights_xml = <<-RIGHTS
public
RIGHTS
end
it "should work via permissions=()" do
@file.permissions = {group: {'public' => 'edit'}}
lambda { @file.save }.should_not raise_error
expect(@file).to be_new_record
@file.errors.should include(:edit_groups)
@file.errors[:edit_groups].should include('Public cannot have edit access')
expect(@file).to_not be_valid
end
it "should work via update_attributes" do
# automatically triggers save
lambda { @file.update_attributes(edit_groups_string: 'public') }.should_not raise_error
expect(@file).to be_new_record
@file.errors.should include(:edit_groups)
@file.errors[:edit_groups].should include('Public cannot have edit access')
expect(@file).to_not be_valid
end
it "should work via update_indexed_attributes" do
@rightsmd.update_indexed_attributes([:edit_access, :group] => 'public')
lambda { @file.save }.should_not raise_error
expect(@file).to be_new_record
@file.errors.should include(:edit_groups)
@file.errors[:edit_groups].should include('Public cannot have edit access')
expect(@file).to_not be_valid
end
it "should work via permissions()" do
@rightsmd.permissions({group: "public"}, "edit")
lambda { @file.save }.should_not raise_error
expect(@file).to be_new_record
@file.errors.should include(:edit_groups)
@file.errors[:edit_groups].should include('Public cannot have edit access')
expect(@file).to_not be_valid
end
it "should work via update_permissions()" do
@rightsmd.update_permissions({"group" => {"public" => "edit"}})
lambda { @file.save }.should_not raise_error
expect(@file).to be_new_record
@file.errors.should include(:edit_groups)
@file.errors[:edit_groups].should include('Public cannot have edit access')
expect(@file).to_not be_valid
end
it "should work via content=()" do
@rightsmd.content=(@rights_xml)
lambda { @file.save }.should_not raise_error
expect(@file).to be_new_record
@file.errors.should include(:edit_groups)
@file.errors[:edit_groups].should include('Public cannot have edit access')
expect(@file).to_not be_valid
end
it "should work via ng_xml=()" do
@rightsmd.ng_xml=(Nokogiri::XML::Document.parse(@rights_xml))
lambda { @file.save }.should_not raise_error
expect(@file).to be_new_record
@file.errors.should include(:edit_groups)
@file.errors[:edit_groups].should include('Public cannot have edit access')
expect(@file).to_not be_valid
end
it "should work via update_values()" do
@rightsmd.update_values([:edit_access, :group] => 'public')
lambda { @file.save }.should_not raise_error
expect(@file).to be_new_record
@file.errors.should include(:edit_groups)
@file.errors[:edit_groups].should include('Public cannot have edit access')
expect(@file).to_not be_valid
end
end
context "registered must not have edit access" do
before(:each) do
@file = GenericFile.new
@file.apply_depositor_metadata('mjg36')
@file.read_groups = ['registered']
@rightsmd = @file.rightsMetadata
end
before(:all) do
@rights_xml = <<-RIGHTS
registered
RIGHTS
end
it "should work via permissions=()" do
@file.permissions = {group: {'registered' => 'edit'}}
lambda { @file.save }.should_not raise_error
expect(@file).to be_new_record
@file.errors.should include(:edit_groups)
@file.errors[:edit_groups].should include('Registered cannot have edit access')
expect(@file).to_not be_valid
end
it "should work via update_attributes" do
# automatically triggers save
lambda { @file.update_attributes(edit_groups_string: 'registered') }.should_not raise_error
expect(@file).to be_new_record
@file.errors.should include(:edit_groups)
@file.errors[:edit_groups].should include('Registered cannot have edit access')
expect(@file).to_not be_valid
end
it "should work via update_indexed_attributes" do
@rightsmd.update_indexed_attributes([:edit_access, :group] => 'registered')
lambda { @file.save }.should_not raise_error
expect(@file).to be_new_record
@file.errors.should include(:edit_groups)
@file.errors[:edit_groups].should include('Registered cannot have edit access')
expect(@file).to_not be_valid
end
it "should work via permissions()" do
@rightsmd.permissions({group: "registered"}, "edit")
lambda { @file.save }.should_not raise_error
expect(@file).to be_new_record
@file.errors.should include(:edit_groups)
@file.errors[:edit_groups].should include('Registered cannot have edit access')
expect(@file).to_not be_valid
end
it "should work via update_permissions()" do
@rightsmd.update_permissions({"group" => {"registered" => "edit"}})
lambda { @file.save }.should_not raise_error
expect(@file).to be_new_record
@file.errors.should include(:edit_groups)
@file.errors[:edit_groups].should include('Registered cannot have edit access')
expect(@file).to_not be_valid
end
it "should work via content=()" do
@rightsmd.content=(@rights_xml)
lambda { @file.save }.should_not raise_error
expect(@file).to be_new_record
@file.errors.should include(:edit_groups)
@file.errors[:edit_groups].should include('Registered cannot have edit access')
expect(@file).to_not be_valid
end
it "should work via ng_xml=()" do
@rightsmd.ng_xml=(Nokogiri::XML::Document.parse(@rights_xml))
lambda { @file.save }.should_not raise_error
expect(@file).to be_new_record
@file.errors.should include(:edit_groups)
@file.errors[:edit_groups].should include('Registered cannot have edit access')
expect(@file).to_not be_valid
end
it "should work via update_values()" do
@rightsmd.update_values([:edit_access, :group] => 'registered')
lambda { @file.save }.should_not raise_error
expect(@file).to be_new_record
@file.errors.should include(:edit_groups)
@file.errors[:edit_groups].should include('Registered cannot have edit access')
expect(@file).to_not be_valid
end
end
context "everything is copacetic" do
before(:each) do
@file = GenericFile.new
@file.apply_depositor_metadata('mjg36')
@file.read_groups = ['public']
@rightsmd = @file.rightsMetadata
end
after(:each) do
@file.delete
end
before(:all) do
@rights_xml = <<-RIGHTS
public
registered
mjg36
RIGHTS
end
it "should work via permissions=()" do
@file.permissions = {group: {'registered' => 'read'}}
lambda { @file.save }.should_not raise_error
expect(@file).to_not be_new_record
@file.errors.should be_empty
expect(@file).to be_valid
end
it "should work via update_attributes" do
# automatically triggers save
lambda { @file.update_attributes(read_groups_string: 'registered') }.should_not raise_error
expect(@file).to_not be_new_record
@file.errors.should be_empty
expect(@file).to be_valid
end
it "should work via update_indexed_attributes" do
@rightsmd.update_indexed_attributes([:read_access, :group] => 'registered')
lambda { @file.save }.should_not raise_error
expect(@file).to_not be_new_record
@file.errors.should be_empty
expect(@file).to be_valid
end
it "should work via permissions()" do
@rightsmd.permissions({group: "registered"}, "read")
lambda { @file.save }.should_not raise_error
expect(@file).to_not be_new_record
@file.errors.should be_empty
expect(@file).to be_valid
end
it "should work via update_permissions()" do
@rightsmd.update_permissions({"group" => {"registered" => "read"}})
lambda { @file.save }.should_not raise_error
expect(@file).to_not be_new_record
@file.errors.should be_empty
expect(@file).to be_valid
end
it "should work via content=()" do
@rightsmd.content=(@rights_xml)
lambda { @file.save }.should_not raise_error
expect(@file).to_not be_new_record
@file.errors.should be_empty
expect(@file).to be_valid
end
it "should work via ng_xml=()" do
@rightsmd.ng_xml=(Nokogiri::XML::Document.parse(@rights_xml))
lambda { @file.save }.should_not raise_error
expect(@file).to_not be_new_record
@file.errors.should be_empty
expect(@file).to be_valid
end
it "should work via update_values()" do
@rightsmd.update_values([:read_access, :group] => 'registered')
lambda { @file.save }.should_not raise_error
expect(@file).to_not be_new_record
@file.errors.should be_empty
expect(@file).to be_valid
end
end
end
describe "file content validation" do
context "when file contains a virus" do
let(:f) { File.new(fixture_path + '/small_file.txt') }
after(:each) do
subject.destroy if subject.persisted?
end
it "populates the errors hash during validation" do
allow(Sufia::GenericFile::Actor).to receive(:virus_check).and_raise(Sufia::VirusFoundError, "A virus was found in #{f.path}: EL CRAPO VIRUS")
subject.add_file(f, 'content', 'small_file.txt')
subject.save
subject.should_not be_persisted
expect(subject.errors.messages).to eq(base: ["A virus was found in #{f.path}: EL CRAPO VIRUS"])
end
it "does not save a new version of a GenericFile" do
subject.add_file(f, 'content', 'small_file.txt')
subject.save
allow(Sufia::GenericFile::Actor).to receive(:virus_check).and_raise(Sufia::VirusFoundError)
subject.add_file(File.new(fixture_path + '/sufia_generic_stub.txt') , 'content', 'sufia_generic_stub.txt')
subject.save
subject.reload.content.content.should == "small\n"
end
end
end
describe "should create a full to_solr record" do
before do
subject.save
end
after do
subject.destroy
end
it "gets both sets of data into solr" do
f1= GenericFile.find(subject.id)
f2 = GenericFile.find(subject.id)
f2.reload_on_save = true
f1.mime_type = "video/abc123"
f2.title = ["abc123"]
f1.save
mime_type_key = Solrizer.solr_name("mime_type")
title_key = Solrizer.solr_name("desc_metadata__title", :stored_searchable, type: :string)
expect(f1.to_solr[mime_type_key]).to eq([f1.mime_type])
expect(f1.to_solr[title_key]).to_not eq(f2.title)
f2.save
expect(f2.to_solr[mime_type_key]).to eq([f1.mime_type])
expect(f2.to_solr[title_key]).to eq(f2.title)
end
end
describe "public?" do
context "when read group is set to public" do
before { subject.read_groups = ['public'] }
it { should be_public }
end
context "when read group is not set to public" do
before { subject.read_groups = ['foo'] }
it { should_not be_public }
end
end
end