diff --git a/lms/static/js/spec/student_account/multiple_enterprise_spec.js b/lms/static/js/spec/student_account/multiple_enterprise_spec.js index 0c7d8be5699d5b2351035ff31f2e6b1687e42482..a9c34fb4d770032c65073ae6f04278ce307acb18 100644 --- a/lms/static/js/spec/student_account/multiple_enterprise_spec.js +++ b/lms/static/js/spec/student_account/multiple_enterprise_spec.js @@ -9,7 +9,8 @@ define([ describe('MultipleEnterpriseInterface', function() { var LEARNER_URL = '/enterprise/api/v1/enterprise-learner/?username=test-learner', NEXT_URL = '/dashboard', - REDIRECT_URL = '/enterprise/select/active/?success_url=%2Fdashboard'; + REDIRECT_URL = '/enterprise/select/active/?success_url=%2Fdashboard', + ENTERPRISE_ACTIVATION_URL = '/enterprise/select/active'; beforeEach(function() { // Mock the redirect call @@ -39,6 +40,75 @@ define([ expect(MultipleEnterpriseInterface.redirect).toHaveBeenCalledWith(REDIRECT_URL); }); + it('checks bypass of enterprise selection page in case of enterprise in URL', function() { + // Spy on Ajax requests + var requests = AjaxHelpers.requests(this); + spyOn(MultipleEnterpriseInterface, 'getEnterpriseFromUrl').and.returnValue('SomeEnterprise'); + spyOn(MultipleEnterpriseInterface, 'checkEnterpriseExists').and.returnValue(true); + + // Attempt to fetch a learner + MultipleEnterpriseInterface.check(NEXT_URL); + + // Expect that the correct request was made to the server + AjaxHelpers.expectRequest( + requests, + 'GET', + LEARNER_URL, + null + ); + + // Simulate a successful response from the server + AjaxHelpers.respondWithJson(requests, {count: 2}); + + AjaxHelpers.expectRequest( + requests, + 'POST', + ENTERPRISE_ACTIVATION_URL, + $.param({ + enterprise: 'SomeEnterprise' + }) + ); + AjaxHelpers.respondWithNoContent(requests); + + // Verify that the user was redirected correctly + expect(MultipleEnterpriseInterface.redirect).toHaveBeenCalledWith(NEXT_URL); + }); + + it('checks enterprise selection page redirect in case of enterprise activation failure', function() { + // Spy on Ajax requests + var requests = AjaxHelpers.requests(this); + spyOn(MultipleEnterpriseInterface, 'getEnterpriseFromUrl').and.returnValue('SomeEnterprise'); + spyOn(MultipleEnterpriseInterface, 'checkEnterpriseExists').and.returnValue(true); + + // Attempt to fetch a learner + MultipleEnterpriseInterface.check(NEXT_URL); + + // Expect that the correct request was made to the server + AjaxHelpers.expectRequest( + requests, + 'GET', + LEARNER_URL, + null + ); + + // Simulate a successful response from the server + AjaxHelpers.respondWithJson(requests, {count: 2}); + + AjaxHelpers.expectRequest( + requests, + 'POST', + ENTERPRISE_ACTIVATION_URL, + $.param({ + enterprise: 'SomeEnterprise' + }) + ); + // Simulate an error response from the server + AjaxHelpers.respondWithError(requests); + + // Verify that the user was redirected correctly + expect(MultipleEnterpriseInterface.redirect).toHaveBeenCalledWith(REDIRECT_URL); + }); + it('gets learner information and checks that enterprise selection page is bypassed', function() { // Spy on Ajax requests var requests = AjaxHelpers.requests(this); diff --git a/lms/static/js/student_account/multiple_enterprise.js b/lms/static/js/student_account/multiple_enterprise.js index 9dadd3d0a77d86a3fdae235137b44fb27b53d442..535713395d13c91f597536d88f299ffb487dbc86 100644 --- a/lms/static/js/student_account/multiple_enterprise.js +++ b/lms/static/js/student_account/multiple_enterprise.js @@ -5,7 +5,8 @@ urls: { learners: '/enterprise/api/v1/enterprise-learner/', - multipleEnterpriseUrl: '/enterprise/select/active/?success_url=' + multipleEnterpriseUrl: '/enterprise/select/active/?success_url=', + enterpriseActivationUrl: '/enterprise/select/active' }, headers: { @@ -15,12 +16,17 @@ /** * Fetch the learner data, then redirect the user to a enterprise selection page if multiple * enterprises were found. - * @param {string} nextUrl The URL to redirect to after multiple enterprise selection. + * @param {string} nextUrl The URL to redirect to after multiple enterprise selection or incase + * the selection page is bypassed e.g. when dealing with direct enrolment urls. */ check: function(nextUrl) { - var redirectUrl = this.urls.multipleEnterpriseUrl + encodeURIComponent(nextUrl); + var view = this; + var selectionPageUrl = this.urls.multipleEnterpriseUrl + encodeURIComponent(nextUrl); var username = Utils.userFromEdxUserCookie().username; var next = nextUrl || '/'; + var enterpriseInUrl = this.getEnterpriseFromUrl(nextUrl); + var userInEnterprise = false; + var userWithMultipleEnterprises = false; $.ajax({ url: this.urls.learners + '?username=' + username, type: 'GET', @@ -28,22 +34,53 @@ headers: this.headers, context: this }).fail(function() { - this.redirect(next); + view.redirect(next); }).done(function(response) { - if (response.count > 1 && redirectUrl) { - this.redirect(redirectUrl); + userWithMultipleEnterprises = (response.count > 1); + if (userWithMultipleEnterprises) { + if (enterpriseInUrl) { + userInEnterprise = view.checkEnterpriseExists(response, enterpriseInUrl); + if (userInEnterprise) { + view.activate(enterpriseInUrl).fail(function() { + view.redirect(selectionPageUrl); + }).done(function() { + view.redirect(next); + }); + } + } + view.redirect(selectionPageUrl); } else { - this.redirect(next); + view.redirect(next); } }); }, - /** - * Redirect to a URL. - * @param {string} url The URL to redirect to. - */ redirect: function(url) { window.location.href = url; + }, + + activate: function(enterprise) { + return $.ajax({ + url: this.urls.enterpriseActivationUrl, + method: 'POST', + headers: {'X-CSRFToken': $.cookie('csrftoken')}, + data: {enterprise: enterprise} + }); + }, + + getEnterpriseFromUrl: function(url) { + var regex; + regex = RegExp('/enterprise/.*/course/.*/enroll'); + if (typeof url !== 'string' || !regex.test(url)) { + return void(0); + } + return url.split('/')[2]; + }, + + checkEnterpriseExists: function(response, enterprise) { + return response.results.some(function(item) { + return item.enterprise_customer.uuid === enterprise; + }); } };