OK-487 FE Unittest anpassen
diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts
index 5aaaddb..ab3bc79 100644
--- a/src/app/app.component.spec.ts
+++ b/src/app/app.component.spec.ts
@@ -1,30 +1,116 @@
 /* tslint:disable:no-unused-variable */
 
 import { TestBed, async } from '@angular/core/testing';
+import { MockComponent } from './testing/mock.component';
 import { AppComponent } from './app.component';
+import { Http, Response } from '@angular/http';
+import { Router, ActivatedRoute } from '@angular/router';
+import { BaseDataLoaderService } from './services/jobs/base-data-loader.service';
+import { HttpResponseInterceptorService } from './services/http-response-interceptor.service';
+import { SessionContext } from './common/session-context';
+import { MessageService } from './services/message.service';
+import { ReminderCallerJobService } from './services/jobs/reminder-caller-job.service';
+import { ImportFileCallerService } from './services/jobs/import-file-caller.service';
+import { AbstractMockObservableService } from './common/abstract-mock-observable.service';
+
+class FakeRouter {
+  navigate(commands: any[]) {
+    return commands[0];
+  }
+}
+
+class MockHttp extends AbstractMockObservableService {
+  get() {
+    return this;
+  }
+}
+
+class MockHttpRes {
+  public content: any;
+  json() { return this.content; }
+}
 
 describe('AppComponent', () => {
+  let router: Router;
+  const mockService = new MockHttp();
+  let sessionContext: SessionContext;
+
   beforeEach(() => {
+    router = new FakeRouter() as any as Router;
+    sessionContext = new SessionContext();    
+
     TestBed.configureTestingModule({
       declarations: [
-        AppComponent
+        AppComponent,
+        MockComponent({selector: 'app-main-navigation'}),
+        MockComponent({selector: 'app-message-banner'}),
+        MockComponent({selector: 'router-outlet'})
       ],
+      providers: [
+        { provide: Http, useValue: mockService },
+        { provide: Router, useValue: router },
+        { provide: BaseDataLoaderService, useValue: {} },
+        { provide: ActivatedRoute },    
+        { provide: HttpResponseInterceptorService },    
+        { provide: SessionContext, useValue: sessionContext },
+        { provide: MessageService },
+        { provide: ReminderCallerJobService },
+        { provide: ImportFileCallerService }
+      ],      
     });
     TestBed.compileComponents();
+
+    const httpRes = new MockHttpRes();
+    httpRes.content = {};
+    mockService.content = httpRes;
+    
+
   });
-/*
+
+  
+
   it('should create the app', async(() => {
-    const fixture = TestBed.createComponent(AppComponent);
+    const fixture = TestBed.createComponent(AppComponent);    
     const app = fixture.debugElement.componentInstance;
     expect(app).toBeTruthy();
   }));
 
-  it(`should have as title 'app works!'`, async(() => {
-    const fixture = TestBed.createComponent(AppComponent);
+ 
+  it('should extract the user data from the JWT-AccessToken', async(() => {
+    const fixture = TestBed.createComponent(AppComponent);    
     const app = fixture.debugElement.componentInstance;
-    expect(app.title).toEqual('app works!');
+
+    const accessToken = 'eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJodVl0e' +
+      'VByUEVLQ1phY3FfMW5sOGZscENETnFHdmZEZHctYUxGQXNoWHZVIn0.eyJqdGkiOiI4ZmY5NTlhZC' +
+      '02ODQ1LTRlOGEtYjRiYi02ODQ0YjAwMjU0ZjgiLCJleHAiOjE1MDY2MDA0NTAsIm5iZiI6MCwiaWF' +
+      '0IjoxNTA2NjAwMTUwLCJpc3MiOiJodHRwOi8vZW50amF2YTAwMjo4MDgwL2F1dGgvcmVhbG1zL2Vs' +
+      'b2dib29rIiwiYXVkIjoiZWxvZ2Jvb2stYmFja2VuZCIsInN1YiI6IjM1OWVmOWM5LTc3ZGYtNGEzZ' +
+      'C1hOWM5LWY5NmQ4MzdkMmQ1NyIsInR5cCI6IkJlYXJlciIsImF6cCI6ImVsb2dib29rLWJhY2tlbm' +
+      'QiLCJhdXRoX3RpbWUiOjAsInNlc3Npb25fc3RhdGUiOiI5NjVmNzM1MS0yZThiLTQ1MjgtOWYzZC1' +
+      'lZTYyODNhOTViMTYiLCJhY3IiOiIxIiwiYWxsb3dlZC1vcmlnaW5zIjpbIioiXSwicmVhbG1fYWNj' +
+      'ZXNzIjp7InJvbGVzIjpbImVsb2dib29rLXN1cGVydXNlciIsImVsb2dib29rLW5vcm1hbHVzZXIiL' +
+      'CJ1bWFfYXV0aG9yaXphdGlvbiJdfSwicmVzb3VyY2VfYWNjZXNzIjp7InJlYWxtLW1hbmFnZW1lbn' +
+      'QiOnsicm9sZXMiOlsidmlldy11c2VycyIsInF1ZXJ5LWdyb3VwcyIsInF1ZXJ5LXVzZXJzIl19LCJ' +
+      'hY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3Mi' +
+      'LCJ2aWV3LXByb2ZpbGUiXX19LCJuYW1lIjoiQWRtaW5pc3RyYXRvciBBZG1pbmlzdHJhdG93aWNoI' +
+      'iwicHJlZmVycmVkX3VzZXJuYW1lIjoiYWRtaW4iLCJnaXZlbl9uYW1lIjoiQWRtaW5pc3RyYXRvci' +
+      'IsImZhbWlseV9uYW1lIjoiQWRtaW5pc3RyYXRvd2ljaCIsImVtYWlsIjoic2VyZ2VqLmtlcm5AcHRh' +
+      'LmRlIiwicm9sZXN0ZXN0IjoiW2Vsb2dib29rLXN1cGVydXNlciwgZWxvZ2Jvb2stbm9ybWFsdXNlc' +
+      'iwgdW1hX2F1dGhvcml6YXRpb24sIG9mZmxpbmVfYWNjZXNzLCB1bWFfYXV0aG9yaXphdGlvbiwgZW' +
+      'xvZ2Jvb2stbm9ybWFsdXNlcl0ifQ.o94Bl43oqyLNzZRABvIq9z-XI8JQjqj2FSDdUUEZGZPTN4uw' +
+      'D5fyi0sONbDxmTFvgWPh_8ZhX6tlDGiupVDBY4eRH43Eettm-t4CDauL7FzB3w3dDPFMB5DhP4rrp' +
+      'k_kATwnY2NKLRbequnh8Z6wLXjcmQNLgrgknXB_gogWAqH29dqKexwceMNIbq-kjaeLsmHSXM9TE9' +
+      'q7_Ln9el04OlkpOVspVguedfINcNFg0DmYLJWyD2ORkOHLmYigN6YnyB9P2NFOnKGlLuQ87GjosI0' +
+      '0zBniRGi3PhE9NGd51Qggdbcsm0aM8GiMaZ7SO5i8iQWL10TRFRFyTEfy6hSO8g';
+
+      const incognito: any = app;
+      incognito.processAccessToken( accessToken );
+
+      expect( sessionContext.getCurrUser().name).toBe('Administrator Administratowich');
+      expect( sessionContext.getAccessToken()).toBe( accessToken );
   }));
 
+  /*
   it('should render title in a h1 tag', async(() => {
     const fixture = TestBed.createComponent(AppComponent);
     fixture.detectChanges();
diff --git a/src/app/app.component.ts b/src/app/app.component.ts
index 84d5334..3456c3c 100644
--- a/src/app/app.component.ts
+++ b/src/app/app.component.ts
@@ -48,6 +48,31 @@
     this.extractTokenFromParameters();
   }
 
+  private processAccessToken( accessToken: string ) {
+    const jwtHelper: JwtHelper = new JwtHelper();
+    const decoded: any = jwtHelper.decodeToken(accessToken);
+    const user: User = new User();      
+    user.id = decoded.sub;
+    user.username = decoded.preferred_username;
+    user.itemName = decoded.preferred_username;
+    let firstName = decoded.given_name;       
+    if (!firstName) {
+      firstName = '';        
+    }
+    let lastName = decoded.family_name;       
+    if (!lastName) {
+      lastName = '';        
+    }        
+
+    user.name = firstName + ' ' + lastName;
+
+    if (decoded.realm_access.roles.filter(s => s === Globals.OAUTH2CONF_SUPERUSER_ROLE).length >= 1) {
+      user.specialUser = true;
+    }
+
+    this.sessionContext.setCurrUser(user);
+    this.sessionContext.setAccessToken(accessToken);
+}
 
   /**
    * Extract the params (suscribe to router event) and store them in the sessionContext.
@@ -55,31 +80,9 @@
   private extractTokenFromParameters() {
     this.activatedRoute.params.subscribe((params: Params) => {
       const accessToken = this.getParametersFromUrl();
-      if (accessToken) {
-        const jwtHelper: JwtHelper = new JwtHelper();
-        const decoded: any = jwtHelper.decodeToken(accessToken);
-        const user: User = new User();      
-        user.id = decoded.sub;
-        user.username = decoded.preferred_username;
-        user.itemName = decoded.preferred_username;
-        let firstName = decoded.given_name;       
-        if (!firstName) {
-          firstName = '';        
-        }
-        let lastName = decoded.family_name;       
-        if (!lastName) {
-          lastName = '';        
-        }        
-    
-        user.name = firstName + ' ' + lastName;
-  
-        if (decoded.realm_access.roles.filter(s => s === Globals.OAUTH2CONF_SUPERUSER_ROLE).length >= 1) {
-          user.specialUser = true;
-        }
-  
-        this.sessionContext.setCurrUser(user);
-        this.sessionContext.setAccessToken(accessToken);
 
+      if (accessToken) {
+        this.processAccessToken( accessToken );        
       }  
       this.messageService.loginLogoff$.emit(MessageDefines.MSG_LOG_IN_SUCCEEDED);     
     });
diff --git a/src/app/common-components/message-banner/message-banner.component.spec.ts b/src/app/common-components/message-banner/message-banner.component.spec.ts
index 4046152..a691e76 100644
--- a/src/app/common-components/message-banner/message-banner.component.spec.ts
+++ b/src/app/common-components/message-banner/message-banner.component.spec.ts
@@ -1,14 +1,26 @@
 import { async, ComponentFixture, TestBed } from '@angular/core/testing';
-
+import { SessionContext } from '../../common/session-context';
+import { By } from '@angular/platform-browser';
+import { DebugElement } from '@angular/core';
 import { MessageBannerComponent } from './message-banner.component';
+import { BannerMessage } from '../../common/banner-message';
+import { BannerMessageStatusEn } from '../../common/enums';
 
 describe('MessageBannerComponent', () => {
   let component: MessageBannerComponent;
   let fixture: ComponentFixture<MessageBannerComponent>;
+  let sessionContext: SessionContext;  
+  let de: DebugElement;    
+  let el: HTMLElement; // the DOM element with the welcome message  
 
   beforeEach(async(() => {
+    sessionContext = new SessionContext();  
+
     TestBed.configureTestingModule({
-      declarations: [ MessageBannerComponent ]
+      declarations: [ MessageBannerComponent ],
+      providers: [
+        { provide: SessionContext, useValue: sessionContext },
+      ],  
     })
     .compileComponents();
   }));
@@ -19,7 +31,36 @@
     fixture.detectChanges();
   });
 
-  // it('should be created', () => {
-  //   expect(component).toBeTruthy();
-  // });
+  it('should be created', () => {
+     expect(component).toBeTruthy();
+   });
+
+  it('should count the zOrder correctly and toggle the visibility due to zOrder', () => {
+    const fixture2 = TestBed.createComponent(MessageBannerComponent);
+    const component2: any = fixture2.componentInstance;
+    const bannerMessage = new BannerMessage();
+
+    sessionContext.setBannerMessage(BannerMessageStatusEn.success, 'Testor', true);
+
+    const x1: any = component;
+    x1.ngOnInit();
+
+    expect(component.getMaxMessageBannerZOrder()).toBe(0);
+    fixture.detectChanges();
+
+    // Component 1 is the only one and has the topmost zOrder=>Visible
+    expect(fixture.debugElement.query( By.css('.close'))).not.toBeNull();
+    
+    component2.zOrder = 666;
+    component2.ngOnInit();
+
+    expect(component.getMaxMessageBannerZOrder()).toBe(666);
+    fixture.detectChanges();
+    fixture2.detectChanges();
+
+    // Component 2 has a bigger zOrder => Component1=invisible, Component2=visible
+    expect(fixture.debugElement.query( By.css('.close'))).toBeNull();
+    expect(fixture2.debugElement.query( By.css('.close'))).not.toBeNull();
+
+  });
 });
diff --git a/src/app/services/user.service.spec.ts b/src/app/services/user.service.spec.ts
index fc6883d..c8fbe8c 100644
--- a/src/app/services/user.service.spec.ts
+++ b/src/app/services/user.service.spec.ts
@@ -18,7 +18,7 @@
 
 describe('Http-UserService (mockBackend)', () => {
   let sessionContext: SessionContext;
-let messageService:MessageService;
+  let messageService: MessageService;
   beforeEach( async(() => {
     TestBed.configureTestingModule({
       imports: [ HttpModule ],