From 78f11c2fefd46722ffeb2f305cc47395d511f5a8 Mon Sep 17 00:00:00 2001 From: Tony Zanella Date: Thu, 25 Jan 2018 13:26:22 -0800 Subject: [PATCH] m2c uses matches_po_current_version? to compare po/pc versions Fixes #483 --- app/services/preserved_object_handler.rb | 12 +++++++----- .../preserved_object_handler_check_exist_spec.rb | 5 +++-- .../preserved_object_handler_confirm_version_spec.rb | 3 +++ .../preserved_object_handler_update_version_spec.rb | 4 ++++ 4 files changed, 17 insertions(+), 7 deletions(-) diff --git a/app/services/preserved_object_handler.rb b/app/services/preserved_object_handler.rb index fdb67726f..fab8d807e 100644 --- a/app/services/preserved_object_handler.rb +++ b/app/services/preserved_object_handler.rb @@ -69,7 +69,7 @@ def check_existence # FIXME: what if there is more than one associated pres_copy? pres_copy = PreservedCopy.find_by!(preserved_object: pres_object, endpoint: endpoint) if pres_object - raise_rollback_if_pc_po_version_mismatch(pres_copy.version, pres_object.current_version) + raise_rollback_if_pc_po_version_mismatch(pres_copy) if incoming_version == pres_copy.version set_status_as_seen_on_disk(pres_copy, true) unless pres_copy.status == PreservedCopy::OK_STATUS @@ -218,7 +218,7 @@ def update_online_version(status=nil, set_status_to_unexp_version=false) pres_object = PreservedObject.find_by!(druid: druid) pres_copy = PreservedCopy.find_by!(preserved_object: pres_object, endpoint: endpoint) if pres_object - raise_rollback_if_pc_po_version_mismatch(pres_copy.version, pres_object.current_version) + raise_rollback_if_pc_po_version_mismatch(pres_copy) # FIXME: what if there is more than one associated pres_copy? if incoming_version > pres_copy.version && pres_copy.version == pres_object.current_version @@ -243,8 +243,10 @@ def update_online_version(status=nil, set_status_to_unexp_version=false) handler_results.remove_db_updated_results unless transaction_ok end - def raise_rollback_if_pc_po_version_mismatch(pc_version, po_version) - if pc_version != po_version + def raise_rollback_if_pc_po_version_mismatch(pres_copy) + unless pres_copy.matches_po_current_version? + pc_version = pres_copy.version + po_version = pres_copy.preserved_object.current_version res_code = PreservedObjectHandlerResults::PC_PO_VERSION_MISMATCH handler_results.add_result(res_code, { pc_version: pc_version, po_version: po_version }) raise ActiveRecord::Rollback, "PreservedCopy version #{pc_version} != PreservedObject current_version #{po_version}" @@ -303,7 +305,7 @@ def confirm_online_version # FIXME: what if there is more than one associated pres_copy? pres_copy = PreservedCopy.find_by!(preserved_object: pres_object, endpoint: endpoint) if pres_object - raise_rollback_if_pc_po_version_mismatch(pres_copy.version, pres_object.current_version) + raise_rollback_if_pc_po_version_mismatch(pres_copy) if incoming_version == pres_copy.version set_status_as_seen_on_disk(pres_copy, true) unless pres_copy.status == PreservedCopy::OK_STATUS diff --git a/spec/services/preserved_object_handler_check_exist_spec.rb b/spec/services/preserved_object_handler_check_exist_spec.rb index 5785daa67..51c1cd73e 100644 --- a/spec/services/preserved_object_handler_check_exist_spec.rb +++ b/spec/services/preserved_object_handler_check_exist_spec.rb @@ -461,10 +461,11 @@ po_handler = described_class.new(druid, 1, 1, ep) po = instance_double(PreservedObject) pc = instance_double(PreservedCopy) - allow(PreservedObject).to receive(:find_by).with(druid: druid).and_return(po) + allow(PreservedObject).to receive(:find_by!).with(druid: druid).and_return(po) allow(po).to receive(:current_version).and_return(1) allow(po).to receive(:touch) - allow(PreservedCopy).to receive(:find_by).with(preserved_object: po, endpoint: ep).and_return(pc) + allow(PreservedCopy).to receive(:find_by!).with(preserved_object: po, endpoint: ep).and_return(pc) + allow(pc).to receive(:matches_po_current_version?).and_return(true) allow(pc).to receive(:status).and_return(PreservedCopy::OK_STATUS) allow(pc).to receive(:version).and_return(1) allow(pc).to receive(:update_audit_timestamps) diff --git a/spec/services/preserved_object_handler_confirm_version_spec.rb b/spec/services/preserved_object_handler_confirm_version_spec.rb index d64cad59e..c797183ec 100644 --- a/spec/services/preserved_object_handler_confirm_version_spec.rb +++ b/spec/services/preserved_object_handler_confirm_version_spec.rb @@ -264,6 +264,7 @@ allow(pc).to receive(:update_audit_timestamps) allow(pc).to receive(:changed?).and_return(true) allow(pc).to receive(:save!).and_raise(ActiveRecord::ActiveRecordError, 'foo') + allow(pc).to receive(:matches_po_current_version?).and_return(true) allow(po).to receive(:current_version).and_return(2) allow(po_handler).to receive(:moab_validation_errors).and_return([]) po_handler.confirm_version @@ -288,6 +289,7 @@ allow(pc).to receive(:update_audit_timestamps) allow(pc).to receive(:changed?).and_return(true) allow(pc).to receive(:save!) + allow(pc).to receive(:matches_po_current_version?).and_return(true) allow(po_handler).to receive(:moab_validation_errors).and_return([]) po_handler.confirm_version expect(po).not_to have_received(:save!) @@ -306,6 +308,7 @@ allow(pc).to receive(:update_audit_timestamps) allow(pc).to receive(:changed?).and_return(false) allow(pc).to receive(:touch) + allow(pc).to receive(:matches_po_current_version?).and_return(true) po_handler.confirm_version expect(po).not_to have_received(:touch) expect(pc).to have_received(:touch) diff --git a/spec/services/preserved_object_handler_update_version_spec.rb b/spec/services/preserved_object_handler_update_version_spec.rb index 289faa73c..d30c5cfde 100644 --- a/spec/services/preserved_object_handler_update_version_spec.rb +++ b/spec/services/preserved_object_handler_update_version_spec.rb @@ -160,6 +160,7 @@ allow(pc).to receive(:update_audit_timestamps) allow(pc).to receive(:changed?).and_return(true) allow(pc).to receive(:save!).and_raise(ActiveRecord::ActiveRecordError, 'foo') + allow(pc).to receive(:matches_po_current_version?).and_return(true) po_handler.update_version end @@ -202,6 +203,7 @@ allow(pc).to receive(:update_audit_timestamps) allow(pc).to receive(:changed?).and_return(true) allow(pc).to receive(:save!) + allow(pc).to receive(:matches_po_current_version?).and_return(true) po_handler.update_version end @@ -241,6 +243,7 @@ allow(pc).to receive(:update_audit_timestamps) allow(pc).to receive(:changed?).and_return(true) allow(pc).to receive(:save!) + allow(pc).to receive(:matches_po_current_version?).and_return(true) po_handler.update_version expect(po).to have_received(:save!) expect(pc).to have_received(:save!) @@ -259,6 +262,7 @@ allow(pc).to receive(:update_status) allow(pc).to receive(:changed?).and_return(true) allow(pc).to receive(:save!) + allow(pc).to receive(:matches_po_current_version?).and_return(true) po_handler = described_class.new(druid, 1, 1, ep) po_handler.update_version expect(po).not_to have_received(:touch)