Fixed issue with DataService's delete method that used wrong uuid to make the request

This commit is contained in:
Giuseppe Digilio
2020-02-27 11:15:31 +01:00
parent a6f1a6d1ec
commit 500f5c645f
11 changed files with 34 additions and 27 deletions

View File

@@ -230,10 +230,10 @@ describe('BitstreamFormatsComponent', () => {
comp.deleteFormats(); comp.deleteFormats();
expect(bitstreamFormatService.clearBitStreamFormatRequests).toHaveBeenCalled(); expect(bitstreamFormatService.clearBitStreamFormatRequests).toHaveBeenCalled();
expect(bitstreamFormatService.delete).toHaveBeenCalledWith(bitstreamFormat1); expect(bitstreamFormatService.delete).toHaveBeenCalledWith(bitstreamFormat1.id);
expect(bitstreamFormatService.delete).toHaveBeenCalledWith(bitstreamFormat2); expect(bitstreamFormatService.delete).toHaveBeenCalledWith(bitstreamFormat2.id);
expect(bitstreamFormatService.delete).toHaveBeenCalledWith(bitstreamFormat3); expect(bitstreamFormatService.delete).toHaveBeenCalledWith(bitstreamFormat3.id);
expect(bitstreamFormatService.delete).toHaveBeenCalledWith(bitstreamFormat4); expect(bitstreamFormatService.delete).toHaveBeenCalledWith(bitstreamFormat4.id);
expect(notificationsServiceStub.success).toHaveBeenCalledWith('admin.registries.bitstream-formats.delete.success.head', expect(notificationsServiceStub.success).toHaveBeenCalledWith('admin.registries.bitstream-formats.delete.success.head',
'admin.registries.bitstream-formats.delete.success.amount'); 'admin.registries.bitstream-formats.delete.success.amount');
@@ -276,10 +276,10 @@ describe('BitstreamFormatsComponent', () => {
comp.deleteFormats(); comp.deleteFormats();
expect(bitstreamFormatService.clearBitStreamFormatRequests).toHaveBeenCalled(); expect(bitstreamFormatService.clearBitStreamFormatRequests).toHaveBeenCalled();
expect(bitstreamFormatService.delete).toHaveBeenCalledWith(bitstreamFormat1); expect(bitstreamFormatService.delete).toHaveBeenCalledWith(bitstreamFormat1.id);
expect(bitstreamFormatService.delete).toHaveBeenCalledWith(bitstreamFormat2); expect(bitstreamFormatService.delete).toHaveBeenCalledWith(bitstreamFormat2.id);
expect(bitstreamFormatService.delete).toHaveBeenCalledWith(bitstreamFormat3); expect(bitstreamFormatService.delete).toHaveBeenCalledWith(bitstreamFormat3.id);
expect(bitstreamFormatService.delete).toHaveBeenCalledWith(bitstreamFormat4); expect(bitstreamFormatService.delete).toHaveBeenCalledWith(bitstreamFormat4.id);
expect(notificationsServiceStub.error).toHaveBeenCalledWith('admin.registries.bitstream-formats.delete.failure.head', expect(notificationsServiceStub.error).toHaveBeenCalledWith('admin.registries.bitstream-formats.delete.failure.head',
'admin.registries.bitstream-formats.delete.failure.amount'); 'admin.registries.bitstream-formats.delete.failure.amount');

View File

@@ -64,7 +64,7 @@ export class BitstreamFormatsComponent implements OnInit {
const tasks$ = []; const tasks$ = [];
for (const format of formats) { for (const format of formats) {
if (hasValue(format.id)) { if (hasValue(format.id)) {
tasks$.push(this.bitstreamFormatService.delete(format)); tasks$.push(this.bitstreamFormatService.delete(format.id));
} }
} }
zip(...tasks$).subscribe((results: boolean[]) => { zip(...tasks$).subscribe((results: boolean[]) => {

View File

@@ -220,7 +220,7 @@ describe('ItemDeleteComponent', () => {
spyOn(comp, 'notify'); spyOn(comp, 'notify');
comp.performAction(); comp.performAction();
expect(mockItemDataService.delete) expect(mockItemDataService.delete)
.toHaveBeenCalledWith(mockItem, types.filter((type) => typesSelection[type]).map((type) => type.id)); .toHaveBeenCalledWith(mockItem.id, types.filter((type) => typesSelection[type]).map((type) => type.id));
expect(comp.notify).toHaveBeenCalled(); expect(comp.notify).toHaveBeenCalled();
}); });
}); });

View File

@@ -312,7 +312,7 @@ export class ItemDeleteComponent
) )
), ),
).subscribe((types) => { ).subscribe((types) => {
this.itemDataService.delete(this.item, types).pipe(first()).subscribe( this.itemDataService.delete(this.item.id, types).pipe(first()).subscribe(
(succeeded: boolean) => { (succeeded: boolean) => {
this.notify(succeeded); this.notify(succeeded);
} }
@@ -322,7 +322,7 @@ export class ItemDeleteComponent
/** /**
* When the item is successfully delete, navigate to the homepage, otherwise navigate back to the item edit page * When the item is successfully delete, navigate to the homepage, otherwise navigate back to the item edit page
* @param response * @param succeeded
*/ */
notify(succeeded: boolean) { notify(succeeded: boolean) {
if (succeeded) { if (succeeded) {

View File

@@ -282,7 +282,7 @@ describe('BitstreamFormatDataService', () => {
format.id = 'format-id'; format.id = 'format-id';
const expected = cold('(b|)', {b: true}); const expected = cold('(b|)', {b: true});
const result = service.delete(format); const result = service.delete(format.id);
expect(result).toBeObservable(expected); expect(result).toBeObservable(expected);
}); });

View File

@@ -154,19 +154,19 @@ export class BitstreamFormatDataService extends DataService<BitstreamFormat> {
/** /**
* Delete an existing DSpace Object on the server * Delete an existing DSpace Object on the server
* @param format The DSpace Object to be removed * @param formatID The DSpace Object'id to be removed
* Return an observable that emits true when the deletion was successful, false when it failed * Return an observable that emits true when the deletion was successful, false when it failed
*/ */
delete(format: BitstreamFormat): Observable<boolean> { delete(formatID: string): Observable<boolean> {
const requestId = this.requestService.generateRequestId(); const requestId = this.requestService.generateRequestId();
const hrefObs = this.halService.getEndpoint(this.linkPath).pipe( const hrefObs = this.halService.getEndpoint(this.linkPath).pipe(
map((endpoint: string) => this.getIDHref(endpoint, format.id))); map((endpoint: string) => this.getIDHref(endpoint, formatID)));
hrefObs.pipe( hrefObs.pipe(
find((href: string) => hasValue(href)), find((href: string) => hasValue(href)),
map((href: string) => { map((href: string) => {
const request = new DeleteByIDRequest(requestId, href, format.id); const request = new DeleteByIDRequest(requestId, href, formatID);
this.requestService.configure(request); this.requestService.configure(request);
}) })
).subscribe(); ).subscribe();

View File

@@ -152,7 +152,11 @@ export abstract class DataService<T extends CacheableObject> {
/** /**
* Returns {@link RemoteData} of all object with a list of {@link FollowLinkConfig}, to indicate which embedded * Returns {@link RemoteData} of all object with a list of {@link FollowLinkConfig}, to indicate which embedded
* info should be added to the objects * info should be added to the objects
*
* @param options Find list options object
* @param linksToFollow List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved * @param linksToFollow List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved
* @return {Observable<RemoteData<PaginatedList<T>>>}
* Return an observable that emits object list
*/ */
findAll(options: FindListOptions = {}, ...linksToFollow: Array<FollowLinkConfig<T>>): Observable<RemoteData<PaginatedList<T>>> { findAll(options: FindListOptions = {}, ...linksToFollow: Array<FollowLinkConfig<T>>): Observable<RemoteData<PaginatedList<T>>> {
return this.findList(this.getFindAllHref(options), options, ...linksToFollow); return this.findList(this.getFindAllHref(options), options, ...linksToFollow);
@@ -162,6 +166,7 @@ export abstract class DataService<T extends CacheableObject> {
* Returns an observable of {@link RemoteData} of an object, based on href observable, * Returns an observable of {@link RemoteData} of an object, based on href observable,
* with a list of {@link FollowLinkConfig}, to automatically resolve {@link HALLink}s of the object * with a list of {@link FollowLinkConfig}, to automatically resolve {@link HALLink}s of the object
* @param href$ Observable of href of object we want to retrieve * @param href$ Observable of href of object we want to retrieve
* @param options Find list options object
* @param linksToFollow List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved * @param linksToFollow List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved
*/ */
protected findList(href$, options: FindListOptions, ...linksToFollow: Array<FollowLinkConfig<T>>) { protected findList(href$, options: FindListOptions, ...linksToFollow: Array<FollowLinkConfig<T>>) {
@@ -231,6 +236,7 @@ export abstract class DataService<T extends CacheableObject> {
* Returns a list of observables of {@link RemoteData} of objects, based on an href, with a list of {@link FollowLinkConfig}, * Returns a list of observables of {@link RemoteData} of objects, based on an href, with a list of {@link FollowLinkConfig},
* to automatically resolve {@link HALLink}s of the object * to automatically resolve {@link HALLink}s of the object
* @param href The url of object we want to retrieve * @param href The url of object we want to retrieve
* @param findListOptions Find list options object
* @param linksToFollow List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved * @param linksToFollow List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved
*/ */
findAllByHref(href: string, findListOptions: FindListOptions = {}, ...linksToFollow: Array<FollowLinkConfig<T>>): Observable<RemoteData<PaginatedList<T>>> { findAllByHref(href: string, findListOptions: FindListOptions = {}, ...linksToFollow: Array<FollowLinkConfig<T>>): Observable<RemoteData<PaginatedList<T>>> {
@@ -259,6 +265,7 @@ export abstract class DataService<T extends CacheableObject> {
* *
* @param searchMethod The search method for the object * @param searchMethod The search method for the object
* @param options The [[FindListOptions]] object * @param options The [[FindListOptions]] object
* @param linksToFollow The array of [[FollowLinkConfig]]
* @return {Observable<RemoteData<PaginatedList<T>>} * @return {Observable<RemoteData<PaginatedList<T>>}
* Return an observable that emits response from the server * Return an observable that emits response from the server
*/ */
@@ -367,16 +374,16 @@ export abstract class DataService<T extends CacheableObject> {
/** /**
* Delete an existing DSpace Object on the server * Delete an existing DSpace Object on the server
* @param dso The DSpace Object to be removed * @param dsoID The DSpace Object' id to be removed
* @param copyVirtualMetadata (optional parameter) the identifiers of the relationship types for which the virtual * @param copyVirtualMetadata (optional parameter) the identifiers of the relationship types for which the virtual
* metadata should be saved as real metadata * metadata should be saved as real metadata
* @return an observable that emits true when the deletion was successful, false when it failed * @return an observable that emits true when the deletion was successful, false when it failed
*/ */
delete(dso: T, copyVirtualMetadata?: string[]): Observable<boolean> { delete(dsoID: string, copyVirtualMetadata?: string[]): Observable<boolean> {
const requestId = this.requestService.generateRequestId(); const requestId = this.requestService.generateRequestId();
const hrefObs = this.halService.getEndpoint(this.linkPath).pipe( const hrefObs = this.halService.getEndpoint(this.linkPath).pipe(
map((endpoint: string) => this.getIDHref(endpoint, dso.uuid))); map((endpoint: string) => this.getIDHref(endpoint, dsoID)));
hrefObs.pipe( hrefObs.pipe(
find((href: string) => hasValue(href)), find((href: string) => hasValue(href)),
@@ -388,7 +395,7 @@ export abstract class DataService<T extends CacheableObject> {
+ id + id
); );
} }
const request = new DeleteByIDRequest(requestId, href, dso.uuid); const request = new DeleteByIDRequest(requestId, href, dsoID);
this.requestService.configure(request); this.requestService.configure(request);
}) })
).subscribe(); ).subscribe();

View File

@@ -125,7 +125,7 @@ describe('DeleteComColPageComponent', () => {
it('should call delete on the data service', () => { it('should call delete on the data service', () => {
comp.onConfirm(data1); comp.onConfirm(data1);
fixture.detectChanges(); fixture.detectChanges();
expect(dsoDataService.delete).toHaveBeenCalledWith(data1); expect(dsoDataService.delete).toHaveBeenCalledWith(data1.id);
}); });
}); });

View File

@@ -43,7 +43,7 @@ export class DeleteComColPageComponent<TDomain extends DSpaceObject> implements
* Deletes an existing DSO and redirects to the home page afterwards, showing a notification that states whether or not the deletion was successful * Deletes an existing DSO and redirects to the home page afterwards, showing a notification that states whether or not the deletion was successful
*/ */
onConfirm(dso: TDomain) { onConfirm(dso: TDomain) {
this.dsoDataService.delete(dso) this.dsoDataService.delete(dso.id)
.pipe(first()) .pipe(first())
.subscribe((success: boolean) => { .subscribe((success: boolean) => {
if (success) { if (success) {

View File

@@ -1,5 +1,5 @@
import { ChangeDetectionStrategy, Injector, NO_ERRORS_SCHEMA } from '@angular/core'; import { ChangeDetectionStrategy, Injector, NO_ERRORS_SCHEMA } from '@angular/core';
import { async, ComponentFixture, fakeAsync, TestBed } from '@angular/core/testing'; import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { Router } from '@angular/router'; import { Router } from '@angular/router';
import { By } from '@angular/platform-browser'; import { By } from '@angular/platform-browser';
@@ -141,7 +141,7 @@ describe('WorkspaceitemActionsComponent', () => {
fixture.detectChanges(); fixture.detectChanges();
fixture.whenStable().then(() => { fixture.whenStable().then(() => {
expect(mockDataService.delete).toHaveBeenCalledWith(mockObject); expect(mockDataService.delete).toHaveBeenCalledWith(mockObject.id);
}); });
}); });

View File

@@ -1,4 +1,4 @@
import { Component, Injector, Input, OnDestroy } from '@angular/core'; import { Component, Injector, Input } from '@angular/core';
import { Router } from '@angular/router'; import { Router } from '@angular/router';
import { BehaviorSubject } from 'rxjs'; import { BehaviorSubject } from 'rxjs';
@@ -62,7 +62,7 @@ export class WorkspaceitemActionsComponent extends MyDSpaceActionsComponent<Work
(result) => { (result) => {
if (result === 'ok') { if (result === 'ok') {
this.processingDelete$.next(true); this.processingDelete$.next(true);
this.objectDataService.delete(this.object) this.objectDataService.delete(this.object.id)
.subscribe((response: boolean) => { .subscribe((response: boolean) => {
this.processingDelete$.next(false); this.processingDelete$.next(false);
this.handleActionResponse(response); this.handleActionResponse(response);