FIX: Lots of plugin tests were using old, non-Ember compat CLI APIs (#13320)

This commit is contained in:
Robin Ward 2021-06-09 10:58:55 -04:00 committed by GitHub
parent 3b6d6c7024
commit 77d33ebe21
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
24 changed files with 514 additions and 422 deletions

View File

@ -19,8 +19,14 @@ import { resolveShareUrl } from "discourse/helpers/share-url";
import { userPath } from "discourse/lib/url"; import { userPath } from "discourse/lib/url";
const Post = RestModel.extend({ const Post = RestModel.extend({
@discourseComputed("url") customShare: null,
@discourseComputed("url", "customShare")
shareUrl(url) { shareUrl(url) {
if (this.customShare) {
return this.customShare;
}
const user = User.current(); const user = User.current();
return resolveShareUrl(url, user); return resolveShareUrl(url, user);
}, },

View File

@ -701,7 +701,17 @@ createWidget("post-article", {
.then((posts) => { .then((posts) => {
this.state.repliesAbove = posts.map((p) => { this.state.repliesAbove = posts.map((p) => {
let result = transformWithCallbacks(p); let result = transformWithCallbacks(p);
result.shareUrl = `${topicUrl}/${p.post_number}`;
// We don't want to overwrite CPs - we are doing something a bit weird
// here by creating a post object from a transformed post. They aren't
// 100% the same.
delete result.new_user;
delete result.deleted;
delete result.shareUrl;
delete result.firstPost;
delete result.usernameUrl;
result.customShare = `${topicUrl}/${p.post_number}`;
result.asPost = this.store.createRecord("post", result); result.asPost = this.store.createRecord("post", result);
return result; return result;
}); });

View File

@ -35,6 +35,7 @@ module.exports = function (defaults) {
app.import(vendorJs + "jquery.ui.widget.js"); app.import(vendorJs + "jquery.ui.widget.js");
app.import(vendorJs + "jquery.fileupload.js"); app.import(vendorJs + "jquery.fileupload.js");
app.import(vendorJs + "jquery.autoellipsis-1.0.10.js"); app.import(vendorJs + "jquery.autoellipsis-1.0.10.js");
app.import(vendorJs + "show-html.js");
let adminVendor = funnel(vendorJs, { let adminVendor = funnel(vendorJs, {
files: ["resumable.js"], files: ["resumable.js"],

View File

@ -1,8 +1,16 @@
import { addPretenderCallback } from "discourse/tests/helpers/qunit-helpers"; import { addPretenderCallback } from "discourse/tests/helpers/qunit-helpers";
import componentTest from "discourse/tests/helpers/component-test"; import componentTest from "discourse/tests/helpers/component-test";
import { moduleForComponent } from "ember-qunit"; import { moduleForComponent } from "ember-qunit";
import { warn } from "@ember/debug";
import deprecated from "discourse-common/lib/deprecated";
export function moduleForWidget(name, options = {}) { export function moduleForWidget(name, options = {}) {
warn(
"moduleForWidget will not work in the Ember CLI environment. Please upgrade your tests.",
{ id: "module-for-widget" }
);
return;
let fullName = `widget:${name}`; let fullName = `widget:${name}`;
addPretenderCallback(fullName, options.pretend); addPretenderCallback(fullName, options.pretend);
@ -17,5 +25,6 @@ export function moduleForWidget(name, options = {}) {
} }
export function widgetTest(name, opts) { export function widgetTest(name, opts) {
deprecated("Use `componentTest` instead of `widgetTest`");
return componentTest(name, opts); return componentTest(name, opts);
} }

View File

@ -12,7 +12,7 @@ discourseModule("Integration | Component | slow-mode-info", function (hooks) {
setupRenderingTest(hooks); setupRenderingTest(hooks);
componentTest("doesn't render if the topic is closed", { componentTest("doesn't render if the topic is closed", {
template: "{{slow-mode-info topic=topic}}", template: hbs`{{slow-mode-info topic=topic}}`,
beforeEach() { beforeEach() {
this.set("topic", { slow_mode_seconds: 3600, closed: true }); this.set("topic", { slow_mode_seconds: 3600, closed: true });

View File

@ -6,6 +6,7 @@ import {
import I18n from "I18n"; import I18n from "I18n";
import { clearPopupMenuOptionsCallback } from "discourse/controllers/composer"; import { clearPopupMenuOptionsCallback } from "discourse/controllers/composer";
import selectKit from "discourse/tests/helpers/select-kit-helper"; import selectKit from "discourse/tests/helpers/select-kit-helper";
import { test } from "qunit";
acceptance("Details Button", function (needs) { acceptance("Details Button", function (needs) {
needs.user(); needs.user();

View File

@ -1,4 +1,5 @@
import PrettyText, { buildOptions } from "pretty-text/pretty-text"; import PrettyText, { buildOptions } from "pretty-text/pretty-text";
import { module, test } from "qunit";
module("lib:details-cooked-test"); module("lib:details-cooked-test");

View File

@ -1,4 +1,5 @@
import { acceptance, queryAll } from "discourse/tests/helpers/qunit-helpers"; import { acceptance, queryAll } from "discourse/tests/helpers/qunit-helpers";
import { test } from "qunit";
acceptance("Local Dates - composer", function (needs) { acceptance("Local Dates - composer", function (needs) {
needs.user(); needs.user();

View File

@ -1,4 +1,5 @@
import DateWithZoneHelper from "./date-with-zone-helper"; import DateWithZoneHelper from "./date-with-zone-helper";
import { module, test } from "qunit";
const PARIS = "Europe/Paris"; const PARIS = "Europe/Paris";
const SYDNEY = "Australia/Sydney"; const SYDNEY = "Australia/Sydney";

View File

@ -1,6 +1,7 @@
import I18n from "I18n"; import I18n from "I18n";
import LocalDateBuilder from "./local-date-builder"; import LocalDateBuilder from "./local-date-builder";
import sinon from "sinon"; import sinon from "sinon";
import { module, test } from "qunit";
const UTC = "Etc/UTC"; const UTC = "Etc/UTC";
const SYDNEY = "Australia/Sydney"; const SYDNEY = "Australia/Sydney";

View File

@ -98,7 +98,8 @@ export default Controller.extend(ModalFunctionality, {
@discourseComputed("pollOptions.@each.value") @discourseComputed("pollOptions.@each.value")
pollOptionsCount(pollOptions) { pollOptionsCount(pollOptions) {
return pollOptions.filter((option) => option.value.length > 0).length; return (pollOptions || []).filter((option) => option.value.length > 0)
.length;
}, },
@discourseComputed("site.groups") @discourseComputed("site.groups")

View File

@ -1,10 +1,12 @@
import { import {
acceptance, acceptance,
count, count,
exists,
query, query,
queryAll,
} from "discourse/tests/helpers/qunit-helpers"; } from "discourse/tests/helpers/qunit-helpers";
import { clearPopupMenuOptionsCallback } from "discourse/controllers/composer"; import { clearPopupMenuOptionsCallback } from "discourse/controllers/composer";
import { test } from "qunit";
import { visit } from "@ember/test-helpers";
acceptance("Poll breakdown", function (needs) { acceptance("Poll breakdown", function (needs) {
needs.user(); needs.user();
@ -65,19 +67,14 @@ acceptance("Poll breakdown", function (needs) {
test("Displaying the poll breakdown modal", async function (assert) { test("Displaying the poll breakdown modal", async function (assert) {
await visit("/t/-/topic_with_pie_chart_poll"); await visit("/t/-/topic_with_pie_chart_poll");
assert.equal( assert.ok(
queryAll(".poll-show-breakdown").text(), exists(".poll-show-breakdown"),
"Show breakdown",
"shows the breakdown button when poll_groupable_user_fields is non-empty" "shows the breakdown button when poll_groupable_user_fields is non-empty"
); );
await click(".poll-show-breakdown"); await click(".poll-show-breakdown");
assert.equal( assert.ok(exists(".poll-breakdown-total-votes"), "displays the vote count");
query(".poll-breakdown-total-votes").textContent.trim(),
"2 votes",
"display the correct total vote count"
);
assert.equal( assert.equal(
count(".poll-breakdown-chart-container"), count(".poll-breakdown-chart-container"),

View File

@ -5,6 +5,7 @@ import {
} from "discourse/tests/helpers/qunit-helpers"; } from "discourse/tests/helpers/qunit-helpers";
import { clearPopupMenuOptionsCallback } from "discourse/controllers/composer"; import { clearPopupMenuOptionsCallback } from "discourse/controllers/composer";
import { displayPollBuilderButton } from "discourse/plugins/poll/helpers/display-poll-builder-button"; import { displayPollBuilderButton } from "discourse/plugins/poll/helpers/display-poll-builder-button";
import { test } from "qunit";
acceptance("Poll Builder - polls are disabled", function (needs) { acceptance("Poll Builder - polls are disabled", function (needs) {
needs.user(); needs.user();
@ -20,7 +21,7 @@ acceptance("Poll Builder - polls are disabled", function (needs) {
await displayPollBuilderButton(); await displayPollBuilderButton();
assert.ok( assert.ok(
!exists(".select-kit-row[title='Build Poll']"), !exists(".select-kit-row[data-value='showPollBuilder']"),
"it hides the builder button" "it hides the builder button"
); );
}); });
@ -31,7 +32,7 @@ acceptance("Poll Builder - polls are disabled", function (needs) {
await displayPollBuilderButton(); await displayPollBuilderButton();
assert.ok( assert.ok(
!exists(".select-kit-row[title='Build Poll']"), !exists(".select-kit-row[data-value='showPollBuilder']"),
"it hides the builder button" "it hides the builder button"
); );
}); });
@ -42,7 +43,7 @@ acceptance("Poll Builder - polls are disabled", function (needs) {
await displayPollBuilderButton(); await displayPollBuilderButton();
assert.ok( assert.ok(
!exists(".select-kit-row[title='Build Poll']"), !exists(".select-kit-row[data-value='showPollBuilder']"),
"it hides the builder button" "it hides the builder button"
); );
}); });

View File

@ -5,6 +5,7 @@ import {
} from "discourse/tests/helpers/qunit-helpers"; } from "discourse/tests/helpers/qunit-helpers";
import { clearPopupMenuOptionsCallback } from "discourse/controllers/composer"; import { clearPopupMenuOptionsCallback } from "discourse/controllers/composer";
import { displayPollBuilderButton } from "discourse/plugins/poll/helpers/display-poll-builder-button"; import { displayPollBuilderButton } from "discourse/plugins/poll/helpers/display-poll-builder-button";
import { test } from "qunit";
acceptance("Poll Builder - polls are enabled", function (needs) { acceptance("Poll Builder - polls are enabled", function (needs) {
needs.user(); needs.user();
@ -20,7 +21,7 @@ acceptance("Poll Builder - polls are enabled", function (needs) {
await displayPollBuilderButton(); await displayPollBuilderButton();
assert.ok( assert.ok(
exists(".select-kit-row[title='Build Poll']"), exists(".select-kit-row[data-value='showPollBuilder']"),
"it shows the builder button" "it shows the builder button"
); );
}); });
@ -31,7 +32,7 @@ acceptance("Poll Builder - polls are enabled", function (needs) {
await displayPollBuilderButton(); await displayPollBuilderButton();
assert.ok( assert.ok(
!exists(".select-kit-row[title='Build Poll']"), !exists(".select-kit-row[data-value='showPollBuilder]"),
"it hides the builder button" "it hides the builder button"
); );
}); });
@ -42,7 +43,7 @@ acceptance("Poll Builder - polls are enabled", function (needs) {
await displayPollBuilderButton(); await displayPollBuilderButton();
assert.ok( assert.ok(
exists(".select-kit-row[title='Build Poll']"), exists(".select-kit-row[data-value='showPollBuilder']"),
"it shows the builder button" "it shows the builder button"
); );
}); });

View File

@ -1,5 +1,7 @@
import { acceptance } from "discourse/tests/helpers/qunit-helpers"; import { acceptance, exists } from "discourse/tests/helpers/qunit-helpers";
import { clearPopupMenuOptionsCallback } from "discourse/controllers/composer"; import { clearPopupMenuOptionsCallback } from "discourse/controllers/composer";
import { test } from "qunit";
import { visit } from "@ember/test-helpers";
acceptance("Poll in a post reply history", function (needs) { acceptance("Poll in a post reply history", function (needs) {
needs.user(); needs.user();

View File

@ -3,6 +3,8 @@ import {
query, query,
queryAll, queryAll,
} from "discourse/tests/helpers/qunit-helpers"; } from "discourse/tests/helpers/qunit-helpers";
import { test } from "qunit";
import { visit } from "@ember/test-helpers";
acceptance("Rendering polls with pie charts", function (needs) { acceptance("Rendering polls with pie charts", function (needs) {
needs.user(); needs.user();

View File

@ -1,5 +1,7 @@
import { acceptance, count } from "discourse/tests/helpers/qunit-helpers"; import { acceptance, count } from "discourse/tests/helpers/qunit-helpers";
import { clearPopupMenuOptionsCallback } from "discourse/controllers/composer"; import { clearPopupMenuOptionsCallback } from "discourse/controllers/composer";
import { test } from "qunit";
import { visit } from "@ember/test-helpers";
acceptance("Poll quote", function (needs) { acceptance("Poll quote", function (needs) {
needs.user(); needs.user();

View File

@ -1,5 +1,7 @@
import { acceptance, queryAll } from "discourse/tests/helpers/qunit-helpers"; import { acceptance, queryAll } from "discourse/tests/helpers/qunit-helpers";
import { clearPopupMenuOptionsCallback } from "discourse/controllers/composer"; import { clearPopupMenuOptionsCallback } from "discourse/controllers/composer";
import { test } from "qunit";
import { visit } from "@ember/test-helpers";
acceptance("Rendering polls with bar charts - desktop", function (needs) { acceptance("Rendering polls with bar charts - desktop", function (needs) {
needs.user(); needs.user();

View File

@ -1,5 +1,7 @@
import { acceptance, queryAll } from "discourse/tests/helpers/qunit-helpers"; import { acceptance, queryAll } from "discourse/tests/helpers/qunit-helpers";
import { clearPopupMenuOptionsCallback } from "discourse/controllers/composer"; import { clearPopupMenuOptionsCallback } from "discourse/controllers/composer";
import { test } from "qunit";
import { visit } from "@ember/test-helpers";
acceptance("Rendering polls with bar charts - mobile", function (needs) { acceptance("Rendering polls with bar charts - mobile", function (needs) {
needs.user(); needs.user();

View File

@ -1,214 +1,220 @@
import { controllerModule } from "discourse/tests/helpers/qunit-helpers"; import { discourseModule } from "discourse/tests/helpers/qunit-helpers";
import { import {
MULTIPLE_POLL_TYPE, MULTIPLE_POLL_TYPE,
NUMBER_POLL_TYPE, NUMBER_POLL_TYPE,
REGULAR_POLL_TYPE, REGULAR_POLL_TYPE,
} from "discourse/plugins/poll/controllers/poll-ui-builder"; } from "discourse/plugins/poll/controllers/poll-ui-builder";
import { test } from "qunit";
import { settled } from "@ember/test-helpers";
controllerModule("controller:poll-ui-builder", { function setupController(ctx) {
setupController(controller) { let controller = ctx.getController("poll-ui-builder");
controller.set("toolbarEvent", { getText: () => "" }); controller.set("toolbarEvent", { getText: () => "" });
controller.onShow(); controller.onShow();
}, return controller;
needs: ["controller:modal"], }
});
test("isMultiple", function (assert) { discourseModule("Unit | Controller | poll-ui-builder", function () {
const controller = this.subject(); test("isMultiple", function (assert) {
const controller = setupController(this);
controller.setProperties({ controller.setProperties({
pollType: MULTIPLE_POLL_TYPE, pollType: MULTIPLE_POLL_TYPE,
pollOptions: [{ value: "a" }], pollOptions: [{ value: "a" }],
});
assert.equal(controller.isMultiple, true, "it should be true");
controller.setProperties({
pollType: "random",
pollOptions: [{ value: "b" }],
});
assert.equal(controller.isMultiple, false, "it should be false");
}); });
assert.equal(controller.isMultiple, true, "it should be true"); test("isNumber", function (assert) {
const controller = setupController(this);
controller.setProperties({ controller.set("pollType", REGULAR_POLL_TYPE);
pollType: "random",
pollOptions: [{ value: "b" }], assert.equal(controller.isNumber, false, "it should be false");
controller.set("pollType", NUMBER_POLL_TYPE);
assert.equal(controller.isNumber, true, "it should be true");
}); });
assert.equal(controller.isMultiple, false, "it should be false"); test("pollOptionsCount", function (assert) {
}); const controller = setupController(this);
test("isNumber", function (assert) { controller.set("pollOptions", [{ value: "1" }, { value: "2" }]);
const controller = this.subject();
controller.set("pollType", REGULAR_POLL_TYPE); assert.equal(controller.pollOptionsCount, 2, "it should equal 2");
assert.equal(controller.isNumber, false, "it should be false"); controller.set("pollOptions", []);
controller.set("pollType", NUMBER_POLL_TYPE); assert.equal(controller.pollOptionsCount, 0, "it should equal 0");
assert.equal(controller.isNumber, true, "it should be true");
});
test("pollOptionsCount", function (assert) {
const controller = this.subject();
controller.set("pollOptions", [{ value: "1" }, { value: "2" }]);
assert.equal(controller.pollOptionsCount, 2, "it should equal 2");
controller.set("pollOptions", []);
assert.equal(controller.pollOptionsCount, 0, "it should equal 0");
});
test("disableInsert", function (assert) {
const controller = this.subject();
controller.siteSettings.poll_maximum_options = 20;
assert.equal(controller.disableInsert, true, "it should be true");
controller.set("pollOptions", [{ value: "a" }, { value: "b" }]);
assert.equal(controller.disableInsert, false, "it should be false");
controller.set("pollType", NUMBER_POLL_TYPE);
assert.equal(controller.disableInsert, false, "it should be false");
controller.setProperties({
pollType: REGULAR_POLL_TYPE,
pollOptions: [{ value: "a" }, { value: "b" }, { value: "c" }],
}); });
assert.equal(controller.disableInsert, false, "it should be false"); test("disableInsert", function (assert) {
const controller = setupController(this);
controller.siteSettings.poll_maximum_options = 20;
controller.setProperties({ assert.equal(controller.disableInsert, true, "it should be true");
pollType: REGULAR_POLL_TYPE,
pollOptions: [], controller.set("pollOptions", [{ value: "a" }, { value: "b" }]);
assert.equal(controller.disableInsert, false, "it should be false");
controller.set("pollType", NUMBER_POLL_TYPE);
assert.equal(controller.disableInsert, false, "it should be false");
controller.setProperties({
pollType: REGULAR_POLL_TYPE,
pollOptions: [{ value: "a" }, { value: "b" }, { value: "c" }],
});
assert.equal(controller.disableInsert, false, "it should be false");
controller.setProperties({
pollType: REGULAR_POLL_TYPE,
pollOptions: [],
});
assert.equal(controller.disableInsert, true, "it should be true");
controller.setProperties({
pollType: REGULAR_POLL_TYPE,
pollOptions: [{ value: "w" }],
});
assert.equal(controller.disableInsert, false, "it should be false");
}); });
assert.equal(controller.disableInsert, true, "it should be true"); test("number pollOutput", async function (assert) {
this.siteSettings.poll_maximum_options = 20;
const controller = setupController(this);
controller.setProperties({ controller.setProperties({
pollType: REGULAR_POLL_TYPE, pollType: NUMBER_POLL_TYPE,
pollOptions: [{ value: "w" }], pollMin: 1,
});
await settled();
assert.equal(
controller.pollOutput,
"[poll type=number results=always min=1 max=20 step=1]\n[/poll]\n",
"it should return the right output"
);
controller.set("pollStep", 2);
await settled();
assert.equal(
controller.pollOutput,
"[poll type=number results=always min=1 max=20 step=2]\n[/poll]\n",
"it should return the right output"
);
controller.set("publicPoll", true);
assert.equal(
controller.pollOutput,
"[poll type=number results=always min=1 max=20 step=2 public=true]\n[/poll]\n",
"it should return the right output"
);
controller.set("pollStep", 0);
assert.equal(
controller.pollOutput,
"[poll type=number results=always min=1 max=20 step=1 public=true]\n[/poll]\n",
"it should return the right output"
);
}); });
assert.equal(controller.disableInsert, false, "it should be false"); test("regular pollOutput", function (assert) {
}); const controller = setupController(this);
controller.siteSettings.poll_maximum_options = 20;
test("number pollOutput", function (assert) { controller.setProperties({
const controller = this.subject(); pollOptions: [{ value: "1" }, { value: "2" }],
controller.siteSettings.poll_maximum_options = 20; pollType: REGULAR_POLL_TYPE,
});
controller.setProperties({ assert.equal(
pollType: NUMBER_POLL_TYPE, controller.pollOutput,
pollMin: 1, "[poll type=regular results=always chartType=bar]\n* 1\n* 2\n[/poll]\n",
"it should return the right output"
);
controller.set("publicPoll", "true");
assert.equal(
controller.pollOutput,
"[poll type=regular results=always public=true chartType=bar]\n* 1\n* 2\n[/poll]\n",
"it should return the right output"
);
controller.set("pollGroups", "test");
assert.equal(
controller.get("pollOutput"),
"[poll type=regular results=always public=true chartType=bar groups=test]\n* 1\n* 2\n[/poll]\n",
"it should return the right output"
);
}); });
assert.equal( test("multiple pollOutput", function (assert) {
controller.pollOutput, const controller = setupController(this);
"[poll type=number results=always min=1 max=20 step=1]\n[/poll]\n", controller.siteSettings.poll_maximum_options = 20;
"it should return the right output"
);
controller.set("pollStep", 2); controller.setProperties({
pollType: MULTIPLE_POLL_TYPE,
pollMin: 1,
pollOptions: [{ value: "1" }, { value: "2" }],
});
assert.equal( assert.equal(
controller.pollOutput, controller.pollOutput,
"[poll type=number results=always min=1 max=20 step=2]\n[/poll]\n", "[poll type=multiple results=always min=1 max=2 chartType=bar]\n* 1\n* 2\n[/poll]\n",
"it should return the right output" "it should return the right output"
); );
controller.set("publicPoll", true); controller.set("publicPoll", "true");
assert.equal( assert.equal(
controller.pollOutput, controller.pollOutput,
"[poll type=number results=always min=1 max=20 step=2 public=true]\n[/poll]\n", "[poll type=multiple results=always min=1 max=2 public=true chartType=bar]\n* 1\n* 2\n[/poll]\n",
"it should return the right output" "it should return the right output"
); );
controller.set("pollStep", 0);
assert.equal(
controller.pollOutput,
"[poll type=number results=always min=1 max=20 step=1 public=true]\n[/poll]\n",
"it should return the right output"
);
});
test("regular pollOutput", function (assert) {
const controller = this.subject();
controller.siteSettings.poll_maximum_options = 20;
controller.setProperties({
pollOptions: [{ value: "1" }, { value: "2" }],
pollType: REGULAR_POLL_TYPE,
}); });
assert.equal( test("staff_only option is not present for non-staff", async function (assert) {
controller.pollOutput, const controller = setupController(this);
"[poll type=regular results=always chartType=bar]\n* 1\n* 2\n[/poll]\n", controller.currentUser = { staff: false };
"it should return the right output" controller.notifyPropertyChange("pollResults");
);
controller.set("publicPoll", "true"); assert.ok(
controller.pollResults.filterBy("value", "staff_only").length === 0,
assert.equal( "staff_only is not present"
controller.pollOutput, );
"[poll type=regular results=always public=true chartType=bar]\n* 1\n* 2\n[/poll]\n",
"it should return the right output"
);
controller.set("pollGroups", "test");
assert.equal(
controller.get("pollOutput"),
"[poll type=regular results=always public=true chartType=bar groups=test]\n* 1\n* 2\n[/poll]\n",
"it should return the right output"
);
});
test("multiple pollOutput", function (assert) {
const controller = this.subject();
controller.siteSettings.poll_maximum_options = 20;
controller.setProperties({
pollType: MULTIPLE_POLL_TYPE,
pollMin: 1,
pollOptions: [{ value: "1" }, { value: "2" }],
}); });
assert.equal( test("poll result is always by default", function (assert) {
controller.pollOutput, const controller = setupController(this);
"[poll type=multiple results=always min=1 max=2 chartType=bar]\n* 1\n* 2\n[/poll]\n", assert.equal(controller.pollResult, "always");
"it should return the right output" });
);
controller.set("publicPoll", "true"); test("staff_only option is present for staff", async function (assert) {
const controller = setupController(this);
controller.currentUser = { staff: true };
controller.notifyPropertyChange("pollResults");
assert.equal( assert.ok(
controller.pollOutput, controller.pollResults.filterBy("value", "staff_only").length === 1,
"[poll type=multiple results=always min=1 max=2 public=true chartType=bar]\n* 1\n* 2\n[/poll]\n", "staff_only is present"
"it should return the right output" );
); });
});
test("staff_only option is not present for non-staff", function (assert) {
const controller = this.subject();
controller.currentUser = { staff: false };
assert.ok(
controller.pollResults.filterBy("value", "staff_only").length === 0,
"staff_only is not present"
);
});
test("poll result is always by default", function (assert) {
const controller = this.subject();
assert.equal(controller.pollResult, "always");
});
test("staff_only option is present for staff", function (assert) {
const controller = this.subject();
controller.currentUser = { staff: true };
assert.ok(
controller.pollResults.filterBy("value", "staff_only").length === 1,
"staff_only is present"
);
}); });

View File

@ -1,4 +1,5 @@
import selectKit from "discourse/tests/helpers/select-kit-helper"; import selectKit from "discourse/tests/helpers/select-kit-helper";
import { click, visit } from "@ember/test-helpers";
export async function displayPollBuilderButton() { export async function displayPollBuilderButton() {
await visit("/"); await visit("/");

View File

@ -1,71 +1,81 @@
import componentTest, {
setupRenderingTest,
} from "discourse/tests/helpers/component-test";
import { import {
moduleForWidget, discourseModule,
widgetTest, queryAll,
} from "discourse/tests/helpers/widget-test"; } from "discourse/tests/helpers/qunit-helpers";
import { queryAll } from "discourse/tests/helpers/qunit-helpers";
moduleForWidget("discourse-poll-option"); discourseModule(
"Integration | Component | Widget | discourse-poll-option",
const template = `{{mount-widget function (hooks) {
setupRenderingTest(hooks);
const template = `{{mount-widget
widget="discourse-poll-option" widget="discourse-poll-option"
args=(hash option=option isMultiple=isMultiple vote=vote)}}`; args=(hash option=option isMultiple=isMultiple vote=vote)}}`;
widgetTest("single, not selected", { componentTest("single, not selected", {
template, template,
beforeEach() { beforeEach() {
this.set("option", { id: "opt-id" }); this.set("option", { id: "opt-id" });
this.set("vote", []); this.set("vote", []);
}, },
test(assert) { test(assert) {
assert.ok(queryAll("li .d-icon-far-circle:nth-of-type(1)").length === 1); assert.ok(
}, queryAll("li .d-icon-far-circle:nth-of-type(1)").length === 1
}); );
},
widgetTest("single, selected", {
template,
beforeEach() {
this.set("option", { id: "opt-id" });
this.set("vote", ["opt-id"]);
},
test(assert) {
assert.ok(queryAll("li .d-icon-circle:nth-of-type(1)").length === 1);
},
});
widgetTest("multi, not selected", {
template,
beforeEach() {
this.setProperties({
option: { id: "opt-id" },
isMultiple: true,
vote: [],
}); });
},
test(assert) { componentTest("single, selected", {
assert.ok(queryAll("li .d-icon-far-square:nth-of-type(1)").length === 1); template,
},
});
widgetTest("multi, selected", { beforeEach() {
template, this.set("option", { id: "opt-id" });
this.set("vote", ["opt-id"]);
},
beforeEach() { test(assert) {
this.setProperties({ assert.ok(queryAll("li .d-icon-circle:nth-of-type(1)").length === 1);
option: { id: "opt-id" }, },
isMultiple: true,
vote: ["opt-id"],
}); });
},
test(assert) { componentTest("multi, not selected", {
assert.ok( template,
queryAll("li .d-icon-far-check-square:nth-of-type(1)").length === 1
); beforeEach() {
}, this.setProperties({
}); option: { id: "opt-id" },
isMultiple: true,
vote: [],
});
},
test(assert) {
assert.ok(
queryAll("li .d-icon-far-square:nth-of-type(1)").length === 1
);
},
});
componentTest("multi, selected", {
template,
beforeEach() {
this.setProperties({
option: { id: "opt-id" },
isMultiple: true,
vote: ["opt-id"],
});
},
test(assert) {
assert.ok(
queryAll("li .d-icon-far-check-square:nth-of-type(1)").length === 1
);
},
});
}
);

View File

@ -1,90 +1,97 @@
import { import componentTest, {
moduleForWidget, setupRenderingTest,
widgetTest, } from "discourse/tests/helpers/component-test";
} from "discourse/tests/helpers/widget-test";
import EmberObject from "@ember/object"; import EmberObject from "@ember/object";
import { queryAll } from "discourse/tests/helpers/qunit-helpers"; import {
discourseModule,
queryAll,
} from "discourse/tests/helpers/qunit-helpers";
moduleForWidget("discourse-poll-standard-results"); discourseModule(
"Integration | Component | Widget | discourse-poll-standard-results",
function (hooks) {
setupRenderingTest(hooks);
const template = `{{mount-widget const template = `{{mount-widget
widget="discourse-poll-standard-results" widget="discourse-poll-standard-results"
args=(hash poll=poll isMultiple=isMultiple)}}`; args=(hash poll=poll isMultiple=isMultiple)}}`;
widgetTest("options in descending order", { componentTest("options in descending order", {
template, template,
beforeEach() { beforeEach() {
this.set( this.set(
"poll", "poll",
EmberObject.create({ EmberObject.create({
options: [{ votes: 5 }, { votes: 4 }], options: [{ votes: 5 }, { votes: 4 }],
voters: 9, voters: 9,
}) })
); );
}, },
test(assert) { test(assert) {
assert.equal(queryAll(".option .percentage")[0].innerText, "56%"); assert.equal(queryAll(".option .percentage")[0].innerText, "56%");
assert.equal(queryAll(".option .percentage")[1].innerText, "44%"); assert.equal(queryAll(".option .percentage")[1].innerText, "44%");
}, },
}); });
widgetTest("options in ascending order", { componentTest("options in ascending order", {
template, template,
beforeEach() { beforeEach() {
this.set( this.set(
"poll", "poll",
EmberObject.create({ EmberObject.create({
options: [{ votes: 4 }, { votes: 5 }], options: [{ votes: 4 }, { votes: 5 }],
voters: 9, voters: 9,
}) })
); );
}, },
test(assert) { test(assert) {
assert.equal(queryAll(".option .percentage")[0].innerText, "56%"); assert.equal(queryAll(".option .percentage")[0].innerText, "56%");
assert.equal(queryAll(".option .percentage")[1].innerText, "44%"); assert.equal(queryAll(".option .percentage")[1].innerText, "44%");
}, },
}); });
widgetTest("multiple options in descending order", { componentTest("multiple options in descending order", {
template, template,
beforeEach() { beforeEach() {
this.set("isMultiple", true); this.set("isMultiple", true);
this.set( this.set(
"poll", "poll",
EmberObject.create({ EmberObject.create({
type: "multiple", type: "multiple",
options: [ options: [
{ votes: 5, html: "a" }, { votes: 5, html: "a" },
{ votes: 2, html: "b" }, { votes: 2, html: "b" },
{ votes: 4, html: "c" }, { votes: 4, html: "c" },
{ votes: 1, html: "b" }, { votes: 1, html: "b" },
{ votes: 1, html: "a" }, { votes: 1, html: "a" },
], ],
voters: 12, voters: 12,
}) })
); );
}, },
test(assert) { test(assert) {
let percentages = queryAll(".option .percentage"); let percentages = queryAll(".option .percentage");
assert.equal(percentages[0].innerText, "41%"); assert.equal(percentages[0].innerText, "41%");
assert.equal(percentages[1].innerText, "33%"); assert.equal(percentages[1].innerText, "33%");
assert.equal(percentages[2].innerText, "16%"); assert.equal(percentages[2].innerText, "16%");
assert.equal(percentages[3].innerText, "8%"); assert.equal(percentages[3].innerText, "8%");
assert.equal( assert.equal(
queryAll(".option")[3].querySelectorAll("span")[1].innerText, queryAll(".option")[3].querySelectorAll("span")[1].innerText,
"a" "a"
); );
assert.equal(percentages[4].innerText, "8%"); assert.equal(percentages[4].innerText, "8%");
assert.equal( assert.equal(
queryAll(".option")[4].querySelectorAll("span")[1].innerText, queryAll(".option")[4].querySelectorAll("span")[1].innerText,
"b" "b"
); );
}, },
}); });
}
);

View File

@ -1,16 +1,23 @@
import { import {
moduleForWidget, discourseModule,
widgetTest, exists,
} from "discourse/tests/helpers/widget-test"; queryAll,
} from "discourse/tests/helpers/qunit-helpers";
import componentTest, {
setupRenderingTest,
} from "discourse/tests/helpers/component-test";
import EmberObject from "@ember/object"; import EmberObject from "@ember/object";
import I18n from "I18n"; import I18n from "I18n";
import { count, exists, queryAll } from "discourse/tests/helpers/qunit-helpers"; import pretender from "discourse/tests/helpers/create-pretender";
let requests = 0; let requests = 0;
moduleForWidget("discourse-poll", { discourseModule(
pretend(server) { "Integration | Component | Widget | discourse-poll",
server.put("/polls/vote", () => { function (hooks) {
setupRenderingTest(hooks);
pretender.put("/polls/vote", () => {
++requests; ++requests;
return [ return [
200, 200,
@ -22,8 +29,16 @@ moduleForWidget("discourse-poll", {
status: "open", status: "open",
results: "always", results: "always",
options: [ options: [
{ id: "1f972d1df351de3ce35a787c89faad29", html: "yes", votes: 1 }, {
{ id: "d7ebc3a9beea2e680815a1e4f57d6db6", html: "no", votes: 0 }, id: "1f972d1df351de3ce35a787c89faad29",
html: "yes",
votes: 1,
},
{
id: "d7ebc3a9beea2e680815a1e4f57d6db6",
html: "no",
votes: 0,
},
], ],
voters: 1, voters: 1,
chart_type: "bar", chart_type: "bar",
@ -33,7 +48,7 @@ moduleForWidget("discourse-poll", {
]; ];
}); });
server.put("/polls/vote", () => { pretender.put("/polls/vote", () => {
++requests; ++requests;
return [ return [
200, 200,
@ -45,8 +60,16 @@ moduleForWidget("discourse-poll", {
status: "open", status: "open",
results: "always", results: "always",
options: [ options: [
{ id: "1f972d1df351de3ce35a787c89faad29", html: "yes", votes: 1 }, {
{ id: "d7ebc3a9beea2e680815a1e4f57d6db6", html: "no", votes: 0 }, id: "1f972d1df351de3ce35a787c89faad29",
html: "yes",
votes: 1,
},
{
id: "d7ebc3a9beea2e680815a1e4f57d6db6",
html: "no",
votes: 0,
},
], ],
voters: 1, voters: 1,
chart_type: "bar", chart_type: "bar",
@ -56,10 +79,8 @@ moduleForWidget("discourse-poll", {
}, },
]; ];
}); });
},
});
const template = `{{mount-widget const template = `{{mount-widget
widget="discourse-poll" widget="discourse-poll"
args=(hash id=id args=(hash id=id
post=post post=post
@ -67,91 +88,97 @@ const template = `{{mount-widget
vote=vote vote=vote
groupableUserFields=groupableUserFields)}}`; groupableUserFields=groupableUserFields)}}`;
widgetTest("can vote", { componentTest("can vote", {
template, template,
beforeEach() { beforeEach() {
this.setProperties({ this.setProperties({
post: EmberObject.create({ post: EmberObject.create({
id: 42, id: 42,
topic: { topic: {
archived: false, archived: false,
}, },
}), }),
poll: EmberObject.create({ poll: EmberObject.create({
name: "poll", name: "poll",
type: "regular", type: "regular",
status: "open", status: "open",
results: "always", results: "always",
options: [ options: [
{ id: "1f972d1df351de3ce35a787c89faad29", html: "yes", votes: 0 }, { id: "1f972d1df351de3ce35a787c89faad29", html: "yes", votes: 0 },
{ id: "d7ebc3a9beea2e680815a1e4f57d6db6", html: "no", votes: 0 }, { id: "d7ebc3a9beea2e680815a1e4f57d6db6", html: "no", votes: 0 },
], ],
voters: 0, voters: 0,
chart_type: "bar", chart_type: "bar",
}), }),
vote: [], vote: [],
groupableUserFields: [], groupableUserFields: [],
});
},
async test(assert) {
requests = 0;
await click(
"li[data-poll-option-id='1f972d1df351de3ce35a787c89faad29']"
);
assert.equal(requests, 1);
assert.equal(count(".chosen"), 1);
assert.equal(queryAll(".chosen").text(), "100%yes");
assert.equal(queryAll(".toggle-results").text(), "Show vote");
await click(".toggle-results");
assert.equal(
queryAll("li[data-poll-option-id='1f972d1df351de3ce35a787c89faad29']")
.length,
1
);
assert.equal(queryAll(".toggle-results").text(), "Show results");
},
}); });
},
async test(assert) { componentTest("cannot vote if not member of the right group", {
requests = 0; template,
await click("li[data-poll-option-id='1f972d1df351de3ce35a787c89faad29']"); beforeEach() {
assert.equal(requests, 1); this.setProperties({
assert.equal(count(".chosen"), 1); post: EmberObject.create({
assert.equal(queryAll(".chosen").text(), "100%yes"); id: 42,
assert.equal(queryAll(".toggle-results").text(), "Show vote"); topic: {
archived: false,
},
}),
poll: EmberObject.create({
name: "poll",
type: "regular",
status: "open",
results: "always",
options: [
{ id: "1f972d1df351de3ce35a787c89faad29", html: "yes", votes: 0 },
{ id: "d7ebc3a9beea2e680815a1e4f57d6db6", html: "no", votes: 0 },
],
voters: 0,
chart_type: "bar",
groups: "foo",
}),
vote: [],
groupableUserFields: [],
});
},
await click(".toggle-results"); async test(assert) {
assert.equal( requests = 0;
queryAll("li[data-poll-option-id='1f972d1df351de3ce35a787c89faad29']")
.length,
1
);
assert.equal(queryAll(".toggle-results").text(), "Show results");
},
});
widgetTest("cannot vote if not member of the right group", { await click(
template, "li[data-poll-option-id='1f972d1df351de3ce35a787c89faad29']"
);
beforeEach() { assert.equal(
this.setProperties({ queryAll(".poll-container .alert").text(),
post: EmberObject.create({ I18n.t("poll.results.groups.title", { groups: "foo" })
id: 42, );
topic: { assert.equal(requests, 0);
archived: false, assert.ok(!exists(".chosen"));
}, },
}),
poll: EmberObject.create({
name: "poll",
type: "regular",
status: "open",
results: "always",
options: [
{ id: "1f972d1df351de3ce35a787c89faad29", html: "yes", votes: 0 },
{ id: "d7ebc3a9beea2e680815a1e4f57d6db6", html: "no", votes: 0 },
],
voters: 0,
chart_type: "bar",
groups: "foo",
}),
vote: [],
groupableUserFields: [],
}); });
}, }
);
async test(assert) {
requests = 0;
await click("li[data-poll-option-id='1f972d1df351de3ce35a787c89faad29']");
assert.equal(
queryAll(".poll-container .alert").text(),
I18n.t("poll.results.groups.title", { groups: "foo" })
);
assert.equal(requests, 0);
assert.ok(!exists(".chosen"));
},
});