fixing fixed_version inheritance

* additional cukes and specs
pull/6827/head
Jens Ulferts 13 years ago
parent 867916976e
commit 928b7cbdf7
  1. 14
      app/models/story.rb
  2. 130
      features/fixed_version_by_issue_hierarchy.feature
  3. 20
      features/step_definitions/_then_steps.rb
  4. 16
      features/step_definitions/_when_steps.rb
  5. 50
      lib/backlogs_issue_patch.rb
  6. 513
      spec/models/issue_fixed_version_propagated_down_spec.rb
  7. 323
      spec/models/issue_fixed_version_restricted_spec.rb

@ -88,13 +88,13 @@ class Story < Issue
self.children.find_all_by_tracker_id(Task.tracker).collect { |t| [t] + t.descendants }.flatten
end
def inherit_version_to_subtasks
# we overwrite the version of all descending issues that are tasks
self.direct_tasks_and_subtasks.each do |task|
task.inherit_version_from(self)
task.save! if task.changed?
end
end
#def inherit_version_to_subtasks
# # we overwrite the version of all descending issues that are tasks
# self.direct_tasks_and_subtasks.each do |task|
# task.inherit_version_from(self)
# task.save! if task.changed?
# end
#end
def set_points(p)
self.init_journal(User.current)

@ -0,0 +1,130 @@
Feature: The issue hierarchy defines the allowed versions for each issue dependent on the type
As a team member
I want to CRUD issues with a reliable target version system
So that I know what target version an issue can have or will be assigned
Background:
Given there is 1 project with:
| name | ecookbook |
And I am working in project "ecookbook"
And the project uses the following modules:
| backlogs |
And there is a role "scrum master"
And the role "scrum master" may have the following rights:
| view_master_backlog |
| view_taskboards |
| update_sprints |
| update_stories |
| create_impediments |
| update_impediments |
| update_tasks |
| subscribe_to_calendars |
| view_wiki_pages |
| edit_wiki_pages |
| view_issues |
| edit_issues |
| manage_subtasks |
| create_tasks |
| add_issues |
And the backlogs module is initialized
And the following trackers are configured to track stories:
| Story |
And the tracker "Task" is configured to track tasks
And the project uses the following trackers:
| Story |
| Epic |
| Task |
| Bug |
And the tracker "Task" has the default workflow for the role "scrum master"
And there is 1 user with:
| login | markus |
| firstname | Markus |
| Lastname | Master |
And the user "markus" is a "scrum master"
And the project has the following sprints:
| name | start_date | effective_date |
| Sprint 001 | 2010-01-01 | 2010-01-31 |
| Sprint 002 | 2010-02-01 | 2010-02-28 |
| Sprint 003 | 2010-03-01 | 2010-03-31 |
| Sprint 004 | 2.weeks.ago | 1.week.from_now |
| Sprint 005 | 3.weeks.ago | 2.weeks.from_now|
And the project has the following stories in the following sprints:
| position | subject | sprint |
| 5 | Story A | Sprint 001 |
| 6 | Story B | Sprint 001 |
| 7 | Story C | Sprint 002 |
And there are the following issue status:
| name | is_closed | is_default |
| New | false | true |
| In Progress | false | false |
| Resolved | false | false |
| Closed | true | false |
| Rejected | true | false |
And I am logged in as "markus"
@javascript
Scenario: Creating a task, via the taskboard, as a subtask to a story sets the target version to the story´s version
Given I am on the taskboard for "Sprint 001"
When I click to add a new task for story "Story A"
And I fill in "Task 0815" for "subject"
And I press "OK"
Then I should see "Task 0815" as a task to story "Story A"
And the task "Task 0815" should have "Sprint 001" as its target version
@javascript
Scenario: Stale Object Error when creating task via the taskboard without 'Remaining Hours' after having created a task with 'Remaining Hours' after having created a task without 'Remaining Hours' (bug 9057)
Given I am on the taskboard for "Sprint 001"
When I click to add a new task for story "Story A"
And I fill in "Task1" for "subject"
And I fill in "3" for "remaining_hours"
And I press "OK"
And I click to add a new task for story "Story A"
And I fill in "Task2" for "subject"
And I press "OK"
And I click to add a new task for story "Story A"
And I fill in "Task3" for "subject"
And I fill in "3" for "remaining_hours"
And I press "OK"
And the request on task "Task1" is finished
And the request on task "Task2" is finished
And the request on task "Task3" is finished
Then there should not be a saving error on task "Task3"
And the task "Task1" should have "Sprint 001" as its target version
And the task "Task2" should have "Sprint 001" as its target version
And the task "Task3" should have "Sprint 001" as its target version
And task Task1 should have remaining_hours set to 3
And task Task3 should have remaining_hours set to 3
#Scenario: Moving a task between stories on the taskboard
# not testable for now
@javascript
Scenario: Creating a task, via subtask, as a subtask to a story set´s the new task´s fixed version to the parent´s fixed version
When I go to the page of the issue "Story A"
And I follow "Add" within "div#issue_tree"
And I select "Task" from "issue_tracker_id"
And I fill in "Task 0815" for "issue_subject"
And I press "Create"
Then I should see "Sprint 001" within "td.fixed-version"
@javascript
Scenario: Creating a task, via new issue, as a subtask to a story is not possible
When I go to the issues/new page of the project called "ecookbook"
And I follow "New issue" within "#main-menu"
And I select "Task" from "issue_tracker_id"
And I fill in "Task 0815" for "issue_subject"
And I fill in the id of the issue "Story A" as the parent issue
And I press "Create"
Then I should see "Sprint 001" within "td.fixed-version"
@javascript
Scenario: Moving a task between stories via issue/edit
Given the project has the following tasks:
| subject | parent |
| Task 1 | Story 1 |
When I go to the edit page of the issue "Task 1"
And I follow "More" within "#issue-form"
And I fill in the id of the issue "Story C" as the parent issue
And I press "Submit"
Then I should see "Sprint 002" within "td.fixed-version"

