diff --git a/lib/open_project/backlogs/engine.rb b/lib/open_project/backlogs/engine.rb index e5e5d208f2..b7c817c0e9 100644 --- a/lib/open_project/backlogs/engine.rb +++ b/lib/open_project/backlogs/engine.rb @@ -159,7 +159,7 @@ module OpenProject::Backlogs if: -> (*) { represented.backlogs_enabled? } end - extend_api_response(:v3, :work_packages, :form, :work_package_payload) do + extend_api_response(:v3, :work_packages, :work_package_payload) do property :story_points, render_nil: true, if: -> (*) { backlogs_enabled? && type.story? } @@ -196,9 +196,11 @@ module OpenProject::Backlogs show_if: -> (*) { represented.project.backlogs_enabled? } end - allow_attribute_update :work_package, :story_points - allow_attribute_update :work_package, :remaining_hours do - if !model.leaf? && model.changed.include?('remaining_hours') + allow_attribute_update :work_package, [:create, :update], :story_points + allow_attribute_update :work_package, [:create, :update], :remaining_hours do + if !model.new_record? && + !model.leaf? && + model.changed.include?('remaining_hours') errors.add :error_readonly, 'remaining_hours' end end diff --git a/spec/api/work_packages/create_contract_spec.rb b/spec/api/work_packages/create_contract_spec.rb new file mode 100644 index 0000000000..155c59dd30 --- /dev/null +++ b/spec/api/work_packages/create_contract_spec.rb @@ -0,0 +1,92 @@ +#-- copyright +# OpenProject Backlogs Plugin +# +# Copyright (C)2013-2014 the OpenProject Foundation (OPF) +# Copyright (C)2011 Stephan Eckardt, Tim Felgentreff, Marnen Laibow-Koser, Sandro Munda +# Copyright (C)2010-2011 friflaj +# Copyright (C)2010 Maxime Guilbot, Andrew Vit, Joakim Kolsjö, ibussieres, Daniel Passos, Jason Vasquez, jpic, Emiliano Heyns +# Copyright (C)2009-2010 Mark Maglana +# Copyright (C)2009 Joe Heck, Nate Lowrie +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License version 3. +# +# OpenProject Backlogs is a derivative work based on ChiliProject Backlogs. +# The copyright follows: +# Copyright (C) 2010-2011 - Emiliano Heyns, Mark Maglana, friflaj +# Copyright (C) 2011 - Jens Ulferts, Gregor Schmidt - Finn GmbH - Berlin, Germany +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + +require 'spec_helper' + +describe ::API::V3::WorkPackages::CreateContract do + let(:work_package) do + FactoryGirl.build(:work_package, + project: project) + end + let(:member) { FactoryGirl.create(:user, + member_in_project: project, + member_through_role: role) } + let (:project) { FactoryGirl.create(:project) } + let(:current_user) { member } + let(:permissions) { + [ + :view_work_packages, + :add_work_packages + ] + } + let(:role) { FactoryGirl.create :role, permissions: permissions } + let(:changed_values) { [] } + + subject(:contract) { described_class.new(work_package, current_user) } + + before do + allow(work_package).to receive(:changed).and_return(changed_values) + end + + describe 'story points' do + context 'has not changed' do + it('is valid') { expect(contract.errors.empty?).to be true } + end + + context 'has changed' do + let(:changed_values) { ['story_points'] } + + it('is valid') { expect(contract.errors.empty?).to be true } + end + end + + describe 'remaining hours' do + context 'is no parent' do + before do + contract.validate + end + + context 'has not changed' do + it('is valid') { expect(contract.errors.empty?).to be true } + end + + context 'has changed' do + let(:changed_values) { ['remaining_hours'] } + + it('is valid') { expect(contract.errors.empty?).to be true } + end + end + end +end diff --git a/spec/api/work_package_contract_spec.rb b/spec/api/work_packages/update_contract_spec.rb similarity index 98% rename from spec/api/work_package_contract_spec.rb rename to spec/api/work_packages/update_contract_spec.rb index e55c705a85..b20755628f 100644 --- a/spec/api/work_package_contract_spec.rb +++ b/spec/api/work_packages/update_contract_spec.rb @@ -28,7 +28,7 @@ require 'spec_helper' -describe ::API::V3::WorkPackages::WorkPackageContract do +describe ::API::V3::WorkPackages::UpdateContract do let(:work_package) do FactoryGirl.create(:work_package, done_ratio: 50,