[CST-4505] Fixed canChangeDiscoverable managment and unit testing

This commit is contained in:
Rezart Vata
2022-01-13 13:45:25 +01:00
parent bb64058f63
commit 768c7f8b28
4 changed files with 178 additions and 70 deletions

View File

@@ -19,6 +19,9 @@ export class SubmissionAccessModel extends ConfigObject {
@autoserialize @autoserialize
discoverable: boolean; discoverable: boolean;
@autoserialize
canChangeDiscoverable: boolean;
@deserialize @deserialize
_links: { _links: {
self: HALLink self: HALLink

View File

@@ -37,8 +37,51 @@ const configRes = Object.assign(new SubmissionFormsModel(), {
} }
}); });
const configResNotChangeDiscoverable = Object.assign(new SubmissionFormsModel(), {
'id': 'AccessConditionDefaultConfiguration',
'canChangeDiscoverable': false,
'accessConditionOptions': [
{
'name': 'openaccess',
'hasStartDate': false,
'hasEndDate': false
},
{
'name': 'lease',
'hasStartDate': false,
'hasEndDate': true,
'maxEndDate': '2022-06-20T12:17:44.420+00:00'
},
{
'name': 'embargo',
'hasStartDate': true,
'hasEndDate': false,
'maxStartDate': '2024-12-20T12:17:44.420+00:00'
},
{
'name': 'administrator',
'hasStartDate': false,
'hasEndDate': false
}
],
'type': 'submissionaccessoption',
'_links': {
'self': {
'href': 'http://localhost:8080/server/api/config/submissionaccessoptions/AccessConditionDefaultConfiguration'
}
}
});
export function getSubmissionAccessesConfigService(): SubmissionFormsConfigService { export function getSubmissionAccessesConfigService(): SubmissionFormsConfigService {
return jasmine.createSpyObj('SubmissionAccessesConfigService', { return jasmine.createSpyObj('SubmissionAccessesConfigService', {
findByHref: createSuccessfulRemoteDataObject$(configRes), findByHref: createSuccessfulRemoteDataObject$(configRes),
}); });
} }
export function getSubmissionAccessesConfigNotChangeDiscoverableService(): SubmissionFormsConfigService {
return jasmine.createSpyObj('SubmissionAccessesConfigService', {
findByHref: createSuccessfulRemoteDataObject$(configResNotChangeDiscoverable),
});
}

View File