@ -222,3 +222,23 @@ Then /^the start date of "(.+?)" should be "(.+?)"$/ do |sprint_name, date|
Then %Q{I should see "#{date}" within "div#sprint_#{version.id} div.start_date"}
end
Then /^I should see "(.+?)" as a task to story "(.+?)"$/ do |task_name, story_name|
story = Story.find_by_subject(story_name)
Then %{I should see "#{task_name}" within "tr.story_#{story.id}"}
end
Then /^the task "(.+?)" should have "(.+?)" as its target version$/ do |task_name, version_name|
task = Task.find_by_subject(task_name)
version = Version.find_by_name(version_name)
task.fixed_version.should eql version
end
Then /^there should not be a saving error on task "(.+?)"$/ do |task_name|
elements = all(:xpath, "//*[contains(., \"#{task_name}\")]")
task_div = elements.find{|e| e.tag_name == "div" && e[:class].include?("task")}
task_div[:class].should_not include("error")
end

@ -176,3 +176,19 @@ end
When /^I click on the impediment called "(.+?)"$/ do |impediment_name|
When %Q{I click on the text "#{impediment_name}"}
end
When /^I click to add a new task for story "(.+?)"$/ do |story_name|
story = Story.find_by_subject(story_name)
page.all(:css, "tr.story_#{story.id} td.add_new").last.click
end
When /^I fill in the id of the issue "(.+?)" as the parent issue$/ do |issue_name|
issue = Issue.find_by_subject(issue_name)
When %Q{I fill in "#{issue.id}" for "issue_parent_issue_id"}
end
When /^the request on task "(.+?)" is finished$/ do |task_name|
When 'I wait for AJAX requests to finish'
end

