discourse/spec/models/notification_spec.rb

327 lines
9.8 KiB
Ruby
Raw Normal View History

require 'rails_helper'
2013-02-05 14:16:51 -05:00
describe Notification do
before do
NotificationEmailer.enable
end
2013-02-05 14:16:51 -05:00
2015-01-05 11:04:23 -05:00
it { is_expected.to validate_presence_of :notification_type }
it { is_expected.to validate_presence_of :data }
2013-02-05 14:16:51 -05:00
2015-01-05 11:04:23 -05:00
it { is_expected.to belong_to :user }
it { is_expected.to belong_to :topic }
2013-02-05 14:16:51 -05:00
describe '#types' do
context "verify enum sequence" do
before do
@types = Notification.types
end
it "'mentioned' should be at 1st position" do
expect(@types[:mentioned]).to eq(1)
end
it "'group_mentioned' should be at 15th position" do
expect(@types[:group_mentioned]).to eq(15)
end
end
end
describe 'post' do
let(:topic) { Fabricate(:topic) }
let(:post_args) do
2017-07-27 21:20:09 -04:00
{ user: topic.user, topic: topic }
end
let(:coding_horror) { Fabricate(:coding_horror) }
describe 'replies' do
def process_alerts(post)
PostAlerter.post_created(post)
end
let(:post) {
process_alerts(Fabricate(:post, post_args.merge(raw: "Hello @CodingHorror")))
}
it 'notifies the poster on reply' do
2015-01-05 11:04:23 -05:00
expect {
reply = Fabricate(:basic_reply, user: coding_horror, topic: post.topic)
process_alerts(reply)
2015-01-05 11:04:23 -05:00
}.to change(post.user.notifications, :count).by(1)
end
it "doesn't notify the poster when they reply to their own post" do
2015-01-05 11:04:23 -05:00
expect {
reply = Fabricate(:basic_reply, user: post.user, topic: post.topic)
process_alerts(reply)
2015-01-05 11:04:23 -05:00
}.not_to change(post.user.notifications, :count)
end
end
describe 'watching' do
it "does notify watching users of new posts" do
post = PostAlerter.post_created(Fabricate(:post, post_args))
user2 = Fabricate(:coding_horror)
post_args[:topic].notify_watch!(user2)
2015-01-05 11:04:23 -05:00
expect {
PostAlerter.post_created(Fabricate(:post, user: post.user, topic: post.topic))
2015-01-05 11:04:23 -05:00
}.to change(user2.notifications, :count).by(1)
end
end
describe 'muting' do
it "does not notify users of new posts" do
post = Fabricate(:post, post_args)
user = post_args[:user]
user2 = Fabricate(:coding_horror)
post_args[:topic].notify_muted!(user)
2015-01-05 11:04:23 -05:00
expect {
Fabricate(:post, user: user2, topic: post.topic, raw: 'hello @' + user.username)
2015-01-05 11:04:23 -05:00
}.to change(user.notifications, :count).by(0)
end
end
end
2013-02-05 14:16:51 -05:00
describe 'unread counts' do
let(:user) { Fabricate(:user) }
2013-02-25 11:42:20 -05:00
context 'a regular notification' do
2013-02-05 14:16:51 -05:00
it 'increases unread_notifications' do
2015-01-05 11:04:23 -05:00
expect { Fabricate(:notification, user: user); user.reload }.to change(user, :unread_notifications)
2013-02-05 14:16:51 -05:00
end
it 'increases total_unread_notifications' do
2015-01-05 11:04:23 -05:00
expect { Fabricate(:notification, user: user); user.reload }.to change(user, :total_unread_notifications)
end
2013-02-05 14:16:51 -05:00
it "doesn't increase unread_private_messages" do
2015-01-05 11:04:23 -05:00
expect { Fabricate(:notification, user: user); user.reload }.not_to change(user, :unread_private_messages)
2013-02-25 11:42:20 -05:00
end
2013-02-05 14:16:51 -05:00
end
context 'a private message' do
it "doesn't increase unread_notifications" do
2015-01-05 11:04:23 -05:00
expect { Fabricate(:private_message_notification, user: user); user.reload }.not_to change(user, :unread_notifications)
2013-02-05 14:16:51 -05:00
end
it 'increases total_unread_notifications' do
2015-01-05 11:04:23 -05:00
expect { Fabricate(:notification, user: user); user.reload }.to change(user, :total_unread_notifications)
end
2013-02-05 14:16:51 -05:00
it "increases unread_private_messages" do
2015-01-05 11:04:23 -05:00
expect { Fabricate(:private_message_notification, user: user); user.reload }.to change(user, :unread_private_messages)
2013-02-25 11:42:20 -05:00
end
2013-02-05 14:16:51 -05:00
end
end
describe 'message bus' do
it 'updates the notification count on create' do
Notification.any_instance.expects(:refresh_notification_count).returns(nil)
2013-02-05 14:16:51 -05:00
Fabricate(:notification)
end
context 'destroy' do
let!(:notification) { Fabricate(:notification) }
it 'updates the notification count on destroy' do
Notification.any_instance.expects(:refresh_notification_count).returns(nil)
2017-03-20 00:06:37 -04:00
notification.destroy!
2013-02-05 14:16:51 -05:00
end
end
end
2013-02-25 11:42:20 -05:00
describe 'private message' do
before do
2013-02-05 14:16:51 -05:00
@topic = Fabricate(:private_message_topic)
@post = Fabricate(:post, topic: @topic, user: @topic.user)
2017-07-27 21:20:09 -04:00
@target = @post.topic.topic_allowed_users.reject { |a| a.user_id == @post.user_id }[0].user
2016-03-21 23:50:12 -04:00
TopicUser.change(@target.id, @topic.id, notification_level: TopicUser.notification_levels[:watching])
PostAlerter.post_created(@post)
2013-02-05 14:16:51 -05:00
end
2014-01-20 00:18:43 -05:00
it 'should create and rollup private message notifications' do
2015-01-05 11:04:23 -05:00
expect(@target.notifications.first.notification_type).to eq(Notification.types[:private_message])
expect(@post.user.unread_notifications).to eq(0)
expect(@post.user.total_unread_notifications).to eq(0)
expect(@target.unread_private_messages).to eq(1)
2014-01-20 00:18:43 -05:00
Fabricate(:post, topic: @topic, user: @topic.user)
@target.reload
2015-01-05 11:04:23 -05:00
expect(@target.unread_private_messages).to eq(1)
2013-02-05 14:16:51 -05:00
end
2014-01-20 00:18:43 -05:00
2013-02-05 14:16:51 -05:00
end
describe '.post' do
let(:post) { Fabricate(:post) }
let!(:notification) { Fabricate(:notification, user: post.user, topic: post.topic, post_number: post.post_number) }
it 'returns the post' do
2015-01-05 11:04:23 -05:00
expect(notification.post).to eq(post)
2013-02-05 14:16:51 -05:00
end
end
describe 'data' do
let(:notification) { Fabricate.build(:notification) }
2013-02-25 11:42:20 -05:00
2013-02-05 14:16:51 -05:00
it 'should have a data hash' do
2015-01-05 11:04:23 -05:00
expect(notification.data_hash).to be_present
2013-02-05 14:16:51 -05:00
end
2013-02-25 11:42:20 -05:00
2013-02-05 14:16:51 -05:00
it 'should have the data within the json' do
2015-01-05 11:04:23 -05:00
expect(notification.data_hash[:poison]).to eq('ivy')
2013-02-05 14:16:51 -05:00
end
end
describe 'saw_regular_notification_id' do
it 'correctly updates the read state' do
user = Fabricate(:user)
t = Fabricate(:topic)
2014-01-20 00:18:43 -05:00
Notification.create!(read: false,
user_id: user.id,
topic_id: t.id,
post_number: 1,
2014-02-03 20:57:52 -05:00
data: '{}',
notification_type: Notification.types[:private_message])
other = Notification.create!(read: false,
2017-07-27 21:20:09 -04:00
user_id: user.id,
topic_id: t.id,
post_number: 1,
data: '{}',
notification_type: Notification.types[:mentioned])
user.saw_notification_id(other.id)
user.reload
2015-01-05 11:04:23 -05:00
expect(user.unread_notifications).to eq(0)
expect(user.total_unread_notifications).to eq(2)
expect(user.unread_private_messages).to eq(1)
end
end
2013-02-25 11:42:20 -05:00
describe 'mark_posts_read' do
it "marks multiple posts as read if needed" do
user = Fabricate(:user)
2014-01-20 00:18:43 -05:00
(1..3).map do |i|
Notification.create!(read: false, user_id: user.id, topic_id: 2, post_number: i, data: '{}', notification_type: 1)
end
Notification.create!(read: true, user_id: user.id, topic_id: 2, post_number: 4, data: '{}', notification_type: 1)
2017-07-27 21:20:09 -04:00
expect { Notification.mark_posts_read(user, 2, [1, 2, 3, 4]) }.to change { Notification.where(read: true).count }.by(3)
end
end
describe 'ensure consistency' do
it 'deletes notifications if post is missing or deleted' do
NotificationEmailer.disable
p = Fabricate(:post)
p2 = Fabricate(:post)
Notification.create!(read: false, user_id: p.user_id, topic_id: p.topic_id, post_number: p.post_number, data: '[]',
notification_type: Notification.types[:private_message])
Notification.create!(read: false, user_id: p2.user_id, topic_id: p2.topic_id, post_number: p2.post_number, data: '[]',
notification_type: Notification.types[:private_message])
Notification.create!(read: false, user_id: p2.user_id, topic_id: p2.topic_id, post_number: p2.post_number, data: '[]',
notification_type: Notification.types[:liked])
2013-07-09 15:20:18 -04:00
p2.trash!(p.user)
# we may want to make notification "trashable" but for now we nuke pm notifications from deleted topics/posts
Notification.ensure_consistency!
2015-01-05 11:04:23 -05:00
expect(Notification.count).to eq(2)
end
end
describe '.get_liked_by' do
let(:post) { Fabricate(:post) }
let(:user) { Fabricate(:user) }
before do
PostActionNotifier.enable
end
it 'should return the right notifications' do
expect(Notification.get_liked_by(user)).to eq([])
expect do
PostAlerter.post_created(Fabricate(:basic_reply,
user: user,
topic: post.topic
))
PostAction.act(user, post, PostActionType.types[:like])
end.to change { Notification.count }.by(2)
expect(Notification.get_liked_by(user)).to contain_exactly(
Notification.find_by(notification_type: Notification.types[:liked])
)
end
end
2013-02-05 14:16:51 -05:00
end
# pulling this out cause I don't want an observer
describe Notification do
describe '#recent_report' do
2017-07-27 21:20:09 -04:00
let(:user) { Fabricate(:user) }
let(:post) { Fabricate(:post) }
def fab(type, read)
@i ||= 0
@i += 1
Notification.create!(read: read, user_id: user.id, topic_id: post.topic_id, post_number: post.post_number, data: '[]',
notification_type: type, created_at: @i.days.from_now)
end
def unread_pm
fab(Notification.types[:private_message], false)
end
def pm
fab(Notification.types[:private_message], true)
end
def regular
fab(Notification.types[:liked], true)
end
it 'correctly finds visible notifications' do
pm
expect(Notification.visible.count).to eq(1)
post.topic.trash!
expect(Notification.visible.count).to eq(0)
end
it 'orders stuff correctly' do
a = unread_pm
regular
c = pm
d = regular
# bumps unread pms to front of list
notifications = Notification.recent_report(user, 3)
2017-07-27 21:20:09 -04:00
expect(notifications.map { |n| n.id }).to eq([a.id, d.id, c.id])
end
end
end