keycloak-uncached

Details

diff --git a/examples/demo-template/angular2-product-app/src/main/frontend/e2e/app.e2e-spec.ts b/examples/demo-template/angular2-product-app/src/main/frontend/e2e/app.e2e-spec.ts
index 52708dc..83246f1 100644
--- a/examples/demo-template/angular2-product-app/src/main/frontend/e2e/app.e2e-spec.ts
+++ b/examples/demo-template/angular2-product-app/src/main/frontend/e2e/app.e2e-spec.ts
@@ -7,8 +7,14 @@ describe('angular2-product-app App', () => {
     page = new Angular2ProductAppPage();
   });
 
-  it('should display message saying app works', () => {
+  it('should display message saying Angular2 Product', () => {
     page.navigateTo();
-    expect(page.getParagraphText()).toEqual('app works!');
+    expect(page.getParagraphText()).toEqual('Angular2 Product');
+  });
+
+  it('should load Products', () => {
+    page.navigateTo();
+    const products = page.loadProducts();
+    ['iphone', 'ipad', 'ipod'].forEach(e => expect(products).toContain(e));
   });
 });
diff --git a/examples/demo-template/angular2-product-app/src/main/frontend/e2e/app.po.ts b/examples/demo-template/angular2-product-app/src/main/frontend/e2e/app.po.ts
index 8e7b6e9..8ebb121 100644
--- a/examples/demo-template/angular2-product-app/src/main/frontend/e2e/app.po.ts
+++ b/examples/demo-template/angular2-product-app/src/main/frontend/e2e/app.po.ts
@@ -2,10 +2,27 @@ import { browser, element, by } from 'protractor';
 
 export class Angular2ProductAppPage {
   navigateTo() {
-    return browser.get('/');
+    browser.ignoreSynchronization = true;
+    browser.get('/');
+    browser.getCurrentUrl().then(url => {
+      if (url.includes('/auth/realms/demo')) {
+        element(by.id('username')).sendKeys('bburke@redhat.com');
+        element(by.id('password')).sendKeys('password');
+        element(by.id('kc-login')).click();
+      }
+      browser.ignoreSynchronization = false;
+
+    });
   }
 
   getParagraphText() {
     return element(by.css('app-root h1')).getText();
   }
+
+  loadProducts() {
+    const click = element(by.id('reload-data')).click();
+    browser.wait(click, 2000, 'Products should load within 2 seconds');
+    return element.all(by.css('table.table td')).getText();
+  }
+
 }
diff --git a/examples/demo-template/angular2-product-app/src/main/frontend/src/app/app.module.ts b/examples/demo-template/angular2-product-app/src/main/frontend/src/app/app.module.ts
index baad699..99a60f9 100644
--- a/examples/demo-template/angular2-product-app/src/main/frontend/src/app/app.module.ts
+++ b/examples/demo-template/angular2-product-app/src/main/frontend/src/app/app.module.ts
@@ -1,15 +1,11 @@
 import { BrowserModule } from '@angular/platform-browser';
 import { NgModule } from '@angular/core';
 import { FormsModule } from '@angular/forms';
-import {HttpModule, Http, XHRBackend, RequestOptions} from '@angular/http';
-import {KeycloakService} from './keycloak/keycloak.service';
-import {KeycloakHttp} from './keycloak/keycloak.http';
+import { HttpModule } from '@angular/http';
+import { KeycloakService } from './keycloak/keycloak.service';
+import { KeycloakHttp, KEYCLOAK_HTTP_PROVIDER } from './keycloak/keycloak.http';
 import { AppComponent } from './app.component';
 
