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.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  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 ActivityTest < ActiveSupport::TestCase
  19. fixtures :projects, :versions, :attachments, :users, :roles, :members, :member_roles, :issues, :journals, :journal_details,
  20. :trackers, :projects_trackers, :issue_statuses, :enabled_modules, :enumerations, :boards, :messages, :time_entries,
  21. :wikis, :wiki_pages, :wiki_contents, :wiki_content_versions
  22. def setup
  23. User.current = nil
  24. @project = Project.find(1)
  25. end
  26. def test_activity_without_subprojects
  27. events = find_events(User.anonymous, :project => @project)
  28. assert_not_nil events
  29. assert events.include?(Issue.find(1))
  30. assert !events.include?(Issue.find(4))
  31. # subproject issue
  32. assert !events.include?(Issue.find(5))
  33. end
  34. def test_activity_with_subprojects
  35. events = find_events(User.anonymous, :project => @project, :with_subprojects => 1)
  36. assert_not_nil events
  37. assert events.include?(Issue.find(1))
  38. # subproject issue
  39. assert events.include?(Issue.find(5))
  40. end
  41. def test_global_activity_anonymous
  42. events = find_events(User.anonymous)
  43. assert_not_nil events
  44. assert events.include?(Issue.find(1))
  45. assert events.include?(Message.find(5))
  46. # Issue of a private project
  47. assert !events.include?(Issue.find(4))
  48. # Private issue and comment
  49. assert !events.include?(Issue.find(14))
  50. assert !events.include?(Journal.find(5))
  51. end
  52. def test_global_activity_logged_user
  53. events = find_events(User.find(2)) # manager
  54. assert_not_nil events
  55. assert events.include?(Issue.find(1))
  56. # Issue of a private project the user belongs to
  57. assert events.include?(Issue.find(4))
  58. end
  59. def test_user_activity
  60. user = User.find(2)
  61. events = Redmine::Activity::Fetcher.new(User.anonymous, :author => user).events(nil, nil, :limit => 10)
  62. assert(events.size > 0)
  63. assert(events.size <= 10)
  64. assert_nil(events.detect {|e| e.event_author != user})
  65. end
  66. def test_journal_with_notes_and_changes_should_be_returned_once
  67. f = Redmine::Activity::Fetcher.new(User.anonymous, :project => Project.find(1))
  68. f.scope = ['issues']
  69. events = f.events
  70. assert_equal events, events.uniq
  71. end
  72. def test_files_activity
  73. f = Redmine::Activity::Fetcher.new(User.anonymous, :project => Project.find(1))
  74. f.scope = ['files']
  75. events = f.events
  76. assert_kind_of Array, events
  77. assert events.include?(Attachment.find_by_container_type_and_container_id('Project', 1))
  78. assert events.include?(Attachment.find_by_container_type_and_container_id('Version', 1))
  79. assert_equal [Attachment], events.collect(&:class).uniq
  80. assert_equal %w(Project Version), events.collect(&:container_type).uniq.sort
  81. end
  82. def test_event_group_for_issue
  83. issue = Issue.find(1)
  84. assert_equal issue, issue.event_group
  85. end
  86. def test_event_group_for_journal
  87. issue = Issue.find(1)
  88. journal = issue.journals.first
  89. assert_equal issue, journal.event_group
  90. end
  91. def test_event_group_for_issue_time_entry
  92. time = TimeEntry.where(:issue_id => 1).first
  93. assert_equal time.issue, time.event_group
  94. end
  95. def test_event_group_for_project_time_entry
  96. time = TimeEntry.where(:issue_id => nil).first
  97. assert_equal time, time.event_group
  98. end
  99. def test_event_group_for_message
  100. message = Message.find(1)
  101. reply = message.children.first
  102. assert_equal message, message.event_group
  103. assert_equal message, reply.event_group
  104. end
  105. def test_event_group_for_wiki_content_version
  106. content = WikiContent::Version.find(1)
  107. assert_equal content.page, content.event_group
  108. end
  109. class TestActivityProviderWithPermission
  110. def self.activity_provider_options
  111. {'test' => {:permission => :custom_permission}}
  112. end
  113. end
  114. class TestActivityProviderWithNilPermission
  115. def self.activity_provider_options
  116. {'test' => {:permission => nil}}
  117. end
  118. end
  119. class TestActivityProviderWithoutPermission
  120. def self.activity_provider_options
  121. {'test' => {}}
  122. end
  123. end
  124. class MockUser
  125. def initialize(*permissions)
  126. @permissions = permissions
  127. end
  128. def allowed_to?(permission, *args)
  129. @permissions.include?(permission)
  130. end
  131. end
  132. def test_event_types_should_consider_activity_provider_permission
  133. Redmine::Activity.register 'test', :class_name => 'ActivityTest::TestActivityProviderWithPermission'
  134. user = MockUser.new(:custom_permission)
  135. f = Redmine::Activity::Fetcher.new(user, :project => Project.find(1))
  136. assert_include 'test', f.event_types
  137. ensure
  138. Redmine::Activity.delete 'test'
  139. end
  140. def test_event_types_should_include_activity_provider_with_nil_permission
  141. Redmine::Activity.register 'test', :class_name => 'ActivityTest::TestActivityProviderWithNilPermission'
  142. user = MockUser.new()
  143. f = Redmine::Activity::Fetcher.new(user, :project => Project.find(1))
  144. assert_include 'test', f.event_types
  145. ensure
  146. Redmine::Activity.delete 'test'
  147. end
  148. def test_event_types_should_use_default_permission_for_activity_provider_without_permission
  149. Redmine::Activity.register 'test', :class_name => 'ActivityTest::TestActivityProviderWithoutPermission'
  150. user = MockUser.new()
  151. f = Redmine::Activity::Fetcher.new(user, :project => Project.find(1))
  152. assert_not_include 'test', f.event_types
  153. user = MockUser.new(:view_test)
  154. f = Redmine::Activity::Fetcher.new(user, :project => Project.find(1))
  155. assert_include 'test', f.event_types
  156. ensure
  157. Redmine::Activity.delete 'test'
  158. end
  159. private
  160. def find_events(user, options={})
  161. Redmine::Activity::Fetcher.new(user, options).events(Date.today - 30, Date.today + 1)
  162. end
  163. end