diff --git a/app/assets/javascripts/discourse/app/components/modal/flag.hbs b/app/assets/javascripts/discourse/app/components/modal/flag.hbs index 8fc67e7dc97..b8ebc6d6750 100644 --- a/app/assets/javascripts/discourse/app/components/modal/flag.hbs +++ b/app/assets/javascripts/discourse/app/components/modal/flag.hbs @@ -32,7 +32,7 @@ <:footer> = Reviewable.score_required_to_hide_post + if score >= Reviewable.score_required_to_hide_post || @take_action + @post.hide!(@post_action_type_id) + end end # Special case: If you have TL3 and the user is TL0, and the flag is spam, diff --git a/spec/lib/post_action_creator_spec.rb b/spec/lib/post_action_creator_spec.rb index fef228d75b3..36e723d56ec 100644 --- a/spec/lib/post_action_creator_spec.rb +++ b/spec/lib/post_action_creator_spec.rb @@ -271,18 +271,38 @@ RSpec.describe PostActionCreator do end describe "take_action" do - before { PostActionCreator.create(Fabricate(:user), post, :inappropriate) } + it "will hide the post" do + PostActionCreator + .new(Fabricate(:moderator), post, PostActionType.types[:spam], take_action: true) + .perform + .reviewable + expect(post.reload).to be_hidden + end - it "will agree with the old reviewable" do - reviewable = + context "when there is another reviewable on the post" do + before { PostActionCreator.create(Fabricate(:user), post, :inappropriate) } + + it "will agree with the old reviewable" do + reviewable = + PostActionCreator + .new(Fabricate(:moderator), post, PostActionType.types[:spam], take_action: true) + .perform + .reviewable + expect(reviewable.reload).to be_approved + expect(reviewable.reviewable_scores).to all(be_agreed) + end + end + + context "when hide_post_sensitivity is low" do + before { SiteSetting.hide_post_sensitivity = Reviewable.sensitivities[:low] } + + it "still hides the post without considering the score" do PostActionCreator .new(Fabricate(:moderator), post, PostActionType.types[:spam], take_action: true) .perform .reviewable - scores = reviewable.reviewable_scores - expect(scores[0]).to be_agreed - expect(scores[1]).to be_agreed - expect(reviewable.reload).to be_approved + expect(post.reload).to be_hidden + end end end @@ -307,7 +327,7 @@ RSpec.describe PostActionCreator do score = result.reviewable.reviewable_scores.last expect(score.reason).to eq("queued_by_staff") - expect(post.reload.hidden?).to eq(true) + expect(post.reload).to be_hidden end it "hides the topic even if it has replies" do diff --git a/spec/system/flagging_post_spec.rb b/spec/system/flagging_post_spec.rb new file mode 100644 index 00000000000..b760335838e --- /dev/null +++ b/spec/system/flagging_post_spec.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +# frozen_string_literal: true + +describe "Flagging post", type: :system, js: true do + fab!(:current_user) { Fabricate(:admin) } + fab!(:first_post) { Fabricate(:post) } + fab!(:post_to_flag) { Fabricate(:post, topic: first_post.topic) } + + let(:topic_page) { PageObjects::Pages::Topic.new } + let(:flag_modal) { PageObjects::Modals::Flag.new } + + before { sign_in(current_user) } + + describe "Using Take Action" do + it "can select the default action to hide the post, agree with other flags, and reach the flag threshold" do + other_flag = Fabricate(:flag, post: post_to_flag, user: Fabricate(:moderator)) + expect(other_flag.reload.agreed_at).to be_nil + topic_page.visit_topic(post_to_flag.topic) + topic_page.expand_post_actions(post_to_flag) + topic_page.click_post_action_button(post_to_flag, :flag) + flag_modal.choose_type(:off_topic) + flag_modal.take_action(:agree_and_hide) + expect( + topic_page.post_by_number(post_to_flag).ancestor(".topic-post.post-hidden"), + ).to be_present + expect(other_flag.reload.agreed_at).to be_present + end + end +end diff --git a/spec/system/page_objects/modals/base.rb b/spec/system/page_objects/modals/base.rb index daa81e5eea9..3b8025ee3e8 100644 --- a/spec/system/page_objects/modals/base.rb +++ b/spec/system/page_objects/modals/base.rb @@ -6,6 +6,16 @@ module PageObjects include Capybara::DSL include RSpec::Matchers + BODY_SELECTOR = "" + + def body + find(".modal-body#{BODY_SELECTOR}") + end + + def footer + find(".modal-footer") + end + def close find(".modal-close").click end @@ -19,11 +29,11 @@ module PageObjects end def click_primary_button - find(".modal-footer .btn-primary").click + footer.find(".btn-primary").click end def has_content?(content) - find(".modal-body").has_content?(content) + body.has_content?(content) end def open? diff --git a/spec/system/page_objects/modals/flag.rb b/spec/system/page_objects/modals/flag.rb new file mode 100644 index 00000000000..1e2da7cba0a --- /dev/null +++ b/spec/system/page_objects/modals/flag.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +module PageObjects + module Modals + class Flag < PageObjects::Modals::Base + BODY_SELECTOR = ".flag-modal-body" + MODAL_SELECTOR = ".flag-modal" + + def choose_type(type) + body.find("#radio_#{type}").click + end + + def confirm_flag + click_primary_button + end + + def take_action(action) + select_kit = + PageObjects::Components::SelectKit.new(".modal-footer .reviewable-action-dropdown") + select_kit.expand + select_kit.select_row_by_value(action) + end + end + end +end diff --git a/spec/system/page_objects/pages/topic.rb b/spec/system/page_objects/pages/topic.rb index 988151d0508..2061ff5ce53 100644 --- a/spec/system/page_objects/pages/topic.rb +++ b/spec/system/page_objects/pages/topic.rb @@ -84,6 +84,8 @@ module PageObjects post_by_number(post).find(".bookmark.with-reminder").click when :reply post_by_number(post).find(".post-controls .reply").click + when :flag + post_by_number(post).find(".post-controls .create-flag").click end end