From 60448eeee1c62de9f2df0db442aa517a1968ea36 Mon Sep 17 00:00:00 2001 From: Justin Coyne Date: Tue, 4 Dec 2018 16:06:31 -0600 Subject: [PATCH] Workflow datastream should set its dsLocation Previously it was setting it prior to having a PID set. --- .travis.yml | 4 ++++ lib/dor/datastreams/workflow_ds.rb | 13 +++++++++++++ lib/dor/models/concerns/processable.rb | 18 +++++------------- spec/models/item_spec.rb | 17 +++++++++++++++++ spec/services/search_service_spec.rb | 2 +- spec/spec_helper.rb | 1 - spec/support/dor_config.rb | 2 +- 7 files changed, 41 insertions(+), 16 deletions(-) diff --git a/.travis.yml b/.travis.yml index d7ead5b9..29e36d53 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,6 +8,10 @@ notifications: rvm: - 2.5.3 +before_install: + - docker run -d -p 8983:8080 suldlss/fcrepo:no-messaging-latest + - docker ps + env: - 'RAILS_VERSION="~> 4.2"' - 'RAILS_VERSION="~> 5.1.0"' diff --git a/lib/dor/datastreams/workflow_ds.rb b/lib/dor/datastreams/workflow_ds.rb index 9eada3c1..4f3e3ec4 100644 --- a/lib/dor/datastreams/workflow_ds.rb +++ b/lib/dor/datastreams/workflow_ds.rb @@ -3,6 +3,7 @@ module Dor # TODO: class docs class WorkflowDs < ActiveFedora::OmDatastream + before_save :build_location set_terminology do |t| t.root(path: 'workflows') t.workflow do @@ -18,6 +19,18 @@ class WorkflowDs < ActiveFedora::OmDatastream end end + # Called before saving, but after a pid has been assigned + def build_location + return unless new? + + self.dsLocation = File.join(Dor::Config.workflow.url, "dor/objects/#{pid}/workflows") + end + + # Called by rubydora. This lets us customize the mime-type + def self.default_attributes + super.merge(mimeType: 'application/xml') + end + def get_workflow(wf, repo = 'dor') xml = Dor::Config.workflow.client.get_workflow_xml(repo, pid, wf) xml = Nokogiri::XML(xml) diff --git a/lib/dor/models/concerns/processable.rb b/lib/dor/models/concerns/processable.rb index 95697dad..f2cc27eb 100644 --- a/lib/dor/models/concerns/processable.rb +++ b/lib/dor/models/concerns/processable.rb @@ -7,8 +7,11 @@ module Processable extend ActiveSupport::Concern included do - has_metadata name: 'workflows', type: Dor::WorkflowDs, label: 'Workflows', control_group: 'E' - after_initialize :set_workflows_datastream_location + has_metadata name: 'workflows', + type: Dor::WorkflowDs, + label: 'Workflows', + control_group: 'E', + autocreate: true end # verbiage we want to use to describe an item when it has completed a particular step @@ -38,17 +41,6 @@ module Processable 'opened' => 9 }.freeze - # This is a work-around for some strange logic in ActiveFedora that - # don't allow self.workflows.new? to work if we load the object using - # .load_instance_from_solr. - def set_workflows_datastream_location - return if respond_to?(:inner_object) && inner_object.is_a?(ActiveFedora::SolrDigitalObject) - return unless workflows.new? - - workflows.mimeType = 'application/xml' - workflows.dsLocation = File.join(Dor::Config.workflow.url, "dor/objects/#{pid}/workflows") - end - def empty_datastream?(datastream) return true if datastream.new? diff --git a/spec/models/item_spec.rb b/spec/models/item_spec.rb index 4cf047c7..ec30a7be 100644 --- a/spec/models/item_spec.rb +++ b/spec/models/item_spec.rb @@ -11,4 +11,21 @@ it { is_expected.to include 'active_fedora_model_ssi' => 'Dor::Item' } end + + describe 'the dsLocation for workflow' do + let(:obj) { described_class.new } + before do + allow(Dor::SuriService).to receive(:mint_id).and_return('changeme:1231231') + allow(Dor::Config.suri).to receive(:mint_ids).and_return(true) + allow(obj).to receive(:update_index) + obj.save! + end + let(:reloaded) { Dor::Item.find(obj.pid) } + let(:workflows) { reloaded.workflows } + + it 'is set automatically' do + expect(workflows.dsLocation).to eq 'http://example.edu/workflow/dor/objects/changeme:1231231/workflows' + expect(workflows.mimeType).to eq 'application/xml' + end + end end diff --git a/spec/services/search_service_spec.rb b/spec/services/search_service_spec.rb index 27799bc9..af1f37f3 100644 --- a/spec/services/search_service_spec.rb +++ b/spec/services/search_service_spec.rb @@ -17,7 +17,7 @@ ['druid:tx361mw6047', 'druid:cm977wg2520', 'druid:tk695fn1971', 'druid:jk486qb3656', 'druid:cd252xn6059'], [] ] @responses = @druids.collect { |group| { body: %("object"\n) + group.collect { |d| "info:fedora/#{d}" }.join("\n") } } - stub_request(:post, 'http://fedora.edu/fedora/risearch') + stub_request(:post, 'http://localhost:8983/fedora/risearch') .to_return(body: @responses[0][:body]).then .to_return(body: @responses[1][:body]).then .to_return(body: @responses[2][:body]) diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index f64c0df3..c53fa579 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -34,7 +34,6 @@ def stub_config Dor::Config.push! do suri.mint_ids false solr.url 'http://solr.edu/solrizer' - fedora.url 'http://fedora.edu/fedora' stacks.document_cache_host 'purl-test.stanford.edu' stacks.local_workspace_root File.join(fixture_dir, 'workspace') stacks.local_stacks_root File.join(fixture_dir, 'stacks') diff --git a/spec/support/dor_config.rb b/spec/support/dor_config.rb index 1e83a615..e86c90b7 100644 --- a/spec/support/dor_config.rb +++ b/spec/support/dor_config.rb @@ -9,7 +9,7 @@ key_pass 'thisisatleast4bytes' end - fedora.url 'http://fedoraUser:fedoraPass@example.edu/fedora' + fedora.url 'http://fedoraAdmin:fedoraAdmin@localhost:8983/fedora' suri do mint_ids true