mirror of
https://github.com/discourse/discourse.git
synced 2025-02-09 12:54:56 +00:00
FIX: broken specs after new link alerting code
This commit is contained in:
parent
9fd7b0b814
commit
5c26b3dad1
@ -48,24 +48,6 @@ class PostAlertObserver < ActiveRecord::Observer
|
|||||||
alerter.create_notification(post.user, Notification.types[:edited], post, display_username: post_revision.user.username)
|
alerter.create_notification(post.user, Notification.types[:edited], post, display_username: post_revision.user.username)
|
||||||
end
|
end
|
||||||
|
|
||||||
def after_create_post(post)
|
|
||||||
if post.topic.private_message?
|
|
||||||
# If it's a private message, notify the topic_allowed_users
|
|
||||||
post.topic.all_allowed_users.reject{ |user| user.id == post.user_id }.each do |user|
|
|
||||||
next if user.blank?
|
|
||||||
|
|
||||||
if TopicUser.get(post.topic, user).try(:notification_level) == TopicUser.notification_levels[:tracking]
|
|
||||||
next unless post.reply_to_post_number
|
|
||||||
next unless post.reply_to_post.user_id == user.id
|
|
||||||
end
|
|
||||||
|
|
||||||
alerter.create_notification(user, Notification.types[:private_message], post)
|
|
||||||
end
|
|
||||||
elsif post.post_type != Post.types[:moderator_action]
|
|
||||||
# If it's not a private message and it's not an automatic post caused by a moderator action, notify the users
|
|
||||||
alerter.notify_post_users(post)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
protected
|
protected
|
||||||
|
|
||||||
|
@ -1,5 +1,31 @@
|
|||||||
class PostAlerter
|
class PostAlerter
|
||||||
|
|
||||||
|
def self.post_created(post)
|
||||||
|
alerter = PostAlerter.new
|
||||||
|
alerter.after_create_post(post)
|
||||||
|
alerter.after_save_post(post)
|
||||||
|
post
|
||||||
|
end
|
||||||
|
|
||||||
|
def after_create_post(post)
|
||||||
|
if post.topic.private_message?
|
||||||
|
# If it's a private message, notify the topic_allowed_users
|
||||||
|
post.topic.all_allowed_users.reject{ |user| user.id == post.user_id }.each do |user|
|
||||||
|
next if user.blank?
|
||||||
|
|
||||||
|
if TopicUser.get(post.topic, user).try(:notification_level) == TopicUser.notification_levels[:tracking]
|
||||||
|
next unless post.reply_to_post_number
|
||||||
|
next unless post.reply_to_post.user_id == user.id
|
||||||
|
end
|
||||||
|
|
||||||
|
create_notification(user, Notification.types[:private_message], post)
|
||||||
|
end
|
||||||
|
elsif post.post_type != Post.types[:moderator_action]
|
||||||
|
# If it's not a private message and it's not an automatic post caused by a moderator action, notify the users
|
||||||
|
notify_post_users(post)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def after_save_post(post)
|
def after_save_post(post)
|
||||||
return if post.topic.private_message?
|
return if post.topic.private_message?
|
||||||
|
|
||||||
|
@ -69,12 +69,15 @@ class PostCreator
|
|||||||
ensure_in_allowed_users if guardian.is_staff?
|
ensure_in_allowed_users if guardian.is_staff?
|
||||||
@post.advance_draft_sequence
|
@post.advance_draft_sequence
|
||||||
@post.save_reply_relationships
|
@post.save_reply_relationships
|
||||||
PostAlerter.new.after_save_post(@post)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
handle_spam
|
if @post
|
||||||
track_latest_on_category
|
PostAlerter.post_created(@post)
|
||||||
enqueue_jobs
|
|
||||||
|
handle_spam
|
||||||
|
track_latest_on_category
|
||||||
|
enqueue_jobs
|
||||||
|
end
|
||||||
|
|
||||||
@post
|
@post
|
||||||
end
|
end
|
||||||
|
@ -253,13 +253,12 @@ describe PostDestroyer do
|
|||||||
end
|
end
|
||||||
|
|
||||||
context '@mentions' do
|
context '@mentions' do
|
||||||
let!(:evil_trout) { Fabricate(:evil_trout) }
|
|
||||||
let!(:mention_post) { Fabricate(:post, raw: 'Hello @eviltrout')}
|
|
||||||
|
|
||||||
it 'removes notifications when deleted' do
|
it 'removes notifications when deleted' do
|
||||||
|
user = Fabricate(:evil_trout)
|
||||||
|
post = create_post(raw: 'Hello @eviltrout')
|
||||||
lambda {
|
lambda {
|
||||||
PostDestroyer.new(Fabricate(:moderator), mention_post).destroy
|
PostDestroyer.new(Fabricate(:moderator), post).destroy
|
||||||
}.should change(evil_trout.notifications, :count).by(-1)
|
}.should change(user.notifications, :count).by(-1)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -210,8 +210,7 @@ describe PostRevisor do
|
|||||||
before do
|
before do
|
||||||
SiteSetting.stubs(:newuser_max_images).returns(0)
|
SiteSetting.stubs(:newuser_max_images).returns(0)
|
||||||
url = "http://i.imgur.com/FGg7Vzu.gif"
|
url = "http://i.imgur.com/FGg7Vzu.gif"
|
||||||
# this test is problamatic, it leaves state in the onebox cache
|
Oneboxer.stubs(:cached_onebox).with(url, anything).returns("<img src='#{url}'>")
|
||||||
Oneboxer.stubs(:onebox).with(url, anything).returns("<img src='#{url}'>")
|
|
||||||
subject.revise!(post.user, "So, post them here!\n#{url}")
|
subject.revise!(post.user, "So, post them here!\n#{url}")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -20,29 +20,37 @@ describe Notification do
|
|||||||
let(:coding_horror) { Fabricate(:coding_horror) }
|
let(:coding_horror) { Fabricate(:coding_horror) }
|
||||||
|
|
||||||
describe 'replies' do
|
describe 'replies' do
|
||||||
|
def process_alerts(post)
|
||||||
|
PostAlerter.post_created(post)
|
||||||
|
end
|
||||||
|
|
||||||
|
let(:post) {
|
||||||
|
process_alerts(Fabricate(:post, post_args.merge(raw: "Hello @CodingHorror")))
|
||||||
|
}
|
||||||
|
|
||||||
let(:post) { Fabricate(:post, post_args.merge(raw: "Hello @CodingHorror")) }
|
|
||||||
|
|
||||||
it 'notifies the poster on reply' do
|
it 'notifies the poster on reply' do
|
||||||
lambda {
|
lambda {
|
||||||
@reply = Fabricate(:basic_reply, user: coding_horror, topic: post.topic)
|
reply = Fabricate(:basic_reply, user: coding_horror, topic: post.topic)
|
||||||
|
process_alerts(reply)
|
||||||
}.should change(post.user.notifications, :count).by(1)
|
}.should change(post.user.notifications, :count).by(1)
|
||||||
end
|
end
|
||||||
|
|
||||||
it "doesn't notify the poster when they reply to their own post" do
|
it "doesn't notify the poster when they reply to their own post" do
|
||||||
lambda {
|
lambda {
|
||||||
@reply = Fabricate(:basic_reply, user: post.user, topic: post.topic)
|
reply = Fabricate(:basic_reply, user: post.user, topic: post.topic)
|
||||||
|
process_alerts(reply)
|
||||||
}.should_not change(post.user.notifications, :count).by(1)
|
}.should_not change(post.user.notifications, :count).by(1)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'watching' do
|
describe 'watching' do
|
||||||
it "does notify watching users of new posts" do
|
it "does notify watching users of new posts" do
|
||||||
post = Fabricate(:post, post_args)
|
post = PostAlerter.post_created(Fabricate(:post, post_args))
|
||||||
user2 = Fabricate(:coding_horror)
|
user2 = Fabricate(:coding_horror)
|
||||||
post_args[:topic].notify_watch!(user2)
|
post_args[:topic].notify_watch!(user2)
|
||||||
lambda {
|
lambda {
|
||||||
Fabricate(:post, user: post.user, topic: post.topic)
|
PostAlerter.post_created(Fabricate(:post, user: post.user, topic: post.topic))
|
||||||
}.should change(user2.notifications, :count).by(1)
|
}.should change(user2.notifications, :count).by(1)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -126,6 +134,7 @@ describe Notification do
|
|||||||
before do
|
before do
|
||||||
@topic = Fabricate(:private_message_topic)
|
@topic = Fabricate(:private_message_topic)
|
||||||
@post = Fabricate(:post, topic: @topic, user: @topic.user)
|
@post = Fabricate(:post, topic: @topic, user: @topic.user)
|
||||||
|
PostAlerter.post_created(@post)
|
||||||
@target = @post.topic.topic_allowed_users.reject{|a| a.user_id == @post.user_id}[0].user
|
@target = @post.topic.topic_allowed_users.reject{|a| a.user_id == @post.user_id}[0].user
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -256,8 +265,6 @@ describe Notification do
|
|||||||
fab(Notification.types[:liked], true)
|
fab(Notification.types[:liked], true)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
it 'orders stuff correctly' do
|
it 'orders stuff correctly' do
|
||||||
a = unread_pm
|
a = unread_pm
|
||||||
regular
|
regular
|
||||||
|
@ -40,59 +40,6 @@ describe PostAlertObserver do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'quotes' do
|
|
||||||
|
|
||||||
it 'notifies a user by username' do
|
|
||||||
lambda {
|
|
||||||
Fabricate(:post, raw: '[quote="EvilTrout, post:1"]whatup[/quote]')
|
|
||||||
}.should change(evil_trout.notifications, :count).by(1)
|
|
||||||
end
|
|
||||||
|
|
||||||
it "won't notify the user a second time on revision" do
|
|
||||||
p1 = Fabricate(:post, raw: '[quote="Evil Trout, post:1"]whatup[/quote]')
|
|
||||||
lambda {
|
|
||||||
p1.revise(p1.user, '[quote="Evil Trout, post:1"]whatup now?[/quote]')
|
|
||||||
}.should_not change(evil_trout.notifications, :count)
|
|
||||||
end
|
|
||||||
|
|
||||||
it "doesn't notify the poster" do
|
|
||||||
topic = post.topic
|
|
||||||
lambda {
|
|
||||||
new_post = Fabricate(:post, topic: topic, user: topic.user, raw: '[quote="Bruce Wayne, post:1"]whatup[/quote]')
|
|
||||||
}.should_not change(topic.user.notifications, :count).by(1)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context '@mentions' do
|
|
||||||
|
|
||||||
let(:user) { Fabricate(:user) }
|
|
||||||
let(:mention_post) { Fabricate(:post, user: user, raw: 'Hello @eviltrout')}
|
|
||||||
let(:topic) { mention_post.topic }
|
|
||||||
|
|
||||||
it 'notifies a user' do
|
|
||||||
lambda {
|
|
||||||
mention_post
|
|
||||||
}.should change(evil_trout.notifications, :count).by(1)
|
|
||||||
end
|
|
||||||
|
|
||||||
it "won't notify the user a second time on revision" do
|
|
||||||
mention_post
|
|
||||||
lambda {
|
|
||||||
mention_post.revise(mention_post.user, "New raw content that still mentions @eviltrout")
|
|
||||||
}.should_not change(evil_trout.notifications, :count)
|
|
||||||
end
|
|
||||||
|
|
||||||
it "doesn't notify the user who created the topic in regular mode" do
|
|
||||||
topic.notify_regular!(user)
|
|
||||||
mention_post
|
|
||||||
lambda {
|
|
||||||
Fabricate(:post, user: user, raw: 'second post', topic: topic)
|
|
||||||
}.should_not change(user.notifications, :count).by(1)
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
context 'private message' do
|
context 'private message' do
|
||||||
let(:user) { Fabricate(:user) }
|
let(:user) { Fabricate(:user) }
|
||||||
let(:mention_post) { Fabricate(:post, user: user, raw: 'Hello @eviltrout')}
|
let(:mention_post) { Fabricate(:post, user: user, raw: 'Hello @eviltrout')}
|
||||||
@ -106,6 +53,8 @@ describe PostAlertObserver do
|
|||||||
lambda {
|
lambda {
|
||||||
Guardian.any_instance.expects(:can_see?).with(instance_of(Post)).returns(false)
|
Guardian.any_instance.expects(:can_see?).with(instance_of(Post)).returns(false)
|
||||||
mention_post
|
mention_post
|
||||||
|
PostAlerter.new.after_create_post(mention_post)
|
||||||
|
PostAlerter.new.after_save_post(mention_post)
|
||||||
}.should_not change(evil_trout.notifications, :count)
|
}.should_not change(evil_trout.notifications, :count)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -17,8 +17,8 @@ describe PostAnalyzer do
|
|||||||
|
|
||||||
before { Oneboxer.stubs(:onebox) }
|
before { Oneboxer.stubs(:onebox) }
|
||||||
|
|
||||||
it 'fetches the onebox for any urls in the post' do
|
it 'fetches the cached onebox for any urls in the post' do
|
||||||
Oneboxer.expects(:onebox).with url
|
Oneboxer.expects(:cached_onebox).with url
|
||||||
post_analyzer.cook(*args)
|
post_analyzer.cook(*args)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -149,8 +149,13 @@ describe UserAction do
|
|||||||
end
|
end
|
||||||
|
|
||||||
describe 'when a user posts a new topic' do
|
describe 'when a user posts a new topic' do
|
||||||
|
def process_alerts(post)
|
||||||
|
PostAlerter.post_created(post)
|
||||||
|
end
|
||||||
|
|
||||||
before do
|
before do
|
||||||
@post = Fabricate(:old_post)
|
@post = Fabricate(:old_post)
|
||||||
|
process_alerts(@post)
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'topic action' do
|
describe 'topic action' do
|
||||||
@ -173,6 +178,8 @@ describe UserAction do
|
|||||||
@other_user = Fabricate(:coding_horror)
|
@other_user = Fabricate(:coding_horror)
|
||||||
@mentioned = Fabricate(:admin)
|
@mentioned = Fabricate(:admin)
|
||||||
@response = Fabricate(:post, reply_to_post_number: 1, topic: @post.topic, user: @other_user, raw: "perhaps @#{@mentioned.username} knows how this works?")
|
@response = Fabricate(:post, reply_to_post_number: 1, topic: @post.topic, user: @other_user, raw: "perhaps @#{@mentioned.username} knows how this works?")
|
||||||
|
|
||||||
|
process_alerts(@response)
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'should log user actions correctly' do
|
it 'should log user actions correctly' do
|
||||||
|
66
spec/services/post_alerter_spec.rb
Normal file
66
spec/services/post_alerter_spec.rb
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
require 'spec_helper'
|
||||||
|
|
||||||
|
describe PostAlerter do
|
||||||
|
|
||||||
|
let!(:evil_trout) { Fabricate(:evil_trout) }
|
||||||
|
|
||||||
|
def create_post_with_alerts(args={})
|
||||||
|
post = Fabricate(:post, args)
|
||||||
|
alerter = PostAlerter.new
|
||||||
|
alerter.after_create_post(post)
|
||||||
|
alerter.after_save_post(post)
|
||||||
|
post
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'quotes' do
|
||||||
|
|
||||||
|
it 'notifies a user by username' do
|
||||||
|
lambda {
|
||||||
|
create_post_with_alerts(raw: '[quote="EvilTrout, post:1"]whatup[/quote]')
|
||||||
|
}.should change(evil_trout.notifications, :count).by(1)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "won't notify the user a second time on revision" do
|
||||||
|
p1 = create_post_with_alerts(raw: '[quote="Evil Trout, post:1"]whatup[/quote]')
|
||||||
|
lambda {
|
||||||
|
p1.revise(p1.user, '[quote="Evil Trout, post:1"]whatup now?[/quote]')
|
||||||
|
}.should_not change(evil_trout.notifications, :count)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "doesn't notify the poster" do
|
||||||
|
topic = create_post_with_alerts.topic
|
||||||
|
lambda {
|
||||||
|
Fabricate(:post, topic: topic, user: topic.user, raw: '[quote="Bruce Wayne, post:1"]whatup[/quote]')
|
||||||
|
}.should_not change(topic.user.notifications, :count).by(1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context '@mentions' do
|
||||||
|
|
||||||
|
let(:user) { Fabricate(:user) }
|
||||||
|
let(:mention_post) { create_post_with_alerts(user: user, raw: 'Hello @eviltrout')}
|
||||||
|
let(:topic) { mention_post.topic }
|
||||||
|
|
||||||
|
it 'notifies a user' do
|
||||||
|
lambda {
|
||||||
|
mention_post
|
||||||
|
}.should change(evil_trout.notifications, :count).by(1)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "won't notify the user a second time on revision" do
|
||||||
|
mention_post
|
||||||
|
lambda {
|
||||||
|
mention_post.revise(mention_post.user, "New raw content that still mentions @eviltrout")
|
||||||
|
}.should_not change(evil_trout.notifications, :count)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "doesn't notify the user who created the topic in regular mode" do
|
||||||
|
topic.notify_regular!(user)
|
||||||
|
mention_post
|
||||||
|
lambda {
|
||||||
|
create_post_with_alerts(user: user, raw: 'second post', topic: topic)
|
||||||
|
}.should_not change(user.notifications, :count).by(1)
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
Loading…
x
Reference in New Issue
Block a user