0
0
Fork 0
mirror of https://github.com/discourse/discourse.git synced 2026-08-06 13:08:40 +08:00
discourse/spec/system/nested_realtime_spec.rb
Mark VanLandingham acbdfa445f
FIX: Add small action controls to nested activity log (#42108)
Previously, small actions in nested replies' Activity Log modal could
not be edited, deleted, or recovered, and refreshes collapsed the modal.

This change renders the activity log as proper small action posts with
all the actions you expect from flat view.
2026-07-29 10:19:47 -05:00

143 lines
4.8 KiB
Ruby
Vendored

# frozen_string_literal: true
RSpec.describe "Nested view real-time updates" do
fab!(:user) { Fabricate(:user, refresh_auto_groups: true) }
fab!(:other_user) { Fabricate(:user, refresh_auto_groups: true) }
fab!(:admin)
fab!(:topic) { Fabricate(:topic, user: user) }
fab!(:op) { Fabricate(:post, topic: topic, user: user, post_number: 1) }
fab!(:root_reply) do
Fabricate(:post, topic: topic, user: Fabricate(:user), raw: "Existing root reply")
end
let(:nested_view) { PageObjects::Pages::NestedView.new }
let(:activity_log) { PageObjects::Components::NestedActivityLog.new }
before do
SiteSetting.nested_replies_enabled = true
Fabricate(:nested_topic, topic: topic)
sign_in(user)
end
describe "new root post by another user" do
it "shows new replies notification banner and loads posts on click" do
nested_view.visit_nested(topic)
expect(nested_view).to have_nested_view
expect(nested_view).to have_root_post(root_reply)
# Create a root post via PostCreator which triggers MessageBus
PostCreator.create!(
other_user,
topic_id: topic.id,
raw: "A brand new root reply from another user",
)
expect(page).to have_css(".nested-view__new-replies-btn", wait: 10)
find(".nested-view__new-replies-btn").click
expect(page).to have_no_css(".nested-view__new-replies-btn")
expect(page).to have_content("A brand new root reply from another user")
end
end
describe "new child reply by another user" do
it "shows the new child in the tree" do
nested_view.visit_nested(topic)
expect(nested_view).to have_nested_view
expect(nested_view).to have_root_post(root_reply)
new_child =
PostCreator.create!(
other_user,
topic_id: topic.id,
reply_to_post_number: root_reply.post_number,
raw: "A child reply via message bus",
)
expect(page).to have_css(
"[data-post-number='#{new_child.post_number}']",
text: "A child reply via message bus",
wait: 10,
)
end
end
describe "stale events from another topic" do
fab!(:other_topic) { Fabricate(:topic, user: other_user, title: "Topic with stale replies") }
fab!(:other_op) { Fabricate(:post, topic: other_topic, user: other_user, post_number: 1) }
fab!(:other_root) do
Fabricate(:post, topic: other_topic, user: other_user, raw: "Other topic root reply")
end
fab!(:other_sibling) do
Fabricate(:post, topic: other_topic, user: other_user, raw: "Other topic sibling reply")
end
fab!(:wrong_topic_reply) do
Fabricate(
:post,
topic: other_topic,
user: other_user,
raw: "Wrong topic leaked reply",
reply_to_post_number: other_root.post_number,
)
end
fab!(:existing_child) do
Fabricate(
:post,
topic: topic,
user: user,
raw: "Legitimate child reply",
reply_to_post_number: root_reply.post_number,
)
end
before { Fabricate(:nested_topic, topic: other_topic) }
it "ignores stale created events for posts from a different topic" do
nested_view.visit_nested(topic)
expect(nested_view).to have_nested_view
expect(page).to have_content("Legitimate child reply")
page.execute_script(<<~JS)
window.__stalePostLookupFinished = false;
jQuery(document).one("ajaxComplete", (_event, _xhr, settings) => {
if (settings.url.includes("/posts/#{wrong_topic_reply.id}.json")) {
window.__stalePostLookupFinished = true;
}
});
Discourse.lookup("controller:nested")._onMessage({
type: "created",
id: #{wrong_topic_reply.id},
user_id: #{other_user.id}
});
JS
try_until_success(reason: "stale post lookup finishes") do
expect(page.evaluate_script("window.__stalePostLookupFinished")).to eq(true)
end
expect(page).to have_no_content("Wrong topic leaked reply")
end
end
describe "small_action posts" do
it "adds the activity link and updates the modal without inserting the action into the tree" do
nested_view.visit_nested(topic)
expect(nested_view).to have_root_post(root_reply)
expect(nested_view).to have_no_activity_log_link
small_action = topic.add_small_action(admin, "closed.enabled")
expect(nested_view).to have_activity_log_link
expect(page).to have_no_css("[data-post-number='#{small_action.post_number}']")
nested_view.open_activity_log
expect(activity_log).to have_item(small_action)
revised = PostRevisor.new(small_action)
revised.revise!(admin, raw: "Updated through the message bus")
expect(activity_log).to have_item_text(small_action, "Updated through the message bus")
end
end
end