discourse/spec/services/base_bookmarkable_spec.rb
Martin Brennan df4197c8b8
FIX: Show deleted bookmark reminders in user bookmarks menu (#25905)
When we send a bookmark reminder, there is an option to delete
the underlying bookmark. The Notification record stays around.
However, if you want to filter your notifications user menu
to only bookmark-based notifications, we were not showing unread
bookmark notifications for deleted bookmarks.

This commit fixes the issue _going forward_ by adding the
bookmarkable_id and bookmarkable_type to the Notification data,
so we can look up the underlying Post/Topic/Chat::Message
for a deleted bookmark and check user access in this way. Then,
it doesn't matter if the bookmark was deleted.
2024-02-29 09:03:49 +10:00

75 lines
2.7 KiB
Ruby

# frozen_string_literal: true
RSpec.describe BaseBookmarkable do
fab!(:bookmark) { Fabricate(:bookmark, bookmarkable: Fabricate(:post)) }
describe "#send_reminder_notification" do
it "raises an error if the data, data.bookmarkable_url, or data.title values are missing from notification_data" do
expect { BaseBookmarkable.send_reminder_notification(bookmark, {}) }.to raise_error(
Discourse::InvalidParameters,
)
expect { BaseBookmarkable.send_reminder_notification(bookmark, { data: {} }) }.to raise_error(
Discourse::InvalidParameters,
)
expect {
BaseBookmarkable.send_reminder_notification(
bookmark,
{ data: { title: "test", bookmarkable_url: "test" } },
)
}.not_to raise_error
end
it "creates a Notification with the required data from the bookmark" do
BaseBookmarkable.send_reminder_notification(
bookmark,
{
topic_id: bookmark.bookmarkable.topic_id,
post_number: bookmark.bookmarkable.post_number,
data: {
title: bookmark.bookmarkable.topic.title,
bookmarkable_url: bookmark.bookmarkable.url,
},
},
)
notif = bookmark.user.notifications.last
expect(notif.notification_type).to eq(Notification.types[:bookmark_reminder])
expect(notif.topic_id).to eq(bookmark.bookmarkable.topic_id)
expect(notif.post_number).to eq(bookmark.bookmarkable.post_number)
expect(notif.data).to eq(
{
title: bookmark.bookmarkable.topic.title,
bookmarkable_url: bookmark.bookmarkable.url,
display_username: bookmark.user.username,
bookmark_name: bookmark.name,
bookmark_id: bookmark.id,
bookmarkable_type: bookmark.bookmarkable_type,
bookmarkable_id: bookmark.bookmarkable_id,
}.to_json,
)
end
it "does not allow the consumer to override display_username, bookmark_name, or bookmark_id" do
BaseBookmarkable.send_reminder_notification(
bookmark,
{
topic_id: bookmark.bookmarkable.topic_id,
post_number: bookmark.bookmarkable.post_number,
data: {
title: bookmark.bookmarkable.topic.title,
bookmarkable_url: bookmark.bookmarkable.url,
display_username: "bad username",
bookmark_name: "bad name",
bookmark_id: -89_854,
},
},
)
notif = bookmark.user.notifications.last
data = JSON.parse(notif[:data])
expect(data[:display_username]).not_to eq("bad username")
expect(data[:name]).not_to eq("bad name")
expect(data[:bookmark_id]).not_to eq(-89_854)
end
end
end