mirror of
https://github.com/DSpace/dspace-angular.git
synced 2025-10-08 10:34:15 +00:00
Added more tests
This commit is contained in:
@@ -0,0 +1,47 @@
|
|||||||
|
import { FormFieldModel } from '../models/form-field.model';
|
||||||
|
import { DynamicConcatModel } from '../ds-dynamic-form-ui/models/ds-dynamic-concat.model';
|
||||||
|
import { SeriesFieldParser } from './series-field-parser';
|
||||||
|
import { DateFieldParser } from './date-field-parser';
|
||||||
|
import { DynamicDsDatePickerModel } from '../ds-dynamic-form-ui/models/date-picker/date-picker.model';
|
||||||
|
|
||||||
|
describe('DateFieldParser test suite', () => {
|
||||||
|
let field: FormFieldModel;
|
||||||
|
|
||||||
|
const initFormValues = {};
|
||||||
|
const readOnly = false;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
field = {
|
||||||
|
input: {
|
||||||
|
type: 'date'
|
||||||
|
},
|
||||||
|
label: 'Date of Issue.',
|
||||||
|
mandatory: 'true',
|
||||||
|
repeatable: false,
|
||||||
|
hints: 'Please give the date of previous publication or public distribution. You can leave out the day and/or month if they aren\'t applicable.',
|
||||||
|
mandatoryMessage: 'You must enter at least the year.',
|
||||||
|
selectableMetadata: [
|
||||||
|
{
|
||||||
|
metadata: 'date',
|
||||||
|
}
|
||||||
|
],
|
||||||
|
languageCodes: []
|
||||||
|
} as FormFieldModel;
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should init parser properly', () => {
|
||||||
|
const parser = new DateFieldParser(field, initFormValues, readOnly);
|
||||||
|
|
||||||
|
expect(parser instanceof DateFieldParser).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return a DynamicDsDatePickerModel object', () => {
|
||||||
|
const parser = new DateFieldParser(field, initFormValues, readOnly);
|
||||||
|
|
||||||
|
const fieldModel = parser.parse();
|
||||||
|
|
||||||
|
expect(fieldModel instanceof DynamicDsDatePickerModel).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
@@ -1,6 +1,5 @@
|
|||||||
import { FieldParser } from './field-parser';
|
import { FieldParser } from './field-parser';
|
||||||
import { DynamicDatePickerModelConfig } from '@ng-dynamic-forms/core';
|
import { DynamicDatePickerModelConfig } from '@ng-dynamic-forms/core';
|
||||||
import { FormFieldModel } from '../models/form-field.model';
|
|
||||||
import { DynamicDsDatePickerModel } from '../ds-dynamic-form-ui/models/date-picker/date-picker.model';
|
import { DynamicDsDatePickerModel } from '../ds-dynamic-form-ui/models/date-picker/date-picker.model';
|
||||||
import { isNotEmpty } from '../../../empty.util';
|
import { isNotEmpty } from '../../../empty.util';
|
||||||
import { DS_DATE_PICKER_SEPARATOR } from '../ds-dynamic-form-ui/models/date-picker/date-picker.component';
|
import { DS_DATE_PICKER_SEPARATOR } from '../ds-dynamic-form-ui/models/date-picker/date-picker.component';
|
||||||
|
@@ -0,0 +1,55 @@
|
|||||||
|
import { FormFieldModel } from '../models/form-field.model';
|
||||||
|
import { DropdownFieldParser } from './dropdown-field-parser';
|
||||||
|
import { DynamicScrollableDropdownModel } from '../ds-dynamic-form-ui/models/scrollable-dropdown/dynamic-scrollable-dropdown.model';
|
||||||
|
|
||||||
|
describe('DropdownFieldParser test suite', () => {
|
||||||
|
let field: FormFieldModel;
|
||||||
|
|
||||||
|
const authorityUuid = 'testScopeUUID';
|
||||||
|
const initFormValues = {};
|
||||||
|
const readOnly = false;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
field = {
|
||||||
|
input: {
|
||||||
|
type: 'dropdown'
|
||||||
|
},
|
||||||
|
label: 'Type',
|
||||||
|
mandatory: 'false',
|
||||||
|
repeatable: false,
|
||||||
|
hints: 'Select the tyupe.',
|
||||||
|
selectableMetadata: [
|
||||||
|
{
|
||||||
|
metadata: 'type',
|
||||||
|
authority: 'common_types_dataset',
|
||||||
|
closed: false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
languageCodes: []
|
||||||
|
} as FormFieldModel;
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should init parser properly', () => {
|
||||||
|
const parser = new DropdownFieldParser(field, initFormValues, readOnly, authorityUuid);
|
||||||
|
|
||||||
|
expect(parser instanceof DropdownFieldParser).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return a DynamicScrollableDropdownModel object', () => {
|
||||||
|
const parser = new DropdownFieldParser(field, initFormValues, readOnly, authorityUuid);
|
||||||
|
|
||||||
|
const fieldModel = parser.parse();
|
||||||
|
|
||||||
|
expect(fieldModel instanceof DynamicScrollableDropdownModel).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should throw when authority is not passed', () => {
|
||||||
|
field.selectableMetadata[0].authority = null;
|
||||||
|
const parser = new DropdownFieldParser(field, initFormValues, readOnly, authorityUuid);
|
||||||
|
|
||||||
|
expect(() => parser.parse())
|
||||||
|
.toThrow();
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
@@ -1,10 +1,4 @@
|
|||||||
import { FormFieldModel } from '../models/form-field.model';
|
import { FormFieldModel } from '../models/form-field.model';
|
||||||
import { OneboxFieldParser } from './onebox-field-parser';
|
|
||||||
import { DynamicQualdropModel } from '../ds-dynamic-form-ui/models/ds-dynamic-qualdrop.model';
|
|
||||||
import { DynamicTypeaheadModel } from '../ds-dynamic-form-ui/models/typeahead/dynamic-typeahead.model';
|
|
||||||
import { DsDynamicInputModel } from '../ds-dynamic-form-ui/models/ds-dynamic-input.model';
|
|
||||||
import { ConcatFieldParser } from './concat-field-parser';
|
|
||||||
import { NameFieldParser } from './name-field-parser';
|
|
||||||
import { DynamicConcatModel } from '../ds-dynamic-form-ui/models/ds-dynamic-concat.model';
|
import { DynamicConcatModel } from '../ds-dynamic-form-ui/models/ds-dynamic-concat.model';
|
||||||
import { SeriesFieldParser } from './series-field-parser';
|
import { SeriesFieldParser } from './series-field-parser';
|
||||||
|
|
||||||
|
@@ -1,21 +1,45 @@
|
|||||||
import { Store, StoreModule } from '@ngrx/store';
|
import { Store, StoreModule } from '@ngrx/store';
|
||||||
import { async, inject, TestBed } from '@angular/core/testing';
|
import { async, inject, TestBed } from '@angular/core/testing';
|
||||||
import 'rxjs/add/observable/of';
|
import { FormGroup } from '@angular/forms';
|
||||||
|
|
||||||
|
import {
|
||||||
|
DynamicFormControlModel,
|
||||||
|
DynamicFormService,
|
||||||
|
DynamicFormValidationService,
|
||||||
|
DynamicInputModel
|
||||||
|
} from '@ng-dynamic-forms/core';
|
||||||
|
|
||||||
import { FormService } from './form.service';
|
import { FormService } from './form.service';
|
||||||
import { FormBuilderService } from './builder/form-builder.service';
|
import { FormBuilderService } from './builder/form-builder.service';
|
||||||
import { AppState } from '../../app.reducer';
|
import { AppState } from '../../app.reducer';
|
||||||
import { DynamicPathable } from '@ng-dynamic-forms/core/src/model/misc/dynamic-form-control-path.model';
|
|
||||||
import { DynamicFormControlModel } from '@ng-dynamic-forms/core';
|
|
||||||
import { formReducer } from './form.reducers';
|
import { formReducer } from './form.reducers';
|
||||||
|
|
||||||
describe('FormService', () => {
|
describe('FormService test suite', () => {
|
||||||
const formId = 'testForm';
|
const formId = 'testForm';
|
||||||
let service: FormService;
|
let service: FormService;
|
||||||
|
let builderService: FormBuilderService;
|
||||||
|
let formGroup: FormGroup;
|
||||||
|
|
||||||
|
const formModel: DynamicFormControlModel[] = [
|
||||||
|
new DynamicInputModel({id: 'author', value: 'test'}),
|
||||||
|
new DynamicInputModel({
|
||||||
|
id: 'title',
|
||||||
|
validators: {
|
||||||
|
required: null
|
||||||
|
},
|
||||||
|
errorMessages: {
|
||||||
|
required: 'Title is required'
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new DynamicInputModel({id: 'date'}),
|
||||||
|
new DynamicInputModel({id: 'description'}),
|
||||||
|
];
|
||||||
|
|
||||||
const formData = {
|
const formData = {
|
||||||
'dc.contributor.author': null,
|
author: ['test'],
|
||||||
'dc.title': ['test'],
|
title: null,
|
||||||
'dc.date.issued': null,
|
date: null,
|
||||||
'dc.description': null
|
description: null
|
||||||
};
|
};
|
||||||
const formState = {
|
const formState = {
|
||||||
testForm: {
|
testForm: {
|
||||||
@@ -25,31 +49,27 @@ describe('FormService', () => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const formBuilderServiceStub: any = {
|
|
||||||
getPath: (model: DynamicPathable) => [],
|
|
||||||
/* tslint:disable:no-empty */
|
|
||||||
clearAllModelsValue: (groupModel: DynamicFormControlModel[]) => {
|
|
||||||
}
|
|
||||||
/* tslint:enable:no-empty */
|
|
||||||
};
|
|
||||||
|
|
||||||
beforeEach(async(() => {
|
beforeEach(async(() => {
|
||||||
TestBed.configureTestingModule({
|
TestBed.configureTestingModule({
|
||||||
imports: [
|
imports: [
|
||||||
StoreModule.forRoot({formReducer})
|
StoreModule.forRoot({formReducer})
|
||||||
],
|
],
|
||||||
providers: [
|
providers: [
|
||||||
{provide: FormBuilderService, useValue: formBuilderServiceStub},
|
DynamicFormService,
|
||||||
|
DynamicFormValidationService,
|
||||||
|
FormBuilderService,
|
||||||
]
|
]
|
||||||
}).compileComponents();
|
}).compileComponents();
|
||||||
}));
|
}));
|
||||||
|
|
||||||
beforeEach(inject([Store], (store: Store<AppState>) => {
|
beforeEach(inject([Store, FormBuilderService], (store: Store<AppState>, formBuilderService: FormBuilderService) => {
|
||||||
store
|
store
|
||||||
.subscribe((state) => {
|
.subscribe((state) => {
|
||||||
state.forms = formState;
|
state.forms = formState;
|
||||||
});
|
});
|
||||||
service = new FormService(formBuilderServiceStub, store);
|
builderService = formBuilderService;
|
||||||
|
formGroup = builderService.createFormGroup(formModel);
|
||||||
|
service = new FormService(formBuilderService, store);
|
||||||
}));
|
}));
|
||||||
|
|
||||||
it('should check whether form state is init', () => {
|
it('should check whether form state is init', () => {
|
||||||
@@ -70,4 +90,54 @@ describe('FormService', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should return form unique id', () => {
|
||||||
|
const formId1 = service.getUniqueId(formId);
|
||||||
|
const formId2 = service.getUniqueId(formId);
|
||||||
|
|
||||||
|
expect(formId1).not.toEqual(formId2);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should validate all form fields', () => {
|
||||||
|
service.validateAllFormFields(formGroup);
|
||||||
|
|
||||||
|
expect(formGroup.controls.author.touched).toBe(true);
|
||||||
|
expect(formGroup.controls.author.status).toBe('VALID');
|
||||||
|
|
||||||
|
expect(formGroup.controls.title.touched).toBe(true);
|
||||||
|
expect(formGroup.controls.title.status).toBe('INVALID');
|
||||||
|
|
||||||
|
expect(formGroup.controls.date.touched).toBe(true);
|
||||||
|
|
||||||
|
expect(formGroup.controls.description.touched).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should add error to field', () => {
|
||||||
|
const control = builderService.getFormControlById('description', formGroup, formModel);
|
||||||
|
const model = builderService.findById('description', formModel);
|
||||||
|
|
||||||
|
service.addErrorToField(control, model, 'Test error message');
|
||||||
|
const errorKeys = Object.keys(control.errors);
|
||||||
|
|
||||||
|
expect(errorKeys.length).toBe(1);
|
||||||
|
|
||||||
|
expect(control.hasError(errorKeys[0])).toBe(true);
|
||||||
|
|
||||||
|
expect(formGroup.controls.description.touched).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should remove error from field', () => {
|
||||||
|
const control = builderService.getFormControlById('description', formGroup, formModel);
|
||||||
|
const model = builderService.findById('description', formModel);
|
||||||
|
|
||||||
|
service.addErrorToField(control, model, 'Test error message');
|
||||||
|
const errorKeys = Object.keys(control.errors);
|
||||||
|
|
||||||
|
service.removeErrorFromField(control, model, errorKeys[0]);
|
||||||
|
|
||||||
|
expect(errorKeys.length).toBe(1);
|
||||||
|
|
||||||
|
expect(control.hasError(errorKeys[0])).toBe(false);
|
||||||
|
|
||||||
|
expect(formGroup.controls.description.touched).toBe(false);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@@ -65,15 +65,6 @@ export class FormService {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public setValue(formGroup: FormGroup, fieldModel: DynamicFormControlModel, fieldId: string, value: any) {
|
|
||||||
if (isNotEmpty(fieldModel)) {
|
|
||||||
const path = this.formBuilderService.getPath(fieldModel);
|
|
||||||
const fieldControl = formGroup.get(path);
|
|
||||||
fieldControl.markAsDirty();
|
|
||||||
fieldControl.setValue(value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public addErrorToField(field: AbstractControl, model: DynamicFormControlModel, message: string) {
|
public addErrorToField(field: AbstractControl, model: DynamicFormControlModel, message: string) {
|
||||||
|
|
||||||
const error = {}; // create the error object
|
const error = {}; // create the error object
|
||||||
@@ -104,15 +95,20 @@ export class FormService {
|
|||||||
field.markAsTouched();
|
field.markAsTouched();
|
||||||
}
|
}
|
||||||
|
|
||||||
public removeErrorFromField(field: AbstractControl, model: DynamicFormControlModel, message) {
|
public removeErrorFromField(field: AbstractControl, model: DynamicFormControlModel, messageKey: string) {
|
||||||
const error = {};
|
const error = {};
|
||||||
|
|
||||||
|
if (messageKey.includes('.')) {
|
||||||
// Use correct error messages from the model
|
// Use correct error messages from the model
|
||||||
const lastArray = message.split('.');
|
const lastArray = messageKey.split('.');
|
||||||
if (lastArray && lastArray.length > 0) {
|
if (lastArray && lastArray.length > 0) {
|
||||||
const last = lastArray[lastArray.length - 1];
|
const last = lastArray[lastArray.length - 1];
|
||||||
error[last] = null;
|
error[last] = null;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
error[messageKey] = null;
|
||||||
|
}
|
||||||
|
|
||||||
field.setErrors(error);
|
field.setErrors(error);
|
||||||
field.markAsUntouched();
|
field.markAsUntouched();
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user