2
0
Fork 0
mirror of https://github.com/discourse/discourse.git synced 2025-10-03 17:21:20 +08:00
discourse/plugins/discourse-solved/spec/system/solved_spec.rb
2025-08-19 10:09:14 +08:00

118 lines
3.7 KiB
Ruby

# frozen_string_literal: true
describe "Solved", type: :system do
fab!(:admin)
fab!(:solver) { Fabricate(:user) }
fab!(:accepter) { Fabricate(:user, name: "<b>DERP<b>") }
fab!(:topic) { Fabricate(:post, user: admin).topic }
fab!(:solver_post) { Fabricate(:post, topic:, user: solver, cooked: "The answer is 42") }
let(:topic_page) { PageObjects::Pages::Topic.new }
UNACCEPTED_BUTTON_SELECTOR = ".post-action-menu__solved-unaccepted"
ACCEPTED_BUTTON_SELECTOR = ".post-action-menu__solved-accepted"
ACCEPTED_ANSWER_QUOTE_SELECTOR = "aside.accepted-answer.quote"
SOLVER_INFO_SELECTOR = ".title .accepted-answer--solver"
ACCEPTER_INFO_SELECTOR = ".title .accepted-answer--accepter"
QUOTE_TOGGLE_SELECTOR = "aside.accepted-answer.quote button.quote-toggle"
before do
SiteSetting.solved_enabled = true
SiteSetting.allow_solved_on_all_topics = true
SiteSetting.accept_all_solutions_allowed_groups = Group::AUTO_GROUPS[:everyone]
SiteSetting.show_who_marked_solved = true
SiteSetting.display_name_on_posts = true
end
%w[enabled disabled].each do |value|
context "when glimmer_post_stream_mode=#{value}" do
before { SiteSetting.glimmer_post_stream_mode = value }
it "accepts post as solution and shows in OP" do
sign_in(accepter)
visit_solver_post
verify_solution_unaccepted_state
accept_solution
verify_solution_accepted_state
verify_solution_quote_content
verify_solver_and_accepter_info
expand_solution_quote
end
it "accepts and unaccepts post as solution" do
sign_in(accepter)
visit_solver_post
verify_solution_unaccepted_state
accept_solution
verify_solution_accepted_state
verify_solution_info_present
unaccept_solution
verify_solution_unaccepted_state
verify_solution_info_absent
end
end
end
it "shows the solved post in user activity at /my/activity/solved" do
Fabricate(:solved_topic, topic:, answer_post: solver_post, accepter:)
sign_in(solver)
visit "/my/activity/solved"
expect(page.find(".post-list")).to have_content(solver_post.cooked)
end
private
def visit_solver_post
topic_page.visit_topic(topic, post_number: 2)
end
def accept_solution
find(UNACCEPTED_BUTTON_SELECTOR).click
end
def unaccept_solution
find(ACCEPTED_BUTTON_SELECTOR).click
end
def verify_solution_accepted_state
expect(topic_page).to have_css(ACCEPTED_BUTTON_SELECTOR)
expect(topic_page).to have_css("#{ACCEPTED_ANSWER_QUOTE_SELECTOR}[data-expanded='false']")
end
def verify_solution_unaccepted_state
expect(topic_page).to have_css(UNACCEPTED_BUTTON_SELECTOR)
end
def verify_solution_quote_content
expect(topic_page.find("#{ACCEPTED_ANSWER_QUOTE_SELECTOR} blockquote")).to have_content(
"The answer is 42",
)
end
def verify_solver_and_accepter_info
expect(topic_page.find(SOLVER_INFO_SELECTOR)).to have_content("Solved by #{solver.name}")
expect(topic_page.find(ACCEPTER_INFO_SELECTOR)).to have_content(
"Marked as solved by #{accepter.name}",
)
end
def verify_solution_info_present
expect(topic_page).to have_css(ACCEPTED_ANSWER_QUOTE_SELECTOR)
expect(topic_page).to have_css(SOLVER_INFO_SELECTOR)
expect(topic_page).to have_css(ACCEPTER_INFO_SELECTOR)
end
def verify_solution_info_absent
expect(topic_page).to have_no_css(ACCEPTED_ANSWER_QUOTE_SELECTOR)
expect(topic_page).to have_no_css(SOLVER_INFO_SELECTOR)
expect(topic_page).to have_no_css(ACCEPTER_INFO_SELECTOR)
end
def expand_solution_quote
topic_page.find(QUOTE_TOGGLE_SELECTOR).click
expect(topic_page).to have_css("#{ACCEPTED_ANSWER_QUOTE_SELECTOR}[data-expanded='true']")
end
end