[835] Auto-save in new Item Submission form breaks the form

Notifications are disabled for submission section savings.
This commit is contained in:
Alessandro Martelli
2020-11-16 18:23:51 +01:00
parent 5ae649f7a5
commit 6136162a21
2 changed files with 218 additions and 5 deletions

View File

@@ -57,9 +57,9 @@ describe('SubmissionObjectEffects test suite', () => {
let actions: Observable<any>; let actions: Observable<any>;
let store: StoreMock<AppState>; let store: StoreMock<AppState>;
const notificationsServiceStub = new NotificationsServiceStub(); let notificationsServiceStub;
const submissionServiceStub = new SubmissionServiceStub(); let submissionServiceStub;
const submissionJsonPatchOperationsServiceStub = new SubmissionJsonPatchOperationsServiceStub(); let submissionJsonPatchOperationsServiceStub;
const collectionId: string = mockSubmissionCollectionId; const collectionId: string = mockSubmissionCollectionId;
const submissionId: string = mockSubmissionId; const submissionId: string = mockSubmissionId;
const submissionDefinitionResponse: any = mockSubmissionDefinitionResponse; const submissionDefinitionResponse: any = mockSubmissionDefinitionResponse;
@@ -68,6 +68,11 @@ describe('SubmissionObjectEffects test suite', () => {
const submissionState: any = Object.assign({}, mockSubmissionState); const submissionState: any = Object.assign({}, mockSubmissionState);
beforeEach(() => { beforeEach(() => {
notificationsServiceStub = new NotificationsServiceStub();
submissionServiceStub = new SubmissionServiceStub();
submissionJsonPatchOperationsServiceStub = new SubmissionJsonPatchOperationsServiceStub();
TestBed.configureTestingModule({ TestBed.configureTestingModule({
imports: [ imports: [
StoreModule.forRoot({}, storeModuleConfig), StoreModule.forRoot({}, storeModuleConfig),
@@ -471,6 +476,202 @@ describe('SubmissionObjectEffects test suite', () => {
}); });
describe('saveSubmissionSectionSuccess$', () => {
it('should return a UPDATE_SECTION_DATA action for each updated section', () => {
store.nextState({
submission: {
objects: submissionState
}
} as any);
const response = [Object.assign({}, mockSubmissionRestResponse[0], {
sections: mockSectionsData,
errors: mockSectionsErrors
})];
actions = hot('--a-', {
a: {
type: SubmissionObjectActionTypes.SAVE_SUBMISSION_SECTION_FORM_SUCCESS,
payload: {
submissionId: submissionId,
submissionObject: response
}
}
});
const errorsList = parseSectionErrors(mockSectionsErrors);
const expected = cold('--(bcd)-', {
b: new UpdateSectionDataAction(
submissionId,
'traditionalpageone',
mockSectionsData.traditionalpageone as any,
errorsList.traditionalpageone || []
),
c: new UpdateSectionDataAction(
submissionId,
'license',
mockSectionsData.license as any,
errorsList.license || []
),
d: new UpdateSectionDataAction(
submissionId,
'upload',
mockSectionsData.upload as any,
errorsList.upload || []
),
});
expect(submissionObjectEffects.saveSubmissionSectionSuccess$).toBeObservable(expected);
});
it('should not display a success notification', () => {
store.nextState({
submission: {
objects: submissionState
}
} as any);
const response = [Object.assign({}, mockSubmissionRestResponse[0], {
sections: mockSectionsData
})];
actions = hot('--a-', {
a: {
type: SubmissionObjectActionTypes.SAVE_SUBMISSION_SECTION_FORM_SUCCESS,
payload: {
submissionId: submissionId,
submissionObject: response
}
}
});
const expected = cold('--(bcd)-', {
b: new UpdateSectionDataAction(
submissionId,
'traditionalpageone',
mockSectionsData.traditionalpageone as any,
[]
),
c: new UpdateSectionDataAction(
submissionId,
'license',
mockSectionsData.license as any,
[]
),
d: new UpdateSectionDataAction(
submissionId,
'upload',
mockSectionsData.upload as any,
[]
),
});
expect(submissionObjectEffects.saveSubmissionSectionSuccess$).toBeObservable(expected);
expect(notificationsServiceStub.success).not.toHaveBeenCalled();
});
it('should not display a warning notification when there are errors', () => {
store.nextState({
submission: {
objects: submissionState
}
} as any);
const response = [Object.assign({}, mockSubmissionRestResponse[0], {
sections: mockSectionsData,
errors: mockSectionsErrors
})];
actions = hot('--a-', {
a: {
type: SubmissionObjectActionTypes.SAVE_SUBMISSION_SECTION_FORM_SUCCESS,
payload: {
submissionId: submissionId,
submissionObject: response
}
}
});
const errorsList = parseSectionErrors(mockSectionsErrors);
const expected = cold('--(bcd)-', {
b: new UpdateSectionDataAction(
submissionId,
'traditionalpageone',
mockSectionsData.traditionalpageone as any,
errorsList.traditionalpageone || []
),
c: new UpdateSectionDataAction(
submissionId,
'license',
mockSectionsData.license as any,
errorsList.license || []
),
d: new UpdateSectionDataAction(
submissionId,
'upload',
mockSectionsData.upload as any,
errorsList.upload || []
),
});
expect(submissionObjectEffects.saveSubmissionSectionSuccess$).toBeObservable(expected);
expect(notificationsServiceStub.warning).not.toHaveBeenCalled();
});
it('should detect new sections but not notify for it', () => {
store.nextState({
submission: {
objects: submissionState
}
} as any);
const response = [Object.assign({}, mockSubmissionRestResponse[0], {
sections: mockSectionsDataTwo,
errors: mockSectionsErrors
})];
actions = hot('--a-', {
a: {
type: SubmissionObjectActionTypes.SAVE_SUBMISSION_SECTION_FORM_SUCCESS,
payload: {
submissionId: submissionId,
submissionObject: response
}
}
});
const errorsList = parseSectionErrors(mockSectionsErrors);
const expected = cold('--(bcde)-', {
b: new UpdateSectionDataAction(
submissionId,
'traditionalpageone',
mockSectionsDataTwo.traditionalpageone as any,
errorsList.traditionalpageone || []
),
c: new UpdateSectionDataAction(
submissionId,
'traditionalpagetwo',
mockSectionsDataTwo.traditionalpagetwo as any,
errorsList.traditionalpagetwo || []
),
d: new UpdateSectionDataAction(
submissionId,
'license',
mockSectionsDataTwo.license as any,
errorsList.license || []
),
e: new UpdateSectionDataAction(
submissionId,
'upload',
mockSectionsDataTwo.upload as any,
errorsList.upload || []
),
});
expect(submissionObjectEffects.saveSubmissionSectionSuccess$).toBeObservable(expected);
expect(submissionServiceStub.notifyNewSection).not.toHaveBeenCalled();
});
});
describe('saveSection$', () => { describe('saveSection$', () => {
it('should return a SAVE_SUBMISSION_SECTION_FORM_SUCCESS action on success', () => { it('should return a SAVE_SUBMISSION_SECTION_FORM_SUCCESS action on success', () => {
actions = hot('--a-', { actions = hot('--a-', {

View File

@@ -154,13 +154,25 @@ export class SubmissionObjectEffects {
* Call parseSaveResponse and dispatch actions * Call parseSaveResponse and dispatch actions
*/ */
@Effect() saveSubmissionSuccess$ = this.actions$.pipe( @Effect() saveSubmissionSuccess$ = this.actions$.pipe(
ofType(SubmissionObjectActionTypes.SAVE_SUBMISSION_FORM_SUCCESS, SubmissionObjectActionTypes.SAVE_SUBMISSION_SECTION_FORM_SUCCESS), ofType(SubmissionObjectActionTypes.SAVE_SUBMISSION_FORM_SUCCESS),
withLatestFrom(this.store$), withLatestFrom(this.store$),
map(([action, currentState]: [SaveSubmissionFormSuccessAction | SaveSubmissionSectionFormSuccessAction, any]) => { map(([action, currentState]: [SaveSubmissionFormSuccessAction, any]) => {
return this.parseSaveResponse((currentState.submission as SubmissionState).objects[action.payload.submissionId], action.payload.submissionObject, action.payload.submissionId, action.payload.notify); return this.parseSaveResponse((currentState.submission as SubmissionState).objects[action.payload.submissionId], action.payload.submissionObject, action.payload.submissionId, action.payload.notify);
}), }),
mergeMap((actions) => observableFrom(actions))); mergeMap((actions) => observableFrom(actions)));
/**
* Call parseSaveResponse and dispatch actions.
* Notification system is forced to be disabled.
*/
@Effect() saveSubmissionSectionSuccess$ = this.actions$.pipe(
ofType(SubmissionObjectActionTypes.SAVE_SUBMISSION_SECTION_FORM_SUCCESS),
withLatestFrom(this.store$),
map(([action, currentState]: [SaveSubmissionSectionFormSuccessAction, any]) => {
return this.parseSaveResponse((currentState.submission as SubmissionState).objects[action.payload.submissionId], action.payload.submissionObject, action.payload.submissionId, false);
}),
mergeMap((actions) => observableFrom(actions)));
/** /**
* Dispatch a [SaveSubmissionSectionFormSuccessAction] or a [SaveSubmissionSectionFormErrorAction] on error * Dispatch a [SaveSubmissionSectionFormSuccessAction] or a [SaveSubmissionSectionFormErrorAction] on error
*/ */