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 9.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. # Redmine - project management software
  2. # Copyright (C) 2006-2017 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 setup
  33. User.current = nil
  34. end
  35. def test_create
  36. from = Issue.find(1)
  37. to = Issue.find(2)
  38. relation = IssueRelation.new :issue_from => from, :issue_to => to,
  39. :relation_type => IssueRelation::TYPE_PRECEDES
  40. assert relation.save
  41. relation.reload
  42. assert_equal IssueRelation::TYPE_PRECEDES, relation.relation_type
  43. assert_equal from, relation.issue_from
  44. assert_equal to, relation.issue_to
  45. end
  46. def test_create_minimum
  47. relation = IssueRelation.new :issue_from => Issue.find(1), :issue_to => Issue.find(2)
  48. assert relation.save
  49. assert_equal IssueRelation::TYPE_RELATES, relation.relation_type
  50. end
  51. def test_follows_relation_should_be_reversed
  52. from = Issue.find(1)
  53. to = Issue.find(2)
  54. relation = IssueRelation.new :issue_from => from, :issue_to => to,
  55. :relation_type => IssueRelation::TYPE_FOLLOWS
  56. assert relation.save
  57. relation.reload
  58. assert_equal IssueRelation::TYPE_PRECEDES, relation.relation_type
  59. assert_equal to, relation.issue_from
  60. assert_equal from, relation.issue_to
  61. end
  62. def test_cannot_create_inverse_relates_relations
  63. from = Issue.find(1)
  64. to = Issue.find(2)
  65. relation1 = IssueRelation.new :issue_from => from, :issue_to => to,
  66. :relation_type => IssueRelation::TYPE_RELATES
  67. assert relation1.save
  68. relation2 = IssueRelation.new :issue_from => to, :issue_to => from,
  69. :relation_type => IssueRelation::TYPE_RELATES
  70. assert !relation2.save
  71. assert_not_equal [], relation2.errors[:base]
  72. end
  73. def test_follows_relation_should_not_be_reversed_if_validation_fails
  74. from = Issue.find(1)
  75. to = Issue.find(2)
  76. relation = IssueRelation.new :issue_from => from, :issue_to => to,
  77. :relation_type => IssueRelation::TYPE_FOLLOWS,
  78. :delay => 'xx'
  79. assert !relation.save
  80. assert_equal IssueRelation::TYPE_FOLLOWS, relation.relation_type
  81. assert_equal from, relation.issue_from
  82. assert_equal to, relation.issue_to
  83. end
  84. def test_relation_type_for
  85. from = Issue.find(1)
  86. to = Issue.find(2)
  87. relation = IssueRelation.new :issue_from => from, :issue_to => to,
  88. :relation_type => IssueRelation::TYPE_PRECEDES
  89. assert_equal IssueRelation::TYPE_PRECEDES, relation.relation_type_for(from)
  90. assert_equal IssueRelation::TYPE_FOLLOWS, relation.relation_type_for(to)
  91. end
  92. def test_set_issue_to_dates_without_issue_to
  93. r = IssueRelation.new(:issue_from => Issue.new(:start_date => Date.today),
  94. :relation_type => IssueRelation::TYPE_PRECEDES,
  95. :delay => 1)
  96. assert_nil r.set_issue_to_dates
  97. end
  98. def test_set_issue_to_dates_without_issues
  99. r = IssueRelation.new(:relation_type => IssueRelation::TYPE_PRECEDES, :delay => 1)
  100. assert_nil r.set_issue_to_dates
  101. end
  102. def test_validates_circular_dependency
  103. IssueRelation.delete_all
  104. assert IssueRelation.create!(
  105. :issue_from => Issue.find(1), :issue_to => Issue.find(2),
  106. :relation_type => IssueRelation::TYPE_PRECEDES
  107. )
  108. assert IssueRelation.create!(
  109. :issue_from => Issue.find(2), :issue_to => Issue.find(3),
  110. :relation_type => IssueRelation::TYPE_PRECEDES
  111. )
  112. r = IssueRelation.new(
  113. :issue_from => Issue.find(3), :issue_to => Issue.find(1),
  114. :relation_type => IssueRelation::TYPE_PRECEDES
  115. )
  116. assert !r.save
  117. assert_not_equal [], r.errors[:base]
  118. end
  119. def test_validates_circular_dependency_of_subtask
  120. set_language_if_valid 'en'
  121. issue1 = Issue.generate!
  122. issue2 = Issue.generate!
  123. IssueRelation.create!(
  124. :issue_from => issue1, :issue_to => issue2,
  125. :relation_type => IssueRelation::TYPE_PRECEDES
  126. )
  127. child = Issue.generate!(:parent_issue_id => issue2.id)
  128. issue1.reload
  129. child.reload
  130. r = IssueRelation.new(
  131. :issue_from => child, :issue_to => issue1,
  132. :relation_type => IssueRelation::TYPE_PRECEDES
  133. )
  134. assert !r.save
  135. assert_include 'This relation would create a circular dependency', r.errors.full_messages
  136. end
  137. def test_subtasks_should_allow_precedes_relation
  138. parent = Issue.generate!
  139. child1 = Issue.generate!(:parent_issue_id => parent.id)
  140. child2 = Issue.generate!(:parent_issue_id => parent.id)
  141. r = IssueRelation.new(
  142. :issue_from => child1, :issue_to => child2,
  143. :relation_type => IssueRelation::TYPE_PRECEDES
  144. )
  145. assert r.valid?
  146. assert r.save
  147. end
  148. def test_validates_circular_dependency_on_reverse_relations
  149. IssueRelation.delete_all
  150. assert IssueRelation.create!(
  151. :issue_from => Issue.find(1), :issue_to => Issue.find(3),
  152. :relation_type => IssueRelation::TYPE_BLOCKS
  153. )
  154. assert IssueRelation.create!(
  155. :issue_from => Issue.find(1), :issue_to => Issue.find(2),
  156. :relation_type => IssueRelation::TYPE_BLOCKED
  157. )
  158. r = IssueRelation.new(
  159. :issue_from => Issue.find(2), :issue_to => Issue.find(1),
  160. :relation_type => IssueRelation::TYPE_BLOCKED
  161. )
  162. assert !r.save
  163. assert_not_equal [], r.errors[:base]
  164. end
  165. def test_create_with_initialized_journals_should_create_journals
  166. from = Issue.find(1)
  167. to = Issue.find(2)
  168. from_journals = from.journals.size
  169. to_journals = to.journals.size
  170. relation = IssueRelation.new(:issue_from => from, :issue_to => to,
  171. :relation_type => IssueRelation::TYPE_PRECEDES)
  172. relation.init_journals User.find(1)
  173. assert relation.save
  174. from.reload
  175. to.reload
  176. relation.reload
  177. assert_equal from.journals.size, (from_journals + 1)
  178. assert_equal to.journals.size, (to_journals + 1)
  179. assert_equal 'relation', from.journals.last.details.last.property
  180. assert_equal 'precedes', from.journals.last.details.last.prop_key
  181. assert_equal '2', from.journals.last.details.last.value
  182. assert_nil from.journals.last.details.last.old_value
  183. assert_equal 'relation', to.journals.last.details.last.property
  184. assert_equal 'follows', to.journals.last.details.last.prop_key
  185. assert_equal '1', to.journals.last.details.last.value
  186. assert_nil to.journals.last.details.last.old_value
  187. end
  188. def test_destroy_with_initialized_journals_should_create_journals
  189. relation = IssueRelation.find(1)
  190. from = relation.issue_from
  191. to = relation.issue_to
  192. from_journals = from.journals.size
  193. to_journals = to.journals.size
  194. relation.init_journals User.find(1)
  195. assert relation.destroy
  196. from.reload
  197. to.reload
  198. assert_equal from.journals.size, (from_journals + 1)
  199. assert_equal to.journals.size, (to_journals + 1)
  200. assert_equal 'relation', from.journals.last.details.last.property
  201. assert_equal 'blocks', from.journals.last.details.last.prop_key
  202. assert_equal '9', from.journals.last.details.last.old_value
  203. assert_nil from.journals.last.details.last.value
  204. assert_equal 'relation', to.journals.last.details.last.property
  205. assert_equal 'blocked', to.journals.last.details.last.prop_key
  206. assert_equal '10', to.journals.last.details.last.old_value
  207. assert_nil to.journals.last.details.last.value
  208. end
  209. def test_to_s_should_return_the_relation_string
  210. set_language_if_valid 'en'
  211. relation = IssueRelation.find(1)
  212. assert_equal "Blocks #9", relation.to_s(relation.issue_from)
  213. assert_equal "Blocked by #10", relation.to_s(relation.issue_to)
  214. end
  215. def test_to_s_without_argument_should_return_the_relation_string_for_issue_from
  216. set_language_if_valid 'en'
  217. relation = IssueRelation.find(1)
  218. assert_equal "Blocks #9", relation.to_s
  219. end
  220. def test_to_s_should_accept_a_block_as_custom_issue_formatting
  221. set_language_if_valid 'en'
  222. relation = IssueRelation.find(1)
  223. assert_equal "Blocks Bug #9", relation.to_s {|issue| "#{issue.tracker} ##{issue.id}"}
  224. end
  225. end