diff --git a/config/locales/en.yml b/config/locales/en.yml index 0001f08..dec6e89 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -2,8 +2,10 @@ en: activerecord: errors: messages: - cant_to_closed_deliverable: "Can't create a time entry on a closed deliverable" - cant_to_closed_contract: "Can't create a time entry on a closed contract" + cant_create_time_on_closed_deliverable: "Can't create a time entry on a closed deliverable" + cant_create_time_on_closed_contract: "Can't create a time entry on a closed contract" + cant_assign_to_closed_deliverable: "Can't assign issue to a closed deliverable" + cant_assign_to_locked_deliverable: "Can't assign issue to a locked deliverable" field_end_date: End Date field_executed: Executed diff --git a/lib/redmine_contracts/patches/issue_patch.rb b/lib/redmine_contracts/patches/issue_patch.rb index 4df6003..ba9100d 100644 --- a/lib/redmine_contracts/patches/issue_patch.rb +++ b/lib/redmine_contracts/patches/issue_patch.rb @@ -15,6 +15,16 @@ module RedmineContracts def contract_name contract.try(:name) end + + validate :validate_deliverable_status + + def validate_deliverable_status + if deliverable.present? && changes["deliverable_id"].present? + errors.add_to_base(:cant_assign_to_closed_deliverable) if deliverable.closed? + errors.add_to_base(:cant_assign_to_locked_deliverable) if deliverable.locked? + end + end + end end diff --git a/lib/redmine_contracts/patches/time_entry_patch.rb b/lib/redmine_contracts/patches/time_entry_patch.rb index 58f9d69..0a327b2 100644 --- a/lib/redmine_contracts/patches/time_entry_patch.rb +++ b/lib/redmine_contracts/patches/time_entry_patch.rb @@ -13,13 +13,13 @@ module RedmineContracts def validate_deliverable_status if issue.present? && issue.deliverable.present? - errors.add_to_base(:cant_to_closed_deliverable) if issue.deliverable.closed? + errors.add_to_base(:cant_create_time_on_closed_deliverable) if issue.deliverable.closed? end end def validate_contract_status if issue.present? && issue.deliverable.present? && issue.deliverable.contract.present? - errors.add_to_base(:cant_to_closed_contract) if issue.deliverable.contract.closed? + errors.add_to_base(:cant_create_time_on_closed_contract) if issue.deliverable.contract.closed? end end diff --git a/test/integration/redmine_contracts/hooks/controller_issues_edit_before_save.rb b/test/integration/redmine_contracts/hooks/controller_issues_edit_before_save.rb index 4b475b2..6810379 100644 --- a/test/integration/redmine_contracts/hooks/controller_issues_edit_before_save.rb +++ b/test/integration/redmine_contracts/hooks/controller_issues_edit_before_save.rb @@ -24,10 +24,10 @@ class RedmineContracts::Hooks::ControllerIssuesEditBeforeSaveTest < ActionContro context "for a new issue" do setup do visit_project(@project) - click_link "New issue" end should "set the issue's deliverable" do + click_link "New issue" fill_in "Subject", :with => 'Hook test' select @deliverable2.title, :from => "Deliverable" click_button "Create" @@ -38,6 +38,38 @@ class RedmineContracts::Hooks::ControllerIssuesEditBeforeSaveTest < ActionContro end + should "not allow setting a locked Deliverable" do + assert @deliverable2.lock! + click_link "New issue" + + fill_in "Subject", :with => 'Hook test' + select @deliverable2.title, :from => "Deliverable" + assert_no_difference("Issue.count") do + click_button "Create" + + assert_response :success + end + + assert_equal nil, Issue.last.deliverable + + end + + should "not allow setting a closed Deliverable" do + assert @deliverable2.close! + click_link "New issue" + + fill_in "Subject", :with => 'Hook test' + select @deliverable2.title, :from => "Deliverable" + assert_no_difference("Issue.count") do + click_button "Create" + + assert_response :success + end + + assert_equal nil, Issue.last.deliverable + + end + context "with no permission to Assign Deliverable" do should "not allow setting the Deliverable (force HTTP request)" do @role.permissions.delete(:assign_deliverable_to_issue) @@ -69,6 +101,51 @@ class RedmineContracts::Hooks::ControllerIssuesEditBeforeSaveTest < ActionContro end + should "not allow updating to a locked deliverable" do + assert @deliverable2.lock! + select @deliverable2.title, :from => "Deliverable" + click_button "Submit" + + assert_response :success + + @issue.reload + assert_equal nil, @issue.deliverable + + end + + should "not allow updating to a closed deliverable" do + assert @deliverable2.close! + select @deliverable2.title, :from => "Deliverable" + click_button "Submit" + + assert_response :success + + @issue.reload + assert_equal nil, @issue.deliverable + + end + + should "allow updating an issue, even if the deliverable is locked as long as the deliverable isn't changed" do + select @deliverable2.title, :from => "Deliverable" + click_button "Submit" + + assert_response :success + + @issue.reload + assert_equal @deliverable2, @issue.deliverable + + # Now normal update after locking + assert @deliverable2.lock! + fill_in "Subject", :with => 'Change subject' + click_button "Submit" + + assert_response :success + @issue.reload + assert_equal "Change subject", @issue.subject + assert_equal @deliverable2, @issue.deliverable + + end + context "with no permission to Assign Deliverable" do should "not allow setting the Deliverable (force HTTP request)" do @role.permissions.delete(:assign_deliverable_to_issue)