@ -14,8 +14,8 @@ module Backlogs
before_validation :backlogs_before_validation, :if => lambda {|i| i.project && i.project.module_enabled?("backlogs")}
after_save :touch_sprint_burndowns
before_save :inherit_version_from_parent, :if => lambda {|i| i.is_task? and i.fixed_version_id.blank? }
after_save :inherit_version_of_story, :if => lambda {|i| i.is_story? and i.changed? }
before_save :inherit_version_from_parent, :if => lambda {|i| i.is_task? }
after_save :inherit_version_to_subtasks, :if => lambda {|i| (i.is_story? || (i.backlogs_enabled? && i.tracker_id == Task.tracker)) }
validates_numericality_of :story_points, :only_integer => true,
:allow_nil => true,
@ -23,12 +23,6 @@ module Backlogs
:less_than => 10_000,
:if => lambda { |i| i.project && i.project.module_enabled?('backlogs') }
validates_each :fixed_version_id do |record, field, value|
if record.is_task? and record.fixed_version_id_changed? and record.fixed_version_id != record.story.fixed_version_id
record.errors.add :fixed_version_id, :task_version_must_be_the_same_as_story_version
end
end
end
end
@ -69,7 +63,7 @@ module Backlogs
end
def is_task?
backlogs_enabled? and (self.parent_id && self.tracker_id == Task.tracker && Task.tracker.present?)
backlogs_enabled? and (self.parent_issue_id && self.tracker_id == Task.tracker && Task.tracker.present?)
end
def story
@ -114,11 +108,13 @@ module Backlogs
end
end
end
def inherit_version_from(parent)
if parent
self.fixed_version_id = parent.fixed_version_id
end
self.fixed_version_id = parent.fixed_version_id if parent
end
def backlogs_enabled?
self.project.module_enabled?("backlogs")
end
private
@ -128,15 +124,26 @@ module Backlogs
self.remaining_hours = self.estimated_hours if self.remaining_hours.blank? && ! self.estimated_hours.blank?
end
end
def inherit_version_from_parent
inherit_version_from(self.story)
parent = Issue.find(self.parent_issue_id)
inherit_version_from(parent) if parent.is_story? || parent.is_task?
true
end
def inherit_version_of_story
story = self.story or return true
story.inherit_version_to_subtasks
# def inherit_version_of_story
# story = self.story or return true
# story.inherit_version_to_subtasks
# end
def inherit_version_to_subtasks
# we overwrite the version of all descending issues that are tasks
self.children.find_all_by_tracker_id(Task.tracker).each do |task|
task.inherit_version_from(self)
task.save! if task.changed?
end
end
def touch_sprint_burndowns
@ -161,11 +168,6 @@ module Backlogs
sprint.touch_burndown
}
end
def backlogs_enabled?
self.project.module_enabled?("backlogs")
end
end
end
end

