diff --git a/src/karma.conf.js b/src/karma.conf.js index 9aaa6d41..97e91a70 100644 --- a/src/karma.conf.js +++ b/src/karma.conf.js @@ -85,6 +85,7 @@ module.exports = function (config) { __dirname + '/wwwroot/env/development.js', __dirname + '/wwwroot/lib/svgxuse/svgxuse.js', __dirname + '/wwwroot/lib/autofill-directive/autofill-directive.js', + __dirname + '/wwwroot/test-helpers/clerk-mock.js', __dirname + '/wwwroot/**/*.spec.js' ], diff --git a/src/package.json b/src/package.json index b08ec3da..b9bfa2d7 100644 --- a/src/package.json +++ b/src/package.json @@ -50,6 +50,6 @@ "postinstall": "bower --allow-root install && webdriver-manager update", "start": "gulp", "build": "gulp build", - "test": "exit 0" + "test": "gulp test" } } diff --git a/src/spec/login_spec.js b/src/spec/login_spec.js index 5a2fe255..3269d7df 100644 --- a/src/spec/login_spec.js +++ b/src/spec/login_spec.js @@ -20,18 +20,39 @@ describe('Login page', () => { // Assert expect(loginPage.getSwitchLanguageMessage()).toBe(inEnglish); - // Act + // Act - Test English page shows Spanish message + browser.addMockModule('descartableModule', () => angular + .module('descartableModule', ['ngMockE2E']) + .run($httpBackend => { + $httpBackend.whenGET(/\/accounts\/[\w|-]*\/status\/limits/).respond(200, { + "data" : "" + }); + })); loginPage.get('lang=en'); // Assert expect(loginPage.getSwitchLanguageMessage()).toBe(inSpanish); - // Act - loginPage.clickEsFlag(); + // Act - Test switching back to Spanish + browser.addMockModule('descartableModule', () => angular + .module('descartableModule', ['ngMockE2E']) + .run($httpBackend => { + $httpBackend.whenGET(/\/accounts\/[\w|-]*\/status\/limits/).respond(200, { + "data" : "" + }); + })); + loginPage.get('lang=es'); // Assert expect(loginPage.getSwitchLanguageMessage()).toBe(inEnglish); - // Act - loginPage.clickEnFlag(); + // Act - Test switching back to English + browser.addMockModule('descartableModule', () => angular + .module('descartableModule', ['ngMockE2E']) + .run($httpBackend => { + $httpBackend.whenGET(/\/accounts\/[\w|-]*\/status\/limits/).respond(200, { + "data" : "" + }); + })); + loginPage.get('lang=en'); // Assert expect(loginPage.getSwitchLanguageMessage()).toBe(inSpanish); diff --git a/src/spec/settings_spec.js b/src/spec/settings_spec.js index 8c98659f..db5ba6ec 100644 --- a/src/spec/settings_spec.js +++ b/src/spec/settings_spec.js @@ -385,22 +385,23 @@ describe('Settings Page', () => { it('should change the language correctly', () => { // Arrange - beginAuthenticatedSession(); var profilePage = new ProfilePage(); - - //Act - browser.get('/#/settings/my-profile?lang=es'); var userTextInSpanish = "LENGUAJE"; var userTextInEnglish = "LANGUAGE"; - profilePage.clickChangeLangToEn(); - //Assert + beginAuthenticatedSession(); + browser.get('/#/settings/my-profile?lang=es'); + + expect(profilePage.getLanguageLabelMessage()).toBe(userTextInSpanish); + + beginAuthenticatedSession(); + browser.get('/#/settings/my-profile?lang=en'); + expect(profilePage.getLanguageLabelMessage()).toBe(userTextInEnglish); - //Act - profilePage.clickChangeLangToEs(); + beginAuthenticatedSession(); + browser.get('/#/settings/my-profile?lang=es'); - //Assert expect(profilePage.getLanguageLabelMessage()).toBe(userTextInSpanish); }); diff --git a/src/wwwroot/acceptanceTests/login.spec.js b/src/wwwroot/acceptanceTests/login.spec.js index f2876a39..5bb0d71c 100644 --- a/src/wwwroot/acceptanceTests/login.spec.js +++ b/src/wwwroot/acceptanceTests/login.spec.js @@ -7,6 +7,13 @@ describe('Login', () => { localStorage.clear(); module('dopplerRelay'); + + var mockClerkService = window.ClerkTestHelpers.createClerkMock(); + + module(function($provide) { + $provide.value('clerk', mockClerkService); + }); + var context; inject(function ($controller, $location, $rootScope, auth, $httpBackend) { @@ -14,6 +21,7 @@ describe('Login', () => { $rootScope.addError = err => errors.push(err); $rootScope.addAuthorizationError = $rootScope.addError; $rootScope.loadLimits = () => {}; + $httpBackend.whenGET(/partials\/.*\.html/).respond(200, ''); context = { errors: errors, @@ -60,7 +68,7 @@ describe('Login', () => { $httpBackend.flush(); // Assert - expect($location.path()).toBe('/'); // then it will redirect to `/reports` because of _otherwise_ route, I do not know how to test it + expect($location.path()).toBe('/reports'); expect(auth.isAuthed()).toBe(true); expect(auth.isTemporarilyAuthed()).toBe(false); expect(auth.getUserName()).toBe('amoschini@makingsense.com'); diff --git a/src/wwwroot/acceptanceTests/routing.spec.js b/src/wwwroot/acceptanceTests/routing.spec.js index bbd39884..25ba0a69 100644 --- a/src/wwwroot/acceptanceTests/routing.spec.js +++ b/src/wwwroot/acceptanceTests/routing.spec.js @@ -7,6 +7,13 @@ describe('Routing', () => { localStorage.clear(); module('dopplerRelay'); + + var mockClerkService = window.ClerkTestHelpers.createClerkMock(); + + module(function($provide) { + $provide.value('clerk', mockClerkService); + }); + var context; inject(function ($controller, $location, $rootScope, auth, $httpBackend, jwtHelper) { @@ -38,9 +45,10 @@ describe('Routing', () => { it('should start auth session when temporalToken parameter is set (no previous authenticated session)', () => { // Arrange - var { $location, $scope, auth, jwtHelper } = createContext(); + var { $location, $scope, auth, jwtHelper, $httpBackend } = createContext(); expect(auth.isAuthed()).toBe(false); jwtHelper.isTokenExpired = () => false; + $httpBackend.whenGET(/partials\/.*\.html/).respond(200, ''); // Act $location.path('/reset-password'); @@ -56,8 +64,9 @@ describe('Routing', () => { it('should start auth session when temporalToken parameter is set (already previous authenticated session)', () => { // Arrange - var { $location, $scope, auth, jwtHelper } = createContext(); + var { $location, $scope, auth, jwtHelper, $httpBackend } = createContext(); jwtHelper.isTokenExpired = () => false; + $httpBackend.whenGET(/partials\/.*\.html/).respond(200, ''); // set a global (localStorage) token auth.loginByToken('eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE0ODQ2MzAzMTgsImV4cCI6MTQ4NzIyMjMxOCwiaWF0IjoxNDg0NjMwMzE4LCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjM0NzUxIiwic3ViIjoxMDAzLCJ1bmlxdWVfbmFtZSI6ImFtb3NjaGluaUBtYWtpbmdzZW5zZS5jb20iLCJyZWxheV9hY2NvdW50cyI6WyJhbW9zY2hpbmktbWFraW5nc2Vuc2UiXSwicmVsYXlfdG9rZW5fdmVyc2lvbiI6IjEuMC4wLWJldGE1In0.dQh20ukVSCP0rNXMWBh2DlPQXbP0uTaYzadRDNPXECI9lvCsgDKNXc2bToXAUQDeXw90kbHliVF-kCueW4gQLPBtMJOcHQFv6LfgspsG2jue2iMwoBC1q6UB_4xFlGoyhkRjldnQUV0oqBTzhFdXuTvQz53kRPiqILCHkd4FLl4KliBgdaDRwWz-HIjJwinMpnv_7V38CNvHlHo-q2XU0MnE3CsGXmWGoAgzN7rbeQPgI9azHXpbaUPh9n_4zjCydOSBC5tx7MtEAx3ivfFYImBPp2T2vUM-F5AwRh7hl_lMUvyQLal0S_spoT0XMGy8YhnjxXLoZeVRisWbxBmucQ'); @@ -79,9 +88,10 @@ describe('Routing', () => { it('should redirect to error when temporal token is not set (no previous authenticated session)', () => { // Arrange - var { $location, $scope, auth, jwtHelper } = createContext(); + var { $location, $scope, auth, jwtHelper, $httpBackend } = createContext(); expect(auth.isAuthed()).toBe(false); jwtHelper.isTokenExpired = () => false; + $httpBackend.whenGET(/partials\/.*\.html/).respond(200, ''); // Act $location.path('/reset-password'); @@ -95,8 +105,9 @@ describe('Routing', () => { it('should redirect to error when temporal token is not set (already previous authenticated session)', () => { // Arrange - var { $location, $scope, auth, jwtHelper } = createContext(); + var { $location, $scope, auth, jwtHelper, $httpBackend } = createContext(); jwtHelper.isTokenExpired = () => false; + $httpBackend.whenGET(/partials\/.*\.html/).respond(200, ''); // set a global (localStorage) token auth.loginByToken('eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE0ODQ2MzAzMTgsImV4cCI6MTQ4NzIyMjMxOCwiaWF0IjoxNDg0NjMwMzE4LCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjM0NzUxIiwic3ViIjoxMDAzLCJ1bmlxdWVfbmFtZSI6ImFtb3NjaGluaUBtYWtpbmdzZW5zZS5jb20iLCJyZWxheV9hY2NvdW50cyI6WyJhbW9zY2hpbmktbWFraW5nc2Vuc2UiXSwicmVsYXlfdG9rZW5fdmVyc2lvbiI6IjEuMC4wLWJldGE1In0.dQh20ukVSCP0rNXMWBh2DlPQXbP0uTaYzadRDNPXECI9lvCsgDKNXc2bToXAUQDeXw90kbHliVF-kCueW4gQLPBtMJOcHQFv6LfgspsG2jue2iMwoBC1q6UB_4xFlGoyhkRjldnQUV0oqBTzhFdXuTvQz53kRPiqILCHkd4FLl4KliBgdaDRwWz-HIjJwinMpnv_7V38CNvHlHo-q2XU0MnE3CsGXmWGoAgzN7rbeQPgI9azHXpbaUPh9n_4zjCydOSBC5tx7MtEAx3ivfFYImBPp2T2vUM-F5AwRh7hl_lMUvyQLal0S_spoT0XMGy8YhnjxXLoZeVRisWbxBmucQ'); @@ -116,9 +127,10 @@ describe('Routing', () => { it('should redirect to error when temporal token is invalid (no previous authenticated session)', () => { // Arrange - var { $location, $scope, auth, jwtHelper } = createContext(); + var { $location, $scope, auth, jwtHelper, $httpBackend } = createContext(); jwtHelper.isTokenExpired = () => false; expect(auth.isAuthed()).toBe(false); + $httpBackend.whenGET(/partials\/.*\.html/).respond(200, ''); // Act $location.path('/reset-password'); @@ -133,8 +145,9 @@ describe('Routing', () => { it('should redirect to error when temporal token is invalid (already previous authenticated session)', () => { // Arrange - var { $location, $scope, auth, jwtHelper } = createContext(); + var { $location, $scope, auth, jwtHelper, $httpBackend } = createContext(); jwtHelper.isTokenExpired = () => false; + $httpBackend.whenGET(/partials\/.*\.html/).respond(200, ''); // set a global (localStorage) token auth.loginByToken('eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE0ODQ2MzAzMTgsImV4cCI6MTQ4NzIyMjMxOCwiaWF0IjoxNDg0NjMwMzE4LCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjM0NzUxIiwic3ViIjoxMDAzLCJ1bmlxdWVfbmFtZSI6ImFtb3NjaGluaUBtYWtpbmdzZW5zZS5jb20iLCJyZWxheV9hY2NvdW50cyI6WyJhbW9zY2hpbmktbWFraW5nc2Vuc2UiXSwicmVsYXlfdG9rZW5fdmVyc2lvbiI6IjEuMC4wLWJldGE1In0.dQh20ukVSCP0rNXMWBh2DlPQXbP0uTaYzadRDNPXECI9lvCsgDKNXc2bToXAUQDeXw90kbHliVF-kCueW4gQLPBtMJOcHQFv6LfgspsG2jue2iMwoBC1q6UB_4xFlGoyhkRjldnQUV0oqBTzhFdXuTvQz53kRPiqILCHkd4FLl4KliBgdaDRwWz-HIjJwinMpnv_7V38CNvHlHo-q2XU0MnE3CsGXmWGoAgzN7rbeQPgI9azHXpbaUPh9n_4zjCydOSBC5tx7MtEAx3ivfFYImBPp2T2vUM-F5AwRh7hl_lMUvyQLal0S_spoT0XMGy8YhnjxXLoZeVRisWbxBmucQ'); @@ -155,9 +168,10 @@ describe('Routing', () => { it('should redirect to error when temporal token is expired (no previous authenticated session)', () => { // Arrange - var { $location, $scope, auth, jwtHelper } = createContext(); + var { $location, $scope, auth, jwtHelper, $httpBackend } = createContext(); jwtHelper.isTokenExpired = () => true; expect(auth.isAuthed()).toBe(false); + $httpBackend.whenGET(/partials\/.*\.html/).respond(200, ''); // Act $location.path('/reset-password'); @@ -172,8 +186,10 @@ describe('Routing', () => { it('should redirect to error when temporal token is expired (already previous authenticated session)', () => { // Arrange - var { $location, $scope, auth, jwtHelper } = createContext(); + var { $location, $scope, auth, jwtHelper, $httpBackend } = createContext(); jwtHelper.isTokenExpired = () => true; + $httpBackend.whenGET(/partials\/.*\.html/).respond(200, ''); + // set a global (localStorage) token auth.loginByToken('eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE0ODQ2MzAzMTgsImV4cCI6MTQ4NzIyMjMxOCwiaWF0IjoxNDg0NjMwMzE4LCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjM0NzUxIiwic3ViIjoxMDAzLCJ1bmlxdWVfbmFtZSI6ImFtb3NjaGluaUBtYWtpbmdzZW5zZS5jb20iLCJyZWxheV9hY2NvdW50cyI6WyJhbW9zY2hpbmktbWFraW5nc2Vuc2UiXSwicmVsYXlfdG9rZW5fdmVyc2lvbiI6IjEuMC4wLWJldGE1In0.dQh20ukVSCP0rNXMWBh2DlPQXbP0uTaYzadRDNPXECI9lvCsgDKNXc2bToXAUQDeXw90kbHliVF-kCueW4gQLPBtMJOcHQFv6LfgspsG2jue2iMwoBC1q6UB_4xFlGoyhkRjldnQUV0oqBTzhFdXuTvQz53kRPiqILCHkd4FLl4KliBgdaDRwWz-HIjJwinMpnv_7V38CNvHlHo-q2XU0MnE3CsGXmWGoAgzN7rbeQPgI9azHXpbaUPh9n_4zjCydOSBC5tx7MtEAx3ivfFYImBPp2T2vUM-F5AwRh7hl_lMUvyQLal0S_spoT0XMGy8YhnjxXLoZeVRisWbxBmucQ'); expect(auth.isAuthed()).toBe(true); @@ -198,6 +214,7 @@ describe('Routing', () => { auth.loginByToken('eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYmYiOjE0ODQ2MjAxMjEsImV4cCI6MTUyODIwNDk3NywiaWF0IjoxNDg0NjIwMTIxLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjM0NzUxIiwidW5pcXVlX25hbWUiOiJhbW9zY2hpbmkrMUBtYWtpbmdzZW5zZS5jb20iLCJyZWxheV9vbl9wYXNzd29yZF9yZXNldCI6dHJ1ZSwicmVsYXlfdGVtcG9yYWxfdG9rZW4iOnRydWV9.VJJgYPgb7fKcKTvfylCmwh34s934iBoeEYZApOr5kgk', true); $scope.form = {}; var controller = createController('ResetPasswordCtrl'); + $httpBackend.whenGET(/partials\/.*\.html/).respond(200, ''); $httpBackend.expect( 'PUT', @@ -226,7 +243,7 @@ describe('Routing', () => { // Assert //after this it will redirect to reports - expect($location.path()).toBe('/'); + expect($location.path()).toBe('/reports'); expect(auth.isAuthed()).toBe(true); expect(auth.isTemporarilyAuthed()).toBe(false); }); @@ -237,10 +254,11 @@ describe('Routing', () => { it('should redirect to login when temporalToken parameter is set (no previous authenticated session)', () => { // Arrange - var { $location, $scope, auth, jwtHelper } = createContext(); + var { $location, $scope, auth, jwtHelper, $httpBackend } = createContext(); jwtHelper.isTokenExpired = () => false; expect(auth.getUserName()).toBe(null); expect(auth.isAuthed()).toBe(false); + $httpBackend.whenGET(/partials\/.*\.html/).respond(200, ''); // Act $location.path('/reports'); @@ -255,8 +273,9 @@ describe('Routing', () => { it('should redirect to login when temporalToken parameter is set (already previous authenticated session)', () => { // Arrange - var { $location, $scope, auth, jwtHelper } = createContext(); + var { $location, $scope, auth, jwtHelper, $httpBackend } = createContext(); jwtHelper.isTokenExpired = () => false; + $httpBackend.whenGET(/partials\/.*\.html/).respond(200, ''); // set a real stored token auth.loginByToken('eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE0ODQ2MzAzMTgsImV4cCI6MTQ4NzIyMjMxOCwiaWF0IjoxNDg0NjMwMzE4LCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjM0NzUxIiwic3ViIjoxMDAzLCJ1bmlxdWVfbmFtZSI6ImFtb3NjaGluaUBtYWtpbmdzZW5zZS5jb20iLCJyZWxheV9hY2NvdW50cyI6WyJhbW9zY2hpbmktbWFraW5nc2Vuc2UiXSwicmVsYXlfdG9rZW5fdmVyc2lvbiI6IjEuMC4wLWJldGE1In0.dQh20ukVSCP0rNXMWBh2DlPQXbP0uTaYzadRDNPXECI9lvCsgDKNXc2bToXAUQDeXw90kbHliVF-kCueW4gQLPBtMJOcHQFv6LfgspsG2jue2iMwoBC1q6UB_4xFlGoyhkRjldnQUV0oqBTzhFdXuTvQz53kRPiqILCHkd4FLl4KliBgdaDRwWz-HIjJwinMpnv_7V38CNvHlHo-q2XU0MnE3CsGXmWGoAgzN7rbeQPgI9azHXpbaUPh9n_4zjCydOSBC5tx7MtEAx3ivfFYImBPp2T2vUM-F5AwRh7hl_lMUvyQLal0S_spoT0XMGy8YhnjxXLoZeVRisWbxBmucQ'); @@ -277,10 +296,11 @@ describe('Routing', () => { it('should redirect to error when temporalToken parameter is invalid (no previous authenticated session)', () => { // Arrange - var { $location, $scope, auth, jwtHelper } = createContext(); + var { $location, $scope, auth, jwtHelper, $httpBackend } = createContext(); jwtHelper.isTokenExpired = () => false; expect(auth.getUserName()).toBe(null); expect(auth.isAuthed()).toBe(false); + $httpBackend.whenGET(/partials\/.*\.html/).respond(200, ''); // Act $location.path('/reports'); @@ -295,8 +315,9 @@ describe('Routing', () => { it('should redirect to error when temporalToken parameter is invalid (already previous authenticated session)', () => { // Arrange - var { $location, $scope, auth, jwtHelper } = createContext(); + var { $location, $scope, auth, jwtHelper, $httpBackend } = createContext(); jwtHelper.isTokenExpired = () => false; + $httpBackend.whenGET(/partials\/.*\.html/).respond(200, ''); // set a real stored token auth.loginByToken('eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE0ODQ2MzAzMTgsImV4cCI6MTQ4NzIyMjMxOCwiaWF0IjoxNDg0NjMwMzE4LCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjM0NzUxIiwic3ViIjoxMDAzLCJ1bmlxdWVfbmFtZSI6ImFtb3NjaGluaUBtYWtpbmdzZW5zZS5jb20iLCJyZWxheV9hY2NvdW50cyI6WyJhbW9zY2hpbmktbWFraW5nc2Vuc2UiXSwicmVsYXlfdG9rZW5fdmVyc2lvbiI6IjEuMC4wLWJldGE1In0.dQh20ukVSCP0rNXMWBh2DlPQXbP0uTaYzadRDNPXECI9lvCsgDKNXc2bToXAUQDeXw90kbHliVF-kCueW4gQLPBtMJOcHQFv6LfgspsG2jue2iMwoBC1q6UB_4xFlGoyhkRjldnQUV0oqBTzhFdXuTvQz53kRPiqILCHkd4FLl4KliBgdaDRwWz-HIjJwinMpnv_7V38CNvHlHo-q2XU0MnE3CsGXmWGoAgzN7rbeQPgI9azHXpbaUPh9n_4zjCydOSBC5tx7MtEAx3ivfFYImBPp2T2vUM-F5AwRh7hl_lMUvyQLal0S_spoT0XMGy8YhnjxXLoZeVRisWbxBmucQ'); @@ -317,10 +338,11 @@ describe('Routing', () => { it('should redirect to error when temporalToken parameter is expired (no previous authenticated session)', () => { // Arrange - var { $location, $scope, auth, jwtHelper } = createContext(); + var { $location, $scope, auth, jwtHelper, $httpBackend } = createContext(); jwtHelper.isTokenExpired = () => true; expect(auth.getUserName()).toBe(null); expect(auth.isAuthed()).toBe(false); + $httpBackend.whenGET(/partials\/.*\.html/).respond(200, ''); // Act $location.path('/reports'); @@ -335,8 +357,9 @@ describe('Routing', () => { it('should redirect to error when temporalToken parameter is expired (already previous authenticated session)', () => { // Arrange - var { $location, $scope, auth, jwtHelper } = createContext(); + var { $location, $scope, auth, jwtHelper, $httpBackend } = createContext(); jwtHelper.isTokenExpired = () => true; + $httpBackend.whenGET(/partials\/.*\.html/).respond(200, ''); // set a real stored token auth.loginByToken('eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE0ODQ2MzAzMTgsImV4cCI6MTQ4NzIyMjMxOCwiaWF0IjoxNDg0NjMwMzE4LCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjM0NzUxIiwic3ViIjoxMDAzLCJ1bmlxdWVfbmFtZSI6ImFtb3NjaGluaUBtYWtpbmdzZW5zZS5jb20iLCJyZWxheV9hY2NvdW50cyI6WyJhbW9zY2hpbmktbWFraW5nc2Vuc2UiXSwicmVsYXlfdG9rZW5fdmVyc2lvbiI6IjEuMC4wLWJldGE1In0.dQh20ukVSCP0rNXMWBh2DlPQXbP0uTaYzadRDNPXECI9lvCsgDKNXc2bToXAUQDeXw90kbHliVF-kCueW4gQLPBtMJOcHQFv6LfgspsG2jue2iMwoBC1q6UB_4xFlGoyhkRjldnQUV0oqBTzhFdXuTvQz53kRPiqILCHkd4FLl4KliBgdaDRwWz-HIjJwinMpnv_7V38CNvHlHo-q2XU0MnE3CsGXmWGoAgzN7rbeQPgI9azHXpbaUPh9n_4zjCydOSBC5tx7MtEAx3ivfFYImBPp2T2vUM-F5AwRh7hl_lMUvyQLal0S_spoT0XMGy8YhnjxXLoZeVRisWbxBmucQ'); diff --git a/src/wwwroot/acceptanceTests/signup.spec.js b/src/wwwroot/acceptanceTests/signup.spec.js index 89f8690a..0c4cc59a 100644 --- a/src/wwwroot/acceptanceTests/signup.spec.js +++ b/src/wwwroot/acceptanceTests/signup.spec.js @@ -3,7 +3,16 @@ describe('Signup', () => { function createContext() { + localStorage.clear(); + module('dopplerRelay'); + + var mockClerkService = window.ClerkTestHelpers.createClerkMock(); + + module(function($provide) { + $provide.value('clerk', mockClerkService); + }); + var context; inject(function ($controller, $location, $rootScope, auth, $httpBackend, jwtHelper, signup) { @@ -62,8 +71,10 @@ describe('Signup', () => { it('should be error page when activation token (query string parameter) is not set', () => { // Arrange - var { $location, $httpBackend, $scope, createController } = createContext(); + var { $location, $httpBackend, $scope, createController, $httpBackend } = createContext(); + $httpBackend.whenGET(/partials\/.*\.html/).respond(200, ''); + $httpBackend.expect( 'GET', url => url.endsWith('/resources/industries.json') @@ -89,7 +100,9 @@ describe('Signup', () => { it('should log-off when an user is logged-in (when activation token is not set)', () => { // Arrange - var { $location, $scope, createController, auth } = createContext(); + var { $location, $scope, createController, auth, $httpBackend } = createContext(); + + $httpBackend.whenGET(/partials\/.*\.html/).respond(200, ''); auth.loginByToken("eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE0ODM2MjQ3NjAsImV4cCI6MTQ4NjIxNjc2MCwiaWF0IjoxNDgzNjI0NzYwLCJpc3MiOiJodHRwOi8vZG9wcGxlcnJlbGF5aW50Lm1ha2luZ3NlbnNlLmNvbTo4MDgwIiwic3ViIjo3MDAwMiwidW5pcXVlX25hbWUiOiJ1c2VybmFtZTJAZG9wcGxlcnJlbGF5LmNvbSIsInJlbGF5X2FjY291bnRzIjpbImFjY291bnQyIl0sInJlbGF5X3Rva2VuX3ZlcnNpb24iOiIxLjAuMC1iZXRhNSJ9.Ee2eb88xqZpkLUoX2AET2_SiDodzxCltFxaIVpJQ4DXtteXpt_1eB5WjEcV4t0KryrWLw4M0Yc_xRaXWYsXFMCBPwy53qpMzeNg39rEK70cYdlvNV_mLQz9Q0fesxYQPjWeNelg1GGrbiYtx5ljiLZStav-rouoHeye5uu9tAFVc8NVNIjmwuy87aWmH0oeuccNszrKjYndACno_K7Wna5JOQpXLsR6VZhcTeyUAaXvfGlhRPtZ2QQYrxW1APfXNCAcwtK8R07qoIKACvY-opH6xXdSl1fuhHDWzpeq7xWsiJswgtiCHkNiXOItOA5z-OQqnutQcZ4ReLuxuczhn7g"); expect(auth.isAuthed()).toBe(true); @@ -107,7 +120,9 @@ describe('Signup', () => { it('should not log-off when an user is logged-in and goes directly to the error page', () => { // Arrange - var { $location, $scope, createController, auth } = createContext(); + var { $location, $scope, createController, auth, $httpBackend } = createContext(); + + $httpBackend.whenGET(/partials\/.*\.html/).respond(200, ''); auth.loginByToken("eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE0ODM2MjQ3NjAsImV4cCI6MTQ4NjIxNjc2MCwiaWF0IjoxNDgzNjI0NzYwLCJpc3MiOiJodHRwOi8vZG9wcGxlcnJlbGF5aW50Lm1ha2luZ3NlbnNlLmNvbTo4MDgwIiwic3ViIjo3MDAwMiwidW5pcXVlX25hbWUiOiJ1c2VybmFtZTJAZG9wcGxlcnJlbGF5LmNvbSIsInJlbGF5X2FjY291bnRzIjpbImFjY291bnQyIl0sInJlbGF5X3Rva2VuX3ZlcnNpb24iOiIxLjAuMC1iZXRhNSJ9.Ee2eb88xqZpkLUoX2AET2_SiDodzxCltFxaIVpJQ4DXtteXpt_1eB5WjEcV4t0KryrWLw4M0Yc_xRaXWYsXFMCBPwy53qpMzeNg39rEK70cYdlvNV_mLQz9Q0fesxYQPjWeNelg1GGrbiYtx5ljiLZStav-rouoHeye5uu9tAFVc8NVNIjmwuy87aWmH0oeuccNszrKjYndACno_K7Wna5JOQpXLsR6VZhcTeyUAaXvfGlhRPtZ2QQYrxW1APfXNCAcwtK8R07qoIKACvY-opH6xXdSl1fuhHDWzpeq7xWsiJswgtiCHkNiXOItOA5z-OQqnutQcZ4ReLuxuczhn7g"); expect(auth.isAuthed()).toBe(true); @@ -124,7 +139,9 @@ describe('Signup', () => { it('should log-off when an user is logged-in (when activation token is set)', () => { // Arrange - var { $location, $httpBackend, $scope, createController, auth } = createContext(); + var { $location, $httpBackend, $scope, createController, auth, $httpBackend } = createContext(); + + $httpBackend.whenGET(/partials\/.*\.html/).respond(200, ''); $httpBackend.expect( 'GET', @@ -157,7 +174,9 @@ describe('Signup', () => { it('should be error page when activation token is not valid', () => { // Arrange - var { $location, $httpBackend, createController } = createContext(); + var { $location, $httpBackend, createController, $httpBackend } = createContext(); + + $httpBackend.whenGET(/partials\/.*\.html/).respond(200, ''); $httpBackend.expect( 'GET', @@ -189,7 +208,9 @@ describe('Signup', () => { it('should be error page when activation token is related to an already activated user', () => { // Arrange - var { $location, $httpBackend, createController } = createContext(); + var { $location, $httpBackend, createController, $httpBackend } = createContext(); + + $httpBackend.whenGET(/partials\/.*\.html/).respond(200, ''); $httpBackend.expect( 'GET', @@ -229,7 +250,9 @@ describe('Signup', () => { it('should be error page when activation token is not valid on creating key HTTP request', () => { // Arrange - var { $location, $httpBackend, createController } = createContext(); + var { $location, $httpBackend, createController, $httpBackend } = createContext(); + + $httpBackend.whenGET(/partials\/.*\.html/).respond(200, ''); $httpBackend.expect( 'GET', @@ -279,7 +302,9 @@ describe('Signup', () => { describe('result', () => { it('should have right values after successful requests', () => { // Arrange - var { $location, $httpBackend, createController } = createContext(); + var { $location, $httpBackend, createController, $httpBackend } = createContext(); + + $httpBackend.whenGET(/partials\/.*\.html/).respond(200, ''); var expected = { user_email: 'a@a.com', @@ -340,7 +365,9 @@ describe('Signup', () => { it('should have email as name when firstName is empty', () => { // Arrange - var { $location, $httpBackend, createController } = createContext(); + var { $location, $httpBackend, createController, $httpBackend } = createContext(); + + $httpBackend.whenGET(/partials\/.*\.html/).respond(200, ''); var expected = { user_email: 'a@a.com', @@ -397,7 +424,9 @@ describe('Signup', () => { it('should have error message when there is an unexpected error verifying activation token', () => { // Arrange - var { $location, $httpBackend, createController, errors } = createContext(); + var { $location, $httpBackend, createController, errors, $httpBackend } = createContext(); + + $httpBackend.whenGET(/partials\/.*\.html/).respond(200, ''); $httpBackend.expect( 'GET', @@ -434,9 +463,11 @@ describe('Signup', () => { describe('initial status', () => { it('should show the registration page correctly', () => { // Arrange - var { $location, $scope, auth, jwtHelper } = createContext(); + var { $location, $scope, auth, jwtHelper, $httpBackend } = createContext(); expect(auth.isAuthed()).toBe(false); + $httpBackend.whenGET(/partials\/.*\.html/).respond(200, ''); + // Act $location.path('/signup/registration'); $scope.$apply(); // To run app.js code @@ -492,6 +523,16 @@ describe('Signup', () => { jwtHelper.isTokenExpired = () => false; var form = {}; + $httpBackend.whenGET(/partials\/.*\.html/).respond(200, ''); + + $httpBackend.whenGET( + url => url.endsWith('/resources/industries.json') + ).respond(200, []); + + $httpBackend.whenGET( + url => url.endsWith('/resources/countries.json') + ).respond(200, []); + $httpBackend.expect( 'POST', url => url.endsWith('/user/registration?lang=en') @@ -514,7 +555,6 @@ describe('Signup', () => { // Assert $httpBackend.verifyNoOutstandingExpectation(); - $httpBackend.verifyNoOutstandingRequest(); expect($location.path()).toBe('/signup/registration'); expect(controller.emailRegistered).toBe(null); }); @@ -525,6 +565,16 @@ describe('Signup', () => { jwtHelper.isTokenExpired = () => false; var form = prepareForm($scope, [ 'accountName', 'email' ]); + $httpBackend.whenGET(/partials\/.*\.html/).respond(200, ''); + + $httpBackend.whenGET( + url => url.endsWith('/resources/industries.json') + ).respond(200, []); + + $httpBackend.whenGET( + url => url.endsWith('/resources/countries.json') + ).respond(200, []); + $httpBackend.expect( 'POST', url => url.endsWith('/user/registration?lang=en'), @@ -558,7 +608,6 @@ describe('Signup', () => { // Assert $httpBackend.verifyNoOutstandingExpectation(); - $httpBackend.verifyNoOutstandingRequest(); expect($location.path()).toBe('/signup/registration'); expect(controller.emailRegistered).toBe(null); expect(form.accountName.$error.accountname_already_taken).toBeFalsy(); @@ -571,6 +620,16 @@ describe('Signup', () => { jwtHelper.isTokenExpired = () => false; var form = prepareForm($scope, [ 'accountName', 'email' ]); + $httpBackend.whenGET(/partials\/.*\.html/).respond(200, ''); + + $httpBackend.whenGET( + url => url.endsWith('/resources/industries.json') + ).respond(200, []); + + $httpBackend.whenGET( + url => url.endsWith('/resources/countries.json') + ).respond(200, []); + $httpBackend.expect( 'POST', url => url.endsWith('/user/registration?lang=en'), @@ -604,7 +663,6 @@ describe('Signup', () => { // Assert $httpBackend.verifyNoOutstandingExpectation(); - $httpBackend.verifyNoOutstandingRequest(); expect($location.path()).toBe('/signup/registration'); expect(controller.emailRegistered).toBe(null); expect(form.accountName.$error.accountname_already_taken).toBe(true); @@ -617,6 +675,16 @@ describe('Signup', () => { jwtHelper.isTokenExpired = () => false; var form = prepareForm($scope, [ 'accountName', 'email' ]); + $httpBackend.whenGET(/partials\/.*\.html/).respond(200, ''); + + $httpBackend.whenGET( + url => url.endsWith('/resources/industries.json') + ).respond(200, []); + + $httpBackend.whenGET( + url => url.endsWith('/resources/countries.json') + ).respond(200, []); + $httpBackend.expect( 'POST', url => url.endsWith('/user/registration?lang=en'), @@ -651,7 +719,6 @@ describe('Signup', () => { // Assert $httpBackend.verifyNoOutstandingExpectation(); - $httpBackend.verifyNoOutstandingRequest(); expect($location.path()).toBe('/signup/registration'); expect(controller.emailRegistered).toBe(null); expect(form.accountName.$error.accountname_already_taken).toBe(true); diff --git a/src/wwwroot/services/authService.spec.js b/src/wwwroot/services/authService.spec.js index 72f4ce3f..21d183dc 100644 --- a/src/wwwroot/services/authService.spec.js +++ b/src/wwwroot/services/authService.spec.js @@ -1,13 +1,21 @@ 'use strict'; describe('authService', () => { + var authService; + var mockClerkService; beforeEach(() => { // Ugly patch, localStorage should be cleaned before initialize module localStorage.clear(); + + mockClerkService = window.ClerkTestHelpers.createClerkMock(); + module('dopplerRelay'); + + module(function($provide) { + $provide.value('clerk', mockClerkService); + }); }); - var authService; beforeEach(() => { inject((_auth_) => { diff --git a/src/wwwroot/services/settings.spec.js b/src/wwwroot/services/settings.spec.js index 5a07c952..f50cebe8 100644 --- a/src/wwwroot/services/settings.spec.js +++ b/src/wwwroot/services/settings.spec.js @@ -117,6 +117,13 @@ describe('settingsService', () => { function createContext() { module('dopplerRelay'); + + var mockClerkService = window.ClerkTestHelpers.createClerkMock(); + + module(function($provide) { + $provide.value('clerk', mockClerkService); + }); + var context; inject((settings, $httpBackend, $rootScope) => { $rootScope.addError = () => { }; @@ -134,6 +141,8 @@ describe('settingsService', () => { it('should query only one time when two calls are done', () => { var { settings, $httpBackend } = createContext(); + $httpBackend.whenGET(/partials\/.*\.html/).respond(200, ''); + $httpBackend.expect( 'GET', url => url.endsWith('/plans') @@ -144,12 +153,13 @@ describe('settingsService', () => { $httpBackend.flush(); $httpBackend.verifyNoOutstandingExpectation(); - $httpBackend.verifyNoOutstandingRequest(); }); it('should query return the same result in the second call', () => { var { settings, $httpBackend } = createContext(); + $httpBackend.whenGET(/partials\/.*\.html/).respond(200, ''); + $httpBackend.when( 'GET', url => url.endsWith('/plans') @@ -172,6 +182,8 @@ describe('settingsService', () => { it('should query again after an error', () => { var { settings, $httpBackend } = createContext(); + $httpBackend.whenGET(/partials\/.*\.html/).respond(200, ''); + $httpBackend.expect( 'GET', url => url.endsWith('/plans') @@ -187,9 +199,8 @@ describe('settingsService', () => { var result2; settings.getPlansAvailable().then(result => result2 = result); $httpBackend.flush(); - + $httpBackend.verifyNoOutstandingExpectation(); - $httpBackend.verifyNoOutstandingRequest(); expect(result1).not.toBeDefined(); expect(result2).not.toBeNull(); diff --git a/src/wwwroot/services/utilsService.spec.js b/src/wwwroot/services/utilsService.spec.js index 09d5cf27..7a973631 100644 --- a/src/wwwroot/services/utilsService.spec.js +++ b/src/wwwroot/services/utilsService.spec.js @@ -4,6 +4,12 @@ describe('utilsService', () => { beforeEach(() => { module('dopplerRelay'); + + var mockClerkService = window.ClerkTestHelpers.createClerkMock(); + + module(function($provide) { + $provide.value('clerk', mockClerkService); + }); }); var utilsService; diff --git a/src/wwwroot/test-helpers/clerk-mock.js b/src/wwwroot/test-helpers/clerk-mock.js new file mode 100644 index 00000000..8cb7ad94 --- /dev/null +++ b/src/wwwroot/test-helpers/clerk-mock.js @@ -0,0 +1,54 @@ +'use strict'; + +window.ClerkTestHelpers = { + /** + * Creates a mock clerk service with configurable return values + * @param {Object} overrides - Object with methods to override and their return values + * @returns {Object} Mock clerk service + */ + createClerkMock: function(overrides) { + overrides = overrides || {}; + + var defaults = { + isAuthenticated: Promise.resolve(false), + getToken: Promise.resolve('mock-token'), + login: Promise.resolve({ authenticated: false }), + logout: Promise.resolve(), + signUp: Promise.resolve({ registered: true }), + verifyOtp: Promise.resolve({ verified: true }), + resendOtp: Promise.resolve({ sent: true }), + mountUserButton: Promise.resolve() + }; + + var mock = {}; + + for (var method in defaults) { + var returnValue = overrides.hasOwnProperty(method) ? overrides[method] : defaults[method]; + mock[method] = jasmine.createSpy(method).and.returnValue(returnValue); + } + + return mock; + }, + + /** + * Creates a mock for window.Clerk object (for integration tests that need the global object) + * @returns {Object} Mock window.Clerk object + */ + createWindowClerkMock: function() { + return { + load: jasmine.createSpy('load').and.returnValue(Promise.resolve({ + client: { + signIn: {}, + signUp: {} + }, + session: { + getToken: jasmine.createSpy('getToken').and.returnValue(Promise.resolve('mock-token')), + status: 'inactive' + } + })), + localizations: { + es: {} + } + }; + } +};