diff --git a/.discourse-compatibility b/.discourse-compatibility index afd28417..1f323689 100644 --- a/.discourse-compatibility +++ b/.discourse-compatibility @@ -1,3 +1,4 @@ +< 3.5.0.beta7-dev: 03804e1065d6a3afa7e5f6060e6f342eb2b94374 < 3.5.0.beta5-dev: a8c534f11832d6bb8590ce5001119654fe6f335f < 3.5.0.beta3-dev: 4f0234f5be3aaa77db277e0f224cd9750d2713cd < 3.5.0.beta2-dev: e82c6ae1ca38ccebb34669148f8de93a3028906e diff --git a/app/controllers/discourse_solved/answer_controller.rb b/app/controllers/discourse_solved/answer_controller.rb index 0ca76546..67ac86d2 100644 --- a/app/controllers/discourse_solved/answer_controller.rb +++ b/app/controllers/discourse_solved/answer_controller.rb @@ -13,9 +13,9 @@ def accept guardian.ensure_can_accept_answer!(topic, post) - DiscourseSolved.accept_answer!(post, current_user, topic: topic) + accepted_answer = DiscourseSolved.accept_answer!(post, current_user, topic: topic) - render json: success_json + render_json_dump(accepted_answer) end def unaccept diff --git a/assets/javascripts/discourse/components/solved-accept-answer-button.gjs b/assets/javascripts/discourse/components/solved-accept-answer-button.gjs index d402a6b5..7a107bef 100644 --- a/assets/javascripts/discourse/components/solved-accept-answer-button.gjs +++ b/assets/javascripts/discourse/components/solved-accept-answer-button.gjs @@ -1,4 +1,5 @@ import Component from "@glimmer/component"; +import { tracked } from "@glimmer/tracking"; import { action } from "@ember/object"; import { service } from "@ember/service"; import DButton from "discourse/components/d-button"; @@ -13,20 +14,27 @@ export default class SolvedAcceptAnswerButton extends Component { @service appEvents; @service currentUser; + @tracked saving = false; + get showLabel() { return this.currentUser?.id === this.args.post.topicCreatedById; } @action - acceptAnswer() { + async acceptAnswer() { const post = this.args.post; - acceptPost(post, this.currentUser); + this.saving = true; + try { + await acceptPost(post, this.currentUser); + } finally { + this.saving = false; + } this.appEvents.trigger("discourse-solved:solution-toggled", post); + // TODO (glimmer-post-stream) the Glimmer Post Stream does not listen to this event post.get("topic.postStream.posts").forEach((p) => { - p.set("topic_accepted_answer", true); this.appEvents.trigger("post-stream:refresh", { id: p.id }); }); } @@ -36,6 +44,7 @@ export default class SolvedAcceptAnswerButton extends Component { class="post-action-menu__solved-unaccepted unaccepted" ...attributes @action={{this.acceptAnswer}} + @disabled={{this.saving}} @icon="far-square-check" @label={{if this.showLabel "solved.solution"}} @title="solved.accept_answer" @@ -43,42 +52,21 @@ export default class SolvedAcceptAnswerButton extends Component { } -function acceptPost(post, acceptingUser) { - const topic = post.topic; - - clearAccepted(topic); - - post.setProperties({ - can_unaccept_answer: true, - can_accept_answer: false, - accepted_answer: true, - }); +async function acceptPost(post) { + if (!post.can_accept_answer || post.accepted_answer) { + return; + } - topic.set("accepted_answer", { - username: post.username, - name: post.name, - post_number: post.post_number, - excerpt: post.cooked, - accepter_username: acceptingUser.username, - accepter_name: acceptingUser.name, - }); + const topic = post.topic; - ajax("/solution/accept", { - type: "POST", - data: { id: post.id }, - }).catch(popupAjaxError); -} + try { + const acceptedAnswer = await ajax("/solution/accept", { + type: "POST", + data: { id: post.id }, + }); -function clearAccepted(topic) { - const posts = topic.get("postStream.posts"); - posts.forEach((post) => { - if (post.get("post_number") > 1) { - post.setProperties({ - accepted_answer: false, - can_accept_answer: true, - can_unaccept_answer: false, - topic_accepted_answer: false, - }); - } - }); + topic.setAcceptedSolution(acceptedAnswer); + } catch (e) { + popupAjaxError(e); + } } diff --git a/assets/javascripts/discourse/components/solved-accepted-answer.gjs b/assets/javascripts/discourse/components/solved-accepted-answer.gjs index fcafef58..4903b1c0 100644 --- a/assets/javascripts/discourse/components/solved-accepted-answer.gjs +++ b/assets/javascripts/discourse/components/solved-accepted-answer.gjs @@ -1,14 +1,8 @@ import Component from "@glimmer/component"; -import { tracked } from "@glimmer/tracking"; -import { on } from "@ember/modifier"; -import { action } from "@ember/object"; import { service } from "@ember/service"; import { htmlSafe } from "@ember/template"; -import AsyncContent from "discourse/components/async-content"; -import PostCookedHtml from "discourse/components/post/cooked-html"; +import PostQuotedContent from "discourse/components/post/quoted-content"; import concatClass from "discourse/helpers/concat-class"; -import icon from "discourse/helpers/d-icon"; -import { ajax } from "discourse/lib/ajax"; import { iconHTML } from "discourse/lib/icon-library"; import { formatUsername } from "discourse/lib/utilities"; import { i18n } from "discourse-i18n"; @@ -17,7 +11,9 @@ export default class SolvedAcceptedAnswer extends Component { @service siteSettings; @service store; - @tracked expanded = false; + get topic() { + return this.args.post.topic; + } get acceptedAnswer() { return this.topic.accepted_answer; @@ -27,49 +23,45 @@ export default class SolvedAcceptedAnswer extends Component { return `accepted-answer-${this.topic.id}-${this.acceptedAnswer.post_number}`; } - get topic() { - return this.args.post.topic; - } - get hasExcerpt() { return !!this.acceptedAnswer.excerpt; } - get htmlAccepter() { - const username = this.acceptedAnswer.accepter_username; - const name = this.acceptedAnswer.accepter_name; + get collapsedContent() { + if (!this.hasExcerpt) { + return null; + } + return htmlSafe(this.acceptedAnswer.excerpt); + } + + get htmlAccepter() { if (!this.siteSettings.show_who_marked_solved) { return; } - const formattedUsername = - this.siteSettings.display_name_on_posts && name - ? name - : formatUsername(username); + const { accepter_username, accepter_name } = this.acceptedAnswer; + const displayName = this.#getDisplayName(accepter_username, accepter_name); + + if (!displayName) { + return; + } return htmlSafe( i18n("solved.marked_solved_by", { - username: formattedUsername, - username_lower: username.toLowerCase(), + username: displayName, + username_lower: accepter_username.toLowerCase(), }) ); } get htmlSolvedBy() { - const username = this.acceptedAnswer.username; - const name = this.acceptedAnswer.name; - const postNumber = this.acceptedAnswer.post_number; - + const { username, name, post_number: postNumber } = this.acceptedAnswer; if (!username || !postNumber) { return; } - const displayedUser = - this.siteSettings.display_name_on_posts && name - ? name - : formatUsername(username); - + const displayedUser = this.#getDisplayName(username, name); const data = { icon: iconHTML("square-check", { class: "accepted" }), username_lower: username.toLowerCase(), @@ -82,85 +74,42 @@ export default class SolvedAcceptedAnswer extends Component { return htmlSafe(i18n("solved.accepted_html", data)); } - @action - toggleExpandedPost() { - if (!this.hasExcerpt) { - return; + #getDisplayName(username, name) { + if (!username) { + return null; } - this.expanded = !this.expanded; - } - - @action - async loadExpandedAcceptedAnswer(postNumber) { - const acceptedAnswer = await ajax( - `/posts/by_number/${this.topic.id}/${postNumber}` - ); - - return this.store.createRecord("post", acceptedAnswer); + return this.siteSettings.display_name_on_posts && name + ? name + : formatUsername(username); } } diff --git a/assets/javascripts/discourse/components/solved-unaccept-answer-button.gjs b/assets/javascripts/discourse/components/solved-unaccept-answer-button.gjs index 3c47156e..6c4d6fb0 100644 --- a/assets/javascripts/discourse/components/solved-unaccept-answer-button.gjs +++ b/assets/javascripts/discourse/components/solved-unaccept-answer-button.gjs @@ -1,7 +1,9 @@ import Component from "@glimmer/component"; +import { tracked } from "@glimmer/tracking"; import { action } from "@ember/object"; import { service } from "@ember/service"; import { htmlSafe } from "@ember/template"; +import { and } from "truth-helpers"; import DButton from "discourse/components/d-button"; import icon from "discourse/helpers/d-icon"; import { ajax } from "discourse/lib/ajax"; @@ -10,43 +12,11 @@ import { formatUsername } from "discourse/lib/utilities"; import { i18n } from "discourse-i18n"; import DTooltip from "float-kit/components/d-tooltip"; -function unacceptPost(post) { - if (!post.can_unaccept_answer) { - return; - } - const topic = post.topic; - - post.setProperties({ - can_accept_answer: true, - can_unaccept_answer: false, - accepted_answer: false, - }); - - topic.set("accepted_answer", undefined); - - ajax("/solution/unaccept", { - type: "POST", - data: { id: post.id }, - }).catch(popupAjaxError); -} - export default class SolvedUnacceptAnswerButton extends Component { @service appEvents; @service siteSettings; - @action - unacceptAnswer() { - const post = this.args.post; - - unacceptPost(post); - - this.appEvents.trigger("discourse-solved:solution-toggled", post); - - post.get("topic.postStream.posts").forEach((p) => { - p.set("topic_accepted_answer", false); - this.appEvents.trigger("post-stream:refresh", { id: p.id }); - }); - } + @tracked saving = false; get solvedBy() { if (!this.siteSettings.show_who_marked_solved) { @@ -67,9 +37,28 @@ export default class SolvedUnacceptAnswerButton extends Component { } } + @action + async unacceptAnswer() { + const post = this.args.post; + + this.saving = true; + try { + await unacceptPost(post); + } finally { + this.saving = false; + } + + this.appEvents.trigger("discourse-solved:solution-toggled", post); + + // TODO (glimmer-post-stream) the Glimmer Post Stream does not listen to this event + post.get("topic.postStream.posts").forEach((p) => { + this.appEvents.trigger("post-stream:refresh", { id: p.id }); + }); + } + } + +async function unacceptPost(post) { + if (!post.can_accept_answer || !post.accepted_answer) { + return; + } + + const topic = post.topic; + + try { + await ajax("/solution/unaccept", { + type: "POST", + data: { id: post.id }, + }); + + topic.setAcceptedSolution(undefined); + } catch (e) { + popupAjaxError(e); + } +} diff --git a/assets/javascripts/discourse/initializers/add-topic-list-class.js b/assets/javascripts/discourse/initializers/add-topic-list-class.js index d857f7a9..1a1fc0a0 100644 --- a/assets/javascripts/discourse/initializers/add-topic-list-class.js +++ b/assets/javascripts/discourse/initializers/add-topic-list-class.js @@ -8,7 +8,7 @@ export default { api.registerValueTransformer( "topic-list-item-class", ({ value, context }) => { - if (context.topic.get("has_accepted_answer")) { + if (context.topic.has_accepted_answer) { value.push("status-solved"); } return value; diff --git a/assets/javascripts/discourse/initializers/extend-for-solved-button.gjs b/assets/javascripts/discourse/initializers/extend-for-solved-button.gjs index cd732e11..d144dc10 100644 --- a/assets/javascripts/discourse/initializers/extend-for-solved-button.gjs +++ b/assets/javascripts/discourse/initializers/extend-for-solved-button.gjs @@ -1,4 +1,5 @@ import Component from "@glimmer/component"; +import { tracked } from "@glimmer/tracking"; import { withSilencedDeprecations } from "discourse/lib/deprecated"; import { withPluginApi } from "discourse/lib/plugin-api"; import RenderGlimmer from "discourse/widgets/render-glimmer"; @@ -10,16 +11,51 @@ import SolvedUnacceptAnswerButton from "../components/solved-unaccept-answer-but function initializeWithApi(api) { customizePost(api); customizePostMenu(api); + handleMessages(api); if (api.addDiscoveryQueryParam) { api.addDiscoveryQueryParam("solved", { replace: true, refreshModel: true }); } + + api.modifyClass( + "model:topic", + (Superclass) => + class extends Superclass { + @tracked accepted_answer; + @tracked has_accepted_answer; + + setAcceptedSolution(acceptedAnswer) { + this.postStream?.posts?.forEach((post) => { + if (!acceptedAnswer) { + post.setProperties({ + accepted_answer: false, + topic_accepted_answer: false, + }); + } else if (post.post_number > 1) { + post.setProperties( + acceptedAnswer.post_number === post.post_number + ? { + accepted_answer: true, + topic_accepted_answer: true, + } + : { + accepted_answer: false, + topic_accepted_answer: true, + } + ); + } + }); + + this.accepted_answer = acceptedAnswer; + this.has_accepted_answer = !!acceptedAnswer; + } + } + ); } function customizePost(api) { api.addTrackedPostProperties( "can_accept_answer", - "can_unaccept_answer", "accepted_answer", "topic_accepted_answer" ); @@ -28,10 +64,17 @@ function customizePost(api) { "post-content-cooked-html", class extends Component { static shouldRender(args) { - return args.post.post_number === 1 && args.post.topic.accepted_answer; + return ( + args.post?.post_number === 1 && args.post?.topic?.accepted_answer + ); } - + } ); @@ -69,10 +112,10 @@ function customizePostMenu(api) { }) => { let solvedButton; - if (post.can_accept_answer) { - solvedButton = SolvedAcceptAnswerButton; - } else if (post.accepted_answer) { + if (post.accepted_answer) { solvedButton = SolvedUnacceptAnswerButton; + } else if (post.can_accept_answer) { + solvedButton = SolvedAcceptAnswerButton; } solvedButton && @@ -95,19 +138,32 @@ function customizePostMenu(api) { ); } +function handleMessages(api) { + const callback = async (controller, message) => { + const topic = controller.model; + + if (topic) { + topic.setAcceptedSolution(message.accepted_answer); + } + }; + + api.registerCustomPostMessageCallback("accepted_solution", callback); + api.registerCustomPostMessageCallback("unaccepted_solution", callback); +} + export default { name: "extend-for-solved-button", initialize() { - withPluginApi("1.34.0", initializeWithApi); + withPluginApi(initializeWithApi); - withPluginApi("0.8.10", (api) => { + withPluginApi((api) => { api.replaceIcon( "notification.solved.accepted_notification", "square-check" ); }); - withPluginApi("0.11.0", (api) => { + withPluginApi((api) => { api.addAdvancedSearchOptions({ statusOptions: [ { @@ -122,7 +178,7 @@ export default { }); }); - withPluginApi("0.11.7", (api) => { + withPluginApi((api) => { api.addSearchSuggestion("status:solved"); api.addSearchSuggestion("status:unsolved"); }); diff --git a/assets/stylesheets/solutions.scss b/assets/stylesheets/solutions.scss index 484bec8e..39957723 100644 --- a/assets/stylesheets/solutions.scss +++ b/assets/stylesheets/solutions.scss @@ -62,10 +62,6 @@ aside.quote.accepted-answer { display: flex; justify-content: space-between; align-items: flex-start; - - &.quote__title--can-toggle-content { - cursor: pointer; - } } .accepted-answer--solver-accepter { diff --git a/lib/discourse_solved/guardian_extensions.rb b/lib/discourse_solved/guardian_extensions.rb index 9f96b441..6ea7fec9 100644 --- a/lib/discourse_solved/guardian_extensions.rb +++ b/lib/discourse_solved/guardian_extensions.rb @@ -21,7 +21,9 @@ def allow_accepted_answers?(category_id, tag_names = []) def can_accept_answer?(topic, post) return false if !authenticated? - return false if !topic || topic.private_message? || !post || post.whisper? + if !topic || topic.private_message? || !post || post.post_number <= 1 || post.whisper? + return false + end return false if !allow_accepted_answers?(topic.category_id, topic.tags.map(&:name)) return true if is_staff? diff --git a/lib/discourse_solved/topic_extension.rb b/lib/discourse_solved/topic_extension.rb index cfd6757c..e9020a3e 100644 --- a/lib/discourse_solved/topic_extension.rb +++ b/lib/discourse_solved/topic_extension.rb @@ -4,4 +4,43 @@ module DiscourseSolved::TopicExtension extend ActiveSupport::Concern prepended { has_one :solved, class_name: "DiscourseSolved::SolvedTopic", dependent: :destroy } + + def accepted_answer_post_info + return nil unless solved + + answer_post = solved.answer_post + + answer_post_user = answer_post.user + accepter = solved.accepter + + excerpt = + if SiteSetting.solved_quote_length > 0 + PrettyText.excerpt( + answer_post.cooked, + SiteSetting.solved_quote_length, + keep_emoji_images: true, + ) + else + nil + end + + accepted_answer = { + post_number: answer_post.post_number, + username: answer_post_user.username, + name: answer_post_user.name, + excerpt:, + } + + if SiteSetting.show_who_marked_solved + accepted_answer[:accepter_name] = accepter.name + accepted_answer[:accepter_username] = accepter.username + end + + if !SiteSetting.enable_names || !SiteSetting.display_name_on_posts + accepted_answer[:name] = nil + accepted_answer[:accepter_name] = nil + end + + accepted_answer + end end diff --git a/lib/discourse_solved/topic_view_serializer_extension.rb b/lib/discourse_solved/topic_view_serializer_extension.rb index cadfb49c..d771af82 100644 --- a/lib/discourse_solved/topic_view_serializer_extension.rb +++ b/lib/discourse_solved/topic_view_serializer_extension.rb @@ -11,45 +11,6 @@ def include_accepted_answer? end def accepted_answer - accepted_answer_post_info - end - - private - - def accepted_answer_post_info - solved = object.topic.solved - answer_post = solved.answer_post - answer_post_user = answer_post.user - accepter = solved.accepter - - excerpt = - if SiteSetting.solved_quote_length > 0 - PrettyText.excerpt( - answer_post.cooked, - SiteSetting.solved_quote_length, - keep_emoji_images: true, - ) - else - nil - end - - accepted_answer = { - post_number: answer_post.post_number, - username: answer_post_user.username, - name: answer_post_user.name, - excerpt:, - } - - if SiteSetting.show_who_marked_solved - accepted_answer[:accepter_name] = accepter.name - accepted_answer[:accepter_username] = accepter.username - end - - if !SiteSetting.enable_names || !SiteSetting.display_name_on_posts - accepted_answer[:name] = nil - accepted_answer[:accepter_name] = nil - end - - accepted_answer + object.topic.accepted_answer_post_info end end diff --git a/plugin.rb b/plugin.rb index c37e9844..1358fac2 100644 --- a/plugin.rb +++ b/plugin.rb @@ -112,7 +112,14 @@ def self.accept_answer!(post, acting_user, topic: nil) WebHook.enqueue_solved_hooks(:accepted_solution, post, payload) end + accepted_answer = topic.reload.accepted_answer_post_info + + message = { type: :accepted_solution, accepted_answer: } + DiscourseEvent.trigger(:accepted_solution, post) + MessageBus.publish("/topic/#{topic.id}", message) + + accepted_answer end end @@ -140,7 +147,9 @@ def self.unaccept_answer!(post, topic: nil) payload = WebHook.generate_payload(:post, post) WebHook.enqueue_solved_hooks(:unaccepted_solution, post, payload) end + DiscourseEvent.trigger(:unaccepted_solution, post) + MessageBus.publish("/topic/#{topic.id}", type: :unaccepted_solution) end end @@ -252,9 +261,7 @@ def self.skip_db? .count end add_to_serializer(:user_summary, :solved_count) { object.solved_count } - add_to_serializer(:post, :can_accept_answer) do - scope.can_accept_answer?(topic, object) && object.post_number > 1 && !accepted_answer - end + add_to_serializer(:post, :can_accept_answer) { scope.can_accept_answer?(topic, object) } add_to_serializer(:post, :can_unaccept_answer) do scope.can_accept_answer?(topic, object) && accepted_answer end diff --git a/spec/integration/solved_spec.rb b/spec/integration/solved_spec.rb index 9a65f764..a6769a22 100644 --- a/spec/integration/solved_spec.rb +++ b/spec/integration/solved_spec.rb @@ -3,7 +3,7 @@ require "rails_helper" RSpec.describe "Managing Posts solved status" do - let(:topic) { Fabricate(:topic) } + let(:topic) { Fabricate(:topic_with_op) } fab!(:user) { Fabricate(:trust_level_4) } let(:p1) { Fabricate(:post, topic: topic) } @@ -238,7 +238,7 @@ it "gives priority to category's solved_topics_auto_close_hours setting" do freeze_time custom_auto_close_category = Fabricate(:category) - topic_2 = Fabricate(:topic, category: custom_auto_close_category) + topic_2 = Fabricate(:topic_with_op, category: custom_auto_close_category) post_2 = Fabricate(:post, topic: topic_2) custom_auto_close_category.custom_fields["solved_topics_auto_close_hours"] = 4 custom_auto_close_category.save_custom_fields diff --git a/spec/lib/guardian_extensions_spec.rb b/spec/lib/guardian_extensions_spec.rb index a3354b50..1ac6f995 100644 --- a/spec/lib/guardian_extensions_spec.rb +++ b/spec/lib/guardian_extensions_spec.rb @@ -5,7 +5,7 @@ describe DiscourseSolved::GuardianExtensions do fab!(:user) { Fabricate(:user, refresh_auto_groups: true) } fab!(:other_user) { Fabricate(:user, refresh_auto_groups: true) } - fab!(:topic) + fab!(:topic) { Fabricate(:topic_with_op) } fab!(:post) { Fabricate(:post, topic: topic, user: other_user) } let(:guardian) { user.guardian } @@ -17,9 +17,10 @@ expect(Guardian.new.can_accept_answer?(topic, post)).to eq(false) end - it "returns false if the topic is nil, the post is nil, or for whispers" do + it "returns false if the topic is nil, the post is nil, for the first post or for whispers" do expect(guardian.can_accept_answer?(nil, post)).to eq(false) expect(guardian.can_accept_answer?(topic, nil)).to eq(false) + expect(guardian.can_accept_answer?(topic, topic.first_post)).to eq(false) post.update!(post_type: Post.types[:whisper]) expect(guardian.can_accept_answer?(topic, post)).to eq(false) diff --git a/spec/system/solved_spec.rb b/spec/system/solved_spec.rb index dc17f7a9..ff225026 100644 --- a/spec/system/solved_spec.rb +++ b/spec/system/solved_spec.rb @@ -1,5 +1,4 @@ # frozen_string_literal: true - describe "About page", type: :system do fab!(:admin) fab!(:solver) { Fabricate(:user) } @@ -16,26 +15,50 @@ end %w[enabled disabled].each do |value| - before { SiteSetting.glimmer_post_stream_mode = 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) - topic_page.visit_topic(topic, post_number: 2) expect(topic_page).to have_css(".post-action-menu__solved-unaccepted") - find(".post-action-menu__solved-unaccepted").click expect(topic_page).to have_css(".post-action-menu__solved-accepted") + + accepted_answer_quote = topic_page.find("aside.accepted-answer.quote") + expect(accepted_answer_quote["data-expanded"]).to eq("false") + expect(accepted_answer_quote.find("blockquote")).to have_content("The answer is 42") + expect(topic_page.find(".title .accepted-answer--solver")).to have_content( "Solved by #{solver.username}", ) expect(topic_page.find(".title .accepted-answer--accepter")).to have_content( "Marked as solved by #{accepter.username}", ) - expect(topic_page.find("blockquote")).to have_content("The answer is 42") + + accepted_answer_quote.find("button.quote-toggle").click + expect(accepted_answer_quote["data-expanded"]).to eq("true") + end + + it "accepts and unaccepts post as solution" do + sign_in(accepter) + topic_page.visit_topic(topic, post_number: 2) + + expect(topic_page).to have_css(".post-action-menu__solved-unaccepted") + find(".post-action-menu__solved-unaccepted").click + expect(topic_page).to have_css(".post-action-menu__solved-accepted") + + expect(topic_page).to have_css(".accepted-answer.quote") + expect(topic_page).to have_css(".title .accepted-answer--solver") + expect(topic_page).to have_css(".title .accepted-answer--accepter") + + find(".post-action-menu__solved-accepted").click + expect(topic_page).to have_css(".post-action-menu__solved-unaccepted") + expect(topic_page).not_to have_css(".accepted-answer.quote") + expect(topic_page).not_to have_css(".title .accepted-answer--solver") + expect(topic_page).not_to have_css(".title .accepted-answer--accepter") end end end diff --git a/test/javascripts/acceptance/discourse-solved-post-menu-test.js b/test/javascripts/acceptance/discourse-solved-post-menu-test.js index 8b3c24cf..2bb8ae46 100644 --- a/test/javascripts/acceptance/discourse-solved-post-menu-test.js +++ b/test/javascripts/acceptance/discourse-solved-post-menu-test.js @@ -15,7 +15,11 @@ acceptance( }); needs.pretender((server, helper) => { - server.post("/solution/accept", () => helper.response({ success: "OK" })); + server.post("/solution/accept", () => + helper.response( + postStreamWithAcceptedAnswerExcerpt(null).accepted_answer + ) + ); server.post("/solution/unaccept", () => helper.response({ success: "OK" }) ); diff --git a/test/javascripts/acceptance/discourse-solved-test.js b/test/javascripts/acceptance/discourse-solved-test.js index 48401c48..41e2239e 100644 --- a/test/javascripts/acceptance/discourse-solved-test.js +++ b/test/javascripts/acceptance/discourse-solved-test.js @@ -30,8 +30,9 @@ import { postStreamWithAcceptedAnswerExcerpt } from "../helpers/discourse-solved assert.dom(".quote blockquote").hasText("this is an excerpt"); await visit("/t/without-excerpt/12"); - assert.dom(".quote blockquote").doesNotExist(); - assert.dom(".quote .title.title-only").exists(); + + assert.dom(".quote blockquote").hasNoText(); + assert.dom(".quote.title-only .title").exists(); }); test("Full page search displays solved status", async function (assert) { diff --git a/test/javascripts/helpers/discourse-solved-helpers.js b/test/javascripts/helpers/discourse-solved-helpers.js index 6060b748..ce733d52 100644 --- a/test/javascripts/helpers/discourse-solved-helpers.js +++ b/test/javascripts/helpers/discourse-solved-helpers.js @@ -109,8 +109,7 @@ export const postStreamWithAcceptedAnswerExcerpt = (excerpt) => { edit_reason: null, can_view_edit_history: true, wiki: false, - can_accept_answer: false, - can_unaccept_answer: true, + can_accept_answer: true, accepted_answer: true, }, ],