From 1166db12b4540e8d8b9e576dde3d672b993b4edf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Guitaut?= Date: Fri, 17 Jun 2022 11:07:58 +0200 Subject: [PATCH] FIX: Make watched words uploads work as intended (#17097) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * FIX: Make watched words uploads work as intended Currently when we upload a file containing watched words, it will always add the words to the action that was initially selected: this is the `block` action by default but if changing manually the action in the URL to `flag` for example, then this action will be selected and uploaded watched words will be categorised as `flag` no matter what. The problem lies with how the component works: it’s an Uppy object where extra data is defined to provide an action key to the server but when navigating to another listed action, while this action key is properly updated on the component itself, the underlying Uppy object has already been created and doesn’t care about the new value. This patch solves this by using the `_perFileData` method instead of `data`: the former is merged just before uploading a file whereas the latter is used when the Uppy object is created. --- .../addon/components/watched-word-uploader.js | 6 +- .../components/watched-word-uploader-test.js | 57 +++++++++++++++++++ 2 files changed, 59 insertions(+), 4 deletions(-) create mode 100644 app/assets/javascripts/discourse/tests/integration/components/watched-word-uploader-test.js diff --git a/app/assets/javascripts/admin/addon/components/watched-word-uploader.js b/app/assets/javascripts/admin/addon/components/watched-word-uploader.js index 8c2864b69b1..efbacb9c0b3 100644 --- a/app/assets/javascripts/admin/addon/components/watched-word-uploader.js +++ b/app/assets/javascripts/admin/addon/components/watched-word-uploader.js @@ -3,7 +3,6 @@ import I18n from "I18n"; import UppyUploadMixin from "discourse/mixins/uppy-upload"; import { alias } from "@ember/object/computed"; import bootbox from "bootbox"; -import discourseComputed from "discourse-common/utils/decorators"; export default Component.extend(UppyUploadMixin, { type: "txt", @@ -16,9 +15,8 @@ export default Component.extend(UppyUploadMixin, { return { skipValidation: true }; }, - @discourseComputed("actionKey") - data(actionKey) { - return { action_key: actionKey }; + _perFileData() { + return { action_key: this.actionKey }; }, uploadDone() { diff --git a/app/assets/javascripts/discourse/tests/integration/components/watched-word-uploader-test.js b/app/assets/javascripts/discourse/tests/integration/components/watched-word-uploader-test.js new file mode 100644 index 00000000000..04f65e36ccc --- /dev/null +++ b/app/assets/javascripts/discourse/tests/integration/components/watched-word-uploader-test.js @@ -0,0 +1,57 @@ +import componentTest, { + setupRenderingTest, +} from "discourse/tests/helpers/component-test"; +import { + createFile, + discourseModule, +} from "discourse/tests/helpers/qunit-helpers"; +import hbs from "htmlbars-inline-precompile"; +import pretender, { response } from "discourse/tests/helpers/create-pretender"; +import { click, waitFor } from "@ember/test-helpers"; +import { isLegacyEmber } from "discourse-common/config/environment"; + +if (!isLegacyEmber()) { + discourseModule( + "Integration | Component | watched-word-uploader", + function (hooks) { + setupRenderingTest(hooks); + + hooks.beforeEach(function () { + pretender.post( + "/admin/customize/watched_words/upload.json", + function () { + return response(200, {}); + } + ); + }); + + componentTest("sets the proper action key on uploads", { + template: hbs`{{watched-word-uploader + id="watched-word-uploader" + actionKey=actionNameKey + done=doneUpload + }}`, + + async test(assert) { + const done = assert.async(); + this.set("actionNameKey", "flag"); + this.set("doneUpload", function () { + assert.equal( + Object.entries(this._uppyInstance.getState().files)[0][1].meta + .action_key, + "flag" + ); + done(); + }); + + const words = createFile("watched-words.txt"); + await this.container + .lookup("service:app-events") + .trigger("upload-mixin:watched-word-uploader:add-files", words); + await waitFor(".bootbox span.d-button-label"); + await click(".bootbox span.d-button-label"); + }, + }); + } + ); +}