Defect #39186 » 0001-Fix-watcher-handling-on-unsaved-objects.patch
lib/plugins/acts_as_watchable/lib/acts_as_watchable.rb | ||
---|---|---|
44 | 44 | |
45 | 45 |
# Adds user as a watcher |
46 | 46 |
def add_watcher(user) |
47 |
# Rails does not reset the has_many :through association |
|
48 |
watcher_users.reset |
|
49 |
self.watchers << Watcher.new(:user => user) |
|
47 |
if persisted? |
|
48 |
# Rails does not reset the has_many :through association |
|
49 |
watcher_users.reset |
|
50 |
self.watchers << Watcher.new(:user => user) |
|
51 |
else |
|
52 |
self.watcher_users << user |
|
53 |
end |
|
50 | 54 |
end |
51 | 55 | |
52 | 56 |
# Removes user from the watchers list |
53 | 57 |
def remove_watcher(user) |
54 | 58 |
return nil unless user && (user.is_a?(User) || user.is_a?(Group)) |
55 |
# Rails does not reset the has_many :through association |
|
56 |
watcher_users.reset |
|
57 |
watchers.where(:user_id => user.id).delete_all |
|
59 |
if persisted? |
|
60 |
# Rails does not reset the has_many :through association |
|
61 |
watcher_users.reset |
|
62 |
watchers.where(:user_id => user.id).delete_all |
|
63 |
else |
|
64 |
watcher_users.delete(user) |
|
65 |
end |
|
58 | 66 |
end |
59 | 67 | |
60 | 68 |
# Adds/removes watcher |
test/unit/watcher_test.rb | ||
---|---|---|
124 | 124 |
end |
125 | 125 |
end |
126 | 126 | |
127 |
def test_add_watcher_with_unsaved_object |
|
128 |
issue = Issue.new(project: Project.find(1), tracker_id: 1, subject: "test", author: User.find(2)) |
|
129 |
refute issue.persisted? |
|
130 | ||
131 |
issue.add_watcher(@user) |
|
132 |
assert issue.watched_by?(@user) |
|
133 | ||
134 |
assert_equal [@user.id], issue.watcher_user_ids |
|
135 |
assert_equal [@user], issue.watcher_users |
|
136 | ||
137 |
assert_equal [nil], issue.watcher_ids |
|
138 |
assert_equal 1, issue.watchers.size |
|
139 | ||
140 |
issue.save! |
|
141 |
assert 1, Watcher.where(watchable: issue).count |
|
142 |
end |
|
143 | ||
144 |
def test_remove_watcher_with_unsaved_object |
|
145 |
issue = Issue.new(project: Project.find(1), tracker_id: 1, subject: "test", author: User.find(2)) |
|
146 |
refute issue.persisted? |
|
147 | ||
148 |
issue.add_watcher(@user) |
|
149 |
assert_equal [@user], issue.watcher_users |
|
150 | ||
151 |
issue.remove_watcher(@user) |
|
152 |
refute issue.watched_by?(@user) |
|
153 | ||
154 |
assert_equal [], issue.watcher_user_ids |
|
155 |
assert_equal [], issue.watcher_users |
|
156 | ||
157 |
assert_equal [], issue.watcher_ids |
|
158 |
assert_equal [], issue.watchers |
|
159 | ||
160 |
issue.save! |
|
161 |
assert 0, Watcher.where(watchable: issue).count |
|
162 |
end |
|
163 | ||
127 | 164 |
def test_addable_watcher_users_should_not_include_user_that_cannot_view_the_object |
128 | 165 |
issue = Issue.new(:project => Project.find(1), :is_private => true) |
129 | 166 |
assert_nil issue.addable_watcher_users.detect {|user| user.is_a?(User) && !issue.visible?(user)} |