From 3f23d972b69622afbba497272515cf5d550ca6df Mon Sep 17 00:00:00 2001 From: Aaron Louie Date: Thu, 19 Mar 2020 10:28:51 -0400 Subject: [PATCH] Adds tests for workflow spec categories --- .../workflow-spec-list.component.spec.ts | 105 +++++++++++++++++- .../workflow-spec-list.component.ts | 5 +- 2 files changed, 106 insertions(+), 4 deletions(-) diff --git a/src/app/workflow-spec-list/workflow-spec-list.component.spec.ts b/src/app/workflow-spec-list/workflow-spec-list.component.spec.ts index b07a3c5..0a9c544 100644 --- a/src/app/workflow-spec-list/workflow-spec-list.component.spec.ts +++ b/src/app/workflow-spec-list/workflow-spec-list.component.spec.ts @@ -14,11 +14,16 @@ import { ApiService, MockEnvironment, mockWorkflowSpec0, - mockWorkflowSpec1, mockWorkflowSpecCategories, + mockWorkflowSpec1, mockWorkflowSpecCategories, mockWorkflowSpecCategory0, mockWorkflowSpecCategory1, mockWorkflowSpecs } from 'sartography-workflow-lib'; import {DeleteWorkflowSpecDialogComponent} from '../_dialogs/delete-workflow-spec-dialog/delete-workflow-spec-dialog.component'; -import {DeleteWorkflowSpecDialogData, WorkflowSpecDialogData} from '../_interfaces/dialog-data'; +import { + DeleteWorkflowSpecCategoryDialogData, + DeleteWorkflowSpecDialogData, + WorkflowSpecCategoryDialogData, + WorkflowSpecDialogData +} from '../_interfaces/dialog-data'; import {GetIconCodePipe} from '../_pipes/get-icon-code.pipe'; import {FileListComponent} from '../file-list/file-list.component'; import {WorkflowSpecListComponent} from './workflow-spec-list.component'; @@ -192,4 +197,100 @@ describe('WorkflowSpecListComponent', () => { expect(loadWorkflowSpecsSpy).toHaveBeenCalled(); }); + it('should show a metadata dialog when editing a workflow spec category', () => { + let mockCatData: WorkflowSpecCategoryDialogData = { + id: null, + name: '', + display_name: '', + }; + + const _upsertWorkflowSpecCategorySpy = spyOn((component as any), '_upsertWorkflowSpecCategory') + .and.stub(); + const openDialogSpy = spyOn(component.dialog, 'open') + .and.returnValue({afterClosed: () => of(mockCatData)} as any); + + component.editWorkflowSpecCategory(mockWorkflowSpecCategory0); + expect(openDialogSpy).toHaveBeenCalled(); + expect(_upsertWorkflowSpecCategorySpy).not.toHaveBeenCalled(); + + mockCatData = mockWorkflowSpecCategory0 as WorkflowSpecCategoryDialogData; + component.editWorkflowSpecCategory(mockWorkflowSpecCategory0); + expect(openDialogSpy).toHaveBeenCalled(); + expect(_upsertWorkflowSpecCategorySpy).toHaveBeenCalled(); + }); + + it('should edit an existing workflow spec category but add a new workflow spec category', () => { + const _addWorkflowSpecCategorySpy = spyOn((component as any), '_addWorkflowSpecCategory').and.stub(); + const _updateWorkflowSpecCategorySpy = spyOn((component as any), '_updateWorkflowSpecCategory').and.stub(); + + component.selectedSpec = undefined; + (component as any)._upsertWorkflowSpecCategory(mockWorkflowSpecCategory1 as WorkflowSpecCategoryDialogData); + expect(_addWorkflowSpecCategorySpy).toHaveBeenCalled(); + expect(_updateWorkflowSpecCategorySpy).not.toHaveBeenCalled(); + + _addWorkflowSpecCategorySpy.calls.reset(); + _updateWorkflowSpecCategorySpy.calls.reset(); + + component.selectedCat = mockWorkflowSpecCategory0; + const modifiedData: WorkflowSpecCategoryDialogData = createClone()(mockWorkflowSpecCategory0); + modifiedData.display_name = 'Modified'; + (component as any)._upsertWorkflowSpecCategory(modifiedData); + expect(_addWorkflowSpecCategorySpy).not.toHaveBeenCalled(); + expect(_updateWorkflowSpecCategorySpy).toHaveBeenCalled(); + }); + + it('should add a workflow spec', () => { + const _loadWorkflowSpecCategoriesSpy = spyOn((component as any), '_loadWorkflowSpecCategories').and.stub(); + const _displayMessageSpy = spyOn((component as any), '_displayMessage').and.stub(); + (component as any)._addWorkflowSpecCategory(mockWorkflowSpecCategory0); + const catReq = httpMock.expectOne(`apiRoot/workflow-specification-category`); + expect(catReq.request.method).toEqual('POST'); + catReq.flush(mockWorkflowSpecCategory0); + + expect(_loadWorkflowSpecCategoriesSpy).toHaveBeenCalled(); + expect(_displayMessageSpy).toHaveBeenCalled(); + }); + + it('should edit a workflow spec category', () => { + const _loadWorkflowSpecCategoriesSpy = spyOn((component as any), '_loadWorkflowSpecCategories').and.stub(); + const _displayMessageSpy = spyOn((component as any), '_displayMessage').and.stub(); + (component as any)._updateWorkflowSpecCategory(mockWorkflowSpecCategory0.id, mockWorkflowSpecCategory0); + const catReq = httpMock.expectOne(`apiRoot/workflow-specification-category/${mockWorkflowSpecCategory0.id}`); + expect(catReq.request.method).toEqual('PUT'); + catReq.flush(mockWorkflowSpecCategory0); + + expect(_loadWorkflowSpecCategoriesSpy).toHaveBeenCalled(); + expect(_displayMessageSpy).toHaveBeenCalled(); + }); + + it('should show a confirmation dialog before deleting a workflow spec category', () => { + const mockConfirmDeleteData: DeleteWorkflowSpecCategoryDialogData = { + confirm: false, + category: mockWorkflowSpecCategory0 + }; + + const _deleteWorkflowSpecCategorySpy = spyOn((component as any), '_deleteWorkflowSpecCategory').and.stub(); + const openDialogSpy = spyOn(component.dialog, 'open') + .and.returnValue({afterClosed: () => of(mockConfirmDeleteData)} as any); + + component.confirmDeleteWorkflowSpecCategory(mockWorkflowSpecCategory0); + expect(openDialogSpy).toHaveBeenCalled(); + expect(_deleteWorkflowSpecCategorySpy).not.toHaveBeenCalled(); + + mockConfirmDeleteData.confirm = true; + component.confirmDeleteWorkflowSpecCategory(mockWorkflowSpecCategory0); + expect(openDialogSpy).toHaveBeenCalled(); + expect(_deleteWorkflowSpecCategorySpy).toHaveBeenCalled(); + }); + + it('should delete a workflow spec category', () => { + const _loadWorkflowSpecCategoriesSpy = spyOn((component as any), '_loadWorkflowSpecCategories').and.stub(); + (component as any)._deleteWorkflowSpecCategory(mockWorkflowSpecCategory0); + const catReq = httpMock.expectOne(`apiRoot/workflow-specification-category/${mockWorkflowSpecCategory0.id}`); + expect(catReq.request.method).toEqual('DELETE'); + catReq.flush(null); + + expect(_loadWorkflowSpecCategoriesSpy).toHaveBeenCalled(); + }); + }); diff --git a/src/app/workflow-spec-list/workflow-spec-list.component.ts b/src/app/workflow-spec-list/workflow-spec-list.component.ts index d750cf4..68f06bd 100644 --- a/src/app/workflow-spec-list/workflow-spec-list.component.ts +++ b/src/app/workflow-spec-list/workflow-spec-list.component.ts @@ -12,6 +12,7 @@ import { WorkflowSpecCategoryDialogData, WorkflowSpecDialogData } from '../_interfaces/dialog-data'; +import {isNumberDefined} from '../_util/is-number-defined'; interface WorklflowSpecCategoryGroup { id: number; @@ -74,14 +75,14 @@ export class WorkflowSpecListComponent implements OnInit { height: '65vh', width: '50vw', data: { - id: this.selectedCat ? this.selectedCat.id : '', + id: this.selectedCat ? this.selectedCat.id : null, name: this.selectedCat ? this.selectedCat.name || this.selectedCat.id : '', display_name: this.selectedCat ? this.selectedCat.display_name : '', }, }); dialogRef.afterClosed().subscribe((data: WorkflowSpecCategoryDialogData) => { - if (data && data.id && data.name && data.display_name) { + if (data && isNumberDefined(data.id) && data.name && data.display_name) { this._upsertWorkflowSpecCategory(data); } });