Files
dspace-angular/src/app/+item-page/edit-item-page/item-relationships/edit-relationship/edit-relationship.component.spec.ts

216 lines
6.0 KiB
TypeScript

import { NO_ERRORS_SCHEMA } from '@angular/core';
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { TranslateModule } from '@ngx-translate/core';
import { of as observableOf } from 'rxjs/internal/observable/of';
import { FieldChangeType } from '../../../../core/data/object-updates/object-updates.actions';
import { ObjectUpdatesService } from '../../../../core/data/object-updates/object-updates.service';
import { RelationshipType } from '../../../../core/shared/item-relationships/relationship-type.model';
import { Relationship } from '../../../../core/shared/item-relationships/relationship.model';
import { Item } from '../../../../core/shared/item.model';
import { EditRelationshipComponent } from './edit-relationship.component';
import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
import { createSuccessfulRemoteDataObject$ } from '../../../../shared/remote-data.utils';
import { createPaginatedList } from '../../../../shared/testing/utils.test';
let objectUpdatesService;
const url = 'http://test-url.com/test-url';
let item;
let relatedItem;
let author1;
let author2;
let fieldUpdate1;
let fieldUpdate2;
let relationships;
let relationshipType;
let fixture: ComponentFixture<EditRelationshipComponent>;
let comp: EditRelationshipComponent;
let de;
let el;
describe('EditRelationshipComponent', () => {
beforeEach(async(() => {
relationshipType = Object.assign(new RelationshipType(), {
id: '1',
uuid: '1',
leftwardType: 'isAuthorOfPublication',
rightwardType: 'isPublicationOfAuthor'
});
item = Object.assign(new Item(), {
_links: {
self: {
href: 'fake-item-url/publication'
}
},
id: 'publication',
uuid: 'publication',
relationships: createSuccessfulRemoteDataObject$(createPaginatedList(relationships))
});
relatedItem = Object.assign(new Item(), {
uuid: 'related item id',
});
relationships = [
Object.assign(new Relationship(), {
_links: {
self: { href: url + '/2' }
},
id: '2',
uuid: '2',
leftId: 'author1',
rightId: 'publication',
relationshipType: createSuccessfulRemoteDataObject$(relationshipType),
leftItem: createSuccessfulRemoteDataObject$(relatedItem),
rightItem: createSuccessfulRemoteDataObject$(item),
}),
Object.assign(new Relationship(), {
_links: {
self: { href: url + '/3' }
},
id: '3',
uuid: '3',
leftId: 'author2',
rightId: 'publication',
relationshipType: createSuccessfulRemoteDataObject$(relationshipType)
})
];
author1 = Object.assign(new Item(), {
id: 'author1',
uuid: 'author1'
});
author2 = Object.assign(new Item(), {
id: 'author2',
uuid: 'author2'
});
fieldUpdate1 = {
field: {
uuid: relationships[0].uuid,
relationship: relationships[0],
},
changeType: undefined
};
fieldUpdate2 = {
field: {
uuid: relationships[1].uuid,
relationship: relationships[1],
},
changeType: FieldChangeType.REMOVE
};
const itemSelection = {};
itemSelection[relatedItem.uuid] = false;
itemSelection[item.uuid] = true;
objectUpdatesService = {
isSelectedVirtualMetadata: () => null,
removeSingleFieldUpdate: jasmine.createSpy('removeSingleFieldUpdate'),
saveRemoveFieldUpdate: jasmine.createSpy('saveRemoveFieldUpdate'),
};
spyOn(objectUpdatesService, 'isSelectedVirtualMetadata').and.callFake((a, b, uuid) => observableOf(itemSelection[uuid]));
TestBed.configureTestingModule({
imports: [TranslateModule.forRoot()],
declarations: [EditRelationshipComponent],
providers: [
{ provide: ObjectUpdatesService, useValue: objectUpdatesService },
{ provide: NgbModal, useValue: {
open: () => {/*comment*/
}
},
},
], schemas: [
NO_ERRORS_SCHEMA
]
}).compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(EditRelationshipComponent);
comp = fixture.componentInstance;
de = fixture.debugElement;
el = de.nativeElement;
comp.url = url;
comp.fieldUpdate = fieldUpdate1;
comp.editItem = item;
comp.relatedItem$ = observableOf(relatedItem);
fixture.detectChanges();
});
describe('when fieldUpdate has no changeType', () => {
beforeEach(() => {
comp.fieldUpdate = fieldUpdate1;
fixture.detectChanges();
});
describe('canRemove', () => {
it('should return true', () => {
expect(comp.canRemove()).toBe(true);
});
});
describe('canUndo', () => {
it('should return false', () => {
expect(comp.canUndo()).toBe(false);
});
});
});
describe('when fieldUpdate has DELETE as changeType', () => {
beforeEach(() => {
comp.fieldUpdate = fieldUpdate2;
fixture.detectChanges();
});
describe('canRemove', () => {
it('should return false', () => {
expect(comp.canRemove()).toBe(false);
});
});
describe('canUndo', () => {
it('should return true', () => {
expect(comp.canUndo()).toBe(true);
});
});
});
describe('remove', () => {
beforeEach(() => {
spyOn(comp, 'closeVirtualMetadataModal');
comp.ngOnChanges();
comp.remove();
});
it('should close the virtual metadata modal and call saveRemoveFieldUpdate with the correct arguments', () => {
expect(comp.closeVirtualMetadataModal).toHaveBeenCalled();
expect(objectUpdatesService.saveRemoveFieldUpdate).toHaveBeenCalledWith(
url,
Object.assign({}, fieldUpdate1.field, {
keepLeftVirtualMetadata: false,
keepRightVirtualMetadata: true,
}),
);
});
});
describe('undo', () => {
it('should call removeSingleFieldUpdate with the correct arguments', () => {
comp.undo();
expect(objectUpdatesService.removeSingleFieldUpdate).toHaveBeenCalledWith(url, relationships[0].uuid);
});
});
});