@@ -8,7 +8,7 @@ import { SectionsServiceStub } from '../../../shared/testing/sections-service.st
import { FormBuilderService } from '../../../shared/form/builder/form-builder.service'; import { FormBuilderService } from '../../../shared/form/builder/form-builder.service';
import { getMockFormBuilderService } from '../../../shared/mocks/form-builder-service.mock'; import { getMockFormBuilderService } from '../../../shared/mocks/form-builder-service.mock';
import { SubmissionAccessesConfigService } from '../../../core/config/submission-accesses-config.service'; import { SubmissionAccessesConfigService } from '../../../core/config/submission-accesses-config.service';
import { getSubmissionAccessesConfigService } from '../../../shared/mocks/section-accesses-config.service.mock'; import { getSubmissionAccessesConfigService, getSubmissionAccessesConfigNotChangeDiscoverableService } from '../../../shared/mocks/section-accesses-config.service.mock';
import { SectionAccessesService } from './section-accesses.service'; import { SectionAccessesService } from './section-accesses.service';
import { SectionFormOperationsService } from '../form/section-form-operations.service'; import { SectionFormOperationsService } from '../form/section-form-operations.service';
import { JsonPatchOperationsBuilder } from '../../../core/json-patch/builder/json-patch-operations-builder'; import { JsonPatchOperationsBuilder } from '../../../core/json-patch/builder/json-patch-operations-builder';
@@ -72,78 +72,130 @@ describe('SubmissionSectionAccessesComponent', () => {
isValid: true isValid: true
}; };
describe('First with canChangeDiscoverable true', () => {
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [
BrowserModule,
TranslateModule.forRoot()
],
declarations: [SubmissionSectionAccessesComponent, FormComponent],
providers: [
{ provide: SectionsService, useValue: sectionsServiceStub },
{ provide: FormBuilderService, useValue: builderService },
{ provide: SubmissionAccessesConfigService, useValue: submissionAccessesConfigService },
{ provide: SectionAccessesService, useValue: sectionAccessesService },
{ provide: SectionFormOperationsService, useValue: sectionFormOperationsService },
{ provide: JsonPatchOperationsBuilder, useValue: operationsBuilder },
{ provide: TranslateService, useValue: getMockTranslateService() },
{ provide: FormService, useValue: getMockFormService() },
{ provide: Store, useValue: storeStub },
{ provide: SubmissionJsonPatchOperationsService, useValue: SubmissionJsonPatchOperationsServiceStub },
{ provide: 'sectionDataProvider', useValue: sectionData },
{ provide: 'submissionIdProvider', useValue: '1508' },
]
})
.compileComponents();
});
beforeEach(inject([Store], (store: Store<AppState>) => {
fixture = TestBed.createComponent(SubmissionSectionAccessesComponent);
component = fixture.componentInstance;
formService = TestBed.inject(FormService);
formService.validateAllFormFields.and.callFake(() => null);
formService.isValid.and.returnValue(observableOf(true));
formService.getFormData.and.returnValue(observableOf(mockAccessesFormData));
fixture.detectChanges();
}));
beforeEach(async () => { it('should create', () => {
await TestBed.configureTestingModule({ expect(component).toBeTruthy();
imports: [ });
BrowserModule,
TranslateModule.forRoot() it('should have created formModel', () => {
], expect(component.formModel).toBeTruthy();
declarations: [SubmissionSectionAccessesComponent, FormComponent], });
providers: [
{ provide: SectionsService, useValue: sectionsServiceStub }, it('should have formModel length should be 2', () => {
{ provide: FormBuilderService, useValue: builderService }, expect(component.formModel.length).toEqual(2);
{ provide: SubmissionAccessesConfigService, useValue: submissionAccessesConfigService }, });
{ provide: SectionAccessesService, useValue: sectionAccessesService },
{ provide: SectionFormOperationsService, useValue: sectionFormOperationsService }, it('formModel should have 1 model type checkbox and 1 model type array', () => {
{ provide: JsonPatchOperationsBuilder, useValue: operationsBuilder }, expect(component.formModel[0] instanceof DynamicCheckboxModel).toBeTrue();
{ provide: TranslateService, useValue: getMockTranslateService() }, expect(component.formModel[1] instanceof DynamicFormArrayModel).toBeTrue();
{ provide: FormService, useValue: getMockFormService() }, });
{ provide: Store, useValue: storeStub },
{ provide: SubmissionJsonPatchOperationsService, useValue: SubmissionJsonPatchOperationsServiceStub }, it('formModel type array should have formgroup with 1 input and 2 datepickers', () => {
{ provide: 'sectionDataProvider', useValue: sectionData }, const formModel: any = component.formModel[1];
{ provide: 'submissionIdProvider', useValue: '1508' }, const formGroup = formModel.groupFactory()[0].group;
] expect(formGroup[0] instanceof DynamicSelectModel).toBeTrue();
}) expect(formGroup[1] instanceof DynamicDatePickerModel).toBeTrue();
.compileComponents(); expect(formGroup[2] instanceof DynamicDatePickerModel).toBeTrue();
});
it('when checkbox changed it should call operationsBuilder replace function', () => {
component.onChange(checkboxChangeEvent);
fixture.detectChanges();
expect(operationsBuilder.replace).toHaveBeenCalled();
});
it('when dropdown select changed it should call operationsBuilder add function', () => {
component.onChange(accessConditionChangeEvent);
fixture.detectChanges();
expect(operationsBuilder.add).toHaveBeenCalled();
});
}); });
beforeEach(inject([Store], (store: Store<AppState>) => { describe('when canDescoverable is false', () => {
fixture = TestBed.createComponent(SubmissionSectionAccessesComponent);
component = fixture.componentInstance;
formService = TestBed.inject(FormService);
formService.validateAllFormFields.and.callFake(() => null);
formService.isValid.and.returnValue(observableOf(true));
formService.getFormData.and.returnValue(observableOf(mockAccessesFormData));
fixture.detectChanges();
}));
it('should create', () => {
expect(component).toBeTruthy();
});
it('should have created formModel', () => {
expect(component.formModel).toBeTruthy();
});
it('should have formModel length should be 2', () => { beforeEach(async () => {
expect(component.formModel.length).toEqual(2); await TestBed.configureTestingModule({
}); imports: [
BrowserModule,
TranslateModule.forRoot()
],
declarations: [SubmissionSectionAccessesComponent, FormComponent],
providers: [
{ provide: SectionsService, useValue: sectionsServiceStub },
{ provide: FormBuilderService, useValue: builderService },
{ provide: SubmissionAccessesConfigService, useValue: getSubmissionAccessesConfigNotChangeDiscoverableService() },
{ provide: SectionAccessesService, useValue: sectionAccessesService },
{ provide: SectionFormOperationsService, useValue: sectionFormOperationsService },
{ provide: JsonPatchOperationsBuilder, useValue: operationsBuilder },
{ provide: TranslateService, useValue: getMockTranslateService() },
{ provide: FormService, useValue: getMockFormService() },
{ provide: Store, useValue: storeStub },
{ provide: SubmissionJsonPatchOperationsService, useValue: SubmissionJsonPatchOperationsServiceStub },
{ provide: 'sectionDataProvider', useValue: sectionData },
{ provide: 'submissionIdProvider', useValue: '1508' },
]
})
.compileComponents();
});
it('formModel should have 1 model type checkbox and 1 model type array', () => { beforeEach(inject([Store], (store: Store<AppState>) => {
expect(component.formModel[0] instanceof DynamicCheckboxModel).toBeTrue(); fixture = TestBed.createComponent(SubmissionSectionAccessesComponent);
expect(component.formModel[1] instanceof DynamicFormArrayModel).toBeTrue(); component = fixture.componentInstance;
}); formService = TestBed.inject(FormService);
formService.validateAllFormFields.and.callFake(() => null);
formService.isValid.and.returnValue(observableOf(true));
formService.getFormData.and.returnValue(observableOf(mockAccessesFormData));
fixture.detectChanges();
}));
it('formModel type array should have formgroup with 1 input and 2 datepickers', () => {
const formModel: any = component.formModel[1];
const formGroup = formModel.groupFactory()[0].group;
expect(formGroup[0] instanceof DynamicSelectModel).toBeTrue();
expect(formGroup[1] instanceof DynamicDatePickerModel).toBeTrue();
expect(formGroup[2] instanceof DynamicDatePickerModel).toBeTrue();
});
it('when checkbox changed it should call operationsBuilder replace function', () => { it('should have formModel length should be 1', () => {
component.onChange(checkboxChangeEvent); expect(component.formModel.length).toEqual(1);
fixture.detectChanges(); });
expect(operationsBuilder.replace).toHaveBeenCalled(); it('formModel should have only 1 model type array', () => {
}); expect(component.formModel[0] instanceof DynamicFormArrayModel).toBeTrue();
});
it('when dropdown select changed it should call operationsBuilder add function', () => {
component.onChange(accessConditionChangeEvent);
fixture.detectChanges();
expect(operationsBuilder.add).toHaveBeenCalled();
}); });
}); });

