Added form validation before saving bitstream data

This commit is contained in:
Giuseppe Digilio
2019-03-17 16:57:24 +01:00
parent e90212703e
commit 1bdc1d799d
3 changed files with 41 additions and 8 deletions

View File

@@ -236,6 +236,7 @@ describe('FormSectionComponent test suite', () => {
it('should init section properly', () => { it('should init section properly', () => {
const sectionData = {}; const sectionData = {};
formService.isValid.and.returnValue(observableOf(true));
formConfigService.getConfigByHref.and.returnValue(observableOf(formConfigData)); formConfigService.getConfigByHref.and.returnValue(observableOf(formConfigData));
sectionsServiceStub.getSectionData.and.returnValue(observableOf(sectionData)); sectionsServiceStub.getSectionData.and.returnValue(observableOf(sectionData));
spyOn(comp, 'initForm'); spyOn(comp, 'initForm');

View File

@@ -35,6 +35,8 @@ import { POLICY_DEFAULT_WITH_LIST } from '../section-upload.component';
import { JsonPatchOperationPathCombiner } from '../../../../core/json-patch/builder/json-patch-operation-path-combiner'; import { JsonPatchOperationPathCombiner } from '../../../../core/json-patch/builder/json-patch-operation-path-combiner';
import { getMockSectionUploadService } from '../../../../shared/mocks/mock-section-upload.service'; import { getMockSectionUploadService } from '../../../../shared/mocks/mock-section-upload.service';
import { FormFieldMetadataValueObject } from '../../../../shared/form/builder/models/form-field-metadata-value.model'; import { FormFieldMetadataValueObject } from '../../../../shared/form/builder/models/form-field-metadata-value.model';
import { Group } from '../../../../core/eperson/models/group.model';
import { UploadSectionFileEditComponent } from './edit/file-edit.component';
function getMockFileService(): FileService { function getMockFileService(): FileService {
return jasmine.createSpyObj('FileService', { return jasmine.createSpyObj('FileService', {
@@ -61,7 +63,10 @@ describe('UploadSectionFileComponent test suite', () => {
const sectionId = 'upload'; const sectionId = 'upload';
const collectionId = mockSubmissionCollectionId; const collectionId = mockSubmissionCollectionId;
const availableAccessConditionOptions = mockUploadConfigResponse.accessConditionOptions; const availableAccessConditionOptions = mockUploadConfigResponse.accessConditionOptions;
const availableGroupsMap = new Map([[mockGroup.id, { name: mockGroup.name, uuid: mockGroup.uuid }]]); const availableGroupsMap: Map<string, Group[]> = new Map([
[mockUploadConfigResponse.accessConditionOptions[1].name, [mockGroup as any]],
[mockUploadConfigResponse.accessConditionOptions[2].name, [mockGroup as any]],
]);
const collectionPolicyType = POLICY_DEFAULT_WITH_LIST; const collectionPolicyType = POLICY_DEFAULT_WITH_LIST;
const fileIndex = '0'; const fileIndex = '0';
const fileName = '123456-test-upload.jpg'; const fileName = '123456-test-upload.jpg';
@@ -98,7 +103,8 @@ describe('UploadSectionFileComponent test suite', () => {
{ provide: SectionUploadService, useValue: getMockSectionUploadService() }, { provide: SectionUploadService, useValue: getMockSectionUploadService() },
ChangeDetectorRef, ChangeDetectorRef,
NgbModal, NgbModal,
UploadSectionFileComponent UploadSectionFileComponent,
UploadSectionFileEditComponent
], ],
schemas: [NO_ERRORS_SCHEMA] schemas: [NO_ERRORS_SCHEMA]
}).compileComponents().then(); }).compileComponents().then();
@@ -228,10 +234,14 @@ describe('UploadSectionFileComponent test suite', () => {
expect(fileService.downloadFile).toHaveBeenCalled() expect(fileService.downloadFile).toHaveBeenCalled()
})); }));
it('should download Bitstream File properly', fakeAsync(() => { it('should save Bitstream File data properly when form is valid', fakeAsync(() => {
compAsAny.fileEditComp = TestBed.get(UploadSectionFileEditComponent);
compAsAny.fileEditComp.formRef = {formGroup: null};
compAsAny.pathCombiner = pathCombiner; compAsAny.pathCombiner = pathCombiner;
const event = new Event('click', null); const event = new Event('click', null);
spyOn(comp, 'switchMode'); spyOn(comp, 'switchMode');
formService.validateAllFormFields.and.callFake(() => null);
formService.isValid.and.returnValue(observableOf(true));
formService.getFormData.and.returnValue(observableOf(mockFileFormData)); formService.getFormData.and.returnValue(observableOf(mockFileFormData));
const response = [ const response = [
@@ -279,6 +289,20 @@ describe('UploadSectionFileComponent test suite', () => {
})); }));
it('should not save Bitstream File data properly when form is not valid', fakeAsync(() => {
compAsAny.fileEditComp = TestBed.get(UploadSectionFileEditComponent);
compAsAny.fileEditComp.formRef = {formGroup: null};
compAsAny.pathCombiner = pathCombiner;
const event = new Event('click', null);
spyOn(comp, 'switchMode');
formService.validateAllFormFields.and.callFake(() => null);
formService.isValid.and.returnValue(observableOf(false));
expect(comp.switchMode).not.toHaveBeenCalled();
expect(uploadService.updateFileData).not.toHaveBeenCalled();
}));
it('should retrieve Value From Field properly', () => { it('should retrieve Value From Field properly', () => {
let field; let field;
expect(compAsAny.retrieveValueFromField(field)).toBeUndefined(); expect(compAsAny.retrieveValueFromField(field)).toBeUndefined();

View File

@@ -1,7 +1,7 @@
import { ChangeDetectorRef, Component, Input, OnChanges, OnInit } from '@angular/core'; import { ChangeDetectorRef, Component, Input, OnChanges, OnInit, ViewChild } from '@angular/core';
import { BehaviorSubject } from 'rxjs'; import { BehaviorSubject } from 'rxjs';
import { filter, first, flatMap } from 'rxjs/operators'; import { filter, first, flatMap, take } from 'rxjs/operators';
import { DynamicFormControlModel, } from '@ng-dynamic-forms/core'; import { DynamicFormControlModel, } from '@ng-dynamic-forms/core';
import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
@@ -20,6 +20,8 @@ import { HALEndpointService } from '../../../../core/shared/hal-endpoint.service
import { SubmissionJsonPatchOperationsService } from '../../../../core/submission/submission-json-patch-operations.service'; import { SubmissionJsonPatchOperationsService } from '../../../../core/submission/submission-json-patch-operations.service';
import { SubmissionObject } from '../../../../core/submission/models/submission-object.model'; import { SubmissionObject } from '../../../../core/submission/models/submission-object.model';
import { WorkspaceitemSectionUploadObject } from '../../../../core/submission/models/workspaceitem-section-upload.model'; import { WorkspaceitemSectionUploadObject } from '../../../../core/submission/models/workspaceitem-section-upload.model';
import { UploadSectionFileEditComponent } from './edit/file-edit.component';
import { Group } from '../../../../core/eperson/models/group.model';
@Component({ @Component({
selector: 'ds-submission-upload-section-file', selector: 'ds-submission-upload-section-file',
@@ -29,7 +31,7 @@ import { WorkspaceitemSectionUploadObject } from '../../../../core/submission/mo
export class UploadSectionFileComponent implements OnChanges, OnInit { export class UploadSectionFileComponent implements OnChanges, OnInit {
@Input() availableAccessConditionOptions: any[]; @Input() availableAccessConditionOptions: any[];
@Input() availableAccessConditionGroups: Map<string, any>; @Input() availableAccessConditionGroups: Map<string, Group[]>;
@Input() collectionId; @Input() collectionId;
@Input() collectionPolicyType; @Input() collectionPolicyType;
@Input() configMetadataForm: SubmissionFormsModel; @Input() configMetadataForm: SubmissionFormsModel;
@@ -48,6 +50,8 @@ export class UploadSectionFileComponent implements OnChanges, OnInit {
protected pathCombiner: JsonPatchOperationPathCombiner; protected pathCombiner: JsonPatchOperationPathCombiner;
protected subscriptions = []; protected subscriptions = [];
@ViewChild(UploadSectionFileEditComponent) fileEditComp: UploadSectionFileEditComponent;
constructor(private cdr: ChangeDetectorRef, constructor(private cdr: ChangeDetectorRef,
private fileService: FileService, private fileService: FileService,
private formService: FormService, private formService: FormService,
@@ -116,8 +120,12 @@ export class UploadSectionFileComponent implements OnChanges, OnInit {
public saveBitstreamData(event) { public saveBitstreamData(event) {
event.preventDefault(); event.preventDefault();
this.subscriptions.push(this.formService.getFormData(this.formId).pipe( this.formService.validateAllFormFields(this.fileEditComp.formRef.formGroup);
first(), this.subscriptions.push(this.formService.isValid(this.formId).pipe(
take(1),
filter((isValid) => isValid),
flatMap(() => this.formService.getFormData(this.formId)),
take(1),
flatMap((formData: any) => { flatMap((formData: any) => {
Object.keys((formData.metadata)) Object.keys((formData.metadata))
.filter((key) => isNotEmpty(formData.metadata[key])) .filter((key) => isNotEmpty(formData.metadata[key]))