Commit d04a87e2560d17b95736118bc9f6439473344313
1 parent
12de4066
Exists in
master
and in
1 other branch
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 | 52 | .pipe($.sourcemaps.init()) |
| 53 | 53 | .pipe($.ngAnnotate()) |
| 54 | 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 | 56 | .pipe($.sourcemaps.write('maps')) |
| 57 | 57 | .pipe(jsFilter.restore) |
| 58 | 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 | 2 | import {BodyStateClassesService} from "./body-state-classes.service"; |
| 3 | 3 | import {AuthService} from "./../../login/auth.service"; |
| 4 | +import {AUTH_EVENTS} from "./../../login/auth-events"; | |
| 4 | 5 | |
| 5 | 6 | describe("BodyStateClasses Service", () => { |
| 6 | 7 | let currentStateName = "main"; |
| ... | ... | @@ -12,16 +13,22 @@ describe("BodyStateClasses Service", () => { |
| 12 | 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 | 21 | let getService = (): BodyStateClassesService => { |
| 22 | 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 | 32 | it("should add the class noosfero-user-logged to the body element if the user is authenticated", () => { |
| 26 | 33 | authService.isAuthenticated = jasmine.createSpy("isAuthenticated").and.returnValue(true); |
| 27 | 34 | $rootScope.$on = jasmine.createSpy("$on"); |
| ... | ... | @@ -50,14 +57,78 @@ describe("BodyStateClasses Service", () => { |
| 50 | 57 | }); |
| 51 | 58 | |
| 52 | 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 | 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 | 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 | 17 | @Inject("$rootScope", "$document", "$state", AuthService) |
| 18 | 18 | export class BodyStateClassesService { |
| 19 | 19 | |
| 20 | + private started: boolean = false; | |
| 21 | + | |
| 20 | 22 | public static get USER_LOGGED_CLASSNAME(): string { return "noosfero-user-logged"; } |
| 21 | 23 | public static get ROUTE_STATE_CLASSNAME_PREFIX(): string { return "noosfero-route-"; } |
| 22 | 24 | |
| ... | ... | @@ -32,18 +34,21 @@ export class BodyStateClassesService { |
| 32 | 34 | } |
| 33 | 35 | |
| 34 | 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 | 45 | let self = this; |
| 41 | 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 | 52 | HtmlUtils.removeCssClassByPrefix(bodyElement[0], BodyStateClassesService.ROUTE_STATE_CLASSNAME_PREFIX); |
| 48 | 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 | 9 | class ScopeWithEvents { |
| 3 | 10 | listeners = {}; |
| ... | ... | @@ -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 | 25 | if ((<any>this.listeners)[message]) { |
| 19 | - console.log("LISTENERS:", (<any>this.listeners)[message]); | |
| 26 | + log("LISTENERS:", (<any>this.listeners)[message]); | |
| 20 | 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 | 33 | export var mocks = { |
| 27 | - scopeWithEvents: new ScopeWithEvents(), | |
| 34 | + scopeWithEvents: (): ScopeWithEvents => new ScopeWithEvents(), | |
| 28 | 35 | modalInstance: { |
| 29 | 36 | close: () => { } |
| 30 | 37 | }, | ... | ... |