diff --git a/cms/static/coffee/spec/main.coffee b/cms/static/coffee/spec/main.coffee index a2a5cb3083..1868a3a383 100644 --- a/cms/static/coffee/spec/main.coffee +++ b/cms/static/coffee/spec/main.coffee @@ -253,6 +253,7 @@ define([ "js/spec/views/xblock_validation_spec", "js/spec/views/license_spec", "js/spec/views/paging_spec", + "js/spec/views/login_studio_spec", "js/spec/views/pages/container_spec", "js/spec/views/pages/container_subviews_spec", diff --git a/cms/static/js/factories/login.js b/cms/static/js/factories/login.js index fcf8ee3069..39480917d8 100644 --- a/cms/static/js/factories/login.js +++ b/cms/static/js/factories/login.js @@ -1,4 +1,4 @@ -define(['jquery.cookie', 'utility'], function() { +define(['jquery.cookie', 'utility', 'common/js/components/utils/view_utils'], function(cookie, utility, ViewUtils) { 'use strict'; return function (homepageURL) { function postJSON(url, data, callback) { @@ -22,15 +22,19 @@ define(['jquery.cookie', 'utility'], function() { $('form#login_form').submit(function(event) { event.preventDefault(); + var submitButton = $('#submit'), + deferred = new $.Deferred(), + promise = deferred.promise(); + ViewUtils.disableElementWhileRunning(submitButton, function() { return promise; }); var submit_data = $('#login_form').serialize(); postJSON('/login_post', submit_data, function(json) { if(json.success) { var next = /next=([^&]*)/g.exec(decodeURIComponent(window.location.search)); if (next && next.length > 1 && !isExternal(next[1])) { - location.href = next[1]; + ViewUtils.redirect(next[1]); } else { - location.href = homepageURL; + ViewUtils.redirect(homepageURL); } } else if($('#login_error').length === 0) { $('#login_form').prepend( @@ -39,11 +43,13 @@ define(['jquery.cookie', 'utility'], function() { '' ); $('#login_error').addClass('is-shown'); + deferred.resolve(); } else { $('#login_error') .stop() .addClass('is-shown') .html(json.value); + deferred.resolve(); } }); }); diff --git a/cms/static/js/spec/views/login_studio_spec.js b/cms/static/js/spec/views/login_studio_spec.js new file mode 100644 index 0000000000..2fb44c2fe2 --- /dev/null +++ b/cms/static/js/spec/views/login_studio_spec.js @@ -0,0 +1,32 @@ +define(['jquery', 'js/factories/login', 'common/js/spec_helpers/ajax_helpers', 'common/js/components/utils/view_utils'], +function($, LoginFactory, AjaxHelpers, ViewUtils) { + 'use strict'; + describe("Studio Login Page", function() { + var submitButton; + + beforeEach(function() { + loadFixtures('mock/login.underscore'); + /*jshint unused: false*/ + var login_factory = new LoginFactory("/home/"); + submitButton = $('#submit'); + }); + + it('disable the submit button once it is clicked', function() { + spyOn(ViewUtils, 'redirect').andCallFake(function(){}); + var requests = AjaxHelpers.requests(this); + expect(submitButton).not.toHaveClass('is-disabled'); + submitButton.click(); + AjaxHelpers.respondWithJson(requests, {'success': true}); + expect(submitButton).toHaveClass('is-disabled'); + }); + + it('It will not disable the submit button if there are errors in ajax request', function() { + var requests = AjaxHelpers.requests(this); + expect(submitButton).not.toHaveClass('is-disabled'); + submitButton.click(); + expect(submitButton).toHaveClass('is-disabled'); + AjaxHelpers.respondWithError(requests, {}); + expect(submitButton).not.toHaveClass('is-disabled'); + }); + }); +}); diff --git a/cms/templates/js/mock/login.underscore b/cms/templates/js/mock/login.underscore new file mode 100644 index 0000000000..8d07f6db6f --- /dev/null +++ b/cms/templates/js/mock/login.underscore @@ -0,0 +1,12 @@ +