diaspora/spec/helpers/notifications_helper_spec.rb
Benjamin Neff c135ace407
Fix notifications when people remove their birthday date
Some people may remove their birthday date after the notification was
sent, which then breaks the notification page for other users. Let's
just display the date when the notification was created, and not display
the users updated birthday date. When users update from date A to B it
always looks weird anyway, when we display the same new date B twice on
different days, or display two different dates for the same user.

We could remove notifications when users change or remove their
birthday, but that would be way more complex and also we usually don't
remove notifications (not even for deleted posts).

Fixes #7689

closes #7691
2018-01-05 01:50:11 +01:00

162 lines
6.4 KiB
Ruby

# frozen_string_literal: true
describe NotificationsHelper, type: :helper do
include ApplicationHelper
before do
@user = FactoryGirl.create(:user)
@person = FactoryGirl.create(:person)
@post = FactoryGirl.create(:status_message, author: @user.person)
@person2 = FactoryGirl.create(:person)
Notifications::Liked.notify(FactoryGirl.create(:like, author: @person, target: @post), [])
Notifications::Liked.notify(FactoryGirl.create(:like, author: @person2, target: @post), [])
@notification = Notifications::Liked.find_by(target: @post, recipient: @user)
end
describe '#notification_people_link' do
context 'formatting' do
include ActionView::Helpers::SanitizeHelper
let(:output){ strip_tags(notification_people_link(@note)) }
before do
@max = FactoryGirl.create(:person)
@max.profile.first_name = 'max'
@max.profile.last_name = 'salzberg'
@sarah = FactoryGirl.create(:person)
@sarah.profile.first_name = 'sarah'
@sarah.profile.last_name = 'mei'
@daniel = FactoryGirl.create(:person)
@daniel.profile.first_name = 'daniel'
@daniel.profile.last_name = 'grippi'
@ilya = FactoryGirl.create(:person)
@ilya.profile.first_name = 'ilya'
@ilya.profile.last_name = 'zhit'
@note = double()
end
it 'with two, does not comma seperate two actors' do
allow(@note).to receive(:actors).and_return([@max, @sarah])
expect(output.scan(/,/)).to be_empty
expect(output.scan(/and/).count).to be 1
end
it 'with three, comma seperates the first two, and and the last actor' do
allow(@note).to receive(:actors).and_return([@max, @sarah, @daniel])
expect(output.scan(/,/).count).to be 2
expect(output.scan(/and/).count).to be 1
end
it 'with more than three, lists the first three, then the others tag' do
allow(@note).to receive(:actors).and_return([@max, @sarah, @daniel, @ilya])
expect(output.scan(/,/).count).to be 3
expect(output.scan(/and/).count).to be 2
end
end
describe 'for a like' do
it 'displays #{list of actors}' do
output = notification_people_link(@notification)
expect(output).to include @person2.name
expect(output).to include @person.name
end
end
end
describe '#object_link' do
describe 'for a like' do
it 'should include a link to the post' do
output = object_link(@notification, notification_people_link(@notification))
expect(output).to include post_path(@post)
end
it 'includes the boilerplate translation' do
output = object_link(@notification, notification_people_link(@notification))
expect(output).to include I18n.t("#{@notification.popup_translation_key}",
:actors => notification_people_link(@notification),
:count => @notification.actors.count,
:post_link => link_to(post_page_title(@post), post_path(@post), 'data-ref' => @post.id, :class => 'hard_object_link').html_safe)
end
context 'when post is deleted' do
it 'works' do
@post.destroy
expect{ object_link(@notification, notification_people_link(@notification))}.to_not raise_error
end
it 'displays that the post was deleted' do
@post.destroy
expect(object_link(@notification, notification_people_link(@notification))).to eq(t('notifications.liked_post_deleted.one', :actors => notification_people_link(@notification)))
end
end
end
let(:status_message) {
FactoryGirl.create(:status_message_in_aspect, author: alice.person, text: text_mentioning(bob))
}
describe "when mentioned in status message" do
it "should include correct wording and post link" do
Notifications::MentionedInPost.notify(status_message, [bob.id])
notification = Notifications::MentionedInPost.last
expect(notification).not_to be_nil
link = object_link(notification, notification_people_link(notification))
expect(link).to include("mentioned you in the post")
expect(link).to include(post_path(status_message))
end
end
describe "when mentioned in comment" do
it "should include correct wording, post link and comment link" do
comment = FactoryGirl.create(:comment, author: bob.person, text: text_mentioning(alice), post: status_message)
Notifications::MentionedInComment.notify(comment, [alice.id])
notification = Notifications::MentionedInComment.last
expect(notification).not_to be_nil
link = object_link(notification, notification_people_link(notification))
expect(link).to include("mentioned you in a")
expect(link).to include(">comment</a>")
expect(link).to include("href=\"#{post_path(status_message)}\"")
expect(link).to include("#{post_path(status_message)}##{comment.guid}")
end
end
context "for a birthday" do
let(:notification) { Notifications::ContactsBirthday.create(recipient: alice, target: bob.person) }
it "contains the date" do
bob.profile.update_attributes(birthday: Time.zone.today)
link = object_link(notification, notification_people_link(notification))
expect(link).to include(I18n.l(Time.zone.today, format: I18n.t("date.formats.fullmonth_day")))
end
it "doesn't break, when the person removes the birthday date" do
bob.profile.update_attributes(birthday: nil)
link = object_link(notification, notification_people_link(notification))
expect(link).to include(I18n.l(Time.zone.today, format: I18n.t("date.formats.fullmonth_day")))
end
end
end
describe '#display_year?' do
it 'returns false if year is nil and the date includes the current year' do
expect(display_year?(nil,Date.current.strftime('%Y-%m-%d'))).to be_falsey
end
it 'returns true if year is nil and the date does not include the current year' do
expect(display_year?(nil,'1900-12-31')).to be_truthy
end
it 'returns false if the date includes the given year' do
expect(display_year?(2015,'2015-12-31')).to be_falsey
end
it 'returns true if the date does not include the given year' do
expect(display_year?(2015,'2014-12-31')).to be_truthy
expect(display_year?(2015,'2016-12-31')).to be_truthy
end
end
end