Commit 09594d63 by Usman Khalid

Merge pull request #12243 from edx/usman/tnl4416-spec-nesting

When using RequireJS load spec files one by one.
parents 8cf89d3a 6c26715a
...@@ -283,6 +283,8 @@ while i < testFiles.length ...@@ -283,6 +283,8 @@ while i < testFiles.length
testFiles[i] = '/base/' + testFiles[i] + '.js' testFiles[i] = '/base/' + testFiles[i] + '.js'
i++ i++
require testFiles, -> # Jasmine has a global stack for creating a tree of specs. We need to load
# spec files one by one, otherwise some end up getting nested under others.
requireSerial testFiles, ->
# start test run, once Require.js is done # start test run, once Require.js is done
window.__karma__.start() window.__karma__.start()
...@@ -202,6 +202,9 @@ i = 0 ...@@ -202,6 +202,9 @@ i = 0
while i < testFiles.length while i < testFiles.length
testFiles[i] = '/base/' + testFiles[i] + '.js' testFiles[i] = '/base/' + testFiles[i] + '.js'
i++ i++
require testFiles, ->
# Jasmine has a global stack for creating a tree of specs. We need to load
# spec files one by one, otherwise some end up getting nested under others.
requireSerial testFiles, ->
# start test run, once Require.js is done # start test run, once Require.js is done
window.__karma__.start() window.__karma__.start()
...@@ -62,8 +62,8 @@ define(["jquery", "URI", "common/js/spec_helpers/ajax_helpers", "common/js/compo ...@@ -62,8 +62,8 @@ define(["jquery", "URI", "common/js/spec_helpers/ajax_helpers", "common/js/compo
mockCssUrl = "mock.css", mockCssUrl = "mock.css",
headHtml; headHtml;
postXBlockRequest(requests, [ postXBlockRequest(requests, [
["hash1", { mimetype: "text/css", kind: "text", data: mockCssText }], ["xblock_spec_hash1", { mimetype: "text/css", kind: "text", data: mockCssText }],
["hash2", { mimetype: "text/css", kind: "url", data: mockCssUrl }] ["xblock_spec_hash2", { mimetype: "text/css", kind: "url", data: mockCssUrl }]
]); ]);
headHtml = $('head').html(); headHtml = $('head').html();
expect(headHtml).toContain(mockCssText); expect(headHtml).toContain(mockCssText);
...@@ -73,7 +73,9 @@ define(["jquery", "URI", "common/js/spec_helpers/ajax_helpers", "common/js/compo ...@@ -73,7 +73,9 @@ define(["jquery", "URI", "common/js/spec_helpers/ajax_helpers", "common/js/compo
it('can render an xblock with required JavaScript', function() { it('can render an xblock with required JavaScript', function() {
var requests = AjaxHelpers.requests(this); var requests = AjaxHelpers.requests(this);
postXBlockRequest(requests, [ postXBlockRequest(requests, [
["hash3", { mimetype: "application/javascript", kind: "text", data: "window.test = 100;" }] ["xblock_spec_hash3", {
mimetype: "application/javascript", kind: "text", data: "window.test = 100;"
}]
]); ]);
expect(window.test).toBe(100); expect(window.test).toBe(100);
}); });
...@@ -82,7 +84,7 @@ define(["jquery", "URI", "common/js/spec_helpers/ajax_helpers", "common/js/compo ...@@ -82,7 +84,7 @@ define(["jquery", "URI", "common/js/spec_helpers/ajax_helpers", "common/js/compo
var requests = AjaxHelpers.requests(this), var requests = AjaxHelpers.requests(this),
mockHeadTag = "<title>Test Title</title>"; mockHeadTag = "<title>Test Title</title>";
postXBlockRequest(requests, [ postXBlockRequest(requests, [
["hash4", { mimetype: "text/html", placement: "head", data: mockHeadTag }] ["xblock_spec_hash4", { mimetype: "text/html", placement: "head", data: mockHeadTag }]
]); ]);
expect($('head').html()).toContain(mockHeadTag); expect($('head').html()).toContain(mockHeadTag);
}); });
...@@ -93,7 +95,9 @@ define(["jquery", "URI", "common/js/spec_helpers/ajax_helpers", "common/js/compo ...@@ -93,7 +95,9 @@ define(["jquery", "URI", "common/js/spec_helpers/ajax_helpers", "common/js/compo
promise; promise;
spyOn(ViewUtils, 'loadJavaScript').and.returnValue($.Deferred().reject().promise()); spyOn(ViewUtils, 'loadJavaScript').and.returnValue($.Deferred().reject().promise());
promise = postXBlockRequest(requests, [ promise = postXBlockRequest(requests, [
["hash5", { mimetype: "application/javascript", kind: "url", data: missingJavaScriptUrl }] ["xblock_spec_hash5", {
mimetype: "application/javascript", kind: "url", data: missingJavaScriptUrl
}]
]); ]);
expect(promise.isRejected()).toBe(true); expect(promise.isRejected()).toBe(true);
}); });
......
...@@ -82,7 +82,9 @@ var libraryFiles = [ ...@@ -82,7 +82,9 @@ var libraryFiles = [
{pattern: 'edx-pattern-library/js/afontgarde.js', included: false}, {pattern: 'edx-pattern-library/js/afontgarde.js', included: false},
{pattern: 'edx-pattern-library/js/edx-icons.js', included: false}, {pattern: 'edx-pattern-library/js/edx-icons.js', included: false},
{pattern: 'edx-pattern-library/js/**/*.js', included: false}, {pattern: 'edx-pattern-library/js/**/*.js', included: false},
{pattern: 'edx-ui-toolkit/js/**/*.js', included: false} {pattern: 'edx-ui-toolkit/js/**/*.js', included: false},
{pattern: 'common/js/utils/require-serial.js', included: true}
]; ];
// Paths to source JavaScript files // Paths to source JavaScript files
......
...@@ -68,7 +68,8 @@ var libraryFiles = [ ...@@ -68,7 +68,8 @@ var libraryFiles = [
pattern: 'xmodule_js/common_static/js/vendor/jQuery-File-Upload/js/jquery.fileupload-validate.js', pattern: 'xmodule_js/common_static/js/vendor/jQuery-File-Upload/js/jquery.fileupload-validate.js',
included: false included: false
}, },
{pattern: 'xmodule_js/common_static/js/vendor/requirejs/text.js', included: false} {pattern: 'xmodule_js/common_static/js/vendor/requirejs/text.js', included: false},
{pattern: 'common/js/utils/require-serial.js', included: true}
]; ];
// Paths to source JavaScript files // Paths to source JavaScript files
......
...@@ -178,7 +178,7 @@ ...@@ -178,7 +178,7 @@
testFiles[i] = '/base/' + testFiles[i]; testFiles[i] = '/base/' + testFiles[i];
} }
require(testFiles, function () { window.requireSerial(testFiles, function () {
// start test run, once Require.js is done // start test run, once Require.js is done
window.__karma__.start(); window.__karma__.start();
}); });
......
/*
Helper function used to require files serially instead of concurrently.
*/
(function (window, require) {
'use strict';
var requireModules = function (paths, callback, modules) {
// If all the modules have been loaded, call the callback.
if (paths.length === 0) {
return callback.apply(null, modules);
}
// Otherwise load the next one.
require([paths.shift()], function(module) {
modules.push(module);
requireModules(paths, callback, modules);
});
};
window.requireSerial = function(paths, callback) {
requireModules(paths, callback, []);
};
}).call(this, window, require || RequireJS.require);
...@@ -46,7 +46,8 @@ var libraryFiles = [ ...@@ -46,7 +46,8 @@ var libraryFiles = [
{pattern: 'js/test/i18n.js', included: false}, {pattern: 'js/test/i18n.js', included: false},
{pattern: 'coffee/src/jquery.immediateDescendents.js', included: false}, {pattern: 'coffee/src/jquery.immediateDescendents.js', included: false},
{pattern: 'js/vendor/requirejs/text.js', included: false}, {pattern: 'js/vendor/requirejs/text.js', included: false},
{pattern: 'js/vendor/sinon-1.17.0.js', included: false} {pattern: 'js/vendor/sinon-1.17.0.js', included: false},
{pattern: 'common/js/utils/require-serial.js', included: true}
]; ];
// Paths to source JavaScript files // Paths to source JavaScript files
......
define(['jquery', 'backbone', 'teams/js/teams_tab_factory', define(['jquery', 'backbone', 'teams/js/teams_tab_factory', 'teams/js/views/teams_tab',
'common/js/spec_helpers/page_helpers', 'teams/js/spec_helpers/team_spec_helpers'], 'common/js/spec_helpers/page_helpers', 'teams/js/spec_helpers/team_spec_helpers'],
function($, Backbone, TeamsTabFactory, PageHelpers, TeamSpecHelpers) { function($, Backbone, TeamsTabFactory, TeamsTabView, PageHelpers, TeamSpecHelpers) {
'use strict'; 'use strict';
describe("Teams Tab Factory", function() { describe("Teams Tab Factory", function() {
...@@ -15,6 +15,7 @@ define(['jquery', 'backbone', 'teams/js/teams_tab_factory', ...@@ -15,6 +15,7 @@ define(['jquery', 'backbone', 'teams/js/teams_tab_factory',
afterEach(function() { afterEach(function() {
Backbone.history.stop(); Backbone.history.stop();
$(document).off('ajaxError', TeamsTabView.prototype.errorHandler);
}); });
it('can render the "Teams" tab', function() { it('can render the "Teams" tab', function() {
......
...@@ -56,7 +56,11 @@ define([ ...@@ -56,7 +56,11 @@ define([
spyOn(Logger, 'log'); spyOn(Logger, 'log');
}); });
afterEach(Backbone.history.stop); afterEach(function() {
Backbone.history.stop();
$(document).off('ajaxError', TeamsTabView.prototype.errorHandler);
}
);
describe('Navigation', function () { describe('Navigation', function () {
it('does not render breadcrumbs for the top level tabs', function() { it('does not render breadcrumbs for the top level tabs', function() {
......
...@@ -159,14 +159,7 @@ ...@@ -159,14 +159,7 @@
start: function() { start: function() {
Backbone.history.start(); Backbone.history.start();
$(document).ajaxError(function (event, xhr) { $(document).ajaxError(this.errorHandler);
if (xhr.status === 401) {
TeamUtils.showMessage(gettext("Your request could not be completed. Reload the page and try again."));
}
else if (xhr.status === 500) {
TeamUtils.showMessage(gettext("Your request could not be completed due to a server problem. Reload the page and try again. If the issue persists, click the Help tab to report the problem."));
}
});
// Navigate to the default page if there is no history: // Navigate to the default page if there is no history:
// 1. If the user belongs to at least one team, jump to the "My Teams" page // 1. If the user belongs to at least one team, jump to the "My Teams" page
...@@ -180,6 +173,20 @@ ...@@ -180,6 +173,20 @@
} }
}, },
errorHandler: function(event, xhr) {
if (xhr.status === 401) {
TeamUtils.showMessage(gettext(
"Your request could not be completed. Reload the page and try again."
));
}
else if (xhr.status === 500) {
TeamUtils.showMessage(gettext(
"Your request could not be completed due to a server problem. Reload the page" +
" and try again. If the issue persists, click the Help tab to report the problem."
));
}
},
render: function() { render: function() {
this.mainView.setElement(this.$el).render(); this.mainView.setElement(this.$el).render();
TeamUtils.hideMessage(); TeamUtils.hideMessage();
......
...@@ -770,7 +770,9 @@ ...@@ -770,7 +770,9 @@
testFiles[i] = '/base/' + testFiles[i]; testFiles[i] = '/base/' + testFiles[i];
} }
require(testFiles, function () { // Jasmine has a global stack for creating a tree of specs. We need to load
// spec files one by one, otherwise some end up getting nested under others.
window.requireSerial(testFiles, function () {
// start test run, once Require.js is done // start test run, once Require.js is done
window.__karma__.start(); window.__karma__.start();
}); });
......
...@@ -73,7 +73,8 @@ var libraryFiles = [ ...@@ -73,7 +73,8 @@ var libraryFiles = [
{pattern: 'xmodule_js/common_static/js/vendor/slick.core.js', included: true}, {pattern: 'xmodule_js/common_static/js/vendor/slick.core.js', included: true},
{pattern: 'xmodule_js/common_static/js/vendor/slick.grid.js', included: true}, {pattern: 'xmodule_js/common_static/js/vendor/slick.grid.js', included: true},
{pattern: 'xmodule_js/common_static/js/libs/jasmine-waituntil.js', included: true}, {pattern: 'xmodule_js/common_static/js/libs/jasmine-waituntil.js', included: true},
{pattern: 'xmodule_js/common_static/js/libs/jasmine-extensions.js', included: true} {pattern: 'xmodule_js/common_static/js/libs/jasmine-extensions.js', included: true},
{pattern: 'common/js/utils/require-serial.js', included: true}
]; ];
// Paths to source JavaScript files // Paths to source JavaScript files
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment