You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

issue_relation_test.rb 8.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. # Redmine - project management software
  2. # Copyright (C) 2006-2015 Jean-Philippe Lang
  3. #
  4. # This program is free software; you can redistribute it and/or
  5. # modify it under the terms of the GNU General Public License
  6. # as published by the Free Software Foundation; either version 2
  7. # of the License, or (at your option) any later version.
  8. #
  9. # This program is distributed in the hope that it will be useful,
  10. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. # GNU General Public License for more details.
  13. #
  14. # You should have received a copy of the GNU General Public License
  15. # along with this program; if not, write to the Free Software
  16. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  17. require File.expand_path('../../test_helper', __FILE__)
  18. class IssueRelationTest < ActiveSupport::TestCase
  19. fixtures :projects,
  20. :users,
  21. :roles,
  22. :members,
  23. :member_roles,
  24. :issues,
  25. :issue_statuses,
  26. :issue_relations,
  27. :enabled_modules,
  28. :enumerations,
  29. :trackers,
  30. :projects_trackers
  31. include Redmine::I18n
  32. def test_create
  33. from = Issue.find(1)
  34. to = Issue.find(2)
  35. relation = IssueRelation.new :issue_from => from, :issue_to => to,
  36. :relation_type => IssueRelation::TYPE_PRECEDES
  37. assert relation.save
  38. relation.reload
  39. assert_equal IssueRelation::TYPE_PRECEDES, relation.relation_type
  40. assert_equal from, relation.issue_from
  41. assert_equal to, relation.issue_to
  42. end
  43. def test_create_minimum
  44. relation = IssueRelation.new :issue_from => Issue.find(1), :issue_to => Issue.find(2)
  45. assert relation.save
  46. assert_equal IssueRelation::TYPE_RELATES, relation.relation_type
  47. end
  48. def test_follows_relation_should_be_reversed
  49. from = Issue.find(1)
  50. to = Issue.find(2)
  51. relation = IssueRelation.new :issue_from => from, :issue_to => to,
  52. :relation_type => IssueRelation::TYPE_FOLLOWS
  53. assert relation.save
  54. relation.reload
  55. assert_equal IssueRelation::TYPE_PRECEDES, relation.relation_type
  56. assert_equal to, relation.issue_from
  57. assert_equal from, relation.issue_to
  58. end
  59. def test_follows_relation_should_not_be_reversed_if_validation_fails
  60. from = Issue.find(1)
  61. to = Issue.find(2)
  62. relation = IssueRelation.new :issue_from => from, :issue_to => to,
  63. :relation_type => IssueRelation::TYPE_FOLLOWS,
  64. :delay => 'xx'
  65. assert !relation.save
  66. assert_equal IssueRelation::TYPE_FOLLOWS, relation.relation_type
  67. assert_equal from, relation.issue_from
  68. assert_equal to, relation.issue_to
  69. end
  70. def test_relation_type_for
  71. from = Issue.find(1)
  72. to = Issue.find(2)
  73. relation = IssueRelation.new :issue_from => from, :issue_to => to,
  74. :relation_type => IssueRelation::TYPE_PRECEDES
  75. assert_equal IssueRelation::TYPE_PRECEDES, relation.relation_type_for(from)
  76. assert_equal IssueRelation::TYPE_FOLLOWS, relation.relation_type_for(to)
  77. end
  78. def test_set_issue_to_dates_without_issue_to
  79. r = IssueRelation.new(:issue_from => Issue.new(:start_date => Date.today),
  80. :relation_type => IssueRelation::TYPE_PRECEDES,
  81. :delay => 1)
  82. assert_nil r.set_issue_to_dates
  83. end
  84. def test_set_issue_to_dates_without_issues
  85. r = IssueRelation.new(:relation_type => IssueRelation::TYPE_PRECEDES, :delay => 1)
  86. assert_nil r.set_issue_to_dates
  87. end
  88. def test_validates_circular_dependency
  89. IssueRelation.delete_all
  90. assert IssueRelation.create!(
  91. :issue_from => Issue.find(1), :issue_to => Issue.find(2),
  92. :relation_type => IssueRelation::TYPE_PRECEDES
  93. )
  94. assert IssueRelation.create!(
  95. :issue_from => Issue.find(2), :issue_to => Issue.find(3),
  96. :relation_type => IssueRelation::TYPE_PRECEDES
  97. )
  98. r = IssueRelation.new(
  99. :issue_from => Issue.find(3), :issue_to => Issue.find(1),
  100. :relation_type => IssueRelation::TYPE_PRECEDES
  101. )
  102. assert !r.save
  103. assert_not_equal [], r.errors[:base]
  104. end
  105. def test_validates_circular_dependency_of_subtask
  106. set_language_if_valid 'en'
  107. issue1 = Issue.generate!
  108. issue2 = Issue.generate!
  109. IssueRelation.create!(
  110. :issue_from => issue1, :issue_to => issue2,
  111. :relation_type => IssueRelation::TYPE_PRECEDES
  112. )
  113. child = Issue.generate!(:parent_issue_id => issue2.id)
  114. issue1.reload
  115. child.reload
  116. r = IssueRelation.new(
  117. :issue_from => child, :issue_to => issue1,
  118. :relation_type => IssueRelation::TYPE_PRECEDES
  119. )
  120. assert !r.save
  121. assert_include 'This relation would create a circular dependency', r.errors.full_messages
  122. end
  123. def test_subtasks_should_allow_precedes_relation
  124. parent = Issue.generate!
  125. child1 = Issue.generate!(:parent_issue_id => parent.id)
  126. child2 = Issue.generate!(:parent_issue_id => parent.id)
  127. r = IssueRelation.new(
  128. :issue_from => child1, :issue_to => child2,
  129. :relation_type => IssueRelation::TYPE_PRECEDES
  130. )
  131. assert r.valid?
  132. assert r.save
  133. end
  134. def test_validates_circular_dependency_on_reverse_relations
  135. IssueRelation.delete_all
  136. assert IssueRelation.create!(
  137. :issue_from => Issue.find(1), :issue_to => Issue.find(3),
  138. :relation_type => IssueRelation::TYPE_BLOCKS
  139. )
  140. assert IssueRelation.create!(
  141. :issue_from => Issue.find(1), :issue_to => Issue.find(2),
  142. :relation_type => IssueRelation::TYPE_BLOCKED
  143. )
  144. r = IssueRelation.new(
  145. :issue_from => Issue.find(2), :issue_to => Issue.find(1),
  146. :relation_type => IssueRelation::TYPE_BLOCKED
  147. )
  148. assert !r.save
  149. assert_not_equal [], r.errors[:base]
  150. end
  151. def test_create_with_initialized_journals_should_create_journals
  152. from = Issue.find(1)
  153. to = Issue.find(2)
  154. from_journals = from.journals.size
  155. to_journals = to.journals.size
  156. relation = IssueRelation.new(:issue_from => from, :issue_to => to,
  157. :relation_type => IssueRelation::TYPE_PRECEDES)
  158. relation.init_journals User.find(1)
  159. assert relation.save
  160. from.reload
  161. to.reload
  162. relation.reload
  163. assert_equal from.journals.size, (from_journals + 1)
  164. assert_equal to.journals.size, (to_journals + 1)
  165. assert_equal 'relation', from.journals.last.details.last.property
  166. assert_equal 'precedes', from.journals.last.details.last.prop_key
  167. assert_equal '2', from.journals.last.details.last.value
  168. assert_nil from.journals.last.details.last.old_value
  169. assert_equal 'relation', to.journals.last.details.last.property
  170. assert_equal 'follows', to.journals.last.details.last.prop_key
  171. assert_equal '1', to.journals.last.details.last.value
  172. assert_nil to.journals.last.details.last.old_value
  173. end
  174. def test_destroy_with_initialized_journals_should_create_journals
  175. relation = IssueRelation.find(1)
  176. from = relation.issue_from
  177. to = relation.issue_to
  178. from_journals = from.journals.size
  179. to_journals = to.journals.size
  180. relation.init_journals User.find(1)
  181. assert relation.destroy
  182. from.reload
  183. to.reload
  184. assert_equal from.journals.size, (from_journals + 1)
  185. assert_equal to.journals.size, (to_journals + 1)
  186. assert_equal 'relation', from.journals.last.details.last.property
  187. assert_equal 'blocks', from.journals.last.details.last.prop_key
  188. assert_equal '9', from.journals.last.details.last.old_value
  189. assert_nil from.journals.last.details.last.value
  190. assert_equal 'relation', to.journals.last.details.last.property
  191. assert_equal 'blocked', to.journals.last.details.last.prop_key
  192. assert_equal '10', to.journals.last.details.last.old_value
  193. assert_nil to.journals.last.details.last.value
  194. end
  195. def test_to_s_should_return_the_relation_string
  196. set_language_if_valid 'en'
  197. relation = IssueRelation.find(1)
  198. assert_equal "Blocks #9", relation.to_s(relation.issue_from)
  199. assert_equal "Blocked by #10", relation.to_s(relation.issue_to)
  200. end
  201. def test_to_s_without_argument_should_return_the_relation_string_for_issue_from
  202. set_language_if_valid 'en'
  203. relation = IssueRelation.find(1)
  204. assert_equal "Blocks #9", relation.to_s
  205. end
  206. def test_to_s_should_accept_a_block_as_custom_issue_formatting
  207. set_language_if_valid 'en'
  208. relation = IssueRelation.find(1)
  209. assert_equal "Blocks Bug #9", relation.to_s {|issue| "#{issue.tracker} ##{issue.id}"}
  210. end
  211. end