diff --git a/app/controllers/versions_controller.rb b/app/controllers/versions_controller.rb index d1ad4c7a8a..eacd1b6089 100644 --- a/app/controllers/versions_controller.rb +++ b/app/controllers/versions_controller.rb @@ -7,7 +7,7 @@ def create VersionService.open(@item, open_params) render plain: @item.current_version rescue Dor::Exception => e - render build_error(e) + render build_error('Unable to open version', e) end def current @@ -17,18 +17,20 @@ def current def close_current VersionService.close(@item, close_params) render plain: "version #{@item.current_version} closed" + rescue Dor::Exception => e + render build_error('Unable to close version', e) end private # JSON-API error response - def build_error(err) + def build_error(msg, err) { json: { errors: [ { "status": '422', - "title": 'Unable to open version', + "title": msg, "detail": err.message } ] diff --git a/spec/controllers/versions_controller_spec.rb b/spec/controllers/versions_controller_spec.rb index 9d58bacf12..d6410a0c7e 100644 --- a/spec/controllers/versions_controller_spec.rb +++ b/spec/controllers/versions_controller_spec.rb @@ -21,16 +21,38 @@ end describe '/versions/current/close' do - it 'closes the current version when posted to' do - expect(VersionService).to receive(:close) - post :close_current, params: { object_id: item.pid }, as: :json - expect(response.body).to match(/version 1 closed/) + context 'when closing a version succeedes' do + before do + allow(VersionService).to receive(:close) + end + + it 'closes the current version when posted to' do + post :close_current, params: { object_id: item.pid }, as: :json + expect(VersionService).to have_received(:close) + expect(response.body).to match(/version 1 closed/) + end + + it 'forwards optional params to the VersionService#close method' do + post :close_current, params: { object_id: item.pid }, body: %( {"description": "some text", "significance": "major"} ), as: :json + expect(response.body).to match(/version 1 closed/) + expect(VersionService).to have_received(:close).with(item, description: 'some text', significance: :major) + end end - it 'forwards optional params to the VersionService#close method' do - expect(VersionService).to receive(:close).with(item, description: 'some text', significance: :major) - post :close_current, params: { object_id: item.pid }, body: %( {"description": "some text", "significance": "major"} ), as: :json - expect(response.body).to match(/version 1 closed/) + context 'when closing a version fails' do + before do + allow(VersionService).to receive(:close) + .and_raise(Dor::Exception, 'Trying to close version on an object not opened for versioning') + end + + it 'returns an error' do + post :close_current, params: { object_id: item.pid }, as: :json + expect(response.body).to eq( + '{"errors":[{"status":"422","title":"Unable to close version",' \ + '"detail":"Trying to close version on an object not opened for versioning"}]}' + ) + expect(response.status).to eq 422 + end end end