mirror of
https://github.com/DSpace/dspace-angular.git
synced 2025-10-07 01:54:15 +00:00

* Removing position-fixed bootstrap class so that navbar links are available again (cherry picked from commit351abaa5c2
) (cherry picked from commit5c4df8765e
) * A new approach so that the elements of the ds-file-dropzone-no-uploader component don't overlap the navbar and make it inaccessible (cherry picked from commit2c259f5ae9
) (cherry picked from commitee5af8f7d1
) * [DURACOM-291] fix submission section visibility in order to rely on the configured section scope (cherry picked from commit8e8979a27a
) * Removing position-fixed bootstrap class so that navbar links are available again (cherry picked from commit351abaa5c2
) (cherry picked from commit3ecec3af51
) * A new approach so that the elements of the ds-file-dropzone-no-uploader component don't overlap the navbar and make it inaccessible (cherry picked from commit2c259f5ae9
) (cherry picked from commit25e2c763be
) --------- Co-authored-by: root <root@TI-03.OHB.LOCAL> Co-authored-by: Giuseppe Digilio <giuseppe.digilio@4science.com>
1203 lines
37 KiB
TypeScript
1203 lines
37 KiB
TypeScript
import { TestBed } from '@angular/core/testing';
|
|
import { provideMockActions } from '@ngrx/effects/testing';
|
|
import {
|
|
Store,
|
|
StoreModule,
|
|
} from '@ngrx/store';
|
|
import {
|
|
TranslateLoader,
|
|
TranslateModule,
|
|
TranslateService,
|
|
} from '@ngx-translate/core';
|
|
import {
|
|
cold,
|
|
hot,
|
|
} from 'jasmine-marbles';
|
|
import {
|
|
Observable,
|
|
of as observableOf,
|
|
throwError as observableThrowError,
|
|
} from 'rxjs';
|
|
|
|
import {
|
|
AppState,
|
|
storeModuleConfig,
|
|
} from '../../app.reducer';
|
|
import { SubmissionSectionModel } from '../../core/config/models/config-submission-section.model';
|
|
import { HALEndpointService } from '../../core/shared/hal-endpoint.service';
|
|
import { Item } from '../../core/shared/item.model';
|
|
import { SubmissionJsonPatchOperationsService } from '../../core/submission/submission-json-patch-operations.service';
|
|
import { SubmissionObjectDataService } from '../../core/submission/submission-object-data.service';
|
|
import { WorkflowItemDataService } from '../../core/submission/workflowitem-data.service';
|
|
import { WorkspaceitemDataService } from '../../core/submission/workspaceitem-data.service';
|
|
import {
|
|
mockSectionsData,
|
|
mockSectionsDataTwo,
|
|
mockSectionsErrors,
|
|
mockSectionsErrorsTouchedField,
|
|
mockSubmissionCollectionId,
|
|
mockSubmissionDefinition,
|
|
mockSubmissionDefinitionResponse,
|
|
mockSubmissionId,
|
|
mockSubmissionRestResponse,
|
|
mockSubmissionSelfUrl,
|
|
mockSubmissionState,
|
|
} from '../../shared/mocks/submission.mock';
|
|
import { TranslateLoaderMock } from '../../shared/mocks/translate-loader.mock';
|
|
import { NotificationsService } from '../../shared/notifications/notifications.service';
|
|
import { NotificationsServiceStub } from '../../shared/testing/notifications-service.stub';
|
|
import { SectionsServiceStub } from '../../shared/testing/sections-service.stub';
|
|
import { StoreMock } from '../../shared/testing/store.mock';
|
|
import { SubmissionJsonPatchOperationsServiceStub } from '../../shared/testing/submission-json-patch-operations-service.stub';
|
|
import { mockSubmissionObjectDataService } from '../../shared/testing/submission-oject-data-service.mock';
|
|
import { SubmissionServiceStub } from '../../shared/testing/submission-service.stub';
|
|
import { SectionsService } from '../sections/sections.service';
|
|
import { SubmissionService } from '../submission.service';
|
|
import parseSectionErrors from '../utils/parseSectionErrors';
|
|
import {
|
|
CompleteInitSubmissionFormAction,
|
|
DepositSubmissionAction,
|
|
DepositSubmissionErrorAction,
|
|
DepositSubmissionSuccessAction,
|
|
DiscardSubmissionErrorAction,
|
|
DiscardSubmissionSuccessAction,
|
|
InitSectionAction,
|
|
InitSubmissionFormAction,
|
|
SaveForLaterSubmissionFormSuccessAction,
|
|
SaveSubmissionFormErrorAction,
|
|
SaveSubmissionFormSuccessAction,
|
|
SaveSubmissionSectionFormErrorAction,
|
|
SaveSubmissionSectionFormSuccessAction,
|
|
SubmissionObjectActionTypes,
|
|
UpdateSectionDataAction,
|
|
} from './submission-objects.actions';
|
|
import { SubmissionObjectEffects } from './submission-objects.effects';
|
|
|
|
describe('SubmissionObjectEffects test suite', () => {
|
|
let submissionObjectEffects: SubmissionObjectEffects;
|
|
let actions: Observable<any>;
|
|
let store: StoreMock<AppState>;
|
|
|
|
let notificationsServiceStub;
|
|
let submissionServiceStub;
|
|
let submissionJsonPatchOperationsServiceStub;
|
|
let submissionObjectDataServiceStub;
|
|
let workspaceItemDataService;
|
|
|
|
const collectionId: string = mockSubmissionCollectionId;
|
|
const submissionId: string = mockSubmissionId;
|
|
const submissionDefinitionResponse: any = mockSubmissionDefinitionResponse;
|
|
const submissionDefinition: any = mockSubmissionDefinition;
|
|
const selfUrl: string = mockSubmissionSelfUrl;
|
|
const submissionState: any = Object.assign({}, mockSubmissionState);
|
|
|
|
beforeEach(() => {
|
|
|
|
notificationsServiceStub = new NotificationsServiceStub();
|
|
submissionServiceStub = new SubmissionServiceStub();
|
|
submissionJsonPatchOperationsServiceStub = new SubmissionJsonPatchOperationsServiceStub();
|
|
submissionObjectDataServiceStub = mockSubmissionObjectDataService;
|
|
|
|
submissionServiceStub.hasUnsavedModification.and.returnValue(observableOf(true));
|
|
|
|
workspaceItemDataService = jasmine.createSpyObj('WorkspaceItemDataService', {
|
|
invalidateById: observableOf(true),
|
|
});
|
|
|
|
TestBed.configureTestingModule({
|
|
imports: [
|
|
StoreModule.forRoot({}, storeModuleConfig),
|
|
TranslateModule.forRoot({
|
|
loader: {
|
|
provide: TranslateLoader,
|
|
useClass: TranslateLoaderMock,
|
|
},
|
|
}),
|
|
],
|
|
providers: [
|
|
SubmissionObjectEffects,
|
|
TranslateService,
|
|
{ provide: Store, useClass: StoreMock },
|
|
provideMockActions(() => actions),
|
|
{ provide: NotificationsService, useValue: notificationsServiceStub },
|
|
{ provide: SectionsService, useClass: SectionsServiceStub },
|
|
{ provide: SubmissionService, useValue: submissionServiceStub },
|
|
{ provide: SubmissionJsonPatchOperationsService, useValue: submissionJsonPatchOperationsServiceStub },
|
|
{ provide: WorkspaceitemDataService, useValue: {} },
|
|
{ provide: WorkflowItemDataService, useValue: {} },
|
|
{ provide: WorkflowItemDataService, useValue: {} },
|
|
{ provide: HALEndpointService, useValue: {} },
|
|
{ provide: SubmissionObjectDataService, useValue: submissionObjectDataServiceStub },
|
|
{ provide: WorkspaceitemDataService, useValue: workspaceItemDataService },
|
|
],
|
|
});
|
|
|
|
submissionObjectEffects = TestBed.inject(SubmissionObjectEffects);
|
|
store = TestBed.inject(Store as any);
|
|
});
|
|
|
|
describe('loadForm$', () => {
|
|
it('should return a INIT_SECTION action for each defined section and a COMPLETE_INIT_SUBMISSION_FORM action', () => {
|
|
actions = hot('--a-', {
|
|
a: {
|
|
type: SubmissionObjectActionTypes.INIT_SUBMISSION_FORM,
|
|
payload: {
|
|
collectionId: collectionId,
|
|
submissionId: submissionId,
|
|
selfUrl: selfUrl,
|
|
submissionDefinition: submissionDefinition,
|
|
sections: {},
|
|
item: { metadata: {} },
|
|
errors: [],
|
|
},
|
|
},
|
|
});
|
|
|
|
const mappedActions = [];
|
|
(submissionDefinitionResponse.sections as SubmissionSectionModel[])
|
|
.forEach((sectionDefinition: SubmissionSectionModel) => {
|
|
const sectionId = sectionDefinition._links.self.href.substr(sectionDefinition._links.self.href.lastIndexOf('/') + 1);
|
|
const config = sectionDefinition._links.config.href || '';
|
|
const enabled = (sectionDefinition.mandatory);
|
|
const sectionData = {};
|
|
const sectionErrors = null;
|
|
mappedActions.push(new InitSectionAction(
|
|
submissionId,
|
|
sectionId,
|
|
sectionDefinition.header,
|
|
config,
|
|
sectionDefinition.mandatory,
|
|
sectionDefinition.scope,
|
|
sectionDefinition.sectionType,
|
|
sectionDefinition.visibility,
|
|
enabled,
|
|
sectionData,
|
|
sectionErrors));
|
|
});
|
|
mappedActions.push(new CompleteInitSubmissionFormAction(submissionId));
|
|
|
|
const expected = cold('--(bcdefgh)', {
|
|
b: mappedActions[0],
|
|
c: mappedActions[1],
|
|
d: mappedActions[2],
|
|
e: mappedActions[3],
|
|
f: mappedActions[4],
|
|
g: mappedActions[5],
|
|
h: mappedActions[6],
|
|
});
|
|
|
|
expect(submissionObjectEffects.loadForm$).toBeObservable(expected);
|
|
});
|
|
});
|
|
|
|
describe('resetForm$', () => {
|
|
it('should return a INIT_SUBMISSION_FORM action', () => {
|
|
actions = hot('--a-', {
|
|
a: {
|
|
type: SubmissionObjectActionTypes.RESET_SUBMISSION_FORM,
|
|
payload: {
|
|
collectionId: collectionId,
|
|
submissionId: submissionId,
|
|
selfUrl: selfUrl,
|
|
submissionDefinition: submissionDefinition,
|
|
sections: {},
|
|
item: new Item(),
|
|
errors: [],
|
|
},
|
|
},
|
|
});
|
|
|
|
const expected = cold('--b-', {
|
|
b: new InitSubmissionFormAction(
|
|
collectionId,
|
|
submissionId,
|
|
selfUrl,
|
|
submissionDefinition,
|
|
{},
|
|
new Item(),
|
|
null,
|
|
),
|
|
});
|
|
|
|
expect(submissionObjectEffects.resetForm$).toBeObservable(expected);
|
|
});
|
|
});
|
|
|
|
describe('saveSubmission$', () => {
|
|
it('should return a SAVE_SUBMISSION_FORM_SUCCESS action on success', () => {
|
|
actions = hot('--a-', {
|
|
a: {
|
|
type: SubmissionObjectActionTypes.SAVE_SUBMISSION_FORM,
|
|
payload: {
|
|
submissionId: submissionId,
|
|
},
|
|
},
|
|
});
|
|
|
|
submissionJsonPatchOperationsServiceStub.jsonPatchByResourceType.and.returnValue(observableOf(mockSubmissionRestResponse));
|
|
const expected = cold('--b-', {
|
|
b: new SaveSubmissionFormSuccessAction(
|
|
submissionId,
|
|
mockSubmissionRestResponse as any,
|
|
),
|
|
});
|
|
|
|
expect(submissionObjectEffects.saveSubmission$).toBeObservable(expected);
|
|
});
|
|
|
|
it('should enable notifications if is manual', () => {
|
|
actions = hot('--a-', {
|
|
a: {
|
|
type: SubmissionObjectActionTypes.SAVE_SUBMISSION_FORM,
|
|
payload: {
|
|
submissionId: submissionId,
|
|
isManual: true,
|
|
},
|
|
},
|
|
});
|
|
|
|
submissionJsonPatchOperationsServiceStub.jsonPatchByResourceType.and.returnValue(observableOf(mockSubmissionRestResponse));
|
|
const expected = cold('--b-', {
|
|
b: new SaveSubmissionFormSuccessAction(
|
|
submissionId,
|
|
mockSubmissionRestResponse as any,
|
|
true,
|
|
true,
|
|
),
|
|
});
|
|
|
|
expect(submissionObjectEffects.saveSubmission$).toBeObservable(expected);
|
|
});
|
|
|
|
it('should disable notifications if is not manual', () => {
|
|
actions = hot('--a-', {
|
|
a: {
|
|
type: SubmissionObjectActionTypes.SAVE_SUBMISSION_FORM,
|
|
payload: {
|
|
submissionId: submissionId,
|
|
isManual: false,
|
|
},
|
|
},
|
|
});
|
|
|
|
submissionJsonPatchOperationsServiceStub.jsonPatchByResourceType.and.returnValue(observableOf(mockSubmissionRestResponse));
|
|
const expected = cold('--b-', {
|
|
b: new SaveSubmissionFormSuccessAction(
|
|
submissionId,
|
|
mockSubmissionRestResponse as any,
|
|
false,
|
|
false,
|
|
),
|
|
});
|
|
|
|
expect(submissionObjectEffects.saveSubmission$).toBeObservable(expected);
|
|
});
|
|
|
|
it('should return a SAVE_SUBMISSION_FORM_ERROR action on error', () => {
|
|
actions = hot('--a-', {
|
|
a: {
|
|
type: SubmissionObjectActionTypes.SAVE_SUBMISSION_FORM,
|
|
payload: {
|
|
submissionId: submissionId,
|
|
},
|
|
},
|
|
});
|
|
|
|
submissionJsonPatchOperationsServiceStub.jsonPatchByResourceType.and.callFake(
|
|
() => observableThrowError('Error'),
|
|
);
|
|
const expected = cold('--b-', {
|
|
b: new SaveSubmissionFormErrorAction(
|
|
submissionId,
|
|
),
|
|
});
|
|
|
|
expect(submissionObjectEffects.saveSubmission$).toBeObservable(expected);
|
|
});
|
|
});
|
|
|
|
describe('saveForLaterSubmission$', () => {
|
|
it('should return a SAVE_FOR_LATER_SUBMISSION_FORM_SUCCESS action on success', () => {
|
|
actions = hot('--a-', {
|
|
a: {
|
|
type: SubmissionObjectActionTypes.SAVE_FOR_LATER_SUBMISSION_FORM,
|
|
payload: {
|
|
submissionId: submissionId,
|
|
},
|
|
},
|
|
});
|
|
|
|
submissionJsonPatchOperationsServiceStub.jsonPatchByResourceType.and.returnValue(observableOf(mockSubmissionRestResponse));
|
|
const expected = cold('--b-', {
|
|
b: new SaveForLaterSubmissionFormSuccessAction(
|
|
submissionId,
|
|
mockSubmissionRestResponse as any,
|
|
),
|
|
});
|
|
|
|
expect(submissionObjectEffects.saveForLaterSubmission$).toBeObservable(expected);
|
|
});
|
|
|
|
it('should return a SAVE_SUBMISSION_FORM_ERROR action on error', () => {
|
|
actions = hot('--a-', {
|
|
a: {
|
|
type: SubmissionObjectActionTypes.SAVE_FOR_LATER_SUBMISSION_FORM,
|
|
payload: {
|
|
submissionId: submissionId,
|
|
},
|
|
},
|
|
});
|
|
|
|
submissionJsonPatchOperationsServiceStub.jsonPatchByResourceType.and.callFake(
|
|
() => observableThrowError('Error'),
|
|
);
|
|
const expected = cold('--b-', {
|
|
b: new SaveSubmissionFormErrorAction(
|
|
submissionId,
|
|
),
|
|
});
|
|
|
|
expect(submissionObjectEffects.saveForLaterSubmission$).toBeObservable(expected);
|
|
});
|
|
});
|
|
|
|
describe('saveSubmissionSuccess$', () => {
|
|
|
|
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_FORM_SUCCESS,
|
|
payload: {
|
|
submissionId: submissionId,
|
|
submissionObject: response,
|
|
notify: true,
|
|
},
|
|
},
|
|
});
|
|
|
|
const errorsList = parseSectionErrors(mockSectionsErrors);
|
|
const expected = cold('--(bcd)-', {
|
|
b: new UpdateSectionDataAction(
|
|
submissionId,
|
|
'traditionalpageone',
|
|
mockSectionsData.traditionalpageone as any,
|
|
errorsList.traditionalpageone || [],
|
|
errorsList.traditionalpageone || [],
|
|
),
|
|
c: new UpdateSectionDataAction(
|
|
submissionId,
|
|
'license',
|
|
mockSectionsData.license as any,
|
|
errorsList.license || [],
|
|
errorsList.license || [],
|
|
),
|
|
d: new UpdateSectionDataAction(
|
|
submissionId,
|
|
'upload',
|
|
mockSectionsData.upload as any,
|
|
errorsList.upload || [],
|
|
errorsList.upload || [],
|
|
),
|
|
});
|
|
|
|
expect(submissionObjectEffects.saveSubmissionSuccess$).toBeObservable(expected);
|
|
expect(notificationsServiceStub.success).toHaveBeenCalled();
|
|
|
|
});
|
|
|
|
it('should not display errors when notification are disabled and field are not touched', () => {
|
|
store.nextState({
|
|
submission: {
|
|
objects: submissionState,
|
|
},
|
|
forms: {
|
|
'2_traditionalpageone': {
|
|
touched: {
|
|
'dc.title': true,
|
|
},
|
|
},
|
|
},
|
|
} 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,
|
|
notify: false,
|
|
},
|
|
},
|
|
});
|
|
|
|
const errorsToShowList = parseSectionErrors(mockSectionsErrorsTouchedField);
|
|
const serverValidationErrorsList = parseSectionErrors(mockSectionsErrors);
|
|
const expected = cold('--(bcd)-', {
|
|
b: new UpdateSectionDataAction(
|
|
submissionId,
|
|
'traditionalpageone',
|
|
mockSectionsData.traditionalpageone as any,
|
|
errorsToShowList.traditionalpageone,
|
|
serverValidationErrorsList.traditionalpageone,
|
|
),
|
|
c: new UpdateSectionDataAction(
|
|
submissionId,
|
|
'license',
|
|
mockSectionsData.license as any,
|
|
errorsToShowList.license || [],
|
|
serverValidationErrorsList.license || [],
|
|
),
|
|
d: new UpdateSectionDataAction(
|
|
submissionId,
|
|
'upload',
|
|
mockSectionsData.upload as any,
|
|
errorsToShowList.upload || [],
|
|
serverValidationErrorsList.upload || [],
|
|
),
|
|
});
|
|
|
|
expect(submissionObjectEffects.saveSubmissionSectionSuccess$).toBeObservable(expected);
|
|
expect(notificationsServiceStub.warning).not.toHaveBeenCalled();
|
|
});
|
|
|
|
it('should 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_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.saveSubmissionSuccess$).toBeObservable(expected);
|
|
expect(notificationsServiceStub.success).toHaveBeenCalled();
|
|
});
|
|
|
|
it('should 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_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 || [],
|
|
errorsList.traditionalpageone || [],
|
|
),
|
|
c: new UpdateSectionDataAction(
|
|
submissionId,
|
|
'license',
|
|
mockSectionsData.license as any,
|
|
errorsList.license || [],
|
|
errorsList.license || [],
|
|
),
|
|
d: new UpdateSectionDataAction(
|
|
submissionId,
|
|
'upload',
|
|
mockSectionsData.upload as any,
|
|
errorsList.upload || [],
|
|
errorsList.upload || [],
|
|
),
|
|
});
|
|
|
|
expect(submissionObjectEffects.saveSubmissionSuccess$).toBeObservable(expected);
|
|
expect(notificationsServiceStub.warning).toHaveBeenCalled();
|
|
});
|
|
|
|
it('should detect and notify a new section', () => {
|
|
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_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 || [],
|
|
errorsList.traditionalpageone || [],
|
|
),
|
|
c: new UpdateSectionDataAction(
|
|
submissionId,
|
|
'traditionalpagetwo',
|
|
mockSectionsDataTwo.traditionalpagetwo as any,
|
|
errorsList.traditionalpagetwo || [],
|
|
errorsList.traditionalpagetwo || [],
|
|
),
|
|
d: new UpdateSectionDataAction(
|
|
submissionId,
|
|
'license',
|
|
mockSectionsDataTwo.license as any,
|
|
errorsList.license || [],
|
|
errorsList.license || [],
|
|
),
|
|
e: new UpdateSectionDataAction(
|
|
submissionId,
|
|
'upload',
|
|
mockSectionsDataTwo.upload as any,
|
|
errorsList.upload || [],
|
|
errorsList.upload || [],
|
|
),
|
|
});
|
|
|
|
expect(submissionObjectEffects.saveSubmissionSuccess$).toBeObservable(expected);
|
|
expect(submissionServiceStub.notifyNewSection).toHaveBeenCalled();
|
|
});
|
|
|
|
});
|
|
|
|
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 || [],
|
|
errorsList.license || [],
|
|
),
|
|
d: new UpdateSectionDataAction(
|
|
submissionId,
|
|
'upload',
|
|
mockSectionsData.upload as any,
|
|
errorsList.upload || [],
|
|
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 serverValidationErrorsList = parseSectionErrors(mockSectionsErrors);
|
|
const expected = cold('--(bcd)-', {
|
|
b: new UpdateSectionDataAction(
|
|
submissionId,
|
|
'traditionalpageone',
|
|
mockSectionsData.traditionalpageone as any,
|
|
[],
|
|
serverValidationErrorsList.traditionalpageone,
|
|
),
|
|
c: new UpdateSectionDataAction(
|
|
submissionId,
|
|
'license',
|
|
mockSectionsData.license as any,
|
|
serverValidationErrorsList.license || [],
|
|
serverValidationErrorsList.license || [],
|
|
),
|
|
d: new UpdateSectionDataAction(
|
|
submissionId,
|
|
'upload',
|
|
mockSectionsData.upload as any,
|
|
serverValidationErrorsList.upload || [],
|
|
serverValidationErrorsList.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 || [],
|
|
errorsList.traditionalpagetwo || [],
|
|
),
|
|
d: new UpdateSectionDataAction(
|
|
submissionId,
|
|
'license',
|
|
mockSectionsDataTwo.license as any,
|
|
errorsList.license || [],
|
|
errorsList.license || [],
|
|
),
|
|
e: new UpdateSectionDataAction(
|
|
submissionId,
|
|
'upload',
|
|
mockSectionsDataTwo.upload as any,
|
|
errorsList.upload || [],
|
|
errorsList.upload || [],
|
|
),
|
|
});
|
|
|
|
expect(submissionObjectEffects.saveSubmissionSectionSuccess$).toBeObservable(expected);
|
|
expect(submissionServiceStub.notifyNewSection).not.toHaveBeenCalled();
|
|
});
|
|
|
|
});
|
|
|
|
describe('saveSection$', () => {
|
|
it('should return a SAVE_SUBMISSION_SECTION_FORM_SUCCESS action on success', () => {
|
|
actions = hot('--a-', {
|
|
a: {
|
|
type: SubmissionObjectActionTypes.SAVE_SUBMISSION_SECTION_FORM,
|
|
payload: {
|
|
submissionId: submissionId,
|
|
sectionId: 'traditionalpageone',
|
|
},
|
|
},
|
|
});
|
|
|
|
submissionJsonPatchOperationsServiceStub.jsonPatchByResourceID.and.returnValue(observableOf(mockSubmissionRestResponse));
|
|
const expected = cold('--b-', {
|
|
b: new SaveSubmissionSectionFormSuccessAction(
|
|
submissionId,
|
|
mockSubmissionRestResponse as any,
|
|
),
|
|
});
|
|
|
|
expect(submissionObjectEffects.saveSection$).toBeObservable(expected);
|
|
});
|
|
|
|
it('should return a SAVE_SUBMISSION_SECTION_FORM_ERROR action on error', () => {
|
|
actions = hot('--a-', {
|
|
a: {
|
|
type: SubmissionObjectActionTypes.SAVE_SUBMISSION_SECTION_FORM,
|
|
payload: {
|
|
submissionId: submissionId,
|
|
sectionId: 'traditionalpageone',
|
|
},
|
|
},
|
|
});
|
|
|
|
submissionJsonPatchOperationsServiceStub.jsonPatchByResourceID.and.callFake(
|
|
() => observableThrowError('Error'),
|
|
);
|
|
const expected = cold('--b-', {
|
|
b: new SaveSubmissionSectionFormErrorAction(
|
|
submissionId,
|
|
),
|
|
});
|
|
|
|
expect(submissionObjectEffects.saveSection$).toBeObservable(expected);
|
|
});
|
|
});
|
|
|
|
describe('saveAndDepositSection$', () => {
|
|
it('should return a DEPOSIT_SUBMISSION action on success', () => {
|
|
actions = hot('--a-', {
|
|
a: {
|
|
type: SubmissionObjectActionTypes.SAVE_AND_DEPOSIT_SUBMISSION,
|
|
payload: {
|
|
submissionId: submissionId,
|
|
},
|
|
},
|
|
});
|
|
|
|
const response = [Object.assign({}, mockSubmissionRestResponse[0], {
|
|
sections: mockSectionsDataTwo,
|
|
})];
|
|
|
|
submissionJsonPatchOperationsServiceStub.jsonPatchByResourceType.and.returnValue(observableOf(response));
|
|
const expected = cold('--b-', {
|
|
b: new DepositSubmissionAction(
|
|
submissionId,
|
|
),
|
|
});
|
|
|
|
expect(submissionObjectEffects.saveAndDeposit$).toBeObservable(expected);
|
|
expect(notificationsServiceStub.warning).not.toHaveBeenCalled();
|
|
});
|
|
|
|
it('should return a SAVE_SUBMISSION_FORM_SUCCESS action when there are errors', () => {
|
|
store.nextState({
|
|
submission: {
|
|
objects: submissionState,
|
|
},
|
|
} as any);
|
|
|
|
actions = hot('--a-', {
|
|
a: {
|
|
type: SubmissionObjectActionTypes.SAVE_AND_DEPOSIT_SUBMISSION,
|
|
payload: {
|
|
submissionId: submissionId,
|
|
},
|
|
},
|
|
});
|
|
|
|
const response = [Object.assign({}, mockSubmissionRestResponse[0], {
|
|
sections: mockSectionsData,
|
|
errors: mockSectionsErrors,
|
|
})];
|
|
|
|
submissionJsonPatchOperationsServiceStub.jsonPatchByResourceType.and.returnValue(observableOf(response));
|
|
|
|
const expected = cold('--b-', {
|
|
b: new SaveSubmissionFormSuccessAction(submissionId, response as any[], false, true),
|
|
});
|
|
|
|
expect(submissionObjectEffects.saveAndDeposit$).toBeObservable(expected);
|
|
expect(notificationsServiceStub.warning).toHaveBeenCalled();
|
|
});
|
|
|
|
it('should catch errors and return a SAVE_SUBMISSION_FORM_ERROR', () => {
|
|
actions = hot('--a-', {
|
|
a: {
|
|
type: SubmissionObjectActionTypes.SAVE_AND_DEPOSIT_SUBMISSION,
|
|
payload: {
|
|
submissionId: submissionId,
|
|
},
|
|
},
|
|
});
|
|
|
|
submissionJsonPatchOperationsServiceStub.jsonPatchByResourceType.and.callFake(
|
|
() => observableThrowError('Error'),
|
|
);
|
|
const expected = cold('--b-', {
|
|
b: new SaveSubmissionFormErrorAction(
|
|
submissionId,
|
|
),
|
|
});
|
|
|
|
expect(submissionObjectEffects.saveAndDeposit$).toBeObservable(expected);
|
|
});
|
|
});
|
|
|
|
describe('depositSubmission$', () => {
|
|
it('should return a DEPOSIT_SUBMISSION_SUCCESS action on success', () => {
|
|
store.nextState({
|
|
submission: {
|
|
objects: submissionState,
|
|
},
|
|
} as any);
|
|
|
|
actions = hot('--a-', {
|
|
a: {
|
|
type: SubmissionObjectActionTypes.DEPOSIT_SUBMISSION,
|
|
payload: {
|
|
submissionId: submissionId,
|
|
},
|
|
},
|
|
});
|
|
|
|
submissionServiceStub.depositSubmission.and.returnValue(observableOf(mockSubmissionRestResponse));
|
|
const expected = cold('--b-', {
|
|
b: new DepositSubmissionSuccessAction(
|
|
submissionId,
|
|
),
|
|
});
|
|
|
|
expect(submissionObjectEffects.depositSubmission$).toBeObservable(expected);
|
|
});
|
|
|
|
it('should return a DEPOSIT_SUBMISSION_ERROR action on error', () => {
|
|
store.nextState({
|
|
submission: {
|
|
objects: submissionState,
|
|
},
|
|
} as any);
|
|
|
|
actions = hot('--a-', {
|
|
a: {
|
|
type: SubmissionObjectActionTypes.DEPOSIT_SUBMISSION,
|
|
payload: {
|
|
submissionId: submissionId,
|
|
},
|
|
},
|
|
});
|
|
|
|
submissionServiceStub.depositSubmission.and.callFake(
|
|
() => observableThrowError('Error'),
|
|
);
|
|
const expected = cold('--b-', {
|
|
b: new DepositSubmissionErrorAction(
|
|
submissionId,
|
|
),
|
|
});
|
|
|
|
expect(submissionObjectEffects.depositSubmission$).toBeObservable(expected);
|
|
});
|
|
});
|
|
|
|
describe('saveForLaterSubmissionSuccess$', () => {
|
|
it('should display a new success notification and redirect to mydspace', () => {
|
|
actions = hot('--a-', {
|
|
a: {
|
|
type: SubmissionObjectActionTypes.SAVE_FOR_LATER_SUBMISSION_FORM_SUCCESS,
|
|
payload: {
|
|
submissionId: submissionId,
|
|
submissionObject: mockSubmissionRestResponse,
|
|
},
|
|
},
|
|
});
|
|
|
|
submissionObjectEffects.saveForLaterSubmissionSuccess$.subscribe(() => {
|
|
expect(notificationsServiceStub.success).toHaveBeenCalled();
|
|
expect(submissionServiceStub.redirectToMyDSpace).toHaveBeenCalled();
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('depositSubmissionSuccess$', () => {
|
|
it('should display a new success notification and redirect to mydspace', () => {
|
|
actions = hot('--a-', {
|
|
a: {
|
|
type: SubmissionObjectActionTypes.DEPOSIT_SUBMISSION_SUCCESS,
|
|
payload: {
|
|
submissionId: submissionId,
|
|
},
|
|
},
|
|
});
|
|
|
|
submissionObjectEffects.depositSubmissionSuccess$.subscribe(() => {
|
|
expect(notificationsServiceStub.success).toHaveBeenCalled();
|
|
expect(submissionServiceStub.redirectToMyDSpace).toHaveBeenCalled();
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('depositSubmissionError$', () => {
|
|
it('should display a new error notification', () => {
|
|
actions = hot('--a-', {
|
|
a: {
|
|
type: SubmissionObjectActionTypes.DEPOSIT_SUBMISSION_ERROR,
|
|
payload: {
|
|
submissionId: submissionId,
|
|
},
|
|
},
|
|
});
|
|
|
|
submissionObjectEffects.depositSubmissionError$.subscribe(() => {
|
|
expect(notificationsServiceStub.error).toHaveBeenCalled();
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('saveError$', () => {
|
|
it('should display a new error notification', () => {
|
|
actions = hot('--a-', {
|
|
a: {
|
|
type: SubmissionObjectActionTypes.SAVE_SUBMISSION_FORM_ERROR,
|
|
payload: {
|
|
submissionId: submissionId,
|
|
},
|
|
},
|
|
});
|
|
|
|
submissionObjectEffects.saveError$.subscribe(() => {
|
|
expect(notificationsServiceStub.error).toHaveBeenCalled();
|
|
});
|
|
});
|
|
|
|
it('should display a new error notification', () => {
|
|
actions = hot('--a-', {
|
|
a: {
|
|
type: SubmissionObjectActionTypes.SAVE_SUBMISSION_SECTION_FORM_ERROR,
|
|
payload: {
|
|
submissionId: submissionId,
|
|
},
|
|
},
|
|
});
|
|
|
|
submissionObjectEffects.saveError$.subscribe(() => {
|
|
expect(notificationsServiceStub.error).toHaveBeenCalled();
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('discardSubmission$', () => {
|
|
it('should return a DISCARD_SUBMISSION_SUCCESS action on success', () => {
|
|
store.nextState({
|
|
submission: {
|
|
objects: submissionState,
|
|
},
|
|
} as any);
|
|
|
|
actions = hot('--a-', {
|
|
a: {
|
|
type: SubmissionObjectActionTypes.DISCARD_SUBMISSION,
|
|
payload: {
|
|
submissionId: submissionId,
|
|
},
|
|
},
|
|
});
|
|
|
|
submissionServiceStub.discardSubmission.and.returnValue(observableOf(mockSubmissionRestResponse));
|
|
const expected = cold('--b-', {
|
|
b: new DiscardSubmissionSuccessAction(
|
|
submissionId,
|
|
),
|
|
});
|
|
|
|
expect(submissionObjectEffects.discardSubmission$).toBeObservable(expected);
|
|
});
|
|
|
|
it('should return a DISCARD_SUBMISSION_ERROR action on error', () => {
|
|
store.nextState({
|
|
submission: {
|
|
objects: submissionState,
|
|
},
|
|
} as any);
|
|
|
|
actions = hot('--a-', {
|
|
a: {
|
|
type: SubmissionObjectActionTypes.DISCARD_SUBMISSION,
|
|
payload: {
|
|
submissionId: submissionId,
|
|
},
|
|
},
|
|
});
|
|
|
|
submissionServiceStub.discardSubmission.and.callFake(
|
|
() => observableThrowError('Error'),
|
|
);
|
|
const expected = cold('--b-', {
|
|
b: new DiscardSubmissionErrorAction(
|
|
submissionId,
|
|
),
|
|
});
|
|
|
|
expect(submissionObjectEffects.discardSubmission$).toBeObservable(expected);
|
|
});
|
|
});
|
|
|
|
describe('discardSubmissionSuccess$', () => {
|
|
it('should display a new success notification and redirect to mydspace', () => {
|
|
actions = hot('--a-', {
|
|
a: {
|
|
type: SubmissionObjectActionTypes.DISCARD_SUBMISSION_SUCCESS,
|
|
payload: {
|
|
submissionId: submissionId,
|
|
},
|
|
},
|
|
});
|
|
|
|
submissionObjectEffects.discardSubmissionSuccess$.subscribe(() => {
|
|
expect(notificationsServiceStub.success).toHaveBeenCalled();
|
|
expect(submissionServiceStub.redirectToMyDSpace).toHaveBeenCalled();
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('discardSubmissionError$', () => {
|
|
it('should display a new error notification', () => {
|
|
actions = hot('--a-', {
|
|
a: {
|
|
type: SubmissionObjectActionTypes.DISCARD_SUBMISSION_ERROR,
|
|
payload: {
|
|
submissionId: submissionId,
|
|
},
|
|
},
|
|
});
|
|
|
|
submissionObjectEffects.discardSubmissionError$.subscribe(() => {
|
|
expect(notificationsServiceStub.error).toHaveBeenCalled();
|
|
});
|
|
});
|
|
});
|
|
});
|