discourse/spec/system/bookmarks_spec.rb
Martin Brennan 2d2329095c
FEATURE: Use new bookmark menu in topic footer buttons (#26670)
Followup to 67a8080e33

This commit makes it so the topic footer button for bookmarks
uses the new BookmarkMenu component, and makes some tweaks to
that component to allow for a label and CSS class options.

Also introduces a TopicBookmarkManager to manage the saving/editing/
deleting of the topic level bookmarks and the reactivity that happens
in the topic UI afterward.

Next commit should rip out old bookmark associated code in the
topic controller as it will no longer be needed.

---------

Co-authored-by: Joffrey JAFFEUX <j.jaffeux@gmail.com>
2024-04-18 11:06:12 +02:00

175 lines
6.8 KiB
Ruby

# frozen_string_literal: true
describe "Bookmarking posts and topics", type: :system do
fab!(:topic)
fab!(:current_user) { Fabricate(:user, refresh_auto_groups: true) }
fab!(:post) { Fabricate(:post, topic: topic, raw: "This is some post to bookmark") }
fab!(:post_2) { Fabricate(:post, topic: topic, raw: "Some interesting post content") }
let(:timezone) { "Australia/Brisbane" }
let(:cdp) { PageObjects::CDP.new }
let(:topic_page) { PageObjects::Pages::Topic.new }
let(:bookmark_modal) { PageObjects::Modals::Bookmark.new }
let(:bookmark_menu) { PageObjects::Components::BookmarkMenu.new }
before do
current_user.user_option.update!(timezone: timezone)
sign_in(current_user)
end
def visit_topic_and_open_bookmark_menu(post, expand_actions: true)
topic_page.visit_topic(topic)
open_bookmark_menu(post, expand_actions: expand_actions)
end
def open_bookmark_menu(post, expand_actions: true)
topic_page.expand_post_actions(post) if expand_actions
topic_page.click_post_action_button(post, :bookmark)
end
it "creates a bookmark on the post as soon as the bookmark button is clicked" do
visit_topic_and_open_bookmark_menu(post)
expect(bookmark_menu).to be_open
expect(page).to have_content(I18n.t("js.bookmarks.bookmarked_success"))
expect(topic_page).to have_post_bookmarked(post, with_reminder: false)
expect(Bookmark.find_by(bookmarkable: post, user: current_user)).to be_truthy
end
it "updates the created bookmark with a selected reminder option from the bookmark menu" do
visit_topic_and_open_bookmark_menu(post)
expect(bookmark_menu).to be_open
expect(page).to have_content(I18n.t("js.bookmarks.bookmarked_success"))
bookmark_menu.click_menu_option("tomorrow")
expect(topic_page).to have_post_bookmarked(post, with_reminder: true)
expect(page).to have_no_css(".bookmark-menu-content.-expanded")
expect(Bookmark.find_by(bookmarkable: post, user: current_user).reminder_at).not_to be_blank
end
it "can set a reminder from the bookmark modal using the custom bookmark menu option" do
visit_topic_and_open_bookmark_menu(post)
bookmark_menu.click_menu_option("custom")
bookmark_modal.select_preset_reminder(:tomorrow)
expect(topic_page).to have_post_bookmarked(post, with_reminder: true)
expect(Bookmark.find_by(bookmarkable: post, user: current_user).reminder_at).not_to be_blank
end
it "allows choosing a different auto_delete_preference to the user preference and remembers it when reopening the modal" do
current_user.user_option.update!(
bookmark_auto_delete_preference: Bookmark.auto_delete_preferences[:on_owner_reply],
)
visit_topic_and_open_bookmark_menu(post_2)
bookmark_menu.click_menu_option("custom")
expect(bookmark_modal).to be_open
# TODO (martin) Not sure why, but I need to click this twice for the panel to open :/
bookmark_modal.open_options_panel
bookmark_modal.open_options_panel
expect(bookmark_modal).to have_auto_delete_preference(
Bookmark.auto_delete_preferences[:on_owner_reply],
)
bookmark_modal.select_auto_delete_preference(Bookmark.auto_delete_preferences[:clear_reminder])
bookmark_modal.save
expect(topic_page).to have_post_bookmarked(post_2, with_reminder: false)
topic_page.click_post_action_button(post_2, :bookmark)
bookmark_menu.click_menu_option("edit")
expect(bookmark_modal).to have_open_options_panel
expect(bookmark_modal).to have_auto_delete_preference(
Bookmark.auto_delete_preferences[:clear_reminder],
)
end
it "opens the bookmark modal with the Custom... option only after the bookmark saves on slow connections" do
topic_page.visit_topic(topic)
cdp.with_slow_upload do
open_bookmark_menu(post)
bookmark_menu.click_menu_option("custom")
end
expect(bookmark_modal).to be_open
end
describe "topic level bookmarks" do
it "allows the topic to be bookmarked" do
topic_page.visit_topic(topic)
topic_page.click_topic_bookmark_button
expect(topic_page).to have_topic_bookmarked(topic)
expect(Bookmark.exists?(bookmarkable: topic, user: current_user)).to be_truthy
end
it "opens the edit bookmark modal from the topic bookmark button and saves edits" do
bookmark = Fabricate(:bookmark, bookmarkable: topic, user: current_user)
topic_page.visit_topic(topic)
topic_page.click_topic_bookmark_button
bookmark_menu.click_menu_option("edit")
expect(bookmark_modal).to be_open
expect(bookmark_modal).to be_editing_id(bookmark.id)
bookmark_modal.fill_name("something important")
bookmark_modal.click_primary_button
try_until_success(frequency: 0.5) do
expect(bookmark.reload.name).to eq("something important")
end
end
end
describe "editing existing bookmarks" do
fab!(:bookmark) do
Fabricate(
:bookmark,
bookmarkable: post_2,
user: current_user,
name: "test name",
reminder_at: 10.days.from_now,
)
end
it "prefills the name of the bookmark and the custom reminder date and time" do
visit_topic_and_open_bookmark_menu(post_2, expand_actions: false)
bookmark_menu.click_menu_option("edit")
expect(bookmark_modal).to have_open_options_panel
expect(bookmark_modal.name.value).to eq("test name")
expect(bookmark_modal.existing_reminder_alert).to have_content(
bookmark_modal.existing_reminder_alert_message(bookmark),
)
expect(bookmark_modal.custom_date_picker.value).to eq(
bookmark.reminder_at_in_zone(timezone).strftime("%Y-%m-%d"),
)
expect(bookmark_modal.custom_time_picker.value).to eq(
bookmark.reminder_at_in_zone(timezone).strftime("%H:%M"),
)
expect(bookmark_modal).to have_active_preset("custom")
end
it "can delete the bookmark" do
visit_topic_and_open_bookmark_menu(post_2, expand_actions: false)
bookmark_menu.click_menu_option("edit")
bookmark_modal.delete
bookmark_modal.confirm_delete
expect(topic_page).to have_no_post_bookmarked(post_2)
end
it "can delete the bookmark from within the menu" do
visit_topic_and_open_bookmark_menu(post_2, expand_actions: false)
bookmark_menu.click_menu_option("delete")
expect(topic_page).to have_no_post_bookmarked(post_2)
end
it "does not save edits when pressing cancel" do
visit_topic_and_open_bookmark_menu(post_2, expand_actions: false)
bookmark_menu.click_menu_option("edit")
bookmark_modal.fill_name("something important")
bookmark_modal.cancel
topic_page.click_post_action_button(post_2, :bookmark)
bookmark_menu.click_menu_option("edit")
expect(bookmark_modal.name.value).to eq("something important")
expect(bookmark.reload.name).to eq("test name")
end
end
end