From 41a8789ec39756e308dbd2915407fa6ab6fd80f0 Mon Sep 17 00:00:00 2001 From: Jarek Radosz Date: Mon, 2 Dec 2024 23:13:34 +0100 Subject: [PATCH] DEV: Minor code cleanup (#322) mostly new i18n imports and qunit-dom --- .../solved-unaccept-answer-button.gjs | 72 +++++++++---------- .../solved-status-filter.js | 4 +- .../initializers/extend-for-solved-button.js | 16 ++--- .../discourse/routes/user-activity-solved.js | 8 +-- .../discourse-solved-post-menu-test.js | 16 ++--- .../acceptance/discourse-solved-test.js | 56 +++++++-------- .../discourse-solved-widget-post-menu-test.js | 18 ++--- .../acceptance/user-activity-solved-test.js | 41 +++++------ 8 files changed, 107 insertions(+), 124 deletions(-) diff --git a/assets/javascripts/discourse/components/solved-unaccept-answer-button.gjs b/assets/javascripts/discourse/components/solved-unaccept-answer-button.gjs index 5407b29..8f690ae 100644 --- a/assets/javascripts/discourse/components/solved-unaccept-answer-button.gjs +++ b/assets/javascripts/discourse/components/solved-unaccept-answer-button.gjs @@ -4,42 +4,8 @@ import { service } from "@ember/service"; import DButton from "discourse/components/d-button"; import { ajax } from "discourse/lib/ajax"; import { popupAjaxError } from "discourse/lib/ajax-error"; -import dIcon from "discourse-common/helpers/d-icon"; -import i18n from "discourse-common/helpers/i18n"; - -export default class SolvedUnacceptAnswerButton extends Component { - @service appEvents; - - @action - unacceptAnswer() { - unacceptAnswer(this.args.post, this.appEvents); - } - - -} +import icon from "discourse-common/helpers/d-icon"; +import { i18n } from "discourse-i18n"; export function unacceptAnswer(post, appEvents) { // TODO (glimmer-post-menu): Remove this exported function and move the code into the button action after the widget code is removed @@ -72,3 +38,37 @@ function unacceptPost(post) { data: { id: post.id }, }).catch(popupAjaxError); } + +export default class SolvedUnacceptAnswerButton extends Component { + @service appEvents; + + @action + unacceptAnswer() { + unacceptAnswer(this.args.post, this.appEvents); + } + + +} diff --git a/assets/javascripts/discourse/connectors/bread-crumbs-right/solved-status-filter.js b/assets/javascripts/discourse/connectors/bread-crumbs-right/solved-status-filter.js index 01554ba..8cd8465 100644 --- a/assets/javascripts/discourse/connectors/bread-crumbs-right/solved-status-filter.js +++ b/assets/javascripts/discourse/connectors/bread-crumbs-right/solved-status-filter.js @@ -1,7 +1,7 @@ import Component from "@glimmer/component"; import { action } from "@ember/object"; import { service } from "@ember/service"; -import I18n from "I18n"; +import { i18n } from "discourse-i18n"; const QUERY_PARAM_VALUES = { solved: "yes", @@ -40,7 +40,7 @@ export default class SolvedStatusFilter extends Component { get statuses() { return ["all", "solved", "unsolved"].map((status) => { return { - name: I18n.t(`solved.topic_status_filter.${status}`), + name: i18n(`solved.topic_status_filter.${status}`), value: status, }; }); diff --git a/assets/javascripts/discourse/initializers/extend-for-solved-button.js b/assets/javascripts/discourse/initializers/extend-for-solved-button.js index 0a711d3..d245c87 100644 --- a/assets/javascripts/discourse/initializers/extend-for-solved-button.js +++ b/assets/javascripts/discourse/initializers/extend-for-solved-button.js @@ -8,7 +8,7 @@ import TopicStatus from "discourse/raw-views/topic-status"; import PostCooked from "discourse/widgets/post-cooked"; import { withSilencedDeprecations } from "discourse-common/lib/deprecated"; import { iconHTML, iconNode } from "discourse-common/lib/icon-library"; -import I18n from "I18n"; +import { i18n } from "discourse-i18n"; import SolvedAcceptAnswerButton, { acceptAnswer, } from "../components/solved-accept-answer-button"; @@ -161,11 +161,11 @@ function customizeWidgetPostMenu(api) { return h( "span.accepted-text", { - title: I18n.t("solved.accepted_description"), + title: i18n("solved.accepted_description"), }, [ h("span", iconNode("check")), - h("span.accepted-label", I18n.t("solved.solution")), + h("span.accepted-label", i18n("solved.solution")), ] ); }, @@ -194,7 +194,7 @@ export default { ? name : formatUsername(username); - return I18n.t("solved.accepted_html", { + return i18n("solved.accepted_html", { icon: iconHTML("check-square", { class: "accepted" }), username_lower: username.toLowerCase(), username: displayedUser, @@ -213,7 +213,7 @@ export default { results.push({ openTag: "span", closeTag: "span", - title: I18n.t("topic_statuses.solved.help"), + title: i18n("topic_statuses.solved.help"), icon: "far-check-square", key: "solved", }); @@ -225,7 +225,7 @@ export default { results.push({ openTag: "span", closeTag: "span", - title: I18n.t("solved.has_no_accepted_answer"), + title: i18n("solved.has_no_accepted_answer"), icon: "far-square", }); } @@ -246,11 +246,11 @@ export default { api.addAdvancedSearchOptions({ statusOptions: [ { - name: I18n.t("search.advanced.statuses.solved"), + name: i18n("search.advanced.statuses.solved"), value: "solved", }, { - name: I18n.t("search.advanced.statuses.unsolved"), + name: i18n("search.advanced.statuses.unsolved"), value: "unsolved", }, ], diff --git a/assets/javascripts/discourse/routes/user-activity-solved.js b/assets/javascripts/discourse/routes/user-activity-solved.js index fa4a674..ef41d18 100644 --- a/assets/javascripts/discourse/routes/user-activity-solved.js +++ b/assets/javascripts/discourse/routes/user-activity-solved.js @@ -1,5 +1,5 @@ import UserActivityStreamRoute from "discourse/routes/user-activity-stream"; -import I18n from "I18n"; +import { i18n } from "discourse-i18n"; export default class UserActivitySolved extends UserActivityStreamRoute { userActionType = 15; @@ -10,10 +10,10 @@ export default class UserActivitySolved extends UserActivityStreamRoute { let title, body; if (this.isCurrentUser(user)) { - title = I18n.t("solved.no_solved_topics_title"); - body = I18n.t("solved.no_solved_topics_body"); + title = i18n("solved.no_solved_topics_title"); + body = i18n("solved.no_solved_topics_body"); } else { - title = I18n.t("solved.no_solved_topics_title_others", { + title = i18n("solved.no_solved_topics_title_others", { username: user.username, }); body = ""; diff --git a/test/javascripts/acceptance/discourse-solved-post-menu-test.js b/test/javascripts/acceptance/discourse-solved-post-menu-test.js index 60df5ba..a8c7be9 100644 --- a/test/javascripts/acceptance/discourse-solved-post-menu-test.js +++ b/test/javascripts/acceptance/discourse-solved-post-menu-test.js @@ -1,15 +1,13 @@ import { click, visit } from "@ember/test-helpers"; import { test } from "qunit"; import { acceptance } from "discourse/tests/helpers/qunit-helpers"; -import I18n from "I18n"; +import { i18n } from "discourse-i18n"; import { postStreamWithAcceptedAnswerExcerpt } from "../helpers/discourse-solved-helpers"; acceptance( "Discourse Solved | Post Menu | Accept and Unaccept", function (needs) { - needs.user({ - admin: true, - }); + needs.user({ admin: true }); needs.settings({ glimmer_post_menu_mode: "enabled", @@ -23,9 +21,9 @@ acceptance( helper.response({ success: "OK" }) ); - server.get("/t/12.json", () => { - return helper.response(postStreamWithAcceptedAnswerExcerpt(null)); - }); + server.get("/t/12.json", () => + helper.response(postStreamWithAcceptedAnswerExcerpt(null)) + ); }); test("accepting and unaccepting a post works", async function (assert) { @@ -34,7 +32,7 @@ acceptance( assert .dom("#post_2 .post-action-menu__solved-accepted") .exists("Unaccept button is visible") - .hasText(I18n.t("solved.solution"), "Unaccept button has correct text"); + .hasText(i18n("solved.solution"), "Unaccept button has correct text"); await click("#post_2 .post-action-menu__solved-accepted"); @@ -46,7 +44,7 @@ acceptance( assert .dom("#post_2 .post-action-menu__solved-accepted") - .exists("Unccept button is visible again"); + .exists("Unaccept button is visible again"); }); } ); diff --git a/test/javascripts/acceptance/discourse-solved-test.js b/test/javascripts/acceptance/discourse-solved-test.js index 08620df..d18f7db 100644 --- a/test/javascripts/acceptance/discourse-solved-test.js +++ b/test/javascripts/acceptance/discourse-solved-test.js @@ -1,53 +1,45 @@ import { click, fillIn, visit } from "@ember/test-helpers"; import { test } from "qunit"; -import { fixturesByUrl } from "discourse/tests/helpers/create-pretender"; -import { acceptance, queryAll } from "discourse/tests/helpers/qunit-helpers"; +import pretender, { + fixturesByUrl, + response, +} from "discourse/tests/helpers/create-pretender"; +import { acceptance } from "discourse/tests/helpers/qunit-helpers"; import { cloneJSON } from "discourse-common/lib/object"; import { postStreamWithAcceptedAnswerExcerpt } from "../helpers/discourse-solved-helpers"; acceptance("Discourse Solved Plugin", function (needs) { needs.user(); - needs.pretender((server, helper) => { - server.get("/t/11.json", () => { - return helper.response( - postStreamWithAcceptedAnswerExcerpt("this is an excerpt") - ); - }); - - server.get("/t/12.json", () => { - return helper.response(postStreamWithAcceptedAnswerExcerpt(null)); - }); - - server.get("/search", () => { - const fixtures = cloneJSON(fixturesByUrl["/search.json"]); - fixtures.topics[0].has_accepted_answer = true; - return helper.response(fixtures); - }); - }); - test("A topic with an accepted answer shows an excerpt of the answer, if provided", async function (assert) { - await visit("/t/with-excerpt/11"); - - assert.strictEqual( - queryAll('.quote blockquote:contains("this is an excerpt")').length, - 1 + pretender.get("/t/11.json", () => + response(postStreamWithAcceptedAnswerExcerpt("this is an excerpt")) ); - await visit("/t/without-excerpt/12"); + pretender.get("/t/12.json", () => + response(postStreamWithAcceptedAnswerExcerpt(null)) + ); - assert.notStrictEqual(queryAll(".quote blockquote").length, 1); - assert.strictEqual(queryAll(".quote .title.title-only").length, 1); + await visit("/t/with-excerpt/11"); + 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(); }); test("Full page search displays solved status", async function (assert) { - await visit("/search"); + pretender.get("/search", () => { + const fixtures = cloneJSON(fixturesByUrl["/search.json"]); + fixtures.topics[0].has_accepted_answer = true; + return response(fixtures); + }); + await visit("/search"); await fillIn(".search-query", "discourse"); await click(".search-cta"); - assert.strictEqual(queryAll(".fps-topic").length, 1, "has one post"); - - assert.ok(queryAll(".topic-status .solved").length, "shows the right icon"); + assert.dom(".fps-topic").exists({ count: 1 }, "has one post"); + assert.dom(".topic-status .solved").exists("shows the right icon"); }); }); diff --git a/test/javascripts/acceptance/discourse-solved-widget-post-menu-test.js b/test/javascripts/acceptance/discourse-solved-widget-post-menu-test.js index e390d2f..2733541 100644 --- a/test/javascripts/acceptance/discourse-solved-widget-post-menu-test.js +++ b/test/javascripts/acceptance/discourse-solved-widget-post-menu-test.js @@ -1,15 +1,13 @@ import { click, visit } from "@ember/test-helpers"; import { test } from "qunit"; import { acceptance } from "discourse/tests/helpers/qunit-helpers"; -import I18n from "I18n"; +import { i18n } from "discourse-i18n"; import { postStreamWithAcceptedAnswerExcerpt } from "../helpers/discourse-solved-helpers"; acceptance( "Discourse Solved | Widget Post Menu |Accept and Unaccept", function (needs) { - needs.user({ - admin: true, - }); + needs.user({ admin: true }); needs.settings({ glimmer_post_menu_mode: "disabled", @@ -23,9 +21,9 @@ acceptance( helper.response({ success: "OK" }) ); - server.get("/t/12.json", () => { - return helper.response(postStreamWithAcceptedAnswerExcerpt(null)); - }); + server.get("/t/12.json", () => + helper.response(postStreamWithAcceptedAnswerExcerpt(null)) + ); }); test("accepting and unaccepting a post works", async function (assert) { @@ -34,7 +32,7 @@ acceptance( assert .dom("#post_2 .accepted") .exists("Unaccept button is visible") - .hasText(I18n.t("solved.solution"), "Unaccept button has correct text"); + .hasText(i18n("solved.solution"), "Unaccept button has correct text"); await click("#post_2 .accepted"); @@ -42,7 +40,9 @@ acceptance( await click("#post_2 .unaccepted"); - assert.dom("#post_2 .accepted").exists("Unccept button is visible again"); + assert + .dom("#post_2 .accepted") + .exists("Unaccept button is visible again"); }); } ); diff --git a/test/javascripts/acceptance/user-activity-solved-test.js b/test/javascripts/acceptance/user-activity-solved-test.js index 99a8e46..ce55280 100644 --- a/test/javascripts/acceptance/user-activity-solved-test.js +++ b/test/javascripts/acceptance/user-activity-solved-test.js @@ -1,46 +1,39 @@ import { visit } from "@ember/test-helpers"; import { test } from "qunit"; -import { acceptance, query } from "discourse/tests/helpers/qunit-helpers"; -import I18n from "I18n"; +import { acceptance } from "discourse/tests/helpers/qunit-helpers"; +import { i18n } from "discourse-i18n"; acceptance( "Discourse Solved Plugin | activity/solved | empty state", function (needs) { - const currentUser = "eviltrout"; - const anotherUser = "charlie"; needs.user(); needs.pretender((server, helper) => { - const emptyResponse = { user_actions: [] }; - - server.get("/user_actions.json", () => { - return helper.response(emptyResponse); - }); + server.get("/user_actions.json", () => + helper.response({ user_actions: [] }) + ); }); test("When looking at own activity", async function (assert) { - await visit(`/u/${currentUser}/activity/solved`); + await visit(`/u/eviltrout/activity/solved`); - assert.equal( - query("div.empty-state span.empty-state-title").innerText, - I18n.t("solved.no_solved_topics_title") - ); - assert.equal( - query("div.empty-state div.empty-state-body").innerText, - I18n.t("solved.no_solved_topics_body") - ); + assert + .dom("div.empty-state span.empty-state-title") + .hasText(i18n("solved.no_solved_topics_title")); + assert + .dom("div.empty-state div.empty-state-body") + .hasText(i18n("solved.no_solved_topics_body")); }); test("When looking at another user's activity", async function (assert) { - await visit(`/u/${anotherUser}/activity/solved`); + await visit(`/u/charlie/activity/solved`); - assert.equal( - query("div.empty-state span.empty-state-title").innerText, - I18n.t("solved.no_solved_topics_title_others", { - username: anotherUser, + assert.dom("div.empty-state span.empty-state-title").hasText( + i18n("solved.no_solved_topics_title_others", { + username: "charlie", }) ); - assert.equal(query("div.empty-state div.empty-state-body").innerText, ""); + assert.dom("div.empty-state div.empty-state-body").hasNoText(); }); } );