http://git-wip-us.apache.org/repos/asf/metron/blob/0c4c622b/metron-interface/metron-config/src/app/shared/sample-data/sample-data.component.spec.ts ---------------------------------------------------------------------- diff --git a/metron-interface/metron-config/src/app/shared/sample-data/sample-data.component.spec.ts b/metron-interface/metron-config/src/app/shared/sample-data/sample-data.component.spec.ts index 5488209..b8cdf1f 100644 --- a/metron-interface/metron-config/src/app/shared/sample-data/sample-data.component.spec.ts +++ b/metron-interface/metron-config/src/app/shared/sample-data/sample-data.component.spec.ts @@ -15,17 +15,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import {async, TestBed, ComponentFixture} from '@angular/core/testing'; -import {KafkaService} from '../../service/kafka.service'; -import {Observable} from 'rxjs/Observable'; -import {SampleDataComponent} from './sample-data.component'; -import {SharedModule} from '../shared.module'; -import '../../rxjs-operators'; +import { async, TestBed, ComponentFixture } from '@angular/core/testing'; +import { KafkaService } from '../../service/kafka.service'; +import { Observable, throwError } from 'rxjs'; +import { SampleDataComponent } from './sample-data.component'; +import { SharedModule } from '../shared.module'; class MockKafkaService { _sample: string[]; - _sampleCounter: number = 0; - + _sampleCounter = 0; public setSample(sampleMessages: string[]): void { this._sample = sampleMessages; @@ -33,7 +31,6 @@ class MockKafkaService { } public sample(name: string): Observable<string> { - if (this._sampleCounter < this._sample.length) { return Observable.create(observer => { observer.next(this._sample[this._sampleCounter++]); @@ -41,7 +38,7 @@ class MockKafkaService { }); } - return Observable.throw('Error'); + return throwError('Error'); } } @@ -58,24 +55,21 @@ describe('SampleDataComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ imports: [SharedModule], - declarations: [ SampleDataComponent], + declarations: [SampleDataComponent], providers: [ SampleDataComponent, - {provide: KafkaService, useClass: MockKafkaService} + { provide: KafkaService, useClass: MockKafkaService } ] }); - fixture = TestBed.createComponent(SampleDataComponent); sampleDataComponent = fixture.componentInstance; - kafkaService = fixture.debugElement.injector.get(KafkaService); - + kafkaService = TestBed.get(KafkaService); })); it('can instantiate SampleDataComponent', async(() => { expect(sampleDataComponent instanceof SampleDataComponent).toBe(true); })); - it('should emmit messages', async(() => { let expectedMessage; let successCount = 0; @@ -140,11 +134,9 @@ describe('SampleDataComponent', () => { sampleDataComponent.getPreviousSample(); expect(successCount).toEqual(7); expect(failureCount).toEqual(1); - })); it('should emmit messages on blur', async(() => { - let expectedMessage; let successCount = 0; @@ -155,9 +147,10 @@ describe('SampleDataComponent', () => { expect(message).toEqual(expectedMessage); }); - expectedMessage = 'This is a simple message'; - fixture.debugElement.nativeElement.querySelector('textarea').value = expectedMessage; + fixture.debugElement.nativeElement.querySelector( + 'textarea' + ).value = expectedMessage; sampleDataComponent.onBlur(); expect(successCount).toEqual(1); @@ -165,16 +158,16 @@ describe('SampleDataComponent', () => { expect(sampleDataComponent.sampleData.length).toEqual(1); expect(sampleDataComponent.sampleData[0]).toEqual(expectedMessage); - expectedMessage = ''; - fixture.debugElement.nativeElement.querySelector('textarea').value = expectedMessage; + fixture.debugElement.nativeElement.querySelector( + 'textarea' + ).value = expectedMessage; sampleDataComponent.onBlur(); expect(successCount).toEqual(2); expect(sampleDataComponent.sampleDataIndex).toEqual(0); expect(sampleDataComponent.sampleData.length).toEqual(1); - expectedMessage = sampleMessages[0]; sampleDataComponent.getNextSample(); @@ -182,7 +175,5 @@ describe('SampleDataComponent', () => { expect(sampleDataComponent.sampleDataIndex).toEqual(1); expect(sampleDataComponent.sampleData.length).toEqual(2); expect(sampleDataComponent.sampleData[1]).toEqual(sampleMessages[0]); - })); - });
http://git-wip-us.apache.org/repos/asf/metron/blob/0c4c622b/metron-interface/metron-config/src/app/util/httpUtil.ts ---------------------------------------------------------------------- diff --git a/metron-interface/metron-config/src/app/util/httpUtil.ts b/metron-interface/metron-config/src/app/util/httpUtil.ts index dfcb61f..d8a21a5 100644 --- a/metron-interface/metron-config/src/app/util/httpUtil.ts +++ b/metron-interface/metron-config/src/app/util/httpUtil.ts @@ -15,34 +15,34 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import {Response} from '@angular/http'; -import {Observable} from 'rxjs/Observable'; -import {RestError} from '../model/rest-error'; +import { HttpErrorResponse, HttpResponse } from '@angular/common/http'; +import { throwError, Observable } from 'rxjs'; -export class HttpUtil { +import { RestError } from '../model/rest-error'; - public static extractString(res: Response): string { - let text: string = res.text(); +export class HttpUtil { + public static extractString(res: HttpResponse<any>): string { + let text: string = res.toString(); return text || ''; } - public static extractData(res: Response): any { - let body = res.json(); + public static extractData(res: HttpResponse<any>): any { + let body = res; return body || {}; } - public static handleError(res: Response): Observable<RestError> { + public static handleError(res: HttpErrorResponse): Observable<RestError> { // In a real world app, we might use a remote logging infrastructure // We'd also dig deeper into the error to get a better message let restError: RestError; if (res.status === 401) { window.location.assign('/login?sessionExpired=true'); } else if (res.status !== 404) { - restError = res.json(); + restError = res; } else { restError = new RestError(); - restError.responseCode = 404; + restError.status = 404; } - return Observable.throw(restError); + return throwError(restError); } } http://git-wip-us.apache.org/repos/asf/metron/blob/0c4c622b/metron-interface/metron-config/src/app/util/httpUtils.spec.ts ---------------------------------------------------------------------- diff --git a/metron-interface/metron-config/src/app/util/httpUtils.spec.ts b/metron-interface/metron-config/src/app/util/httpUtils.spec.ts index ff1e39d..c2b0e6b 100644 --- a/metron-interface/metron-config/src/app/util/httpUtils.spec.ts +++ b/metron-interface/metron-config/src/app/util/httpUtils.spec.ts @@ -15,33 +15,52 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import {HttpUtil} from './httpUtil'; -import {Response, ResponseOptions, ResponseType} from '@angular/http'; -import {Observable} from 'rxjs/Observable'; -import {RestError} from '../model/rest-error'; +import { HttpUtil } from './httpUtil'; +import { RestError } from '../model/rest-error'; +import { HttpErrorResponse } from '@angular/common/http'; +import { noop } from 'rxjs'; describe('HttpUtil', () => { - it('should create an instance', () => { expect(HttpUtil.handleError).toBeTruthy(); expect(HttpUtil.extractString).toBeTruthy(); expect(HttpUtil.extractData).toBeTruthy(); }); - it('should handleError', () => { - let error500: RestError = {message: 'This is error', responseCode: 500, fullMessage: 'This is error'}; - let responseOptions = new ResponseOptions(); - responseOptions.body = error500; - let response = new Response(responseOptions); - response.type = ResponseType.Basic; - expect(HttpUtil.handleError(response)).toEqual(Observable.throw(error500)); - - let error404 = new RestError(); - error404.responseCode = 404; - response = new Response(new ResponseOptions()); - response.type = ResponseType.Basic; - response.status = 404; - expect(HttpUtil.handleError(response)).toEqual(Observable.throw(error404)); + it('should handleError 500', () => { + let error500: RestError = { + message: 'This is error', + status: 500, + error: 'This is error' + }; + let response = new HttpErrorResponse(error500); + let httpUtilSub = HttpUtil.handleError(response).subscribe( + noop, + e => { + expect(e.status).toBe(500); + expect(e.message).toBe( + 'Http failure response for (unknown url): 500 undefined' + ); + expect(e.error).toBe('This is error'); + }, + noop + ); + httpUtilSub.unsubscribe(); }); + it('should handleError 404', () => { + const error404 = new RestError(); + error404.status = 404; + const response = new HttpErrorResponse(error404); + const httpUtilSub = HttpUtil.handleError(response).subscribe( + noop, + e => { + expect(e.status).toBe(404); + expect(e.message).toBe(undefined); + expect(e.error).toBe(undefined); + }, + noop + ); + httpUtilSub.unsubscribe(); + }); }); http://git-wip-us.apache.org/repos/asf/metron/blob/0c4c622b/metron-interface/metron-config/src/app/verticalnavbar/verticalnavbar.component.spec.ts ---------------------------------------------------------------------- diff --git a/metron-interface/metron-config/src/app/verticalnavbar/verticalnavbar.component.spec.ts b/metron-interface/metron-config/src/app/verticalnavbar/verticalnavbar.component.spec.ts index 7be3ccd..432ec2b 100644 --- a/metron-interface/metron-config/src/app/verticalnavbar/verticalnavbar.component.spec.ts +++ b/metron-interface/metron-config/src/app/verticalnavbar/verticalnavbar.component.spec.ts @@ -15,39 +15,29 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import {async, inject, TestBed} from '@angular/core/testing'; +import {TestBed} from '@angular/core/testing'; import {Router} from '@angular/router'; import {VerticalNavbarComponent} from './verticalnavbar.component'; class MockRouter { - url: string = ''; + url = ''; } describe('VerticalNavbarComponent', () => { - - beforeEach(async(() => { + let router: Router; + let verticalNavbarComponent: VerticalNavbarComponent; + beforeEach(() => { TestBed.configureTestingModule({ providers: [ VerticalNavbarComponent, {provide: Router, useClass: MockRouter} ] - }).compileComponents(); - - })); + }); + verticalNavbarComponent = TestBed.get(VerticalNavbarComponent); + }); - it('can instantiate VerticalNavbarComponent', - inject([VerticalNavbarComponent], (verticalNavbarComponent: VerticalNavbarComponent) => { + it('can instantiate VerticalNavbarComponent', () => { expect(verticalNavbarComponent instanceof VerticalNavbarComponent).toBe(true); - })); - - it('check isActive for a URL VerticalNavbarComponent', - inject([VerticalNavbarComponent, Router], (component: VerticalNavbarComponent, router: Router) => { - - router.url = '/abc'; - expect(component.isActive(['/def'])).toEqual(false); - expect(component.isActive(['/abc'])).toEqual(true); - expect(component.isActive(['/def', '/abc'])).toEqual(true); - - })); + }); }); http://git-wip-us.apache.org/repos/asf/metron/blob/0c4c622b/metron-interface/metron-config/src/app/verticalnavbar/verticalnavbar.component.ts ---------------------------------------------------------------------- diff --git a/metron-interface/metron-config/src/app/verticalnavbar/verticalnavbar.component.ts b/metron-interface/metron-config/src/app/verticalnavbar/verticalnavbar.component.ts index 4067f6c..3425612 100644 --- a/metron-interface/metron-config/src/app/verticalnavbar/verticalnavbar.component.ts +++ b/metron-interface/metron-config/src/app/verticalnavbar/verticalnavbar.component.ts @@ -29,7 +29,4 @@ export class VerticalNavbarComponent { constructor(private router: Router) {} - isActive(validRoutes: string[]) { - return validRoutes.indexOf(this.router.url) !== -1; - } } http://git-wip-us.apache.org/repos/asf/metron/blob/0c4c622b/metron-interface/metron-config/src/app/verticalnavbar/verticalnavbar.html ---------------------------------------------------------------------- diff --git a/metron-interface/metron-config/src/app/verticalnavbar/verticalnavbar.html b/metron-interface/metron-config/src/app/verticalnavbar/verticalnavbar.html index a4052b3..994711a 100644 --- a/metron-interface/metron-config/src/app/verticalnavbar/verticalnavbar.html +++ b/metron-interface/metron-config/src/app/verticalnavbar/verticalnavbar.html @@ -19,10 +19,10 @@ <ul class="nav"> <li class="nav-item"> - <a [routerLink]="['/sensors']" class="nav-link" [ngClass]="{'active': isActive(['/', '/sensors'])}" href="#">Sensors</a> + <a [routerLink]="['/sensors']" class="nav-link" routerLinkActive="active" href="#">Sensors</a> </li> <li class="nav-item"> - <a [routerLink]="['/general-settings']" class="nav-link" [ngClass]="{'active': isActive(['/general-settings'])}" href="#">General Settings</a> + <a [routerLink]="['/general-settings']" class="nav-link" routerLinkActive="active" href="#">General Settings</a> </li> </ul> http://git-wip-us.apache.org/repos/asf/metron/blob/0c4c622b/metron-interface/metron-config/src/styles.scss ---------------------------------------------------------------------- diff --git a/metron-interface/metron-config/src/styles.scss b/metron-interface/metron-config/src/styles.scss index db57e91..26bb57c 100644 --- a/metron-interface/metron-config/src/styles.scss +++ b/metron-interface/metron-config/src/styles.scss @@ -17,7 +17,7 @@ */ /* You can add global styles to this file, and also import other style files */ @import "app/_variables.scss"; -@import "app/_main.scss"; +@import "app/_fonts.scss"; $height: 60px; http://git-wip-us.apache.org/repos/asf/metron/blob/0c4c622b/metron-interface/metron-config/src/test.ts ---------------------------------------------------------------------- diff --git a/metron-interface/metron-config/src/test.ts b/metron-interface/metron-config/src/test.ts index 347d245..606c810 100644 --- a/metron-interface/metron-config/src/test.ts +++ b/metron-interface/metron-config/src/test.ts @@ -15,50 +15,24 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import './polyfills.ts'; -import 'zone.js/dist/long-stack-trace-zone'; -import 'zone.js/dist/proxy.js'; -import 'zone.js/dist/sync-test'; -import 'zone.js/dist/jasmine-patch'; -import 'zone.js/dist/async-test'; -import 'zone.js/dist/fake-async-test'; - -import 'jquery/dist/jquery'; -import 'tether/dist/js/tether'; - -import * as $ from 'jquery'; -window['$'] = window['jQuery'] = $; - -import * as Tether from 'tether'; -window['Tether'] = Tether; - -import 'ace-builds/src-noconflict/ace.js'; -import 'bootstrap/dist/js/bootstrap'; -import 'bootstrap'; - -// Unfortunately there's no typing for the `__karma__` variable. Just declare it as any. -declare var __karma__: any; -declare var require: any; - -// Prevent Karma from running prematurely. -__karma__.loaded = function () {}; - - -Promise.all([ - System.import('@angular/core/testing'), - System.import('@angular/platform-browser-dynamic/testing') -]) - // First, initialize the Angular testing environment. - .then(([testing, testingBrowser]) => { - testing.getTestBed().initTestEnvironment( - testingBrowser.BrowserDynamicTestingModule, - testingBrowser.platformBrowserDynamicTesting() - ); - }) - // Then we find all the tests. - .then(() => require.context('./', true, /\.spec\.ts/)) - // And load the modules. - .then(context => context.keys().map(context)) - // Finally, start Karma to run the tests. - .then(__karma__.start, __karma__.error); +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'zone.js/dist/zone-testing'; +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting +} from '@angular/platform-browser-dynamic/testing'; + +declare const require: any; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting() +); +// Then we find all the tests. +const context = require.context('./', true, /\.spec\.ts$/); +// And load the modules. +context.keys().map(context); http://git-wip-us.apache.org/repos/asf/metron/blob/0c4c622b/metron-interface/metron-config/src/tsconfig.app.json ---------------------------------------------------------------------- diff --git a/metron-interface/metron-config/src/tsconfig.app.json b/metron-interface/metron-config/src/tsconfig.app.json new file mode 100644 index 0000000..107b74d --- /dev/null +++ b/metron-interface/metron-config/src/tsconfig.app.json @@ -0,0 +1,23 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/app", + "module": "es2015", + "baseUrl": "", + "types": [ + "jquery", + "bootstrap", + "ace", + "node" + ], + "typeRoots": [ "../node_modules/@types" ] + }, + "exclude": [ + "test.ts", + "**/*.spec.ts" + ], + "angularCompilerOptions": { + "preserveWhitespaces": true + }, +} + http://git-wip-us.apache.org/repos/asf/metron/blob/0c4c622b/metron-interface/metron-config/src/tsconfig.json ---------------------------------------------------------------------- diff --git a/metron-interface/metron-config/src/tsconfig.json b/metron-interface/metron-config/src/tsconfig.json deleted file mode 100644 index 65756e3..0000000 --- a/metron-interface/metron-config/src/tsconfig.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "compilerOptions": { - "declaration": false, - "emitDecoratorMetadata": true, - "experimentalDecorators": true, - "lib": ["es6", "dom"], - "mapRoot": "./", - "module": "es6", - "moduleResolution": "node", - "outDir": "../dist/out-tsc", - "sourceMap": true, - "target": "es5", - "typeRoots": [ - "../node_modules/@types" - ], - "types": [ - "jasmine", - "jquery", - "bootstrap", - "ace" - ] - } - -} http://git-wip-us.apache.org/repos/asf/metron/blob/0c4c622b/metron-interface/metron-config/src/tsconfig.spec.json ---------------------------------------------------------------------- diff --git a/metron-interface/metron-config/src/tsconfig.spec.json b/metron-interface/metron-config/src/tsconfig.spec.json new file mode 100644 index 0000000..eb43ad2 --- /dev/null +++ b/metron-interface/metron-config/src/tsconfig.spec.json @@ -0,0 +1,24 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/spec", + "module": "commonjs", + "target": "es5", + "baseUrl": "", + "types": [ + "jquery", + "bootstrap", + "jasmine", + "node" + ], + "typeRoots": [ "../node_modules/@types" ] + }, + "files": [ + "test.ts", + "polyfills.ts" + ], + "include": [ + "**/*.spec.ts", + "**/*.d.ts" + ] + } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/metron/blob/0c4c622b/metron-interface/metron-config/src/typings.d.ts ---------------------------------------------------------------------- diff --git a/metron-interface/metron-config/src/typings.d.ts b/metron-interface/metron-config/src/typings.d.ts index c0aaf0c..75b5619e 100644 --- a/metron-interface/metron-config/src/typings.d.ts +++ b/metron-interface/metron-config/src/typings.d.ts @@ -20,4 +20,4 @@ // https://www.typescriptlang.org/docs/handbook/writing-declaration-files.html declare var System: any; -declare var require: any; +declare var require: NodeRequire; http://git-wip-us.apache.org/repos/asf/metron/blob/0c4c622b/metron-interface/metron-config/tsconfig.json ---------------------------------------------------------------------- diff --git a/metron-interface/metron-config/tsconfig.json b/metron-interface/metron-config/tsconfig.json new file mode 100644 index 0000000..1ca28d2 --- /dev/null +++ b/metron-interface/metron-config/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "outDir": "./dist/out-tsc", + "baseUrl": "src", + "sourceMap": true, + "declaration": false, + "moduleResolution": "node", + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "target": "es5", + "typeRoots": [ + "node_modules/@types" + ], + "lib": [ + "es2016", + "dom" + ] + } + } \ No newline at end of file