From 8c8e32e5a8491d3eb384d2c7c3e29bef52122087 Mon Sep 17 00:00:00 2001
From: paf <paf@titelfrei.de>
Date: Wed, 16 Sep 2020 14:25:28 +0200
Subject: [PATCH] don't attempt to update testState before test-id exists or
 after test is locked

rename TERMINATING to TERMINATED wo have the one reported to backend/monitor to be TERMINATED and teh internale state (former TERMINATED) wich cames when locking was successful to FINISHED (not LOCKED because possible future confusion)
---
 src/app/test-controller/backend.service.ts    |  6 ------
 src/app/test-controller/command.service.ts    |  2 +-
 .../test-controller-route-guards.ts           |  6 ++++--
 .../test-controller.component.ts              | 14 ++++++++-----
 .../test-controller.interfaces.ts             |  2 +-
 .../test-controller.service.ts                | 20 +++++++++----------
 src/environments/environment.dev.ts           |  2 +-
 src/environments/environment.prod.ts          |  2 +-
 8 files changed, 27 insertions(+), 27 deletions(-)

diff --git a/src/app/test-controller/backend.service.ts b/src/app/test-controller/backend.service.ts
index c15433a6..b41638ef 100644
--- a/src/app/test-controller/backend.service.ts
+++ b/src/app/test-controller/backend.service.ts
@@ -87,12 +87,6 @@ export class BackendService {
   }
 
   updateTestState(testId: string, newState: StateReportEntry[]): Subscription {
-
-    if (!testId) { // TODO find out why does this happen at tst start and get rid of it
-        console.warn('called without testID', newState);
-        return of().subscribe();
-    }
-
     return this.http
       .patch(this.serverUrl + `test/${testId}/state`, newState)
       .subscribe({error: (err: ApiError) => console.error(`updateTestState Api-Error: ${err.code} ${err.info}`)});
diff --git a/src/app/test-controller/command.service.ts b/src/app/test-controller/command.service.ts
index 546535e6..f8934880 100644
--- a/src/app/test-controller/command.service.ts
+++ b/src/app/test-controller/command.service.ts
@@ -59,7 +59,7 @@ export class CommandService extends WebsocketBackendService<Command[]> implement
         if ((testStatus === TestControllerState.RUNNING) || (testStatus === TestControllerState.PAUSED)) {
             return 'started';
         }
-        if ((testStatus === TestControllerState.TERMINATED) || (testStatus === TestControllerState.ERROR)) {
+        if ((testStatus === TestControllerState.FINISHED) || (testStatus === TestControllerState.ERROR)) {
             return 'terminated';
         }
         return '';
diff --git a/src/app/test-controller/test-controller-route-guards.ts b/src/app/test-controller/test-controller-route-guards.ts
index f6436798..3f990b72 100644
--- a/src/app/test-controller/test-controller-route-guards.ts
+++ b/src/app/test-controller/test-controller-route-guards.ts
@@ -19,7 +19,7 @@ export class TestControllerDeactivateGuard implements CanDeactivate<TestControll
 
     if (this.tcs.testMode.saveResponses) {
       const testStatus: TestControllerState = this.tcs.testStatus$.getValue();
-      if ((testStatus !== TestControllerState.ERROR) && (testStatus !== TestControllerState.TERMINATED)) {
+      if ((testStatus !== TestControllerState.ERROR) && (testStatus !== TestControllerState.FINISHED)) {
         if (this.tcs.bookletConfig.unit_menu !== 'OFF' || this.tcs.testMode.showUnitMenu) {
           this.tcs.setUnitNavigationRequest(UnitNavigationTarget.MENU);
         } else {
@@ -48,7 +48,9 @@ export class TestControllerErrorPausedActivateGuard implements CanActivate {
 
   canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | boolean {
     const testStatus: TestControllerState = this.tcs.testStatus$.getValue();
-    return (testStatus !== TestControllerState.ERROR) && (testStatus !== TestControllerState.TERMINATED) && (testStatus !== TestControllerState.PAUSED)
+    return (testStatus !== TestControllerState.ERROR)
+        && (testStatus !== TestControllerState.FINISHED)
+        && (testStatus !== TestControllerState.PAUSED);
   }
 }
 
diff --git a/src/app/test-controller/test-controller.component.ts b/src/app/test-controller/test-controller.component.ts
index 95cf7898..ed430fe7 100644
--- a/src/app/test-controller/test-controller.component.ts
+++ b/src/app/test-controller/test-controller.component.ts
@@ -319,11 +319,15 @@ export class TestControllerComponent implements OnInit, OnDestroy {
         }
         this.tcs.testStatus$.next(TestControllerState.ERROR);
       });
-      this.testStatusSubscription = this.tcs.testStatus$.subscribe(ts => {
-        this.bs.updateTestState(this.tcs.testId, [<StateReportEntry>{
-          key: TestStateKey.CONTROLLER, timeStamp: Date.now(), content: ts
-        }]);
-        switch (ts) {
+      this.testStatusSubscription = this.tcs.testStatus$.subscribe(testContollerState => {
+
+        if ([TestControllerState.FINISHED, TestControllerState.INIT].indexOf(testContollerState) === -1) {
+          this.bs.updateTestState(this.tcs.testId, [<StateReportEntry>{
+            key: TestStateKey.CONTROLLER, timeStamp: Date.now(), content: testContollerState
+          }]);
+        }
+
+        switch (testContollerState) {
           case TestControllerState.ERROR:
             this.tcs.loadProgressValue = 0;
             this.tcs.setUnitNavigationRequest(UnitNavigationTarget.ERROR);
diff --git a/src/app/test-controller/test-controller.interfaces.ts b/src/app/test-controller/test-controller.interfaces.ts
index 02059874..c79b66a1 100644
--- a/src/app/test-controller/test-controller.interfaces.ts
+++ b/src/app/test-controller/test-controller.interfaces.ts
@@ -49,8 +49,8 @@ export enum TestControllerState {
   INIT = 'INIT',
   LOADING = 'LOADING',
   RUNNING = 'RUNNING',
-  TERMINATING = 'TERMINATING',
   TERMINATED = 'TERMINATED',
+  FINISHED = 'FINISHED',
   PAUSED = 'PAUSED',
   ERROR = 'ERROR'
 }
diff --git a/src/app/test-controller/test-controller.service.ts b/src/app/test-controller/test-controller.service.ts
index cb73c706..6d0be715 100644
--- a/src/app/test-controller/test-controller.service.ts
+++ b/src/app/test-controller/test-controller.service.ts
@@ -273,15 +273,15 @@ export class TestControllerService {
 
   public terminateTest(logEntryKey: string) {
     if (this.testMode.saveResponses) {
-      if (this.testStatus$.getValue() !== TestControllerState.TERMINATING) {
-        this.testStatus$.next(TestControllerState.TERMINATING); // sometimes terminateTest get called two times from player
+      if (this.testStatus$.getValue() !== TestControllerState.TERMINATED) {
+        this.testStatus$.next(TestControllerState.TERMINATED); // sometimes terminateTest get called two times from player
         this.bs.lockTest(this.testId, Date.now(), logEntryKey).subscribe(bsOk => {
-          this.testStatus$.next(bsOk ? TestControllerState.TERMINATED : TestControllerState.ERROR);
+          this.testStatus$.next(bsOk ? TestControllerState.FINISHED : TestControllerState.ERROR);
           this.router.navigate(['/'], {state: {force: true}});
         });
       }
     } else {
-      this.testStatus$.next(TestControllerState.TERMINATED);
+      this.testStatus$.next(TestControllerState.FINISHED);
       this.router.navigate(['/'], {state: {force: true}});
     }
   }
@@ -335,13 +335,13 @@ export class TestControllerService {
               if (!navOk) {
                 const navTarget = Number(navString);
                 if (!isNaN(navTarget)) {
-                  let startWith = this.currentUnitSequenceId;
-                  if (startWith < this.minUnitSequenceId) {
-                    startWith = this.minUnitSequenceId - 1;
+                  let unitSequenceId = this.currentUnitSequenceId;
+                  if (unitSequenceId < this.minUnitSequenceId) {
+                    unitSequenceId = this.minUnitSequenceId - 1;
                   }
-                  const nextUnitSequenceId = this.rootTestlet.getNextUnlockedUnitSequenceId(startWith);
-                  if (nextUnitSequenceId > 0 && nextUnitSequenceId !== navTarget) {
-                    this.router.navigate([`/t/${this.testId}/u/${nextUnitSequenceId}`],
+                  const unitSequenceIdNext = this.rootTestlet.getNextUnlockedUnitSequenceId(unitSequenceId);
+                  if (unitSequenceIdNext > 0 && unitSequenceIdNext !== navTarget) {
+                    this.router.navigate([`/t/${this.testId}/u/${unitSequenceIdNext}`],
                       {state: {force: force}});
                   }
                 }
diff --git a/src/environments/environment.dev.ts b/src/environments/environment.dev.ts
index 9c0ce523..b32c9024 100644
--- a/src/environments/environment.dev.ts
+++ b/src/environments/environment.dev.ts
@@ -6,6 +6,6 @@ export const environment = {
   production: false,
   testcenterUrl: '/api/',
   appPublisher: 'IQB - Institut zur Qualitätsentwicklung im Bildungswesen',
-  apiVersionExpected: '7.0.0',
+  apiVersionExpected: '7.1.0',
   veronaApiVersionSupported: '2.1.0'
 };
diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts
index 34407785..b55c1e8f 100644
--- a/src/environments/environment.prod.ts
+++ b/src/environments/environment.prod.ts
@@ -4,6 +4,6 @@ export const environment = {
   production: true,
   testcenterUrl: '/api/',
   appPublisher: 'IQB - Institut zur Qualitätsentwicklung im Bildungswesen',
-  apiVersionExpected: '7.0.0',
+  apiVersionExpected: '7.1.0',
   veronaApiVersionSupported: '2.1.0'
 };
-- 
GitLab