@ -0,0 +1,513 @@
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
describe Issue, "changing a story's fixed_version changes the fixed_version of all it's tasks (and the tasks beyond)" do
let(:tracker_feature) { Factory.build(:tracker_feature) }
let(:tracker_task) { Factory.build(:tracker_task) }
let(:tracker_bug) { Factory.build(:tracker_bug) }
let(:version1) { project.versions.first }
let(:version2) { project.versions.last }
let(:role) { Factory.build(:role) }
let(:user) { Factory.build(:user) }
let(:issue_priority) { Factory.build(:priority) }
let(:issue_status) { Factory.build(:issue_status, :name => "status 1", :is_default => true) }
let(:project) do
p = Factory.build(:project, :members => [Factory.build(:member,
:principal => user,
:roles => [role])],
:trackers => [tracker_feature, tracker_task, tracker_bug])
p.versions << Factory.build(:version, :name => "Version1", :project => p)
p.versions << Factory.build(:version, :name => "Version2", :project => p)
p
end
let(:story) { Factory.build(:issue,
:subject => "Story",
:project => project,
:tracker => tracker_feature,
:fixed_version => version1,
:status => issue_status,
:author => user,
:priority => issue_priority) }
let(:story2) { Factory.build(:issue,
:subject => "Story2",
:project => project,
:tracker => tracker_feature,
:fixed_version => version1,
:status => issue_status,
:author => user,
:priority => issue_priority) }
let(:story3) { Factory.build(:issue,
:subject => "Story3",
:project => project,
:tracker => tracker_feature,
:fixed_version => version1,
:status => issue_status,
:author => user,
:priority => issue_priority) }
let(:task) { Factory.build(:issue,
:subject => "Task",
:tracker => tracker_task,
:fixed_version => version1,
:project => project,
:status => issue_status,
:author => user,
:priority => issue_priority) }
let(:task2) { Factory.build(:issue,
:subject => "Task2",
:tracker => tracker_task,
:fixed_version => version1,
:project => project,
:status => issue_status,
:author => user,
:priority => issue_priority) }
let(:task3) { Factory.build(:issue,
:subject => "Task3",
:tracker => tracker_task,
:fixed_version => version1,
:project => project,
:status => issue_status,
:author => user,
:priority => issue_priority) }
let(:task4) { Factory.build(:issue,
:subject => "Task4",
:tracker => tracker_task,
:fixed_version => version1,
:project => project,
:status => issue_status,
:author => user,
:priority => issue_priority) }
let(:task5) { Factory.build(:issue,
:subject => "Task5",
:tracker => tracker_task,
:fixed_version => version1,
:project => project,
:status => issue_status,
:author => user,
:priority => issue_priority) }
let(:bug) { Factory.build(:issue,
:subject => "Bug",
:tracker => tracker_bug,
:fixed_version => version1,
:project => project,
:status => issue_status,
:author => user,
:priority => issue_priority) }
let(:bug2) { Factory.build(:issue,
:subject => "Bug2",
:tracker => tracker_bug,
:fixed_version => version1,
:project => project,
:status => issue_status,
:author => user,
:priority => issue_priority) }
let(:bug3) { Factory.build(:issue,
:subject => "Bug3",
:tracker => tracker_bug,
:fixed_version => version1,
:project => project,
:status => issue_status,
:author => user,
:priority => issue_priority) }
before(:each) do
project.save!
Setting.plugin_redmine_backlogs = { :points_burn_direction => "down",
:wiki_template => "",
:card_spec => "Sattleford VM-5040",
:story_trackers => [tracker_feature.id],
:task_tracker => tracker_task.id.to_s }
end
def standard_child_layout
# Layout is
# child
# -> task3
# -> bug3
# -> task4
# -> story3
# -> task5
task3.parent_issue_id = child.id
task3.save!
bug3.parent_issue_id = child.id
bug3.save!
story3.parent_issue_id = child.id
story3.save!
task4.parent_issue_id = bug3.id
task4.save!
task5.parent_issue_id = story3.id
task5.save!
child.reload
end
describe "WHEN changing fixed_version" do
shared_examples_for "changing parent's fixed_version changes child's fixed version" do
it "SHOULD change the child's fixed version to the parent's fixed version" do
subject.save!
child.parent_issue_id = subject.id
child.save!
standard_child_layout
subject.reload
subject.fixed_version = version2
subject.save!
#due to performance, these assertions are all in one it statement
child.reload.fixed_version.should eql version2
task3.reload.fixed_version.should eql version2
bug3.reload.fixed_version.should eql version1
story3.reload.fixed_version.should eql version1
task4.reload.fixed_version.should eql version1
task5.reload.fixed_version.should eql version1
end
end
shared_examples_for "changing parent's fixed_version does not change child's fixed_version" do
it "SHOULD keep the child's version" do
subject.save!
child.parent_issue_id = subject.id
child.save!
standard_child_layout
subject.reload
subject.fixed_version = version2
subject.save!
#due to performance, these assertions are all in one it statement
child.reload.fixed_version.should eql version1
bug3.reload.fixed_version.should eql version1
story3.reload.fixed_version.should eql version1
task3.reload.fixed_version.should eql version1
task4.reload.fixed_version.should eql version1
task5.reload.fixed_version.should eql version1
end
end
describe "WITH backlogs enabled" do
describe "WITH a story" do
subject { story }
describe "WITH a task as child" do
let(:child) { task2 }
it_should_behave_like "changing parent's fixed_version changes child's fixed version"
end
describe "WITH a non backlogs issue as child" do
let(:child) { bug2 }
it_should_behave_like "changing parent's fixed_version does not change child's fixed_version"
end
describe "WITH a story as a child" do
let(:child) { story2 }
it_should_behave_like "changing parent's fixed_version does not change child's fixed_version"
end
end
describe "WITH a task" do
before(:each) do
bug2.save!
task.parent_issue_id = bug2.id #so that it is considered a task
task.save!
end
subject { task }
describe "WITH a task as child" do
let(:child) { task2 }
it_should_behave_like "changing parent's fixed_version changes child's fixed version"
end
describe "WITH a non backlogs issue as child" do
let(:child) { bug }
it_should_behave_like "changing parent's fixed_version does not change child's fixed_version"
end
end
describe "WITH a task (impediment) without a parent" do
subject { task }
describe "WITH a task as child" do
let(:child) { task2 }
it_should_behave_like "changing parent's fixed_version changes child's fixed version"
end
describe "WITH a non backlogs issue as child" do
let(:child) { bug }
it_should_behave_like "changing parent's fixed_version does not change child's fixed_version"
end
end
describe "WITH a non backlogs issue" do
subject { bug }
describe "WITH a task as child" do
let(:child) { task }
it_should_behave_like "changing parent's fixed_version does not change child's fixed_version"
end
describe "WITH a non backlogs issue as child" do
let(:child) { bug2 }
it_should_behave_like "changing parent's fixed_version does not change child's fixed_version"
end
describe "WITH a story as a child" do
let(:child) { story }
it_should_behave_like "changing parent's fixed_version does not change child's fixed_version"
end
end
end
describe "WITH backlogs disabled" do
before(:each) do
project.enabled_module_names = project.enabled_module_names.find_all{|n| n != "backlogs" }
end
describe "WITH a story" do
subject { story }
describe "WITH a task as child" do
let(:child) { task2 }
it_should_behave_like "changing parent's fixed_version does not change child's fixed_version"
end
describe "WITH a non backlogs issue as child" do
let(:child) { bug2 }
it_should_behave_like "changing parent's fixed_version does not change child's fixed_version"
end
describe "WITH a story as a child" do
let(:child) { story2 }
it_should_behave_like "changing parent's fixed_version does not change child's fixed_version"
end
end
describe "WITH a task" do
before(:each) do
bug2.save!
task.parent_issue_id = bug2.id #so that it is considered a task
task.save!
end
subject { task }
describe "WITH a task as child" do
let(:child) { task2 }
it_should_behave_like "changing parent's fixed_version does not change child's fixed_version"
end
describe "WITH a non backlogs issue as child" do
let(:child) { bug }
it_should_behave_like "changing parent's fixed_version does not change child's fixed_version"
end
end
describe "WITH a task (impediment) without a parent" do
subject { task }
describe "WITH a task as child" do
let(:child) { task2 }
it_should_behave_like "changing parent's fixed_version does not change child's fixed_version"
end
describe "WITH a non backlogs issue as child" do
let(:child) { bug }
it_should_behave_like "changing parent's fixed_version does not change child's fixed_version"
end
end
describe "WITH a non backlogs issue" do
subject { bug }
describe "WITH a task as child" do
let(:child) { task }
it_should_behave_like "changing parent's fixed_version does not change child's fixed_version"
end
describe "WITH a non backlogs issue as child" do
let(:child) { bug2 }
it_should_behave_like "changing parent's fixed_version does not change child's fixed_version"
end
describe "WITH a story as a child" do
let(:child) { story }
it_should_behave_like "changing parent's fixed_version does not change child's fixed_version"
end
end
end
end
describe "WHEN changing the parent_issue_id" do
shared_examples_for "changing the child's parent_issue to the parent changes child's fixed version" do
it "SHOULD change the child's fixed version to the parent's fixed version" do
child.save!
standard_child_layout
parent.fixed_version = version2
parent.save!
child.parent_issue_id = parent.id
child.save!
#due to performance, these assertions are all in one it statement
child.reload.fixed_version.should eql version2
task3.reload.fixed_version.should eql version2
bug3.reload.fixed_version.should eql version1
story3.reload.fixed_version.should eql version1
task4.reload.fixed_version.should eql version1
task5.reload.fixed_version.should eql version1
end
end
shared_examples_for "changing the child's parent_issue to the parent leaves child's fixed version" do
it "SHOULD keep the child's version" do
child.save!
standard_child_layout
parent.fixed_version = version2
parent.save!
child.parent_issue_id = parent.id
child.save!
#due to performance, these assertions are all in one it statement
child.reload.fixed_version.should eql version1
bug3.reload.fixed_version.should eql version1
story3.reload.fixed_version.should eql version1
task3.reload.fixed_version.should eql version1
task4.reload.fixed_version.should eql version1
task5.reload.fixed_version.should eql version1
end
end
describe "WITH backogs enabled" do
describe "WITH a story as parent" do
let(:parent) { story }
describe "WITH a story as child" do
let(:child) { story2 }
it_should_behave_like "changing the child's parent_issue to the parent leaves child's fixed version"
end
describe "WITH a task as child" do
let(:child) { task2 }
it_should_behave_like "changing the child's parent_issue to the parent changes child's fixed version"
end
describe "WITH a non-backlogs issue as child" do
let(:child) { bug2 }
it_should_behave_like "changing the child's parent_issue to the parent leaves child's fixed version"
end
end
describe "WITH a task as parent" do
before(:each) do
story.save!
task.parent_issue_id = story.id
task.save!
story.reload
task.reload
end
let(:parent) { story } #needs to be the story because it is not possible to change a task's fixed_version_id
describe "WITH a task as child" do
let(:child) { task2 }
it_should_behave_like "changing the child's parent_issue to the parent changes child's fixed version"
end
describe "WITH a non-backlogs issue as child" do
let(:child) { bug2 }
it_should_behave_like "changing the child's parent_issue to the parent leaves child's fixed version"
end
end
describe "WITH an impediment (task) as parent" do
let(:parent) { task }
describe "WITH a task as child" do
let(:child) { task2 }
it_should_behave_like "changing the child's parent_issue to the parent changes child's fixed version"
end
describe "WITH a non-backlogs issue as child" do
let(:child) { bug2 }
it_should_behave_like "changing the child's parent_issue to the parent leaves child's fixed version"
end
end
describe "WITH a non-backlogs issue as parent" do
let(:parent) { bug }
describe "WITH a story as child" do
let(:child) { story2 }
it_should_behave_like "changing the child's parent_issue to the parent leaves child's fixed version"
end
describe "WITH a task as child" do
let(:child) { task2 }
it_should_behave_like "changing the child's parent_issue to the parent leaves child's fixed version"
end
describe "WITH a non-backlogs issue as child" do
let(:child) { bug2 }
it_should_behave_like "changing the child's parent_issue to the parent leaves child's fixed version"
end
end
end
end
end

