From 038483c8b87fd7a93b021cf2cbc201cac4efcece Mon Sep 17 00:00:00 2001
From: Samuel <samuel@atmire.com>
Date: Thu, 5 Dec 2019 15:29:32 +0100
Subject: [PATCH] taskid 66074 Keep virtual metadata on relationship delete -
 fix tests

---
 .../edit-relationship-list.component.spec.ts  |  1 +
 .../edit-relationship.component.spec.ts       | 81 ++++++++++++-------
 .../core/data/relationship.service.spec.ts    |  4 +-
 3 files changed, 57 insertions(+), 29 deletions(-)

diff --git a/src/app/+item-page/edit-item-page/item-relationships/edit-relationship-list/edit-relationship-list.component.spec.ts b/src/app/+item-page/edit-item-page/item-relationships/edit-relationship-list/edit-relationship-list.component.spec.ts
index 54cb2837a2..bc2fcda3a9 100644
--- a/src/app/+item-page/edit-item-page/item-relationships/edit-relationship-list/edit-relationship-list.component.spec.ts
+++ b/src/app/+item-page/edit-item-page/item-relationships/edit-relationship-list/edit-relationship-list.component.spec.ts
@@ -98,6 +98,7 @@ describe('EditRelationshipListComponent', () => {
     relationshipService = jasmine.createSpyObj('relationshipService',
       {
         getRelatedItemsByLabel: observableOf(new RemoteData(false, false, true, null, new PaginatedList(new PageInfo(), [author1, author2]))),
+        getItemRelationshipsByLabel: observableOf(new RemoteData(false, false, true, null, new PaginatedList(new PageInfo(), relationships))),
       }
     );
 
diff --git a/src/app/+item-page/edit-item-page/item-relationships/edit-relationship/edit-relationship.component.spec.ts b/src/app/+item-page/edit-item-page/item-relationships/edit-relationship/edit-relationship.component.spec.ts
index 00c2a33006..5f12ea32e7 100644
--- a/src/app/+item-page/edit-item-page/item-relationships/edit-relationship/edit-relationship.component.spec.ts
+++ b/src/app/+item-page/edit-item-page/item-relationships/edit-relationship/edit-relationship.component.spec.ts
@@ -11,11 +11,15 @@ import { Item } from '../../../../core/shared/item.model';
 import { PaginatedList } from '../../../../core/data/paginated-list';
 import { PageInfo } from '../../../../core/shared/page-info.model';
 import { FieldChangeType } from '../../../../core/data/object-updates/object-updates.actions';
+import {NgbModal} from "@ng-bootstrap/ng-bootstrap";
+import {Store} from "@ngrx/store";
+import {CoreState} from "../../../../core/core.reducers";
 
-let objectUpdatesService: ObjectUpdatesService;
+let objectUpdatesService;
 const url = 'http://test-url.com/test-url';
 
 let item;
+let relatedItem;
 let author1;
 let author2;
 let fieldUpdate1;
@@ -37,6 +41,17 @@ describe('EditRelationshipComponent', () => {
       rightwardType: 'isPublicationOfAuthor'
     });
 
+    item = Object.assign(new Item(), {
+      self: 'fake-item-url/publication',
+      id: 'publication',
+      uuid: 'publication',
+      relationships: observableOf(new RemoteData(false, false, true, undefined, new PaginatedList(new PageInfo(), relationships)))
+    });
+
+    relatedItem = Object.assign(new Item(), {
+      uuid: 'related item id',
+    });
+
     relationships = [
       Object.assign(new Relationship(), {
         self: url + '/2',
@@ -44,7 +59,9 @@ describe('EditRelationshipComponent', () => {
         uuid: '2',
         leftId: 'author1',
         rightId: 'publication',
-        relationshipType: observableOf(new RemoteData(false, false, true, undefined, relationshipType))
+        relationshipType: observableOf(new RemoteData(false, false, true, undefined, relationshipType)),
+        leftItem: observableOf(new RemoteData(false, false, true, undefined, relatedItem)),
+        rightItem: observableOf(new RemoteData(false, false, true, undefined, item)),
       }),
       Object.assign(new Relationship(), {
         self: url + '/3',
@@ -56,13 +73,6 @@ describe('EditRelationshipComponent', () => {
       })
     ];
 
-    item = Object.assign(new Item(), {
-      self: 'fake-item-url/publication',
-      id: 'publication',
-      uuid: 'publication',
-      relationships: observableOf(new RemoteData(false, false, true, undefined, new PaginatedList(new PageInfo(), relationships)))
-    });
-
     author1 = Object.assign(new Item(), {
       id: 'author1',
       uuid: 'author1'
@@ -73,32 +83,35 @@ describe('EditRelationshipComponent', () => {
     });
 
     fieldUpdate1 = {
-      field: author1,
+      field: relationships[0],
       changeType: undefined
     };
     fieldUpdate2 = {
-      field: author2,
+      field: relationships[1],
       changeType: FieldChangeType.REMOVE
     };
 
-    objectUpdatesService = jasmine.createSpyObj('objectUpdatesService',
-      {
-        saveChangeFieldUpdate: {},
-        saveRemoveFieldUpdate: {},
-        setEditableFieldUpdate: {},
-        setValidFieldUpdate: {},
-        removeSingleFieldUpdate: {},
-        isEditable: observableOf(false), // should always return something --> its in ngOnInit
-        isValid: observableOf(true) // should always return something --> its in ngOnInit
-      }
-    );
+    const itemSelection = {};
+    itemSelection[relatedItem.uuid] = false;
+    itemSelection[item.uuid] = true;
+
+    const store = new Store<CoreState>(undefined, undefined, undefined);
+
+    objectUpdatesService = new ObjectUpdatesService(store);
+
+    spyOn(objectUpdatesService, 'isSelectedVirtualMetadata').and.callFake((a, b, uuid) => observableOf(itemSelection[uuid]));
 
     TestBed.configureTestingModule({
       imports: [TranslateModule.forRoot()],
       declarations: [EditRelationshipComponent],
       providers: [
-        { provide: ObjectUpdatesService, useValue: objectUpdatesService }
-      ], schemas: [
+        { provide: ObjectUpdatesService, useValue: objectUpdatesService },
+        { provide: NgbModal, useValue: {
+            open: () => {/*comment*/
+            }
+          },
+        },
+    ], schemas: [
         NO_ERRORS_SCHEMA
       ]
     }).compileComponents();
@@ -113,6 +126,7 @@ describe('EditRelationshipComponent', () => {
     comp.url = url;
     comp.fieldUpdate = fieldUpdate1;
     comp.editItem = item;
+    comp.relatedItem$ = observableOf(relatedItem);
 
     fixture.detectChanges();
   });
@@ -157,21 +171,34 @@ describe('EditRelationshipComponent', () => {
 
   describe('remove', () => {
     beforeEach(() => {
+      spyOn(comp, 'closeVirtualMetadataModal');
+      spyOn(objectUpdatesService, 'saveRemoveFieldUpdate');
+      comp.ngOnChanges();
       comp.remove();
     });
 
-    it('should call saveRemoveFieldUpdate with the correct arguments', () => {
-      expect(objectUpdatesService.saveRemoveFieldUpdate).toHaveBeenCalledWith(url, item);
+    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', () => {
     beforeEach(() => {
+      spyOn(objectUpdatesService, 'removeSingleFieldUpdate');
       comp.undo();
+      comp.ngOnChanges();
     });
 
     it('should call removeSingleFieldUpdate with the correct arguments', () => {
-      expect(objectUpdatesService.removeSingleFieldUpdate).toHaveBeenCalledWith(url, item.uuid);
+
+      fixture.whenStable().then(() => {
+        expect(objectUpdatesService.removeSingleFieldUpdate).toHaveBeenCalledWith(url, fieldUpdate1[0]);
+      })
     });
   });
 
diff --git a/src/app/core/data/relationship.service.spec.ts b/src/app/core/data/relationship.service.spec.ts
index 7d51f167d3..34c60983c2 100644
--- a/src/app/core/data/relationship.service.spec.ts
+++ b/src/app/core/data/relationship.service.spec.ts
@@ -109,11 +109,11 @@ describe('RelationshipService', () => {
     beforeEach(() => {
       spyOn(service, 'findById').and.returnValue(getRemotedataObservable(relationship1));
       spyOn(objectCache, 'remove');
-      service.deleteRelationship(relationships[0].uuid, 'none').subscribe();
+      service.deleteRelationship(relationships[0].uuid, 'right').subscribe();
     });
 
     it('should send a DeleteRequest', () => {
-      const expected = new DeleteRequest(requestService.generateRequestId(), relationshipsEndpointURL + '/' + relationship1.uuid);
+      const expected = new DeleteRequest(requestService.generateRequestId(), relationshipsEndpointURL + '/' + relationship1.uuid + '?copyVirtualMetadata=right');
       expect(requestService.configure).toHaveBeenCalledWith(expected);
     });
 
-- 
GitLab