This repository has been archived on 2023-03-18. You can view files and clone it, but cannot push or open issues or pull requests.
osr-discourse-src/app/assets/javascripts/discourse/tests/helpers/component-test.js
2021-11-13 13:10:13 +01:00

142 lines
4.2 KiB
JavaScript

import { TestModuleForComponent, render } from "@ember/test-helpers";
import MessageBus from "message-bus-client";
import EmberObject from "@ember/object";
import { setupRenderingTest as EmberSetupRenderingTest } from "ember-qunit";
import Session from "discourse/models/session";
import Site from "discourse/models/site";
import TopicTrackingState from "discourse/models/topic-tracking-state";
import User from "discourse/models/user";
import { autoLoadModules } from "discourse/initializers/auto-load-modules";
import createStore from "discourse/tests/helpers/create-store";
import { currentSettings } from "discourse/tests/helpers/site-settings";
import QUnit, { test } from "qunit";
const LEGACY_ENV = !EmberSetupRenderingTest;
export function setupRenderingTest(hooks) {
if (!LEGACY_ENV) {
return EmberSetupRenderingTest.apply(this, arguments);
}
let testModule;
hooks.before(function () {
const name = this.moduleName.split("|").pop();
testModule = new TestModuleForComponent(name, {
integration: true,
});
});
hooks.beforeEach(function () {
testModule.setContext(this);
return testModule.setup(...arguments);
});
hooks.afterEach(function () {
return testModule.teardown(...arguments);
});
hooks.after(function () {
testModule = null;
});
}
export default function (name, opts) {
opts = opts || {};
if (opts.skip) {
return;
}
if (typeof opts.template === "string" && !LEGACY_ENV) {
let testName = QUnit.config.currentModule.name + " " + name;
// eslint-disable-next-line
console.warn(
`${testName} skipped; template must be compiled and not a string`
);
return;
}
test(name, async function (assert) {
this.site = Site.current();
this.session = Session.current();
let owner = LEGACY_ENV ? this.registry : this.owner;
let store;
if (LEGACY_ENV) {
this.registry.register("site-settings:main", currentSettings(), {
instantiate: false,
});
this.registry.register("capabilities:main", EmberObject);
this.registry.register("message-bus:main", MessageBus, {
instantiate: false,
});
this.registry.register("site:main", this.site, { instantiate: false });
this.registry.register("session:main", this.session, {
instantiate: false,
});
this.registry.injection(
"component",
"siteSettings",
"site-settings:main"
);
this.registry.injection("component", "appEvents", "service:app-events");
this.registry.injection("component", "capabilities", "capabilities:main");
this.registry.injection("component", "site", "site:main");
this.registry.injection("component", "session", "session:main");
this.registry.injection("component", "messageBus", "message-bus:main");
this.siteSettings = currentSettings();
store = createStore();
this.registry.register("service:store", store, { instantiate: false });
} else {
this.container = owner;
store = this.container.lookup("service:store");
}
autoLoadModules(this.container, this.registry);
if (!opts.anonymous) {
const currentUser = User.create({
username: "eviltrout",
timezone: "Australia/Brisbane",
});
this.currentUser = currentUser;
owner.unregister("current-user:main");
owner.register("current-user:main", currentUser, {
instantiate: false,
});
if (LEGACY_ENV) {
owner.injection("component", "currentUser", "current-user:main");
} else {
owner.inject("component", "currentUser", "current-user:main");
}
owner.unregister("topic-tracking-state:main");
owner.register(
"topic-tracking-state:main",
TopicTrackingState.create({ currentUser }),
{ instantiate: false }
);
}
if (opts.beforeEach) {
opts.beforeEach.call(this, store);
}
$.fn.autocomplete = function () {};
andThen(() => {
return LEGACY_ENV ? this.render(opts.template) : render(opts.template);
});
andThen(() => {
return opts.test.call(this, assert);
}).finally(async () => {
if (opts.afterEach) {
await andThen(() => {
return opts.afterEach.call(opts);
});
}
});
});
}