@ -0,0 +1,323 @@
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
describe Issue, "fixed version restricted by an issues parents (if it's a task)" do
let(:tracker_feature) { Factory.build(:tracker_feature) }
let(:tracker_task) { Factory.build(:tracker_task) }
let(:tracker_bug) { Factory.build(:tracker_bug) }
let(:version1) { project.versions.first }
let(:version2) { project.versions.last }
let(:role) { Factory.build(:role) }
let(:user) { Factory.build(:user) }
let(:issue_priority) { Factory.build(:priority) }
let(:issue_status) { Factory.build(:issue_status, :name => "status 1", :is_default => true) }
let(:project) do
p = Factory.build(:project, :members => [Factory.build(:member,
:principal => user,
:roles => [role])],
:trackers => [tracker_feature, tracker_task, tracker_bug])
p.versions << Factory.build(:version, :name => "Version1", :project => p)
p.versions << Factory.build(:version, :name => "Version2", :project => p)
p
end
let(:story) { Factory.build(:issue,
:subject => "Story",
:project => project,
:tracker => tracker_feature,
:fixed_version => version1,
:status => issue_status,
:author => user,
:priority => issue_priority) }
let(:story2) { Factory.build(:issue,
:subject => "Story2",
:project => project,
:tracker => tracker_feature,
:fixed_version => version1,
:status => issue_status,
:author => user,
:priority => issue_priority) }
let(:task) { Factory.build(:issue,
:subject => "Task",
:tracker => tracker_task,
:fixed_version => version1,
:project => project,
:status => issue_status,
:author => user,
:priority => issue_priority) }
let(:task2) { Factory.build(:issue,
:subject => "Task2",
:tracker => tracker_task,
:fixed_version => version1,
:project => project,
:status => issue_status,
:author => user,
:priority => issue_priority) }
let(:bug) { Factory.build(:issue,
:subject => "Bug",
:tracker => tracker_bug,
:fixed_version => version1,
:project => project,
:status => issue_status,
:author => user,
:priority => issue_priority) }
let(:bug2) { Factory.build(:issue,
:subject => "Bug2",
:tracker => tracker_bug,
:fixed_version => version1,
:project => project,
:status => issue_status,
:author => user,
:priority => issue_priority) }
shared_examples_for "fixed version beeing inherited from the parent" do
before(:each) do
parent.save!
subject.parent_issue_id = parent.id
subject.save!
parent.reload
end
describe "WITHOUT a fixed version and the parent also having no fixed version" do
before(:each) do
parent.fixed_version = nil
parent.save!
subject.reload
subject.fixed_version = nil
subject.save!
end
it { subject.reload.fixed_version.should be_nil }
end
describe "WITHOUT a fixed version and the parent having a fixed version" do
before(:each) do
parent.fixed_version = version1
parent.save!
subject.fixed_version = nil
subject.save!
end
it { subject.reload.fixed_version.should eql version1 }
end
describe "WITH a fixed version and the parent having a different fixed version" do
before(:each) do
parent.fixed_version = version1
parent.save!
subject.fixed_version = version2
subject.save!
end
it { subject.reload.fixed_version.should eql version1 }
end
describe "WITH a fixed version and the parent having the same fixed version" do
before(:each) do
parent.fixed_version = version1
parent.save!
subject.fixed_version = version1
subject.save!
end
it { subject.reload.fixed_version.should eql version1 }
end
describe "WITH a fixed version and the parent having no fixed version" do
before(:each) do
parent.fixed_version = nil
parent.save!
subject.reload
subject.fixed_version = version1
subject.save!
end
it { subject.reload.fixed_version.should be_nil }
end
end
shared_examples_for "fixed version not beeing inherited from the parent" do
before(:each) do
parent.save!
subject.parent_issue_id = parent.id
subject.save!
parent.reload
end
describe "WITHOUT a fixed version and the parent also having no fixed version" do
before(:each) do
parent.fixed_version = nil
parent.save!
subject.reload
subject.fixed_version = nil
subject.save!
end
it { subject.reload.fixed_version.should be_nil }
end
describe "WITHOUT a fixed version and the parent having a fixed version" do
before(:each) do
parent.fixed_version = version1
parent.save!
subject.fixed_version = nil
subject.save!
end
it { subject.reload.fixed_version.should be_nil }
end
describe "WITH a fixed version and the parent having a different fixed version" do
before(:each) do
parent.fixed_version = version1
parent.save!
subject.fixed_version = version2
subject.save!
end
it { subject.reload.fixed_version.should eql version2 }
end
describe "WITH a fixed version and the parent having the same fixed version" do
before(:each) do
parent.fixed_version = version1
parent.save!
subject.fixed_version = version1
subject.save!
end
it { subject.reload.fixed_version.should eql version1 }
end
describe "WITH a fixed version and the parent having no fixed version" do
before(:each) do
parent.fixed_version = nil
parent.save!
subject.reload
subject.fixed_version = version1
subject.save!
end
it { subject.reload.fixed_version.should eql version1 }
end
end
shared_examples_for "fixed version without restriction" do
describe "WITHOUT a fixed version" do
before(:each) do
subject.fixed_version = nil
subject.save!
end
it { subject.reload.fixed_version.should be_nil }
end
describe "WITH a fixed version" do
before(:each) do
subject.fixed_version = version1
subject.save!
end
it { subject.reload.fixed_version.should eql version1 }
end
end
before(:each) do
project.save!
Setting.plugin_redmine_backlogs = { :points_burn_direction => "down",
:wiki_template => "",
:card_spec => "Sattleford VM-5040",
:story_trackers => [tracker_feature.id],
:task_tracker => tracker_task.id.to_s }
end
describe "WITH a story" do
subject { story }
describe "WITHOUT a parent issue" do
it_should_behave_like "fixed version without restriction"
end
describe "WITH a story as it's parent" do
let(:parent) { story2 }
it_should_behave_like "fixed version not beeing inherited from the parent"
end
describe "WITH a non backlogs tracked issue as it's parent" do
let(:parent) { bug }
it_should_behave_like "fixed version not beeing inherited from the parent"
end
end
describe "WITH a task" do
subject { task }
describe "WITHOUT a parent issue (would than be an impediment)" do
it_should_behave_like "fixed version without restriction"
end
describe "WITH a task as it's parent" do
before(:each) do
story.save!
task2.parent_issue_id = story.id #a task needs a parent
task2.save!
story.reload
end
let(:parent) { story } #it's actually the grandparent but it makes no difference for the test
it_should_behave_like "fixed version beeing inherited from the parent"
end
describe "WITH a story as it's parent" do
let(:parent) { story }
it_should_behave_like "fixed version beeing inherited from the parent"
end
describe "WITH a non backlogs tracked issue as it's parent" do
let(:parent) { bug }
it_should_behave_like "fixed version not beeing inherited from the parent"
end
end
describe "WITH a non backlogs issue" do
subject { bug }
describe "WITHOUT a parent issue" do
it_should_behave_like "fixed version without restriction"
end
describe "WITH a task as it's parent" do
let(:parent) { task2 }
it_should_behave_like "fixed version not beeing inherited from the parent"
end
describe "WITH a story as it's parent" do
let(:parent) { story }
it_should_behave_like "fixed version not beeing inherited from the parent"
end
describe "WITH a non backlogs tracked issue as it's parent" do
let(:parent) { bug2 }
it_should_behave_like "fixed version not beeing inherited from the parent"
end
end
end
Loading…
Cancel
Save