import { withPluginApi } from "discourse/lib/plugin-api"; import selectKit from "helpers/select-kit-helper"; import { acceptance } from "helpers/qunit-helpers"; import { IMAGE_VERSION as v } from "pretty-text/emoji/version"; acceptance("Topic", { loggedIn: true, pretend(server, helper) { server.put("/posts/398/wiki", () => { return helper.response({}); }); } }); QUnit.test("Reply as new topic", async assert => { await visit("/t/internationalization-localization/280"); await click("button.share:eq(0)"); await click(".reply-as-new-topic a"); assert.ok(exists(".d-editor-input"), "the composer input is visible"); assert.equal( find(".d-editor-input") .val() .trim(), `Continuing the discussion from [Internationalization / localization](${window.location.origin}/t/internationalization-localization/280):`, "it fills composer with the ring string" ); assert.equal( selectKit(".category-chooser") .header() .value(), "2", "it fills category selector with the right category" ); }); QUnit.test("Reply as new message", async assert => { await visit("/t/pm-for-testing/12"); await click("button.share:eq(0)"); await click(".reply-as-new-topic a"); assert.ok(exists(".d-editor-input"), "the composer input is visible"); assert.equal( find(".d-editor-input") .val() .trim(), `Continuing the discussion from [PM for testing](${window.location.origin}/t/pm-for-testing/12):`, "it fills composer with the ring string" ); const targets = find(".item span", ".composer-fields"); assert.equal( $(targets[0]).text(), "someguy", "it fills up the composer with the right user to start the PM to" ); assert.equal( $(targets[1]).text(), "test", "it fills up the composer with the right user to start the PM to" ); assert.equal( $(targets[2]).text(), "Group", "it fills up the composer with the right group to start the PM to" ); }); QUnit.test("Share Modal", async assert => { await visit("/t/internationalization-localization/280"); await click(".topic-post:first-child button.share"); assert.ok(exists("#share-link"), "it shows the share modal"); }); QUnit.test("Showing and hiding the edit controls", async assert => { await visit("/t/internationalization-localization/280"); await click("#topic-title .d-icon-pencil-alt"); assert.ok(exists("#edit-title"), "it shows the editing controls"); assert.ok( !exists(".title-wrapper .remove-featured-link"), "link to remove featured link is not shown" ); await fillIn("#edit-title", "this is the new title"); await click("#topic-title .cancel-edit"); assert.ok(!exists("#edit-title"), "it hides the editing controls"); }); QUnit.test("Updating the topic title and category", async assert => { const categoryChooser = selectKit(".title-wrapper .category-chooser"); await visit("/t/internationalization-localization/280"); await click("#topic-title .d-icon-pencil-alt"); await fillIn("#edit-title", "this is the new title"); await categoryChooser.expand(); await categoryChooser.selectRowByValue(4); await click("#topic-title .submit-edit"); assert.equal( find("#topic-title .badge-category").text(), "faq", "it displays the new category" ); assert.equal( find(".fancy-title") .text() .trim(), "this is the new title", "it displays the new title" ); }); QUnit.test("Marking a topic as wiki", async assert => { await visit("/t/internationalization-localization/280"); assert.ok(find("a.wiki").length === 0, "it does not show the wiki icon"); await click(".topic-post:eq(0) button.show-more-actions"); await click(".topic-post:eq(0) button.show-post-admin-menu"); await click(".btn.wiki"); assert.ok(find("a.wiki").length === 1, "it shows the wiki icon"); }); QUnit.test("Visit topic routes", async assert => { await visit("/t/12"); assert.equal( find(".fancy-title") .text() .trim(), "PM for testing", "it routes to the right topic" ); await visit("/t/280/20"); assert.equal( find(".fancy-title") .text() .trim(), "Internationalization / localization", "it routes to the right topic" ); }); QUnit.test("Updating the topic title with emojis", async assert => { await visit("/t/internationalization-localization/280"); await click("#topic-title .d-icon-pencil-alt"); await fillIn("#edit-title", "emojis title :bike: :blonde_woman:t6:"); await click("#topic-title .submit-edit"); assert.equal( find(".fancy-title") .html() .trim(), `emojis title bike blonde_woman:t6`, "it displays the new title with emojis" ); }); QUnit.test("Updating the topic title with unicode emojis", async assert => { await visit("/t/internationalization-localization/280"); await click("#topic-title .d-icon-pencil-alt"); await fillIn("#edit-title", "emojis title 👨‍🌾🙏"); await click("#topic-title .submit-edit"); assert.equal( find(".fancy-title") .html() .trim(), `emojis title man_farmerpray`, "it displays the new title with escaped unicode emojis" ); }); QUnit.test( "Updating the topic title with unicode emojis without whitespaces", async assert => { Discourse.SiteSettings.enable_inline_emoji_translation = true; await visit("/t/internationalization-localization/280"); await click("#topic-title .d-icon-pencil-alt"); await fillIn("#edit-title", "Test🙂Title"); await click("#topic-title .submit-edit"); assert.equal( find(".fancy-title") .html() .trim(), `Testslightly_smiling_faceTitle`, "it displays the new title with escaped unicode emojis" ); } ); QUnit.test("Suggested topics", async assert => { await visit("/t/internationalization-localization/280"); assert.equal( find("#suggested-topics .suggested-topics-title") .text() .trim(), I18n.t("suggested_topics.title") ); }); QUnit.skip("Deleting a topic", async assert => { await visit("/t/internationalization-localization/280"); await click(".topic-post:eq(0) button.show-more-actions"); await click(".widget-button.delete"); assert.ok(exists(".widget-button.recover"), "it shows the recover button"); }); acceptance("Topic featured links", { loggedIn: true, settings: { topic_featured_link_enabled: true, max_topic_title_length: 80 } }); QUnit.test("remove featured link", async assert => { await visit("/t/-/299/1"); assert.ok( exists(".title-wrapper .topic-featured-link"), "link is shown with topic title" ); await click(".title-wrapper .edit-topic"); assert.ok( exists(".title-wrapper .remove-featured-link"), "link to remove featured link" ); // this test only works in a browser: // await click('.title-wrapper .remove-featured-link'); // await click('.title-wrapper .submit-edit'); // assert.ok(!exists('.title-wrapper .topic-featured-link'), 'link is gone'); }); QUnit.test("Converting to a public topic", async assert => { await visit("/t/test-pm/34"); assert.ok(exists(".private_message")); await click(".toggle-admin-menu"); await click(".topic-admin-convert button"); let categoryChooser = selectKit(".convert-to-public-topic .category-chooser"); await categoryChooser.expand(); await categoryChooser.selectRowByValue(21); await click(".convert-to-public-topic .btn-primary"); assert.ok(!exists(".private_message")); }); QUnit.test("Unpinning unlisted topic", async assert => { await visit("/t/internationalization-localization/280"); await click(".toggle-admin-menu"); await click(".topic-admin-pin .btn"); await click(".btn-primary:last"); await click(".toggle-admin-menu"); await click(".topic-admin-visible .btn"); await click(".toggle-admin-menu"); assert.ok(exists(".topic-admin-pin"), "it should show the multi select menu"); }); QUnit.test("selecting posts", async assert => { await visit("/t/internationalization-localization/280"); await click(".toggle-admin-menu"); await click(".topic-admin-multi-select .btn"); assert.ok( exists(".selected-posts:not(.hidden)"), "it should show the multi select menu" ); assert.ok( exists(".select-all"), "it should allow users to select all the posts" ); }); QUnit.test("select below", async assert => { await visit("/t/internationalization-localization/280"); await click(".toggle-admin-menu"); await click(".topic-admin-multi-select .btn"); await click("#post_3 .select-below"); assert.ok( find(".selected-posts") .html() .includes(I18n.t("topic.multi_select.description", { count: 18 })), "it should select the right number of posts" ); await click("#post_2 .select-below"); assert.ok( find(".selected-posts") .html() .includes(I18n.t("topic.multi_select.description", { count: 19 })), "it should select the right number of posts" ); }); QUnit.test("View Hidden Replies", async assert => { await visit("/t/internationalization-localization/280"); await click(".gap"); assert.equal(find(".gap").length, 0, "it hides gap"); }); function selectText(selector) { const range = document.createRange(); const node = document.querySelector(selector); range.selectNodeContents(node); const selection = window.getSelection(); selection.removeAllRanges(); selection.addRange(range); } QUnit.test("Quoting a quote keeps the original poster name", async assert => { await visit("/t/internationalization-localization/280"); selectText("#post_5 blockquote"); await click(".quote-button"); assert.ok( find(".d-editor-input") .val() .indexOf('quote="codinghorror said, post:3, topic:280"') !== -1 ); }); QUnit.test( "Quoting a quote with the Reply button keeps the original poster name", async assert => { await visit("/t/internationalization-localization/280"); selectText("#post_5 blockquote"); await click(".reply"); assert.ok( find(".d-editor-input") .val() .indexOf('quote="codinghorror said, post:3, topic:280"') !== -1 ); } ); QUnit.test( "Quoting a quote with replyAsNewTopic keeps the original poster name", async assert => { await visit("/t/internationalization-localization/280"); selectText("#post_5 blockquote"); await keyEvent(document, "keypress", "j".charCodeAt(0)); await keyEvent(document, "keypress", "t".charCodeAt(0)); assert.ok( find(".d-editor-input") .val() .indexOf('quote="codinghorror said, post:3, topic:280"') !== -1 ); } ); QUnit.test( "Quoting by selecting text can mark the quote as full", async assert => { await visit("/t/internationalization-localization/280"); selectText("#post_5 .cooked"); await click(".quote-button"); assert.ok( find(".d-editor-input") .val() .indexOf('quote="pekka, post:5, topic:280, full:true"') !== -1 ); } ); acceptance("Topic + Post Bookmarks with Reminders", { loggedIn: true, settings: { enable_bookmarks_with_reminders: true } }); QUnit.test("Bookmarks Modal", async assert => { await visit("/t/internationalization-localization/280"); await click(".topic-post:first-child button.show-more-actions"); await click(".topic-post:first-child button.bookmark"); assert.ok(exists("#bookmark-reminder-modal"), "it shows the bookmark modal"); }); acceptance("Topic with title decorated", { loggedIn: true, beforeEach() { withPluginApi("0.8.40", api => { api.decorateTopicTitle((topic, node, topicTitleType) => { node.innerText = `${node.innerText}-${topic.id}-${topicTitleType}`; }); }); } }); QUnit.test("Decorate topic title", async assert => { await visit("/t/internationalization-localization/280"); assert.ok( find(".fancy-title")[0].innerText.endsWith("-280-topic-title"), "it decorates topic title" ); assert.ok( find(".raw-topic-link:nth-child(1)")[0].innerText.endsWith( "-27331-topic-list-item-title" ), "it decorates topic list item title" ); });