Commit d04a87e2560d17b95736118bc9f6439473344313
1 parent
12de4066
Exists in
master
and in
30 other branches
added tests for body state classes service
Showing
4 changed files
with
104 additions
and
21 deletions
Show diff stats
gulp/build.js
| @@ -52,7 +52,7 @@ gulp.task('html', ['inject', 'partials'], function () { | @@ -52,7 +52,7 @@ gulp.task('html', ['inject', 'partials'], function () { | ||
| 52 | .pipe($.sourcemaps.init()) | 52 | .pipe($.sourcemaps.init()) |
| 53 | .pipe($.ngAnnotate()) | 53 | .pipe($.ngAnnotate()) |
| 54 | // TODO - check how to make uglify work with ngforward | 54 | // TODO - check how to make uglify work with ngforward |
| 55 | - .pipe($.uglify({ preserveComments: $.uglifySaveLicense, mangle: true, output: { beautify: false} })).on('error', conf.errorHandler('Uglify')) | 55 | + .pipe($.uglify({ preserveComments: $.uglifySaveLicense, mangle: false, output: { beautify: false} })).on('error', conf.errorHandler('Uglify')) |
| 56 | .pipe($.sourcemaps.write('maps')) | 56 | .pipe($.sourcemaps.write('maps')) |
| 57 | .pipe(jsFilter.restore) | 57 | .pipe(jsFilter.restore) |
| 58 | .pipe(cssFilter) | 58 | .pipe(cssFilter) |
src/app/layout/services/body-state-classes.service.spec.ts
| 1 | -import {provideFilters} from '../../../spec/helpers'; | 1 | +import * as helpers from '../../../spec/helpers'; |
| 2 | import {BodyStateClassesService} from "./body-state-classes.service"; | 2 | import {BodyStateClassesService} from "./body-state-classes.service"; |
| 3 | import {AuthService} from "./../../login/auth.service"; | 3 | import {AuthService} from "./../../login/auth.service"; |
| 4 | +import {AUTH_EVENTS} from "./../../login/auth-events"; | ||
| 4 | 5 | ||
| 5 | describe("BodyStateClasses Service", () => { | 6 | describe("BodyStateClasses Service", () => { |
| 6 | let currentStateName = "main"; | 7 | let currentStateName = "main"; |
| @@ -12,16 +13,22 @@ describe("BodyStateClasses Service", () => { | @@ -12,16 +13,22 @@ describe("BodyStateClasses Service", () => { | ||
| 12 | name: currentStateName | 13 | name: currentStateName |
| 13 | } | 14 | } |
| 14 | }, | 15 | }, |
| 15 | - authService: AuthService = <any>{ | ||
| 16 | - isAuthenticated: () => false | ||
| 17 | - }, | ||
| 18 | - bodyEl: { className: string } = { className: "" }, | ||
| 19 | - bodyElJq: any = [bodyEl]; | 16 | + authService: AuthService, |
| 17 | + bodyEl: { className: string }, | ||
| 18 | + bodyElJq: any; | ||
| 19 | + | ||
| 20 | 20 | ||
| 21 | let getService = (): BodyStateClassesService => { | 21 | let getService = (): BodyStateClassesService => { |
| 22 | return new BodyStateClassesService($rootScope, $document, $state, authService); | 22 | return new BodyStateClassesService($rootScope, $document, $state, authService); |
| 23 | }; | 23 | }; |
| 24 | 24 | ||
| 25 | + beforeEach(() => { | ||
| 26 | + authService = <any>{}; | ||
| 27 | + authService.isAuthenticated = jasmine.createSpy("isAuthenticated").and.returnValue(true); | ||
| 28 | + bodyEl = { className: "" }; | ||
| 29 | + bodyElJq = [bodyEl]; | ||
| 30 | + }); | ||
| 31 | + | ||
| 25 | it("should add the class noosfero-user-logged to the body element if the user is authenticated", () => { | 32 | it("should add the class noosfero-user-logged to the body element if the user is authenticated", () => { |
| 26 | authService.isAuthenticated = jasmine.createSpy("isAuthenticated").and.returnValue(true); | 33 | authService.isAuthenticated = jasmine.createSpy("isAuthenticated").and.returnValue(true); |
| 27 | $rootScope.$on = jasmine.createSpy("$on"); | 34 | $rootScope.$on = jasmine.createSpy("$on"); |
| @@ -50,14 +57,78 @@ describe("BodyStateClasses Service", () => { | @@ -50,14 +57,78 @@ describe("BodyStateClasses Service", () => { | ||
| 50 | }); | 57 | }); |
| 51 | 58 | ||
| 52 | it("should capture loginSuccess event and add noosfero-user-logged class to the body element", () => { | 59 | it("should capture loginSuccess event and add noosfero-user-logged class to the body element", () => { |
| 53 | - pending("Test not yet implemented!"); | 60 | + let userLoggedClassName = BodyStateClassesService.USER_LOGGED_CLASSNAME; |
| 61 | + $rootScope = <any>helpers.mocks.scopeWithEvents(); | ||
| 62 | + bodyElJq.addClass = jasmine.createSpy("addClass"); | ||
| 63 | + authService.isAuthenticated = jasmine.createSpy("isAuthenticated").and.returnValue(false); | ||
| 64 | + let service = getService(); | ||
| 65 | + | ||
| 66 | + service["bodyElement"] = bodyElJq; | ||
| 67 | + | ||
| 68 | + // triggers the service start | ||
| 69 | + service.start(); | ||
| 70 | + // check if the the body element addClass was not called yet, | ||
| 71 | + // because the user is not authenticated | ||
| 72 | + expect(bodyElJq.addClass).not.toHaveBeenCalledWith(userLoggedClassName); | ||
| 73 | + | ||
| 74 | + // emit the event loginSuccess | ||
| 75 | + $rootScope.$emit(AUTH_EVENTS.loginSuccess); | ||
| 76 | + | ||
| 77 | + // and check now if the addClass was called passing the userLogged class | ||
| 78 | + // to the body Element | ||
| 79 | + expect(bodyElJq.addClass).toHaveBeenCalledWith(userLoggedClassName); | ||
| 54 | }); | 80 | }); |
| 55 | 81 | ||
| 56 | - it("should capture logoutSuccess event and remove noosfero-user-logged class to the body element", () => { | ||
| 57 | - pending("Test not yet implemented!"); | 82 | + it("should capture logoutSuccess event and remove noosfero-user-logged class from the body element", () => { |
| 83 | + let userLoggedClassName = BodyStateClassesService.USER_LOGGED_CLASSNAME; | ||
| 84 | + | ||
| 85 | + authService.isAuthenticated = jasmine.createSpy("isAuthenticated").and.returnValue(true); | ||
| 86 | + $rootScope = <any>helpers.mocks.scopeWithEvents(); | ||
| 87 | + | ||
| 88 | + bodyElJq.addClass = jasmine.createSpy("addClass"); | ||
| 89 | + bodyElJq.removeClass = jasmine.createSpy("removeClass"); | ||
| 90 | + | ||
| 91 | + let service = getService(); | ||
| 92 | + service["bodyElement"] = bodyElJq; | ||
| 93 | + | ||
| 94 | + // triggers the service start | ||
| 95 | + service.start(); | ||
| 96 | + | ||
| 97 | + // check if the the body element addClass was called | ||
| 98 | + // because the user is already authenticated | ||
| 99 | + expect(bodyElJq.addClass).toHaveBeenCalledWith(userLoggedClassName); | ||
| 100 | + | ||
| 101 | + // emit the event logoutSuccess | ||
| 102 | + $rootScope.$emit(AUTH_EVENTS.logoutSuccess); | ||
| 103 | + | ||
| 104 | + // and check now if the removeClass was called passing the userLogged class | ||
| 105 | + // to the body Element | ||
| 106 | + expect(bodyElJq.removeClass).toHaveBeenCalledWith(userLoggedClassName); | ||
| 58 | }); | 107 | }); |
| 59 | 108 | ||
| 60 | it("should capture $stateChangeSuccess event and switch route class in the body element", () => { | 109 | it("should capture $stateChangeSuccess event and switch route class in the body element", () => { |
| 61 | - pending("Test not yet implemented!"); | 110 | + let userLoggedClassName = BodyStateClassesService.USER_LOGGED_CLASSNAME; |
| 111 | + | ||
| 112 | + authService.isAuthenticated = jasmine.createSpy("isAuthenticated").and.returnValue(false); | ||
| 113 | + $rootScope = <any>helpers.mocks.scopeWithEvents(); | ||
| 114 | + bodyElJq.addClass = (className: string) => { | ||
| 115 | + bodyEl.className = className; | ||
| 116 | + } | ||
| 117 | + bodyElJq.removeClass = jasmine.createSpy("removeClass"); | ||
| 118 | + | ||
| 119 | + let service = getService(); | ||
| 120 | + service["bodyElement"] = bodyElJq; | ||
| 121 | + | ||
| 122 | + // triggers the service start | ||
| 123 | + service.start(); | ||
| 124 | + | ||
| 125 | + // checks if the bodyEl has a class indicating the currentState | ||
| 126 | + expect(bodyEl.className).toEqual(BodyStateClassesService.ROUTE_STATE_CLASSNAME_PREFIX + currentStateName); | ||
| 127 | + | ||
| 128 | + // emit the event $stateChangeSuccess | ||
| 129 | + $rootScope.$emit("$stateChangeSuccess", null, {name: "new-route"}); | ||
| 130 | + | ||
| 131 | + // and check now if the bodyEl has a class indicating the new state route | ||
| 132 | + expect(bodyEl.className).toEqual(BodyStateClassesService.ROUTE_STATE_CLASSNAME_PREFIX + "new-route"); | ||
| 62 | }); | 133 | }); |
| 63 | }); | 134 | }); |
| 64 | \ No newline at end of file | 135 | \ No newline at end of file |
src/app/layout/services/body-state-classes.service.ts
| @@ -17,6 +17,8 @@ import {HtmlUtils} from "../html-utils"; | @@ -17,6 +17,8 @@ import {HtmlUtils} from "../html-utils"; | ||
| 17 | @Inject("$rootScope", "$document", "$state", AuthService) | 17 | @Inject("$rootScope", "$document", "$state", AuthService) |
| 18 | export class BodyStateClassesService { | 18 | export class BodyStateClassesService { |
| 19 | 19 | ||
| 20 | + private started: boolean = false; | ||
| 21 | + | ||
| 20 | public static get USER_LOGGED_CLASSNAME(): string { return "noosfero-user-logged"; } | 22 | public static get USER_LOGGED_CLASSNAME(): string { return "noosfero-user-logged"; } |
| 21 | public static get ROUTE_STATE_CLASSNAME_PREFIX(): string { return "noosfero-route-"; } | 23 | public static get ROUTE_STATE_CLASSNAME_PREFIX(): string { return "noosfero-route-"; } |
| 22 | 24 | ||
| @@ -32,18 +34,21 @@ export class BodyStateClassesService { | @@ -32,18 +34,21 @@ export class BodyStateClassesService { | ||
| 32 | } | 34 | } |
| 33 | 35 | ||
| 34 | start() { | 36 | start() { |
| 35 | - this.setupUserLoggedClassToggle(); | ||
| 36 | - this.setupStateClassToggle(); | 37 | + if (!this.started) { |
| 38 | + this.setupUserLoggedClassToggle(); | ||
| 39 | + this.setupStateClassToggle(); | ||
| 40 | + this.started = true; | ||
| 41 | + } | ||
| 37 | } | 42 | } |
| 38 | 43 | ||
| 39 | - getStateChangeSuccessHandlerFunction(bodyElement: ng.IAugmentedJQuery): (event: ng.IAngularEvent, toState: ng.ui.IState) => void { | 44 | + private getStateChangeSuccessHandlerFunction(bodyElement: ng.IAugmentedJQuery): (event: ng.IAngularEvent, toState: ng.ui.IState) => void { |
| 40 | let self = this; | 45 | let self = this; |
| 41 | return (event: ng.IAngularEvent, toState: ng.ui.IState) => { | 46 | return (event: ng.IAngularEvent, toState: ng.ui.IState) => { |
| 42 | - self.switchStateClasses(bodyElement, BodyStateClassesService.ROUTE_STATE_CLASSNAME_PREFIX); | 47 | + self.switchStateClasses(bodyElement, toState); |
| 43 | }; | 48 | }; |
| 44 | } | 49 | } |
| 45 | 50 | ||
| 46 | - switchStateClasses(bodyElement: ng.IAugmentedJQuery, state: ng.ui.IState) { | 51 | + private switchStateClasses(bodyElement: ng.IAugmentedJQuery, state: ng.ui.IState) { |
| 47 | HtmlUtils.removeCssClassByPrefix(bodyElement[0], BodyStateClassesService.ROUTE_STATE_CLASSNAME_PREFIX); | 52 | HtmlUtils.removeCssClassByPrefix(bodyElement[0], BodyStateClassesService.ROUTE_STATE_CLASSNAME_PREFIX); |
| 48 | bodyElement.addClass(BodyStateClassesService.ROUTE_STATE_CLASSNAME_PREFIX + state.name); | 53 | bodyElement.addClass(BodyStateClassesService.ROUTE_STATE_CLASSNAME_PREFIX + state.name); |
| 49 | } | 54 | } |
src/spec/mocks.ts
| 1 | +const DEBUG = false; | ||
| 2 | + | ||
| 3 | +let log = (message: string, ...args: any[]) => { | ||
| 4 | + if (DEBUG) { | ||
| 5 | + console.log(message); | ||
| 6 | + } | ||
| 7 | +}; | ||
| 1 | 8 | ||
| 2 | class ScopeWithEvents { | 9 | class ScopeWithEvents { |
| 3 | listeners = {}; | 10 | listeners = {}; |
| @@ -13,18 +20,18 @@ class ScopeWithEvents { | @@ -13,18 +20,18 @@ class ScopeWithEvents { | ||
| 13 | } | 20 | } |
| 14 | } | 21 | } |
| 15 | 22 | ||
| 16 | - public $emit(message: string, arg?: any) { | ||
| 17 | - console.log("Emitted " + message); | 23 | + public $emit(message: string, ...args: any[]) { |
| 24 | + log("Emitted " + message); | ||
| 18 | if ((<any>this.listeners)[message]) { | 25 | if ((<any>this.listeners)[message]) { |
| 19 | - console.log("LISTENERS:", (<any>this.listeners)[message]); | 26 | + log("LISTENERS:", (<any>this.listeners)[message]); |
| 20 | (<any>this.listeners)[message].forEach((f: Function) => { | 27 | (<any>this.listeners)[message].forEach((f: Function) => { |
| 21 | - f(arg); | 28 | + f.apply(this, args); |
| 22 | }); | 29 | }); |
| 23 | } | 30 | } |
| 24 | } | 31 | } |
| 25 | } | 32 | } |
| 26 | export var mocks = { | 33 | export var mocks = { |
| 27 | - scopeWithEvents: new ScopeWithEvents(), | 34 | + scopeWithEvents: (): ScopeWithEvents => new ScopeWithEvents(), |
| 28 | modalInstance: { | 35 | modalInstance: { |
| 29 | close: () => { } | 36 | close: () => { } |
| 30 | }, | 37 | }, |