-export function keycloakHttpFactory(backend: XHRBackend, defaultOptions: RequestOptions, keycloakService: KeycloakService) {
-  return new KeycloakHttp(backend, defaultOptions, keycloakService);
-}
-
 @NgModule({
   declarations: [
     AppComponent
@@ -21,11 +17,7 @@ export function keycloakHttpFactory(backend: XHRBackend, defaultOptions: Request
   ],
   providers: [
     KeycloakService,
-    {
-      provide: Http,
-      useFactory: keycloakHttpFactory,
-      deps: [XHRBackend, RequestOptions, KeycloakService]
-    }
+    KEYCLOAK_HTTP_PROVIDER
   ],
   bootstrap: [AppComponent]
 })
diff --git a/examples/demo-template/angular2-product-app/src/main/frontend/src/app/keycloak/keycloak.http.spec.ts b/examples/demo-template/angular2-product-app/src/main/frontend/src/app/keycloak/keycloak.http.spec.ts
new file mode 100644
index 0000000..7ea175e
--- /dev/null
+++ b/examples/demo-template/angular2-product-app/src/main/frontend/src/app/keycloak/keycloak.http.spec.ts
@@ -0,0 +1,47 @@
+import {Injectable, ReflectiveInjector} from '@angular/core';
+import {async, fakeAsync, tick} from '@angular/core/testing';
+import {BaseRequestOptions, ConnectionBackend, Http, RequestOptions} from '@angular/http';
+import {Response, ResponseOptions} from '@angular/http';
+import {MockBackend, MockConnection} from '@angular/http/testing';
+
+import { KeycloakHttp, KEYCLOAK_HTTP_PROVIDER, keycloakHttpFactory } from './keycloak.http';
+import { KeycloakService } from './keycloak.service';
+
+@Injectable()
+class MockKeycloakService extends KeycloakService {
+  getToken(): Promise<string> {
+    return Promise.resolve('hello');
+  }
+}
+
+describe('KeycloakHttp', () => {
+
+  let injector: ReflectiveInjector;
+  let backend: MockBackend;
+  let lastConnection: MockConnection;
+  let http: Http;
+
+  beforeEach(() => {
+    injector = ReflectiveInjector.resolveAndCreate([
+      {provide: ConnectionBackend, useClass: MockBackend},
+      {provide: RequestOptions, useClass: BaseRequestOptions},
+      {provide: KeycloakService, useClass: MockKeycloakService},
+      {
+        provide: Http,
+        useFactory: keycloakHttpFactory,
+        deps: [ConnectionBackend, RequestOptions, KeycloakService]
+      }
+    ]);
+    http = injector.get(Http);
+    backend = injector.get(ConnectionBackend) as MockBackend;
+    backend.connections.subscribe((c: MockConnection) => lastConnection = c);
+  });
+
+  it('should set Authorization header', fakeAsync(() => {
+    http.get('foo').subscribe(r => console.log(r));
+    tick();
+    expect(lastConnection).toBeDefined('no http service connection at all?');
+    expect(lastConnection.request.headers.get('Authorization')).toBe('Bearer hello');
+  }));
+
+});
diff --git a/examples/demo-template/angular2-product-app/src/main/frontend/src/app/keycloak/keycloak.http.ts b/examples/demo-template/angular2-product-app/src/main/frontend/src/app/keycloak/keycloak.http.ts
index c908965..07887bd 100644
--- a/examples/demo-template/angular2-product-app/src/main/frontend/src/app/keycloak/keycloak.http.ts
+++ b/examples/demo-template/angular2-product-app/src/main/frontend/src/app/keycloak/keycloak.http.ts
@@ -1,5 +1,5 @@
 import {Injectable} from '@angular/core';
-import {Http, Request, ConnectionBackend, RequestOptions, RequestOptionsArgs, Response, Headers} from '@angular/http';
+import {Http, Request, XHRBackend, ConnectionBackend, RequestOptions, RequestOptionsArgs, Response, Headers} from '@angular/http';
 
 import {KeycloakService} from './keycloak.service';
 import {Observable} from 'rxjs/Rx';
@@ -30,3 +30,13 @@ export class KeycloakHttp extends Http {
     }
   }
 }
+
+export function keycloakHttpFactory(backend: XHRBackend, defaultOptions: RequestOptions, keycloakService: KeycloakService) {
+  return new KeycloakHttp(backend, defaultOptions, keycloakService);
+}
+
+export const KEYCLOAK_HTTP_PROVIDER = {
+  provide: Http,
+  useFactory: keycloakHttpFactory,
+  deps: [XHRBackend, RequestOptions, KeycloakService]
+};