diff --git a/app/services/discovery_report.rb b/app/services/discovery_report.rb index a6358858..0f3564c0 100644 --- a/app/services/discovery_report.rb +++ b/app/services/discovery_report.rb @@ -49,12 +49,16 @@ def process_dobj(dobj) if using_media_manifest? # if we are using a media manifest, let's add how many files were found bundle_id = File.basename(dobj.container) - cm_files = media.manifest[bundle_id].fetch(:files, []) - counts[:files_in_manifest] = cm_files.count - relative_paths = dobj.object_files.map(&:relative_path) - counts[:files_found] = (cm_files.pluck(:filename) & relative_paths).count - errors[:empty_manifest] = true unless counts[:files_in_manifest] > 0 - errors[:files_found_mismatch] = true unless counts[:files_in_manifest] == counts[:files_found] + if bundle_id && media.manifest[bundle_id] + cm_files = media.manifest[bundle_id].fetch(:files, []) + counts[:files_in_manifest] = cm_files.count + relative_paths = dobj.object_files.map(&:relative_path) + counts[:files_found] = (cm_files.pluck(:filename) & relative_paths).count + errors[:empty_manifest] = true unless counts[:files_in_manifest] > 0 + errors[:files_found_mismatch] = true unless counts[:files_in_manifest] == counts[:files_found] + else + errors[:missing_media_container_name_or_manifest] = true + end end errors[:empty_object] = true unless counts[:total_size] > 0 diff --git a/spec/services/discovery_report_spec.rb b/spec/services/discovery_report_spec.rb index fbb08daf..cab31a70 100644 --- a/spec/services/discovery_report_spec.rb +++ b/spec/services/discovery_report_spec.rb @@ -82,6 +82,21 @@ expect(report.process_dobj(dobj)).not_to include(a_hash_including(empty_object: true)) end end + + context 'missing_media_container_name_or_manifest' do + let(:bundle) { bundle_setup(:media_missing) } + let(:obj_file) { instance_double(PreAssembly::ObjectFile, path: '', filesize: 324, mimetype: '') } + + before do + allow(dobj).to receive(:object_files).and_return([obj_file, obj_file]) + allow(report).to receive(:using_media_manifest?).and_return(true) + allow(report).to receive(:registration_check).and_return({}) # pretend everything is in Dor + end + + it 'adds missing_media_container_name_or_manifest error' do + expect(report.process_dobj(dobj)).to match a_hash_including(errors: a_hash_including(missing_media_container_name_or_manifest: true)) + end + end end context 'integration test' do diff --git a/spec/test_data/media_missing/manifest.csv b/spec/test_data/media_missing/manifest.csv new file mode 100644 index 00000000..7bcbf262 --- /dev/null +++ b/spec/test_data/media_missing/manifest.csv @@ -0,0 +1,2 @@ +druid,sourceid,object,label,description +"druid:aa111aa1111","bar-1.0","aa111aa1111","Label 1","This is a description for label 1" diff --git a/spec/test_data/media_missing/media_manifest.csv b/spec/test_data/media_missing/media_manifest.csv new file mode 100644 index 00000000..58d1c26d --- /dev/null +++ b/spec/test_data/media_missing/media_manifest.csv @@ -0,0 +1 @@ +source_id,filename,label,sequence,publish,preserve,shelve,resource_type diff --git a/spec/test_data/project_config_files/media_missing.yaml b/spec/test_data/project_config_files/media_missing.yaml new file mode 100644 index 00000000..c20a92d2 --- /dev/null +++ b/spec/test_data/project_config_files/media_missing.yaml @@ -0,0 +1,24 @@ +# An example of a project which has already registered objects, but for which +# you want to provide a manifest to provide descriptive metadata and a MODS template. +# Object discovery also occurs via the manifest. + +project_name: 'Media_Missing' + +project_style: + content_structure: 'media' + +bundle_dir: 'spec/test_data/media_missing' + +content_md_creation: + style: 'media' + media_manifest: 'media_manifest.csv' + +object_discovery: + use_manifest: true + glob: '*' + regex: '^[a-z][a-z]\d\d\d[a-z][a-z]\d\d\d\d$' + +stageable_discovery: + use_container: false + glob: '**/*/*' + regex: '^((?!.md5).)*$'