Added vorgang.service.ts and accompanying spec
authorKai Moritz <kai@juplo.de>
Fri, 26 Jun 2020 14:21:49 +0000 (16:21 +0200)
committerKai Moritz <kai@juplo.de>
Sun, 5 Jul 2020 08:55:52 +0000 (10:55 +0200)
src/app/vorgang.service.spec.ts [new file with mode: 0644]
src/app/vorgang.service.ts [new file with mode: 0644]
src/app/vorgang.ts [new file with mode: 0644]
src/mock/vorgang.json [new file with mode: 0644]

diff --git a/src/app/vorgang.service.spec.ts b/src/app/vorgang.service.spec.ts
new file mode 100644 (file)
index 0000000..72b694d
--- /dev/null
@@ -0,0 +1,51 @@
+import { TestBed, getTestBed } from '@angular/core/testing';
+import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
+
+import { VorgangService } from './vorgang.service';
+import { Vorgang } from './vorgang';
+
+describe('VorgangService', () => {
+  let service: VorgangService;
+  let httpMock: HttpTestingController;
+
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      imports: [ HttpClientTestingModule ],
+      providers: [ VorgangService ]
+    });
+    service = TestBed.inject(VorgangService);
+    httpMock = TestBed.inject(HttpTestingController);
+  });
+
+  afterEach(() => {
+    // After every test, assert that there are no more pending requests.
+    httpMock.verify();
+  });
+
+  it('should be created', () => {
+    expect(service).toBeTruthy();
+  });
+
+  describe('#getUrlSave', () => {
+    it ('should reate valid url for save', () => {
+      const expectedUrl = 'http://localhost:1991/las/VBID/save';
+
+      expect(service.getUrlSave('VBID')).toBe(expectedUrl);
+    });
+  });
+
+  describe('#create', () => {
+    it('should return Vorgang', () => {
+      const expectedVorgang = require('../mock/vorgang.json');
+
+      service.create({ type: null, vbId: 'greetings', vorgangId: '1' , zustand: 'Hello world!'}).subscribe(
+        vorgang => expect(vorgang).toEqual(expectedVorgang),
+        fail
+      );
+
+      const req = httpMock.expectOne(service.getUrlSave(expectedVorgang.vbId));
+      expect(req.request.method).toBe('POST');
+      req.flush(expectedVorgang);
+    });
+  });
+});
diff --git a/src/app/vorgang.service.ts b/src/app/vorgang.service.ts
new file mode 100644 (file)
index 0000000..dff07d2
--- /dev/null
@@ -0,0 +1,67 @@
+import { Injectable } from '@angular/core';
+import { Observable, of, EMPTY } from 'rxjs';
+import { Vorgang } from './vorgang';
+import { HttpClient, HttpHeaders } from '@angular/common/http';
+import { catchError, tap } from 'rxjs/operators';
+
+
+@Injectable({
+  providedIn: 'root'
+})
+export class VorgangService {
+
+  gpsUrl = 'http://localhost:1991/las/';  // URL to web api
+  httpOptions = {
+    headers: new HttpHeaders({
+      'Content-Type': 'text/plain',
+      'Accept': 'application/json'
+    })
+  };
+
+  constructor(private http: HttpClient) { }
+
+  /** POST: Einen neuen Vorgang erzeugen */
+  create(vorgang: Vorgang): Observable<Vorgang> {
+    return this
+      .http
+      .post<Vorgang>(
+        this.getUrlSave(vorgang.vbId),
+        vorgang.zustand,
+        this.httpOptions)
+      .pipe(
+        tap((result: Vorgang) => this.log(`Result for ${JSON.stringify(vorgang)}: ${JSON.stringify(result)}`)),
+        catchError(this.handleError<Vorgang>('create')));
+  }
+
+  getUrlSave(vbId: string): string {
+    return this.gpsUrl + vbId + '/save';
+  }
+
+  /**
+   * Handle Http operation that failed.
+   * Let the app continue.
+   * @param operation - name of the operation that failed
+   * @param result - optional value to return as the observable result
+   */
+  private handleError<T>(operation = 'operation', result?: T) {
+    return (error: any): Observable<T> => {
+
+      // TODO: send the error to remote logging infrastructure
+      console.error(error); // log to console instead
+
+      // TODO: better job of transforming error for user consumption
+      this.log(`${operation} failed: ${error.message}`);
+
+      // Let the app keep running by returning an empty result.
+      if (result === undefined) {
+        return EMPTY as Observable<T>;
+      } else {
+        return of(result as T);
+      }
+    };
+  }
+
+  private log(message: string) {
+    console.log(message);
+  }
+}
diff --git a/src/app/vorgang.ts b/src/app/vorgang.ts
new file mode 100644 (file)
index 0000000..ab6095f
--- /dev/null
@@ -0,0 +1,11 @@
+export enum Type {
+  SUCCESS = 'SUCCESS',
+  FAILURE = 'FAILURE'
+}
+
+export interface Vorgang {
+  type?: Type;
+  vbId: string;
+  vorgangId: string;
+  zustand: any;
+}
diff --git a/src/mock/vorgang.json b/src/mock/vorgang.json
new file mode 100644 (file)
index 0000000..052717a
--- /dev/null
@@ -0,0 +1,9 @@
+{
+    "type": "SUCCESS",
+    "vbId": "greetings",
+    "vorgangId": 1,
+    "zustand": {
+        "dlz": "1|vbId=greetings|1, rand=8: Hallo Welt!",
+        "produkt": "1|vbId=greetings|1, rand=1: Hallo Welt!"
+    }
+}