View File

@@ -113,6 +113,12 @@ export class SubmissionSectionAccessesComponent extends SectionModelComponent {
*/ */
protected fieldsOnTheirWayToBeRemoved: Map<string, number[]> = new Map(); protected fieldsOnTheirWayToBeRemoved: Map<string, number[]> = new Map();
/**
* Defines if the access discoverable property can be managed
*/
public canChangeDiscoverable: boolean;
/** /**
* Initialize instance variables * Initialize instance variables
* *
@@ -282,6 +288,7 @@ export class SubmissionSectionAccessesComponent extends SectionModelComponent {
combineLatest(config$, accessData$).subscribe(([config, accessData]) => { combineLatest(config$, accessData$).subscribe(([config, accessData]) => {
this.availableAccessConditionOptions = isNotEmpty(config.accessConditionOptions) ? config.accessConditionOptions : []; this.availableAccessConditionOptions = isNotEmpty(config.accessConditionOptions) ? config.accessConditionOptions : [];
this.canChangeDiscoverable = !!config.canChangeDiscoverable;
this.accessesData = accessData; this.accessesData = accessData;
this.formModel = this.buildFileEditForm(); this.formModel = this.buildFileEditForm();
}); });
@@ -305,14 +312,17 @@ export class SubmissionSectionAccessesComponent extends SectionModelComponent {
protected buildFileEditForm() { protected buildFileEditForm() {
const formModel: DynamicFormControlModel[] = []; const formModel: DynamicFormControlModel[] = [];
formModel.push( if (this.canChangeDiscoverable) {
new DynamicCheckboxModel({ formModel.push(
id: 'discoverable', new DynamicCheckboxModel({
label: this.translate.instant('submission.sections.accesses.form.discoverable-label'), id: 'discoverable',
name: 'discoverable', label: this.translate.instant('submission.sections.accesses.form.discoverable-label'),
value: this.accessesData.discoverable name: 'discoverable',
}) value: this.accessesData.discoverable
); })
);
}
const accessConditionTypeModelConfig = Object.assign({}, FORM_ACCESS_CONDITION_TYPE_CONFIG); const accessConditionTypeModelConfig = Object.assign({}, FORM_ACCESS_CONDITION_TYPE_CONFIG);
const accessConditionsArrayConfig = Object.assign({}, ACCESS_CONDITIONS_FORM_ARRAY_CONFIG); const accessConditionsArrayConfig = Object.assign({}, ACCESS_CONDITIONS_FORM_ARRAY_CONFIG);