##// END OF EJS Templates
Fixed: validation error on issue creation when trying to add an invalid user as a watcher (#5373)....
Jean-Philippe Lang -
r5760:ef00501c3699
parent child
Show More
@@ -1,122 +1,143
1 1 # Redmine - project management software
2 2 # Copyright (C) 2006-2009 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 require File.expand_path('../../test_helper', __FILE__)
19 19
20 20 class WatcherTest < ActiveSupport::TestCase
21 21 fixtures :projects, :users, :members, :member_roles, :roles, :enabled_modules,
22 22 :issues,
23 23 :boards, :messages,
24 24 :wikis, :wiki_pages,
25 25 :watchers
26 26
27 27 def setup
28 28 @user = User.find(1)
29 29 @issue = Issue.find(1)
30 30 end
31 31
32 32 def test_watch
33 33 assert @issue.add_watcher(@user)
34 34 @issue.reload
35 35 assert @issue.watchers.detect { |w| w.user == @user }
36 36 end
37 37
38 38 def test_cant_watch_twice
39 39 assert @issue.add_watcher(@user)
40 40 assert !@issue.add_watcher(@user)
41 41 end
42 42
43 43 def test_watched_by
44 44 assert @issue.add_watcher(@user)
45 45 @issue.reload
46 46 assert @issue.watched_by?(@user)
47 47 assert Issue.watched_by(@user).include?(@issue)
48 48 end
49 49
50 def test_watcher_users
51 watcher_users = Issue.find(2).watcher_users
52 assert_kind_of Array, watcher_users
53 assert_kind_of User, watcher_users.first
54 end
55
56 def test_watcher_users_should_not_validate_user
57 User.update_all("firstname = ''", "id=1")
58 @user.reload
59 assert !@user.valid?
60
61 issue = Issue.new(:project => Project.find(1), :tracker_id => 1, :subject => "test", :author => User.find(2))
62 issue.watcher_users << @user
63 issue.save!
64 assert issue.watched_by?(@user)
65 end
66
50 67 def test_watcher_user_ids
68 assert_equal [1, 3], Issue.find(2).watcher_user_ids.sort
69 end
70
71 def test_watcher_user_ids=
51 72 issue = Issue.new
52 73 issue.watcher_user_ids = ['1', '3']
53 74 assert issue.watched_by?(User.find(1))
54 75 end
55 76
56 77 def test_addable_watcher_users
57 78 addable_watcher_users = @issue.addable_watcher_users
58 79 assert_kind_of Array, addable_watcher_users
59 80 assert_kind_of User, addable_watcher_users.first
60 81 end
61 82
62 83 def test_addable_watcher_users_should_not_include_user_that_cannot_view_the_object
63 84 issue = Issue.new(:project => Project.find(1), :is_private => true)
64 85 assert_nil issue.addable_watcher_users.detect {|user| !issue.visible?(user)}
65 86 end
66 87
67 88 def test_recipients
68 89 @issue.watchers.delete_all
69 90 @issue.reload
70 91
71 92 assert @issue.watcher_recipients.empty?
72 93 assert @issue.add_watcher(@user)
73 94
74 95 @user.mail_notification = 'all'
75 96 @user.save!
76 97 @issue.reload
77 98 assert @issue.watcher_recipients.include?(@user.mail)
78 99
79 100 @user.mail_notification = 'none'
80 101 @user.save!
81 102 @issue.reload
82 103 assert !@issue.watcher_recipients.include?(@user.mail)
83 104 end
84 105
85 106 def test_unwatch
86 107 assert @issue.add_watcher(@user)
87 108 @issue.reload
88 109 assert_equal 1, @issue.remove_watcher(@user)
89 110 end
90 111
91 112 def test_prune
92 113 Watcher.delete_all("user_id = 9")
93 114 user = User.find(9)
94 115
95 116 # public
96 117 Watcher.create!(:watchable => Issue.find(1), :user => user)
97 118 Watcher.create!(:watchable => Issue.find(2), :user => user)
98 119 Watcher.create!(:watchable => Message.find(1), :user => user)
99 120 Watcher.create!(:watchable => Wiki.find(1), :user => user)
100 121 Watcher.create!(:watchable => WikiPage.find(2), :user => user)
101 122
102 123 # private project (id: 2)
103 124 Member.create!(:project => Project.find(2), :principal => user, :role_ids => [1])
104 125 Watcher.create!(:watchable => Issue.find(4), :user => user)
105 126 Watcher.create!(:watchable => Message.find(7), :user => user)
106 127 Watcher.create!(:watchable => Wiki.find(2), :user => user)
107 128 Watcher.create!(:watchable => WikiPage.find(3), :user => user)
108 129
109 130 assert_no_difference 'Watcher.count' do
110 131 Watcher.prune(:user => User.find(9))
111 132 end
112 133
113 134 Member.delete_all
114 135
115 136 assert_difference 'Watcher.count', -4 do
116 137 Watcher.prune(:user => User.find(9))
117 138 end
118 139
119 140 assert Issue.find(1).watched_by?(user)
120 141 assert !Issue.find(4).watched_by?(user)
121 142 end
122 143 end
@@ -1,77 +1,77
1 1 # ActsAsWatchable
2 2 module Redmine
3 3 module Acts
4 4 module Watchable
5 5 def self.included(base)
6 6 base.extend ClassMethods
7 7 end
8 8
9 9 module ClassMethods
10 10 def acts_as_watchable(options = {})
11 11 return if self.included_modules.include?(Redmine::Acts::Watchable::InstanceMethods)
12 12 send :include, Redmine::Acts::Watchable::InstanceMethods
13 13
14 14 class_eval do
15 15 has_many :watchers, :as => :watchable, :dependent => :delete_all
16 has_many :watcher_users, :through => :watchers, :source => :user
16 has_many :watcher_users, :through => :watchers, :source => :user, :validate => false
17 17
18 18 named_scope :watched_by, lambda { |user_id|
19 19 { :include => :watchers,
20 20 :conditions => ["#{Watcher.table_name}.user_id = ?", user_id] }
21 21 }
22 22 attr_protected :watcher_ids, :watcher_user_ids
23 23 end
24 24 end
25 25 end
26 26
27 27 module InstanceMethods
28 28 def self.included(base)
29 29 base.extend ClassMethods
30 30 end
31 31
32 32 # Returns an array of users that are proposed as watchers
33 33 def addable_watcher_users
34 34 users = self.project.users.sort - self.watcher_users
35 35 if respond_to?(:visible?)
36 36 users.reject! {|user| !visible?(user)}
37 37 end
38 38 users
39 39 end
40 40
41 41 # Adds user as a watcher
42 42 def add_watcher(user)
43 43 self.watchers << Watcher.new(:user => user)
44 44 end
45 45
46 46 # Removes user from the watchers list
47 47 def remove_watcher(user)
48 48 return nil unless user && user.is_a?(User)
49 49 Watcher.delete_all "watchable_type = '#{self.class}' AND watchable_id = #{self.id} AND user_id = #{user.id}"
50 50 end
51 51
52 52 # Adds/removes watcher
53 53 def set_watcher(user, watching=true)
54 54 watching ? add_watcher(user) : remove_watcher(user)
55 55 end
56 56
57 57 # Returns true if object is watched by +user+
58 58 def watched_by?(user)
59 59 !!(user && self.watcher_user_ids.detect {|uid| uid == user.id })
60 60 end
61 61
62 62 # Returns an array of watchers' email addresses
63 63 def watcher_recipients
64 64 notified = watcher_users.active
65 65 notified.reject! {|user| user.mail_notification == 'none'}
66 66
67 67 if respond_to?(:visible?)
68 68 notified.reject! {|user| !visible?(user)}
69 69 end
70 70 notified.collect(&:mail).compact
71 71 end
72 72
73 73 module ClassMethods; end
74 74 end
75 75 end
76 76 end
77 77 end
General Comments 0
You need to be logged in to leave comments. Login now