2019-11-01 01:37:24 +08:00
|
|
|
import { isEmpty } from "@ember/utils";
|
2019-10-30 21:48:24 +08:00
|
|
|
import { later } from "@ember/runloop";
|
2017-11-02 03:08:18 +08:00
|
|
|
/* global QUnit, resetSite */
|
2014-09-27 02:48:34 +08:00
|
|
|
|
2015-04-02 02:18:46 +08:00
|
|
|
import sessionFixtures from "fixtures/session-fixtures";
|
2016-04-15 03:23:05 +08:00
|
|
|
import HeaderComponent from "discourse/components/site-header";
|
2016-05-06 00:49:12 +08:00
|
|
|
import { forceMobile, resetMobile } from "discourse/lib/mobile";
|
2016-11-23 04:36:18 +08:00
|
|
|
import { resetPluginApi } from "discourse/lib/plugin-api";
|
2016-12-20 00:19:10 +08:00
|
|
|
import {
|
|
|
|
clearCache as clearOutletCache,
|
|
|
|
resetExtraClasses
|
|
|
|
} from "discourse/lib/plugin-connectors";
|
2016-11-24 01:57:50 +08:00
|
|
|
import { clearHTMLCache } from "discourse/helpers/custom-html";
|
2016-12-20 00:19:10 +08:00
|
|
|
import { flushMap } from "discourse/models/store";
|
2017-03-28 03:34:54 +08:00
|
|
|
import { clearRewrites } from "discourse/lib/url";
|
2017-12-20 11:04:23 +08:00
|
|
|
import { initSearchData } from "discourse/widgets/search-menu";
|
2018-03-12 19:46:41 +08:00
|
|
|
import { resetDecorators } from "discourse/widgets/widget";
|
2019-06-12 23:49:02 +08:00
|
|
|
import { resetWidgetCleanCallbacks } from "discourse/components/mount-widget";
|
2020-03-27 23:50:31 +08:00
|
|
|
import { resetTopicTitleDecorators } from "discourse/components/topic-title";
|
2019-06-11 16:02:10 +08:00
|
|
|
import { resetDecorators as resetPostCookedDecorators } from "discourse/widgets/post-cooked";
|
2020-02-14 06:44:34 +08:00
|
|
|
import { resetDecorators as resetPluginOutletDecorators } from "discourse/components/plugin-connector";
|
2020-05-26 01:09:55 +08:00
|
|
|
import { resetUsernameDecorators } from "discourse/helpers/decorate-username-selector";
|
2018-11-27 16:00:31 +08:00
|
|
|
import { resetCache as resetOneboxCache } from "pretty-text/oneboxer";
|
2018-05-24 13:28:54 +08:00
|
|
|
import { resetCustomPostMessageCallbacks } from "discourse/controllers/topic";
|
2020-07-10 00:58:23 +08:00
|
|
|
import { _clearSnapshots } from "select-kit/components/composer-actions";
|
2019-11-14 01:35:19 +08:00
|
|
|
import User from "discourse/models/user";
|
2020-07-10 03:54:53 +08:00
|
|
|
import { mapRoutes } from "discourse/mapping-router";
|
2020-07-15 01:07:54 +08:00
|
|
|
import { currentSettings, mergeSettings } from "helpers/site-settings";
|
2020-07-29 01:07:33 +08:00
|
|
|
import { getOwner } from "discourse-common/lib/get-owner";
|
2020-07-31 09:23:12 +08:00
|
|
|
import { setTopicList } from "discourse/lib/topic-list-tracker";
|
2016-12-20 00:19:10 +08:00
|
|
|
|
2017-09-13 23:54:49 +08:00
|
|
|
export function currentUser() {
|
2019-11-14 01:35:19 +08:00
|
|
|
return User.create(sessionFixtures["/session/current.json"].current_user);
|
2015-04-02 02:18:46 +08:00
|
|
|
}
|
|
|
|
|
2019-06-14 20:54:20 +08:00
|
|
|
export function updateCurrentUser(properties) {
|
2019-11-14 01:35:19 +08:00
|
|
|
User.current().setProperties(properties);
|
2018-04-06 11:36:57 +08:00
|
|
|
}
|
|
|
|
|
2019-06-14 20:54:20 +08:00
|
|
|
// Note: do not use this in acceptance tests. Use `loggedIn: true` instead
|
2017-09-13 23:54:49 +08:00
|
|
|
export function logIn() {
|
2019-11-14 01:35:19 +08:00
|
|
|
User.resetCurrent(currentUser());
|
2015-04-02 02:18:46 +08:00
|
|
|
}
|
|
|
|
|
2020-04-30 12:58:26 +08:00
|
|
|
// Note: Only use if `loggedIn: true` has been used in an acceptance test
|
|
|
|
export function loggedInUser() {
|
|
|
|
return User.current();
|
|
|
|
}
|
|
|
|
|
2020-05-13 13:16:07 +08:00
|
|
|
export function fakeTime(timeString, timezone = null, advanceTime = false) {
|
2020-05-07 07:10:32 +08:00
|
|
|
let now = moment.tz(timeString, timezone);
|
2020-05-13 13:16:07 +08:00
|
|
|
return sandbox.useFakeTimers({
|
|
|
|
now: now.valueOf(),
|
|
|
|
shouldAdvanceTime: advanceTime
|
|
|
|
});
|
2020-05-07 07:10:32 +08:00
|
|
|
}
|
|
|
|
|
2020-05-13 13:16:07 +08:00
|
|
|
export async function acceptanceUseFakeClock(
|
|
|
|
timeString,
|
|
|
|
callback,
|
|
|
|
timezone = null
|
|
|
|
) {
|
|
|
|
if (!timezone) {
|
|
|
|
let user = loggedInUser();
|
|
|
|
if (user) {
|
|
|
|
timezone = user.resolvedTimezone(user);
|
|
|
|
} else {
|
|
|
|
timezone = "America/Denver";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
let clock = fakeTime(timeString, timezone, true);
|
|
|
|
await callback();
|
|
|
|
clock.reset();
|
2020-05-07 07:10:32 +08:00
|
|
|
}
|
|
|
|
|
2015-04-02 02:18:46 +08:00
|
|
|
const Plugin = $.fn.modal;
|
|
|
|
const Modal = Plugin.Constructor;
|
|
|
|
|
|
|
|
function AcceptanceModal(option, _relatedTarget) {
|
|
|
|
return this.each(function() {
|
|
|
|
var $this = $(this);
|
|
|
|
var data = $this.data("bs.modal");
|
|
|
|
var options = $.extend(
|
|
|
|
{},
|
|
|
|
Modal.DEFAULTS,
|
|
|
|
$this.data(),
|
|
|
|
typeof option === "object" && option
|
|
|
|
);
|
2018-06-15 23:03:24 +08:00
|
|
|
|
2015-04-02 02:18:46 +08:00
|
|
|
if (!data) $this.data("bs.modal", (data = new Modal(this, options)));
|
|
|
|
data.$body = $("#ember-testing");
|
2018-06-15 23:03:24 +08:00
|
|
|
|
2015-04-02 02:18:46 +08:00
|
|
|
if (typeof option === "string") data[option](_relatedTarget);
|
|
|
|
else if (options.show) data.show(_relatedTarget);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
window.bootbox.$body = $("#ember-testing");
|
|
|
|
$.fn.modal = AcceptanceModal;
|
|
|
|
|
2019-05-28 10:40:27 +08:00
|
|
|
let _pretenderCallbacks = {};
|
2017-09-13 23:54:49 +08:00
|
|
|
|
2019-05-28 10:40:27 +08:00
|
|
|
export function applyPretender(name, server, helper) {
|
|
|
|
const cb = _pretenderCallbacks[name];
|
|
|
|
if (cb) cb(server, helper);
|
2017-09-13 23:54:49 +08:00
|
|
|
}
|
|
|
|
|
2020-07-10 03:54:53 +08:00
|
|
|
export function controllerModule(name, args = {}) {
|
|
|
|
moduleFor(name, name, {
|
|
|
|
setup() {
|
|
|
|
this.registry.register("router:main", mapRoutes());
|
|
|
|
let controller = this.subject();
|
2020-07-15 01:07:54 +08:00
|
|
|
controller.siteSettings = currentSettings();
|
2020-07-10 03:54:53 +08:00
|
|
|
if (args.setupController) {
|
|
|
|
args.setupController(controller);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
needs: args.needs
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
export function discourseModule(name, hooks) {
|
|
|
|
QUnit.module(name, {
|
|
|
|
beforeEach() {
|
2020-07-29 01:07:33 +08:00
|
|
|
this.container = getOwner(this);
|
2020-07-15 01:07:54 +08:00
|
|
|
this.siteSettings = currentSettings();
|
2020-07-10 03:54:53 +08:00
|
|
|
if (hooks && hooks.beforeEach) {
|
|
|
|
hooks.beforeEach.call(this);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
afterEach() {
|
|
|
|
if (hooks && hooks.afterEach) {
|
|
|
|
hooks.afterEach.call(this);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2017-09-13 23:54:49 +08:00
|
|
|
export function acceptance(name, options) {
|
|
|
|
options = options || {};
|
|
|
|
|
|
|
|
if (options.pretend) {
|
2019-05-28 10:40:27 +08:00
|
|
|
_pretenderCallbacks[name] = options.pretend;
|
2017-09-13 23:54:49 +08:00
|
|
|
}
|
|
|
|
|
2017-07-06 02:14:30 +08:00
|
|
|
QUnit.module("Acceptance: " + name, {
|
2017-06-15 01:57:58 +08:00
|
|
|
beforeEach() {
|
2016-05-06 00:49:12 +08:00
|
|
|
resetMobile();
|
|
|
|
|
2015-04-02 02:18:46 +08:00
|
|
|
// For now don't do scrolling stuff in Test Mode
|
2017-06-14 03:59:48 +08:00
|
|
|
HeaderComponent.reopen({ examineDockHeader: function() {} });
|
2015-04-02 02:18:46 +08:00
|
|
|
|
2016-12-20 00:19:10 +08:00
|
|
|
resetExtraClasses();
|
2017-09-13 23:54:49 +08:00
|
|
|
if (options.mobileView) {
|
|
|
|
forceMobile();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (options.loggedIn) {
|
|
|
|
logIn();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (options.settings) {
|
2020-07-15 01:07:54 +08:00
|
|
|
mergeSettings(options.settings);
|
2017-09-13 23:54:49 +08:00
|
|
|
}
|
2020-07-15 01:07:54 +08:00
|
|
|
this.siteSettings = currentSettings();
|
2017-09-13 23:54:49 +08:00
|
|
|
|
|
|
|
if (options.site) {
|
2020-07-15 01:07:54 +08:00
|
|
|
resetSite(currentSettings(), options.site);
|
2014-08-01 01:24:07 +08:00
|
|
|
}
|
2014-09-27 02:48:34 +08:00
|
|
|
|
2016-11-24 01:57:50 +08:00
|
|
|
clearOutletCache();
|
|
|
|
clearHTMLCache();
|
2016-11-23 23:41:21 +08:00
|
|
|
resetPluginApi();
|
2014-07-31 06:56:01 +08:00
|
|
|
Discourse.reset();
|
2020-07-29 01:07:33 +08:00
|
|
|
this.container = getOwner(this);
|
|
|
|
if (options.beforeEach) {
|
|
|
|
options.beforeEach.call(this);
|
|
|
|
}
|
2013-06-21 01:58:54 +08:00
|
|
|
},
|
|
|
|
|
2017-06-15 01:57:58 +08:00
|
|
|
afterEach() {
|
|
|
|
if (options && options.afterEach) {
|
|
|
|
options.afterEach.call(this);
|
2013-11-06 00:42:37 +08:00
|
|
|
}
|
2016-12-20 00:19:10 +08:00
|
|
|
flushMap();
|
2017-11-03 06:38:51 +08:00
|
|
|
localStorage.clear();
|
2019-11-14 01:35:19 +08:00
|
|
|
User.resetCurrent();
|
2020-07-15 01:07:54 +08:00
|
|
|
resetSite(currentSettings());
|
2016-12-20 00:19:10 +08:00
|
|
|
resetExtraClasses();
|
2016-11-24 01:57:50 +08:00
|
|
|
clearOutletCache();
|
|
|
|
clearHTMLCache();
|
2016-11-23 04:36:18 +08:00
|
|
|
resetPluginApi();
|
2017-03-28 03:34:54 +08:00
|
|
|
clearRewrites();
|
2017-12-20 11:04:23 +08:00
|
|
|
initSearchData();
|
2018-03-12 19:46:41 +08:00
|
|
|
resetDecorators();
|
2019-06-11 16:02:10 +08:00
|
|
|
resetPostCookedDecorators();
|
2020-02-14 06:44:34 +08:00
|
|
|
resetPluginOutletDecorators();
|
2020-03-27 23:50:31 +08:00
|
|
|
resetTopicTitleDecorators();
|
2020-05-26 01:09:55 +08:00
|
|
|
resetUsernameDecorators();
|
2018-11-27 16:00:31 +08:00
|
|
|
resetOneboxCache();
|
2018-05-24 13:28:54 +08:00
|
|
|
resetCustomPostMessageCallbacks();
|
2020-07-31 09:23:12 +08:00
|
|
|
setTopicList(null);
|
2020-07-10 00:58:23 +08:00
|
|
|
_clearSnapshots();
|
2020-07-29 01:07:33 +08:00
|
|
|
Discourse._runInitializer(
|
|
|
|
"instanceInitializers",
|
|
|
|
(initName, initializer) => {
|
|
|
|
if (initializer && initializer.teardown) {
|
|
|
|
initializer.teardown(this.container);
|
|
|
|
}
|
2019-06-14 20:54:20 +08:00
|
|
|
}
|
2020-07-29 01:07:33 +08:00
|
|
|
);
|
2013-06-21 01:58:54 +08:00
|
|
|
Discourse.reset();
|
2019-06-15 01:29:13 +08:00
|
|
|
|
|
|
|
// We do this after reset so that the willClearRender will have already fired
|
|
|
|
resetWidgetCleanCallbacks();
|
2013-06-21 01:58:54 +08:00
|
|
|
}
|
|
|
|
});
|
2013-06-21 05:20:08 +08:00
|
|
|
}
|
|
|
|
|
2017-09-13 23:54:49 +08:00
|
|
|
export function controllerFor(controller, model) {
|
2020-07-29 01:07:33 +08:00
|
|
|
controller = getOwner(this).lookup("controller:" + controller);
|
2013-06-21 05:20:08 +08:00
|
|
|
if (model) {
|
|
|
|
controller.set("model", model);
|
|
|
|
}
|
|
|
|
return controller;
|
2013-07-16 07:47:13 +08:00
|
|
|
}
|
|
|
|
|
2017-09-13 23:54:49 +08:00
|
|
|
export function fixture(selector) {
|
2013-11-08 02:46:38 +08:00
|
|
|
if (selector) {
|
|
|
|
return $("#qunit-fixture").find(selector);
|
|
|
|
}
|
|
|
|
return $("#qunit-fixture");
|
|
|
|
}
|
2015-02-07 02:25:48 +08:00
|
|
|
|
2017-06-15 01:57:58 +08:00
|
|
|
QUnit.assert.not = function(actual, message) {
|
|
|
|
this.pushResult({
|
|
|
|
result: !actual,
|
|
|
|
actual,
|
|
|
|
expected: !actual,
|
|
|
|
message
|
|
|
|
});
|
|
|
|
};
|
2015-08-12 00:27:07 +08:00
|
|
|
|
2017-06-15 01:57:58 +08:00
|
|
|
QUnit.assert.blank = function(actual, message) {
|
|
|
|
this.pushResult({
|
2019-11-01 01:37:24 +08:00
|
|
|
result: isEmpty(actual),
|
2017-06-15 01:57:58 +08:00
|
|
|
actual,
|
|
|
|
message
|
|
|
|
});
|
|
|
|
};
|
2015-08-12 00:27:07 +08:00
|
|
|
|
2017-06-15 01:57:58 +08:00
|
|
|
QUnit.assert.present = function(actual, message) {
|
|
|
|
this.pushResult({
|
2019-11-01 01:37:24 +08:00
|
|
|
result: !isEmpty(actual),
|
2017-06-15 01:57:58 +08:00
|
|
|
actual,
|
|
|
|
message
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
QUnit.assert.containsInstance = function(collection, klass, message) {
|
|
|
|
const result = klass.detectInstance(_.first(collection));
|
|
|
|
this.pushResult({
|
|
|
|
result,
|
|
|
|
message
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2017-09-13 23:54:49 +08:00
|
|
|
export function waitFor(assert, callback, timeout) {
|
2016-10-07 03:18:05 +08:00
|
|
|
timeout = timeout || 500;
|
2017-06-15 01:57:58 +08:00
|
|
|
|
|
|
|
const done = assert.async();
|
2019-10-30 21:48:24 +08:00
|
|
|
later(() => {
|
2016-10-07 03:18:05 +08:00
|
|
|
callback();
|
2017-06-15 01:57:58 +08:00
|
|
|
done();
|
2016-10-07 03:18:05 +08:00
|
|
|
}, timeout);
|
|
|
|
}
|