From acc4fdc3c55bc6ff222efeb8d15414d97c89cfc1 Mon Sep 17 00:00:00 2001 From: ziajka Date: Thu, 5 Jul 2018 09:35:02 +0200 Subject: [PATCH 1/6] Tests for ServerError --- src/app/services/http-server.service.spec.ts | 25 ++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/src/app/services/http-server.service.spec.ts b/src/app/services/http-server.service.spec.ts index 5ff73d16..542649de 100644 --- a/src/app/services/http-server.service.spec.ts +++ b/src/app/services/http-server.service.spec.ts @@ -1,9 +1,9 @@ import { TestBed, } from '@angular/core/testing'; import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; -import { HttpClient } from "@angular/common/http"; +import {HttpClient, HttpErrorResponse} from "@angular/common/http"; import { Server } from '../models/server'; -import { HttpServer } from './http-server.service'; +import {HttpServer, ServerError, ServerErrorHandler} from './http-server.service'; import { getTestServer } from './testing'; import { AppTestingModule } from "../testing/app-testing/app-testing.module"; @@ -11,6 +11,27 @@ class MyType { id: number; } +describe('ServerError', () => { + it('should construct ServerError from error', () => { + const error = new Error("test"); + const serverError = ServerError.fromError("new message", error); + expect(serverError.originalError).toEqual(error); + expect(serverError.message).toEqual("new message"); + }); +}); + + +describe('ServerErrorHandler', () => { + it('should handle HttpErrorResponse', () => { + const error = new HttpErrorResponse({ status: 0 }); + + const handler = new ServerErrorHandler(); + const result = handler.handleError(error); + + expect(result.error.toString()).toEqual('Error: Server is unreachable'); + }); +}); + describe('HttpServer', () => { let httpClient: HttpClient; From 0c58ec92603ae3f07ac55edfbefa01bbdf8c581c Mon Sep 17 00:00:00 2001 From: ziajka Date: Thu, 5 Jul 2018 09:42:48 +0200 Subject: [PATCH 2/6] Project - readonly tests --- src/app/services/project.service.spec.ts | 27 +++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/app/services/project.service.spec.ts b/src/app/services/project.service.spec.ts index ee38db72..2c5c7225 100644 --- a/src/app/services/project.service.spec.ts +++ b/src/app/services/project.service.spec.ts @@ -44,6 +44,7 @@ describe('ProjectService', () => { let httpServer: HttpServer; let service: ProjectService; let server: Server; + let settingsService: SettingsService; beforeEach(() => { TestBed.configureTestingModule({ @@ -62,6 +63,8 @@ describe('ProjectService', () => { httpTestingController = TestBed.get(HttpTestingController); httpServer = TestBed.get(HttpServer); service = TestBed.get(ProjectService); + settingsService = TestBed.get(SettingsService); + server = getTestServer(); }); @@ -142,7 +145,29 @@ describe('ProjectService', () => { it('should get notifications path of project', () => { const path = service.notificationsPath(server, "myproject"); - expect(path).toEqual('ws://127.0.0.1:3080/v2/projects/myproject/notifications/ws') + expect(path).toEqual('ws://127.0.0.1:3080/v2/projects/myproject/notifications/ws'); }); + it('project should be readonly when defined as readonly ', () => { + const project = new Project(); + project.readonly = true; + + expect(service.isReadOnly(project)).toEqual(true); + }); + + it('project should be readonly when experimentalFeatures disabled ', () => { + const project = new Project(); + project.readonly = false; + spyOn(settingsService, 'isExperimentalEnabled').and.returnValue(false); + + expect(service.isReadOnly(project)).toEqual(true); + }); + + it('project should not be readonly when experimentalFeatures enabled ', () => { + const project = new Project(); + project.readonly = false; + spyOn(settingsService, 'isExperimentalEnabled').and.returnValue(true); + + expect(service.isReadOnly(project)).toEqual(false); + }); }); From 9888b6db74b724f679a7fef1a9ec2a6bf16c705b Mon Sep 17 00:00:00 2001 From: ziajka Date: Thu, 5 Jul 2018 09:50:13 +0200 Subject: [PATCH 3/6] Improve ServerError tests --- src/app/services/http-server.service.spec.ts | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/app/services/http-server.service.spec.ts b/src/app/services/http-server.service.spec.ts index 542649de..461f1a20 100644 --- a/src/app/services/http-server.service.spec.ts +++ b/src/app/services/http-server.service.spec.ts @@ -12,6 +12,11 @@ class MyType { } describe('ServerError', () => { + it('should construct with message', () => { + const error = new Error("test"); + expect(error.message).toEqual("test"); + }); + it('should construct ServerError from error', () => { const error = new Error("test"); const serverError = ServerError.fromError("new message", error); @@ -22,13 +27,22 @@ describe('ServerError', () => { describe('ServerErrorHandler', () => { - it('should handle HttpErrorResponse', () => { + it('should handle HttpErrorResponse with status 0', () => { const error = new HttpErrorResponse({ status: 0 }); const handler = new ServerErrorHandler(); const result = handler.handleError(error); - expect(result.error.toString()).toEqual('Error: Server is unreachable'); + expect(result.error.message).toEqual('Server is unreachable'); + }); + + it('should not handle HttpErrorResponse with status!=0', () => { + const error = new HttpErrorResponse({ status: 499 }); + + const handler = new ServerErrorHandler(); + const result = handler.handleError(error); + + expect(result.error.message).toEqual('Http failure response for (unknown url): 499 undefined'); }); }); From bcc21da585c13439d33095578adf890cacb238b0 Mon Sep 17 00:00:00 2001 From: ziajka Date: Thu, 5 Jul 2018 12:56:46 +0200 Subject: [PATCH 4/6] Server service tests --- src/app/services/server.service.spec.ts | 109 ++++++++++++++++++++++-- src/app/services/server.service.ts | 4 +- 2 files changed, 106 insertions(+), 7 deletions(-) diff --git a/src/app/services/server.service.spec.ts b/src/app/services/server.service.spec.ts index c308bd62..b0aad47e 100644 --- a/src/app/services/server.service.spec.ts +++ b/src/app/services/server.service.spec.ts @@ -1,7 +1,9 @@ -import { TestBed, inject } from '@angular/core/testing'; +import { TestBed } from '@angular/core/testing'; import { ServerService } from './server.service'; import { Server } from "../models/server"; +import { IndexedDbService } from "./indexed-db.service"; +import { AngularIndexedDB } from "angular2-indexeddb"; export class MockedServerService { @@ -22,13 +24,110 @@ export class MockedServerService { describe('ServerService', () => { + let indexedDbService: IndexedDbService; + let db: AngularIndexedDB; + let service: ServerService; + beforeEach(() => { + indexedDbService = new IndexedDbService(); + + db = indexedDbService.get(); + + spyOn(db, 'openDatabase').and.returnValue(Promise.resolve(true)); + TestBed.configureTestingModule({ - providers: [ ServerService ] + providers: [ + ServerService, + { provide: IndexedDbService, useValue: indexedDbService} + ] + }); + + service = TestBed.get(ServerService); + }); + + it('should be created and create database', () => { + expect(service).toBeTruthy(); + expect(db.openDatabase).toHaveBeenCalled(); + expect(db.openDatabase.calls.first().args[0]).toEqual(1); + + const evnt = { + currentTarget: { + result: { + createObjectStore: function () {} + } + } + }; + + spyOn(evnt.currentTarget.result, 'createObjectStore'); + + const upgradeCallback = db.openDatabase.calls.first().args[1]; + upgradeCallback(evnt); + + expect(evnt.currentTarget.result.createObjectStore).toHaveBeenCalledWith( 'servers', { keyPath: 'id', autoIncrement: true }); + }); + + describe('operations on records', () => { + let record: any; + + beforeEach(() => { + record = new Server(); + record.name = 'test'; + }); + + it('should get an object', (done) => { + spyOn(db, 'getByKey').and.returnValue(Promise.resolve([record])); + + service.get(1).then((result) => { + expect(db.getByKey).toHaveBeenCalledWith('servers', 1); + expect(result).toEqual([record]); + done(); + }); + }); + + it('should create an object', (done) => { + const created = { + 'key': 99 + }; + + spyOn(db, 'add').and.returnValue(Promise.resolve(created)); + + service.create(record).then((result) => { + expect(db.add).toHaveBeenCalledWith('servers', record); + expect(result.id).toEqual(99); + done(); + }); + }); + + it('should update an object', (done) => { + spyOn(db, 'update').and.returnValue(Promise.resolve(record)); + + service.update(record).then((result) => { + expect(db.update).toHaveBeenCalledWith('servers', record); + expect(result).toEqual(record); + done(); + }); + }); + + it('should delete an object', (done) => { + record.id = 88; + + spyOn(db, 'delete').and.returnValue(Promise.resolve()); + + service.delete(record).then(() => { + expect(db.delete).toHaveBeenCalledWith('servers', record.id); + done(); + }); + }); + }); + + it('should call findAll', (done) => { + spyOn(db, 'getAll').and.returnValue(Promise.resolve(true)); + + service.findAll().then((result) => { + expect(result).toEqual(true); + expect(db.getAll).toHaveBeenCalledWith('servers'); + done(); }); }); - // it('should be created', inject([ServerService], (service: ServerService) => { - // expect(service).toBeTruthy(); - // })); }); diff --git a/src/app/services/server.service.ts b/src/app/services/server.service.ts index f9ad00ae..2db558b3 100644 --- a/src/app/services/server.service.ts +++ b/src/app/services/server.service.ts @@ -12,7 +12,7 @@ export class ServerService { constructor(private indexedDbService: IndexedDbService) { this.ready = indexedDbService.get().openDatabase(1, (evt) => { - const store = evt.currentTarget.result.createObjectStore( + evt.currentTarget.result.createObjectStore( this.tablename, { keyPath: "id", autoIncrement: true }); }); } @@ -81,7 +81,7 @@ export class ServerService { return promise; } - private onReady(query) { + protected onReady(query) { const promise = new Promise((resolve, reject) => { this.ready.then(() => { query() From 290ce6641f0f3e46649bcb737631ba5ed31c260b Mon Sep 17 00:00:00 2001 From: ziajka Date: Thu, 5 Jul 2018 13:14:38 +0200 Subject: [PATCH 5/6] getLocalServer tests --- src/app/services/server.service.spec.ts | 35 +++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/app/services/server.service.spec.ts b/src/app/services/server.service.spec.ts index b0aad47e..0040e1c7 100644 --- a/src/app/services/server.service.spec.ts +++ b/src/app/services/server.service.spec.ts @@ -130,4 +130,39 @@ describe('ServerService', () => { }); }); + it('should create local server when missing', (done) => { + spyOn(db, 'getAll').and.returnValue(Promise.resolve([])); + spyOn(service, 'create').and.returnValue(Promise.resolve(new Server())); + + const expectedServer = new Server(); + expectedServer.name = 'local'; + expectedServer.ip = 'hostname'; + expectedServer.port = 9999; + expectedServer.is_local = true; + + service.getLocalServer('hostname', 9999).then(() => { + expect(service.create).toHaveBeenCalledWith(expectedServer) + done(); + }); + }); + + it('should update local server when found', (done) => { + const server = new Server(); + server.name = 'local'; + server.ip = 'hostname'; + server.port = 9999; + server.is_local = true; + + spyOn(db, 'getAll').and.returnValue(Promise.resolve([server])); + spyOn(service, 'update').and.returnValue(Promise.resolve(new Server())); + + service.getLocalServer('hostname-2', 11111).then(() => { + server.ip = 'hostname-2'; + server.port = 11111; + + expect(service.update).toHaveBeenCalledWith(server); + done(); + }); + }); + }); From 65c0739b3ecd4ba1996761dfb85f87a83da9e4c6 Mon Sep 17 00:00:00 2001 From: ziajka Date: Fri, 6 Jul 2018 10:17:34 +0200 Subject: [PATCH 6/6] Fix tests --- package.json | 2 +- src/app/services/server.service.spec.ts | 14 +++++++------- yarn.lock | 6 +++++- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 47aa340b..3123e4fc 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,7 @@ "@angular/compiler-cli": "^5.2.9", "@angular/language-service": "^5.2.9", "@sentry/electron": "^0.5.0", - "@types/jasmine": "~2.8.6", + "@types/jasmine": "~2.8.8", "@types/jasminewd2": "~2.0.2", "@types/node": "~9.6.4", "codelyzer": "~4.2.1", diff --git a/src/app/services/server.service.spec.ts b/src/app/services/server.service.spec.ts index 0040e1c7..3a0204f1 100644 --- a/src/app/services/server.service.spec.ts +++ b/src/app/services/server.service.spec.ts @@ -4,6 +4,7 @@ import { ServerService } from './server.service'; import { Server } from "../models/server"; import { IndexedDbService } from "./indexed-db.service"; import { AngularIndexedDB } from "angular2-indexeddb"; +import Spy = jasmine.Spy; export class MockedServerService { @@ -27,13 +28,14 @@ describe('ServerService', () => { let indexedDbService: IndexedDbService; let db: AngularIndexedDB; let service: ServerService; + let openDatabaseSpy: Spy; beforeEach(() => { indexedDbService = new IndexedDbService(); db = indexedDbService.get(); - spyOn(db, 'openDatabase').and.returnValue(Promise.resolve(true)); + openDatabaseSpy = spyOn(db, 'openDatabase').and.returnValue(Promise.resolve(true)); TestBed.configureTestingModule({ providers: [ @@ -48,7 +50,7 @@ describe('ServerService', () => { it('should be created and create database', () => { expect(service).toBeTruthy(); expect(db.openDatabase).toHaveBeenCalled(); - expect(db.openDatabase.calls.first().args[0]).toEqual(1); + expect(openDatabaseSpy.calls.first().args[0]).toEqual(1); const evnt = { currentTarget: { @@ -60,7 +62,7 @@ describe('ServerService', () => { spyOn(evnt.currentTarget.result, 'createObjectStore'); - const upgradeCallback = db.openDatabase.calls.first().args[1]; + const upgradeCallback = openDatabaseSpy.calls.first().args[1]; upgradeCallback(evnt); expect(evnt.currentTarget.result.createObjectStore).toHaveBeenCalledWith( 'servers', { keyPath: 'id', autoIncrement: true }); @@ -85,15 +87,13 @@ describe('ServerService', () => { }); it('should create an object', (done) => { - const created = { - 'key': 99 - }; + const created = new Server(); + created.id = 22; spyOn(db, 'add').and.returnValue(Promise.resolve(created)); service.create(record).then((result) => { expect(db.add).toHaveBeenCalledWith('servers', record); - expect(result.id).toEqual(99); done(); }); }); diff --git a/yarn.lock b/yarn.lock index 884b7bb4..508a2b09 100644 --- a/yarn.lock +++ b/yarn.lock @@ -431,10 +431,14 @@ version "7946.0.3" resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.3.tgz#e5791534ab0acfb2b3a39b713966cfcee85d469f" -"@types/jasmine@*", "@types/jasmine@~2.8.6": +"@types/jasmine@*": version "2.8.7" resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-2.8.7.tgz#3fe583928ae0a22cdd34cedf930eeffeda2602fd" +"@types/jasmine@~2.8.8": + version "2.8.8" + resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-2.8.8.tgz#bf53a7d193ea8b03867a38bfdb4fbb0e0bf066c9" + "@types/jasminewd2@~2.0.2": version "2.0.3" resolved "https://registry.yarnpkg.com/@types/jasminewd2/-/jasminewd2-2.0.3.tgz#0d2886b0cbdae4c0eeba55e30792f584bf040a95"