From 7f36cbca51a130b08e370be506bf08af5b1ee030 Mon Sep 17 00:00:00 2001 From: ferpasri Date: Tue, 2 Mar 2021 22:03:58 +0100 Subject: [PATCH 1/2] Visualize TESTAR StateModel --- .gitignore | 2 ++ appsrc/src/app/core/models/artifact.ts | 2 +- appsrc/src/app/plugins/plugins.config.ts | 5 ++++ .../artifact-visualizer.component.ts | 11 ++++++++ .../related-artifacts.component.spec.ts | 2 ++ .../statemodel-visualizer.component.html | 4 +++ .../statemodel-visualizer.component.scss | 0 .../statemodel-visualizer.component.spec.ts | 25 ++++++++++++++++++ .../statemodel-visualizer.component.ts | 20 ++++++++++++++ .../artifact-navigation.component.ts | 26 +++++++++++++++++++ .../artifacts-retriever.service.ts | 14 ++++++++++ .../services/artifact-retriever.mock.ts | 3 +++ appsrc/src/app/shared/constants/constants.ts | 4 +++ 13 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 appsrc/src/app/plugins/project/components/statemodel-visualizer/statemodel-visualizer.component.html create mode 100644 appsrc/src/app/plugins/project/components/statemodel-visualizer/statemodel-visualizer.component.scss create mode 100644 appsrc/src/app/plugins/project/components/statemodel-visualizer/statemodel-visualizer.component.spec.ts create mode 100644 appsrc/src/app/plugins/project/components/statemodel-visualizer/statemodel-visualizer.component.ts diff --git a/.gitignore b/.gitignore index 9d3beff..9d88433 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ # dependencies /node_modules +node_modules/ # profiling files chrome-profiler-events*.json @@ -25,6 +26,7 @@ speed-measure-plugin*.json # IDE - VSCode .vscode/* +.vs/ !.vscode/tasks.json !.vscode/launch.json diff --git a/appsrc/src/app/core/models/artifact.ts b/appsrc/src/app/core/models/artifact.ts index 324632a..b187ac4 100644 --- a/appsrc/src/app/core/models/artifact.ts +++ b/appsrc/src/app/core/models/artifact.ts @@ -1,4 +1,4 @@ -export type ArtifactType = 'Diagram' | 'Code' | 'Doc' | 'Annotation' | 'Log'; +export type ArtifactType = 'Diagram' | 'Code' | 'Doc' | 'Annotation' | 'Log' | 'TESTAR State Model'; export type StatusType = 'Status1' | 'Status2' | 'Status3'; // TODO: Artifact object is been deprecated and will be removed by the end of the integration diff --git a/appsrc/src/app/plugins/plugins.config.ts b/appsrc/src/app/plugins/plugins.config.ts index 0524b48..ddb7734 100644 --- a/appsrc/src/app/plugins/plugins.config.ts +++ b/appsrc/src/app/plugins/plugins.config.ts @@ -55,5 +55,10 @@ export const rendererPlugins: any = { componentName: 'UmlRendererComponent', importFunction: () => import('./renderers/uml-renderer/uml-renderer.component') + }, + web: { + componentName: 'StateModelVisualizerComponent', + importFunction: () => + import('src/app/plugins/project/components/statemodel-visualizer/statemodel-visualizer.component') } }; diff --git a/appsrc/src/app/plugins/project/components/artifact-visualizer/artifact-visualizer.component.ts b/appsrc/src/app/plugins/project/components/artifact-visualizer/artifact-visualizer.component.ts index a1eebe3..4e7a92f 100644 --- a/appsrc/src/app/plugins/project/components/artifact-visualizer/artifact-visualizer.component.ts +++ b/appsrc/src/app/plugins/project/components/artifact-visualizer/artifact-visualizer.component.ts @@ -9,6 +9,7 @@ import { import { PKMArtifact } from 'src/app/core/models/artifact'; import { VisualizableArtifact } from '../../models/visualizable-artifact.model'; import { artifactNameRetriever } from '../../../../utils/utils'; +import { StateModelVisualizerComponent } from 'src/app/plugins/project/components/statemodel-visualizer/statemodel-visualizer.component'; @Component({ selector: 'app-artifact-visualizer', templateUrl: './artifact-visualizer.component.html', @@ -74,6 +75,16 @@ export class ArtifactVisualizerComponent implements OnInit { }; break; } + case 'TESTAR State Model': { + console.log(StateModelVisualizerComponent); + return { + artifact: this.selectedArtifact, + extension: 'web', + content: StateModelVisualizerComponent, + originalUrl: '', + }; + break; + } case 'Diagram': { return { artifact: this.selectedArtifact, diff --git a/appsrc/src/app/plugins/project/components/related-artifacts/related-artifacts.component.spec.ts b/appsrc/src/app/plugins/project/components/related-artifacts/related-artifacts.component.spec.ts index 87fbce5..1971167 100644 --- a/appsrc/src/app/plugins/project/components/related-artifacts/related-artifacts.component.spec.ts +++ b/appsrc/src/app/plugins/project/components/related-artifacts/related-artifacts.component.spec.ts @@ -40,12 +40,14 @@ describe('RelatedArtifactsComponent', () => { const artifactTypeCode: ArtifactType = 'Code'; const artifactTypeDoc: ArtifactType = 'Doc'; const artifactTypeAnnot: ArtifactType = 'Annotation'; + const artifactTypeTestar: ArtifactType = 'TESTAR State Model'; expect(component.getIcon(artifactTypeDiagram)).toBe( constants.icons.DIAGRAM ); expect(component.getIcon(artifactTypeCode)).toBe(constants.icons.CODE); expect(component.getIcon(artifactTypeDoc)).toBe(constants.icons.DOC); + expect(component.getIcon(artifactTypeTestar)).toBe(constants.icons.DIAGRAM); expect(component.getIcon(artifactTypeAnnot)).toBe( constants.icons.ANNOTATION ); diff --git a/appsrc/src/app/plugins/project/components/statemodel-visualizer/statemodel-visualizer.component.html b/appsrc/src/app/plugins/project/components/statemodel-visualizer/statemodel-visualizer.component.html new file mode 100644 index 0000000..30872c3 --- /dev/null +++ b/appsrc/src/app/plugins/project/components/statemodel-visualizer/statemodel-visualizer.component.html @@ -0,0 +1,4 @@ + diff --git a/appsrc/src/app/plugins/project/components/statemodel-visualizer/statemodel-visualizer.component.scss b/appsrc/src/app/plugins/project/components/statemodel-visualizer/statemodel-visualizer.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/appsrc/src/app/plugins/project/components/statemodel-visualizer/statemodel-visualizer.component.spec.ts b/appsrc/src/app/plugins/project/components/statemodel-visualizer/statemodel-visualizer.component.spec.ts new file mode 100644 index 0000000..dde8110 --- /dev/null +++ b/appsrc/src/app/plugins/project/components/statemodel-visualizer/statemodel-visualizer.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { StateModelVisualizerComponent } from './statemodel-visualizer.component'; + +describe('StateModelVisualizerComponent', () => { + let component: StateModelVisualizerComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ StateModelVisualizerComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(StateModelVisualizerComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/appsrc/src/app/plugins/project/components/statemodel-visualizer/statemodel-visualizer.component.ts b/appsrc/src/app/plugins/project/components/statemodel-visualizer/statemodel-visualizer.component.ts new file mode 100644 index 0000000..5b866e9 --- /dev/null +++ b/appsrc/src/app/plugins/project/components/statemodel-visualizer/statemodel-visualizer.component.ts @@ -0,0 +1,20 @@ +import { Component, OnInit } from '@angular/core'; +import { DomSanitizer, SafeUrl } from '@angular/platform-browser'; + +@Component({ + selector: 'app-statemodel-visualizer', + templateUrl: './statemodel-visualizer.component.html', + styleUrls: ['./statemodel-visualizer.component.scss'], +}) +export class StateModelVisualizerComponent implements OnInit { + htmlUrl: SafeUrl; + + constructor(private sanitizer: DomSanitizer) {} + + ngOnInit(): void { + //need to do a GET request, then we can visualize + //curl -X GET "https://decoder-tool.ow2.org/testar/testar/analysis/MyThaiStar" -H "accept: */*" -H "OrientDBaddress: 127.0.0.1" -H "OrientDBpassword: testar" -H "OrientDBuser: testar" + this.htmlUrl = this.sanitizer.bypassSecurityTrustResourceUrl('http://81.200.36.109:8090/models'); + //this.htmlUrl = this.sanitizer.bypassSecurityTrustResourceUrl('http://127.0.0.1:8090/models'); + } +} diff --git a/appsrc/src/app/plugins/project/containers/artifact-navigation/artifact-navigation.component.ts b/appsrc/src/app/plugins/project/containers/artifact-navigation/artifact-navigation.component.ts index 588649e..ac5fa76 100644 --- a/appsrc/src/app/plugins/project/containers/artifact-navigation/artifact-navigation.component.ts +++ b/appsrc/src/app/plugins/project/containers/artifact-navigation/artifact-navigation.component.ts @@ -73,6 +73,7 @@ export class ArtifactNavigationComponent implements OnInit { this.artifactsRetriever.getPKMDocsFromAProject(this.projectInfo.name), this.artifactsRetriever.getPKMLogsFromAProject(this.projectInfo.name), this.artifactsRetriever.getPKMDiagramsFromAProject(this.projectInfo.name), + this.artifactsRetriever.getPKMTESTARStateModelFromAProject(this.projectInfo.name), ] ).subscribe((result: any) => { this.pkmArtifacts = this.filterErrorResultsFromRequest(result.flat(1)); @@ -135,6 +136,7 @@ export class ArtifactNavigationComponent implements OnInit { this.artifactsRetriever.getPKMDocsFromAProject(this.projectInfo.name), this.artifactsRetriever.getPKMLogsFromAProject(this.projectInfo.name), this.artifactsRetriever.getPKMDiagramsFromAProject(this.projectInfo.name), + this.artifactsRetriever.getPKMTESTARStateModelFromAProject(this.projectInfo.name), ] ).subscribe((result: any) => { this.pkmArtifacts = this.filterErrorResultsFromRequest(result.flat(1)); @@ -199,6 +201,11 @@ export class ArtifactNavigationComponent implements OnInit { artifact.id = `${artifact.name}`; break; } + case 'TESTAR State Model': { + artifact.name = `${artifact.stateModelAppName}v${artifact.stateModelAppVersion}`; + artifact.id = `${artifact._id}`; + break; + } default: { artifact.name = `${artifact.rel_path}`; artifact.id = `${artifact.rel_path}`; @@ -247,6 +254,25 @@ export class ArtifactNavigationComponent implements OnInit { this.goToSelectedArtifact(artifactNodeInformation.id); break; } + case 'TESTAR State Model': { + this.artifactsRetriever + .getPKMTESTARStateModelFromAProjectByID(this.projectInfo.name, artifactNodeInformation.id) + .subscribe((element: any) => { + this.selectedArtifact = { + content: element, + type: element.type, + name: element.stateModelAppName + 'v' + element.stateModelAppVersion, + id: element._id, + rel_path: '', + format: '', + encoding: '', + gitRepoUrl: '', + gitCommitId: '', + }; + }); + this.goToSelectedArtifact(artifactNodeInformation.id); + break; + } case 'Comment': { this.artifactsRetriever .getPKMCommentsFromAProjectByID(this.projectInfo.name, artifactNodeInformation.id) diff --git a/appsrc/src/app/plugins/project/services/artifacts-retriever/artifacts-retriever.service.ts b/appsrc/src/app/plugins/project/services/artifacts-retriever/artifacts-retriever.service.ts index bf30079..e569ccf 100644 --- a/appsrc/src/app/plugins/project/services/artifacts-retriever/artifacts-retriever.service.ts +++ b/appsrc/src/app/plugins/project/services/artifacts-retriever/artifacts-retriever.service.ts @@ -138,4 +138,18 @@ export class ArtifactsRetrieverService { .get(url) .pipe(catchError((err: any) => of({isError: true, error: err}))); } + + getPKMTESTARStateModelFromAProject(projectId: string): Observable { + const url: string = `${PROJECT_BASE_URL}/testar/state_model/${projectId}`; + return this.http + .get(url) + .pipe(catchError((err: any) => of({isError: true, error: err}))); + } + + getPKMTESTARStateModelFromAProjectByID(projectId: string, artifactId: string): Observable { + const url: string = `${PROJECT_BASE_URL}/testar/state_model/${projectId}/${urlEncodeArtifactName(artifactId)}`; + return this.http + .get(url) + .pipe(catchError((err: any) => of({isError: true, error: err}))); + } } diff --git a/appsrc/src/app/plugins/project/testing/services/artifact-retriever.mock.ts b/appsrc/src/app/plugins/project/testing/services/artifact-retriever.mock.ts index ae2588e..76249b7 100644 --- a/appsrc/src/app/plugins/project/testing/services/artifact-retriever.mock.ts +++ b/appsrc/src/app/plugins/project/testing/services/artifact-retriever.mock.ts @@ -39,6 +39,9 @@ export function getMockRetriever(): Partial { getPKMDiagramsFromAProject : jasmine .createSpy('getPKMDiagramsFromAProject ') .and.returnValue(scheduled(of([]), asyncScheduler)), + getPKMTESTARStateModelFromAProject : jasmine + .createSpy('getPKMTESTARStateModelFromAProject') + .and.returnValue(scheduled(of([]), asyncScheduler)), }; return mockRetriever; diff --git a/appsrc/src/app/shared/constants/constants.ts b/appsrc/src/app/shared/constants/constants.ts index 0067272..3a0706f 100644 --- a/appsrc/src/app/shared/constants/constants.ts +++ b/appsrc/src/app/shared/constants/constants.ts @@ -7,6 +7,7 @@ export interface Constants { COMMENT: string; LOG: string; 'UML MODEL': string; + 'TESTAR STATE MODEL': string; }; icons: { @@ -17,6 +18,7 @@ export interface Constants { COMMENT: string; LOG: string; 'UML MODEL': string; + 'TESTAR STATE MODEL': string; }; } @@ -29,6 +31,7 @@ export const constants: Constants = { COMMENT: 'Comment', LOG: 'Log', 'UML MODEL': 'UML Model', + 'TESTAR STATE MODEL': 'TESTAR State Model', }, icons: { DIAGRAM: 'integration_instructions', @@ -38,5 +41,6 @@ export const constants: Constants = { COMMENT: 'comment', LOG: 'description', 'UML MODEL': 'device_hub', + 'TESTAR STATE MODEL': 'device_hub', } }; -- GitLab From 5ada5c926acf3b293697835a5e7d6e2f1a45acbf Mon Sep 17 00:00:00 2001 From: ferpasri Date: Mon, 8 Mar 2021 14:47:47 +0100 Subject: [PATCH 2/2] update TESTAR State Model - Add GET request to activate web feature - Change name and type --- appsrc/src/app/core/models/artifact.ts | 2 +- appsrc/src/app/plugins/plugins.config.ts | 2 +- .../artifact-visualizer.component.ts | 8 +++----- .../related-artifacts.component.spec.ts | 2 +- .../statemodel-visualizer.component.ts | 2 -- .../artifact-navigation.component.ts | 8 ++++---- .../artifacts-retriever.service.ts | 18 ++++++++++++++++-- appsrc/src/app/shared/constants/constants.ts | 2 +- 8 files changed, 27 insertions(+), 17 deletions(-) diff --git a/appsrc/src/app/core/models/artifact.ts b/appsrc/src/app/core/models/artifact.ts index b187ac4..a2205a1 100644 --- a/appsrc/src/app/core/models/artifact.ts +++ b/appsrc/src/app/core/models/artifact.ts @@ -1,4 +1,4 @@ -export type ArtifactType = 'Diagram' | 'Code' | 'Doc' | 'Annotation' | 'Log' | 'TESTAR State Model'; +export type ArtifactType = 'Diagram' | 'Code' | 'Doc' | 'Annotation' | 'Log' | 'TESTAR_State_Model'; export type StatusType = 'Status1' | 'Status2' | 'Status3'; // TODO: Artifact object is been deprecated and will be removed by the end of the integration diff --git a/appsrc/src/app/plugins/plugins.config.ts b/appsrc/src/app/plugins/plugins.config.ts index ddb7734..9ec96fa 100644 --- a/appsrc/src/app/plugins/plugins.config.ts +++ b/appsrc/src/app/plugins/plugins.config.ts @@ -56,7 +56,7 @@ export const rendererPlugins: any = { importFunction: () => import('./renderers/uml-renderer/uml-renderer.component') }, - web: { + web_testar_statemodel: { componentName: 'StateModelVisualizerComponent', importFunction: () => import('src/app/plugins/project/components/statemodel-visualizer/statemodel-visualizer.component') diff --git a/appsrc/src/app/plugins/project/components/artifact-visualizer/artifact-visualizer.component.ts b/appsrc/src/app/plugins/project/components/artifact-visualizer/artifact-visualizer.component.ts index 4e7a92f..2cc9be2 100644 --- a/appsrc/src/app/plugins/project/components/artifact-visualizer/artifact-visualizer.component.ts +++ b/appsrc/src/app/plugins/project/components/artifact-visualizer/artifact-visualizer.component.ts @@ -9,7 +9,6 @@ import { import { PKMArtifact } from 'src/app/core/models/artifact'; import { VisualizableArtifact } from '../../models/visualizable-artifact.model'; import { artifactNameRetriever } from '../../../../utils/utils'; -import { StateModelVisualizerComponent } from 'src/app/plugins/project/components/statemodel-visualizer/statemodel-visualizer.component'; @Component({ selector: 'app-artifact-visualizer', templateUrl: './artifact-visualizer.component.html', @@ -75,12 +74,11 @@ export class ArtifactVisualizerComponent implements OnInit { }; break; } - case 'TESTAR State Model': { - console.log(StateModelVisualizerComponent); + case 'TESTAR_State_Model': { return { artifact: this.selectedArtifact, - extension: 'web', - content: StateModelVisualizerComponent, + extension: 'web_testar_statemodel', + content: '', originalUrl: '', }; break; diff --git a/appsrc/src/app/plugins/project/components/related-artifacts/related-artifacts.component.spec.ts b/appsrc/src/app/plugins/project/components/related-artifacts/related-artifacts.component.spec.ts index 1971167..724188d 100644 --- a/appsrc/src/app/plugins/project/components/related-artifacts/related-artifacts.component.spec.ts +++ b/appsrc/src/app/plugins/project/components/related-artifacts/related-artifacts.component.spec.ts @@ -40,7 +40,7 @@ describe('RelatedArtifactsComponent', () => { const artifactTypeCode: ArtifactType = 'Code'; const artifactTypeDoc: ArtifactType = 'Doc'; const artifactTypeAnnot: ArtifactType = 'Annotation'; - const artifactTypeTestar: ArtifactType = 'TESTAR State Model'; + const artifactTypeTestar: ArtifactType = 'TESTAR_State_Model'; expect(component.getIcon(artifactTypeDiagram)).toBe( constants.icons.DIAGRAM diff --git a/appsrc/src/app/plugins/project/components/statemodel-visualizer/statemodel-visualizer.component.ts b/appsrc/src/app/plugins/project/components/statemodel-visualizer/statemodel-visualizer.component.ts index 5b866e9..9e5ceb6 100644 --- a/appsrc/src/app/plugins/project/components/statemodel-visualizer/statemodel-visualizer.component.ts +++ b/appsrc/src/app/plugins/project/components/statemodel-visualizer/statemodel-visualizer.component.ts @@ -12,8 +12,6 @@ export class StateModelVisualizerComponent implements OnInit { constructor(private sanitizer: DomSanitizer) {} ngOnInit(): void { - //need to do a GET request, then we can visualize - //curl -X GET "https://decoder-tool.ow2.org/testar/testar/analysis/MyThaiStar" -H "accept: */*" -H "OrientDBaddress: 127.0.0.1" -H "OrientDBpassword: testar" -H "OrientDBuser: testar" this.htmlUrl = this.sanitizer.bypassSecurityTrustResourceUrl('http://81.200.36.109:8090/models'); //this.htmlUrl = this.sanitizer.bypassSecurityTrustResourceUrl('http://127.0.0.1:8090/models'); } diff --git a/appsrc/src/app/plugins/project/containers/artifact-navigation/artifact-navigation.component.ts b/appsrc/src/app/plugins/project/containers/artifact-navigation/artifact-navigation.component.ts index ac5fa76..bd1e7cf 100644 --- a/appsrc/src/app/plugins/project/containers/artifact-navigation/artifact-navigation.component.ts +++ b/appsrc/src/app/plugins/project/containers/artifact-navigation/artifact-navigation.component.ts @@ -201,8 +201,8 @@ export class ArtifactNavigationComponent implements OnInit { artifact.id = `${artifact.name}`; break; } - case 'TESTAR State Model': { - artifact.name = `${artifact.stateModelAppName}v${artifact.stateModelAppVersion}`; + case 'TESTAR_State_Model': { + artifact.name = `${artifact.stateModelDataStoreDB}`; artifact.id = `${artifact._id}`; break; } @@ -254,14 +254,14 @@ export class ArtifactNavigationComponent implements OnInit { this.goToSelectedArtifact(artifactNodeInformation.id); break; } - case 'TESTAR State Model': { + case 'TESTAR_State_Model': { this.artifactsRetriever .getPKMTESTARStateModelFromAProjectByID(this.projectInfo.name, artifactNodeInformation.id) .subscribe((element: any) => { this.selectedArtifact = { content: element, type: element.type, - name: element.stateModelAppName + 'v' + element.stateModelAppVersion, + name: element.stateModelDataStoreDB, id: element._id, rel_path: '', format: '', diff --git a/appsrc/src/app/plugins/project/services/artifacts-retriever/artifacts-retriever.service.ts b/appsrc/src/app/plugins/project/services/artifacts-retriever/artifacts-retriever.service.ts index e569ccf..94bef5a 100644 --- a/appsrc/src/app/plugins/project/services/artifacts-retriever/artifacts-retriever.service.ts +++ b/appsrc/src/app/plugins/project/services/artifacts-retriever/artifacts-retriever.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; import { PKMArtifact } from 'src/app/core/models/artifact'; import { Observable, of } from 'rxjs'; -import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { HttpClient, HttpHeaders, HttpClientModule, HttpParams } from '@angular/common/http'; import { environment } from 'src/environments/environment'; import { catchError } from 'rxjs/operators'; import { urlEncodeArtifactName } from '../../../../utils/utils'; @@ -140,6 +140,20 @@ export class ArtifactsRetrieverService { } getPKMTESTARStateModelFromAProject(projectId: string): Observable { + // Activate TESTAR State Model web feature sending a GET request + const testarHeaders: HttpHeaders = new HttpHeaders({ + 'Content-Type': 'application/json', + 'OrientDBaddress': '127.0.0.1', + 'OrientDBpassword': 'testar', + 'OrientDBuser': 'testar' + }); + + this.http.get( + 'https://decoder-tool.ow2.org/testar/testar/analysis/MyThaiStar', + { + headers: testarHeaders, + }).subscribe(x => console.log(x)); + const url: string = `${PROJECT_BASE_URL}/testar/state_model/${projectId}`; return this.http .get(url) @@ -147,7 +161,7 @@ export class ArtifactsRetrieverService { } getPKMTESTARStateModelFromAProjectByID(projectId: string, artifactId: string): Observable { - const url: string = `${PROJECT_BASE_URL}/testar/state_model/${projectId}/${urlEncodeArtifactName(artifactId)}`; + const url: string = `${PROJECT_BASE_URL}/testar/state_model/${projectId}/${artifactId}`; return this.http .get(url) .pipe(catchError((err: any) => of({isError: true, error: err}))); diff --git a/appsrc/src/app/shared/constants/constants.ts b/appsrc/src/app/shared/constants/constants.ts index 3a0706f..cdc2661 100644 --- a/appsrc/src/app/shared/constants/constants.ts +++ b/appsrc/src/app/shared/constants/constants.ts @@ -31,7 +31,7 @@ export const constants: Constants = { COMMENT: 'Comment', LOG: 'Log', 'UML MODEL': 'UML Model', - 'TESTAR STATE MODEL': 'TESTAR State Model', + 'TESTAR STATE MODEL': 'TESTAR_State_Model', }, icons: { DIAGRAM: 'integration_instructions', -- GitLab