discourse/test/javascripts/test_helper.js

Failed to ignore revisions in .git-blame-ignore-revs.

231 lines
6.5 KiB
JavaScript
Raw Normal View History

// discourse-skip-module
/*global document, sinon, QUnit, Logster */
//= require env
2015-04-30 02:57:08 +08:00
//= require jquery.debug
//= require jquery.ui.widget
2015-08-12 05:34:02 +08:00
//= require ember.debug
//= require message-bus
2018-09-11 15:07:28 +08:00
//= require qunit/qunit/qunit
//= require ember-qunit
//= require fake_xml_http_request
//= require route-recognizer/dist/route-recognizer
2018-09-07 16:01:20 +08:00
//= require pretender/pretender
2016-11-16 01:41:12 +08:00
//= require discourse-loader
//= require locales/i18n
//= require locales/en_US
// Stuff we need to load first
2016-07-04 01:33:05 +08:00
//= require vendor
//= require ember-shim
//= require pretty-text-bundle
//= require markdown-it-bundle
2016-11-15 10:30:03 +08:00
//= require application
//= require admin
// These are not loaded in prod or development
// But we need them for testing handlebars templates in qunit
//= require handlebars
//= require ember-template-compiler
//= require sinon/pkg/sinon
2013-06-21 01:58:54 +08:00
//= require helpers/assertions
//= require break_string
//= require helpers/qunit-helpers
2013-06-21 01:58:54 +08:00
//= require_tree ./fixtures
//= require_tree ./lib
//= require_tree .
//= require plugin_tests
//= require_self
2015-03-13 14:45:55 +08:00
//
//= require jquery.magnific-popup.min.js
const buildResolver = require("discourse-common/resolver").buildResolver;
window.setResolver(buildResolver("discourse").create({ namespace: Discourse }));
sinon.config = {
injectIntoThis: false,
injectInto: null,
properties: ["spy", "stub", "mock", "clock", "sandbox"],
useFakeTimers: true,
useFakeServer: false
};
window.inTestEnv = true;
// Stop the message bus so we don't get ajax calls
window.MessageBus.stop();
// Trick JSHint into allow document.write
var d = document;
2018-09-07 15:19:34 +08:00
d.write(
'<div id="ember-testing-container"><div id="ember-testing"></div></div>'
);
d.write(
"<style>#ember-testing-container { position: absolute; background: white; bottom: 0; right: 0; width: 640px; height: 384px; overflow: auto; z-index: 9999; border: 1px solid #ccc; } #ember-testing { zoom: 50%; }</style>"
);
2018-09-07 15:19:34 +08:00
Discourse.rootElement = "#ember-testing";
Discourse.setupForTesting();
Discourse.injectTestHelpers();
Discourse.start();
2013-07-05 23:53:09 +08:00
// disable logster error reporting
if (window.Logster) {
Logster.enabled = false;
} else {
window.Logster = { enabled: false };
}
var createPretender = require("helpers/create-pretender", null, null, false),
2018-09-07 15:19:34 +08:00
fixtures = require("fixtures/site-fixtures", null, null, false).default,
flushMap = require("discourse/models/store", null, null, false).flushMap,
ScrollingDOMMethods = require("discourse/mixins/scrolling", null, null, false)
.ScrollingDOMMethods,
_DiscourseURL = require("discourse/lib/url", null, null, false).default,
applyPretender = require("helpers/qunit-helpers", null, null, false)
.applyPretender,
server,
acceptanceModulePrefix = "Acceptance: ";
function dup(obj) {
return jQuery.extend(true, {}, obj);
}
function resetSite(siteSettings, extras) {
let createStore = require("helpers/create-store").default;
let siteAttrs = $.extend({}, fixtures["site.json"].site, extras || {});
let Site = require("discourse/models/site").default;
2016-07-05 02:15:51 +08:00
siteAttrs.store = createStore();
siteAttrs.siteSettings = siteSettings;
Site.resetCurrent(Site.create(siteAttrs));
2016-07-05 02:15:51 +08:00
}
2014-07-31 06:56:01 +08:00
QUnit.testStart(function(ctx) {
server = createPretender.default;
createPretender.applyDefaultHandlers(server);
server.handlers = [];
server.prepareBody = function(body) {
if (body && typeof body === "object") {
return JSON.stringify(body);
}
return body;
};
if (QUnit.config.logAllRequests) {
server.handledRequest = function(verb, path, request) {
console.log("REQ: " + verb + " " + path);
};
}
server.unhandledRequest = function(verb, path) {
if (QUnit.config.logAllRequests) {
console.log("REQ: " + verb + " " + path + " missing");
}
const error =
"Unhandled request in test environment: " + path + " (" + verb + ")";
window.console.error(error);
throw error;
};
server.checkPassthrough = request =>
request.requestHeaders["Discourse-Script"];
if (ctx.module.startsWith(acceptanceModulePrefix)) {
var helper = {
parsePostData: createPretender.parsePostData,
response: createPretender.response,
success: createPretender.success
};
applyPretender(
ctx.module.replace(acceptanceModulePrefix, ""),
server,
helper
);
}
2013-07-05 23:53:09 +08:00
// Allow our tests to change site settings and have them reset before the next test
Discourse.SiteSettings = dup(Discourse.SiteSettingsOriginal);
Discourse.BaseUri = "";
Discourse.BaseUrl = "http://localhost:3000";
2019-11-13 22:17:06 +08:00
let User = require("discourse/models/user").default;
let Session = require("discourse/models/session").default;
Session.resetCurrent();
2019-11-13 22:17:06 +08:00
User.resetCurrent();
resetSite(Discourse.SiteSettings);
2015-08-11 05:11:27 +08:00
_DiscourseURL.redirectedTo = null;
_DiscourseURL.redirectTo = function(url) {
_DiscourseURL.redirectedTo = url;
};
var ps = require("discourse/lib/preload-store").default;
2016-07-05 02:15:51 +08:00
ps.reset();
2014-07-31 05:53:14 +08:00
window.sandbox = sinon;
window.sandbox.stub(ScrollingDOMMethods, "screenNotFull");
2015-08-08 03:08:27 +08:00
window.sandbox.stub(ScrollingDOMMethods, "bindOnScroll");
window.sandbox.stub(ScrollingDOMMethods, "unbindOnScroll");
2014-07-31 06:56:01 +08:00
// Unless we ever need to test this, let's leave it off.
2018-09-07 15:19:34 +08:00
$.fn.autocomplete = function() {};
});
2013-07-05 23:53:09 +08:00
2014-07-31 05:53:14 +08:00
QUnit.testDone(function() {
2014-07-31 06:56:01 +08:00
window.sandbox.restore();
2014-08-01 02:17:18 +08:00
// Destroy any modals
2018-09-07 15:19:34 +08:00
$(".modal-backdrop").remove();
flushMap();
// ensures any event not removed is not leaking between tests
2019-06-06 19:00:23 +08:00
// most likely in intialisers, other places (controller, component...)
// should be fixed in code
require("discourse/services/app-events").clearAppEventsCache(
window.Discourse.__container__
);
window.MessageBus.unsubscribe("*");
delete window.server;
window.Mousetrap.reset();
2014-07-31 05:53:14 +08:00
});
2014-08-01 00:05:47 +08:00
// Load ES6 tests
var helpers = require("helpers/qunit-helpers");
function getUrlParameter(name) {
2018-09-07 15:19:34 +08:00
name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
var regex = new RegExp("[\\?&]" + name + "=([^&#]*)");
var results = regex.exec(location.search);
return results === null
? ""
: decodeURIComponent(results[1].replace(/\+/g, " "));
}
2018-09-07 15:19:34 +08:00
var skipCore = getUrlParameter("qunit_skip_core") == "1";
var pluginPath = getUrlParameter("qunit_single_plugin")
? "/" + getUrlParameter("qunit_single_plugin") + "/"
: "/plugins/";
Object.keys(requirejs.entries).forEach(function(entry) {
2018-09-07 15:19:34 +08:00
var isTest = /\-test/.test(entry);
var regex = new RegExp(pluginPath);
var isPlugin = regex.test(entry);
if (isTest && (!skipCore || isPlugin)) {
2014-08-01 00:05:47 +08:00
require(entry, null, null, true);
}
});
// forces 0 as duration for all jquery animations
jQuery.fx.off = true;
2016-07-05 02:15:51 +08:00
resetSite();