mirror of
https://github.com/DSpace/dspace-angular.git
synced 2025-10-07 10:04:11 +00:00
Added tests and comments
This commit is contained in:
108
src/app/core/tasks/claimed-task-data.service.spec.ts
Normal file
108
src/app/core/tasks/claimed-task-data.service.spec.ts
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
import { HttpClient, HttpHeaders } from '@angular/common/http';
|
||||||
|
|
||||||
|
import { Store } from '@ngrx/store';
|
||||||
|
|
||||||
|
import { getMockRequestService } from '../../shared/mocks/mock-request.service';
|
||||||
|
import { HALEndpointServiceStub } from '../../shared/testing/hal-endpoint-service-stub';
|
||||||
|
import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service';
|
||||||
|
import { NotificationsService } from '../../shared/notifications/notifications.service';
|
||||||
|
import { NormalizedObjectBuildService } from '../cache/builders/normalized-object-build.service';
|
||||||
|
import { CoreState } from '../core.reducers';
|
||||||
|
import { ClaimedTaskDataService } from './claimed-task-data.service';
|
||||||
|
import { HttpOptions } from '../dspace-rest-v2/dspace-rest-v2.service';
|
||||||
|
|
||||||
|
describe('ClaimedTaskDataService', () => {
|
||||||
|
let service: ClaimedTaskDataService;
|
||||||
|
let options: HttpOptions;
|
||||||
|
const taskEndpoint = 'https://rest.api/task';
|
||||||
|
const linkPath = 'claimedtasks';
|
||||||
|
const requestService: any = getMockRequestService();
|
||||||
|
const halService: any = new HALEndpointServiceStub(taskEndpoint);
|
||||||
|
const rdbService = {} as RemoteDataBuildService;
|
||||||
|
const notificationsService = {} as NotificationsService;
|
||||||
|
const http = {} as HttpClient;
|
||||||
|
const comparator = {} as any;
|
||||||
|
const dataBuildService = {
|
||||||
|
normalize: (object) => object
|
||||||
|
} as NormalizedObjectBuildService;
|
||||||
|
const objectCache = {
|
||||||
|
addPatch: () => {
|
||||||
|
/* empty */
|
||||||
|
},
|
||||||
|
getObjectBySelfLink: () => {
|
||||||
|
/* empty */
|
||||||
|
}
|
||||||
|
} as any;
|
||||||
|
const store = {} as Store<CoreState>;
|
||||||
|
|
||||||
|
function initTestService(): ClaimedTaskDataService {
|
||||||
|
return new ClaimedTaskDataService(
|
||||||
|
requestService,
|
||||||
|
rdbService,
|
||||||
|
dataBuildService,
|
||||||
|
store,
|
||||||
|
objectCache,
|
||||||
|
halService,
|
||||||
|
notificationsService,
|
||||||
|
http,
|
||||||
|
comparator
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
service = initTestService();
|
||||||
|
options = Object.create({});
|
||||||
|
let headers = new HttpHeaders();
|
||||||
|
headers = headers.append('Content-Type', 'application/x-www-form-urlencoded');
|
||||||
|
options.headers = headers;
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('approveTask', () => {
|
||||||
|
|
||||||
|
it('should call postToEndpoint method', () => {
|
||||||
|
const scopeId = '1234';
|
||||||
|
const body = {
|
||||||
|
submit_approve: 'true'
|
||||||
|
};
|
||||||
|
|
||||||
|
spyOn(service, 'postToEndpoint');
|
||||||
|
requestService.prepareBody.and.returnValue(body);
|
||||||
|
|
||||||
|
service.approveTask(scopeId);
|
||||||
|
|
||||||
|
expect(service.postToEndpoint).toHaveBeenCalledWith(linkPath, body, scopeId, options);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('rejectTask', () => {
|
||||||
|
|
||||||
|
it('should call postToEndpoint method', () => {
|
||||||
|
const scopeId = '1234';
|
||||||
|
const reason = 'test reject';
|
||||||
|
const body = {
|
||||||
|
submit_reject: 'true',
|
||||||
|
reason
|
||||||
|
};
|
||||||
|
|
||||||
|
spyOn(service, 'postToEndpoint');
|
||||||
|
requestService.prepareBody.and.returnValue(body);
|
||||||
|
|
||||||
|
service.rejectTask(reason, scopeId);
|
||||||
|
|
||||||
|
expect(service.postToEndpoint).toHaveBeenCalledWith(linkPath, body, scopeId, options);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('returnToPoolTask', () => {
|
||||||
|
|
||||||
|
it('should call deleteById method', () => {
|
||||||
|
const scopeId = '1234';
|
||||||
|
|
||||||
|
spyOn(service, 'deleteById');
|
||||||
|
|
||||||
|
service.returnToPoolTask(scopeId);
|
||||||
|
|
||||||
|
expect(service.deleteById).toHaveBeenCalledWith(linkPath, scopeId, options);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@@ -14,12 +14,37 @@ import { NormalizedObjectBuildService } from '../cache/builders/normalized-objec
|
|||||||
import { ObjectCacheService } from '../cache/object-cache.service';
|
import { ObjectCacheService } from '../cache/object-cache.service';
|
||||||
import { NotificationsService } from '../../shared/notifications/notifications.service';
|
import { NotificationsService } from '../../shared/notifications/notifications.service';
|
||||||
import { DSOChangeAnalyzer } from '../data/dso-change-analyzer.service';
|
import { DSOChangeAnalyzer } from '../data/dso-change-analyzer.service';
|
||||||
|
import { ProcessTaskResponse } from './models/process-task-response';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The service handling all REST requests for ClaimedTask
|
||||||
|
*/
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class ClaimedTaskDataService extends TasksService<ClaimedTask> {
|
export class ClaimedTaskDataService extends TasksService<ClaimedTask> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The endpoint link name
|
||||||
|
*/
|
||||||
protected linkPath = 'claimedtasks';
|
protected linkPath = 'claimedtasks';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When true, a new request is always dispatched
|
||||||
|
*/
|
||||||
protected forceBypassCache = true;
|
protected forceBypassCache = true;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize instance variables
|
||||||
|
*
|
||||||
|
* @param {RequestService} requestService
|
||||||
|
* @param {RemoteDataBuildService} rdbService
|
||||||
|
* @param {NormalizedObjectBuildService} dataBuildService
|
||||||
|
* @param {Store<CoreState>} store
|
||||||
|
* @param {ObjectCacheService} objectCache
|
||||||
|
* @param {HALEndpointService} halService
|
||||||
|
* @param {NotificationsService} notificationsService
|
||||||
|
* @param {HttpClient} http
|
||||||
|
* @param {DSOChangeAnalyzer<ClaimedTask} comparator
|
||||||
|
*/
|
||||||
constructor(
|
constructor(
|
||||||
protected requestService: RequestService,
|
protected requestService: RequestService,
|
||||||
protected rdbService: RemoteDataBuildService,
|
protected rdbService: RemoteDataBuildService,
|
||||||
@@ -33,14 +58,32 @@ export class ClaimedTaskDataService extends TasksService<ClaimedTask> {
|
|||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
public approveTask(scopeId: string): Observable<any> {
|
/**
|
||||||
|
* Make a request to approve the given task
|
||||||
|
*
|
||||||
|
* @param scopeId
|
||||||
|
* The task id
|
||||||
|
* @return {Observable<ProcessTaskResponse>}
|
||||||
|
* Emit the server response
|
||||||
|
*/
|
||||||
|
public approveTask(scopeId: string): Observable<ProcessTaskResponse> {
|
||||||
const body = {
|
const body = {
|
||||||
submit_approve: 'true'
|
submit_approve: 'true'
|
||||||
};
|
};
|
||||||
return this.postToEndpoint(this.linkPath, this.requestService.prepareBody(body), scopeId, this.makeHttpOptions());
|
return this.postToEndpoint(this.linkPath, this.requestService.prepareBody(body), scopeId, this.makeHttpOptions());
|
||||||
}
|
}
|
||||||
|
|
||||||
public rejectTask(reason: string, scopeId: string): Observable<any> {
|
/**
|
||||||
|
* Make a request to reject the given task
|
||||||
|
*
|
||||||
|
* @param reason
|
||||||
|
* The reason of reject
|
||||||
|
* @param scopeId
|
||||||
|
* The task id
|
||||||
|
* @return {Observable<ProcessTaskResponse>}
|
||||||
|
* Emit the server response
|
||||||
|
*/
|
||||||
|
public rejectTask(reason: string, scopeId: string): Observable<ProcessTaskResponse> {
|
||||||
const body = {
|
const body = {
|
||||||
submit_reject: 'true',
|
submit_reject: 'true',
|
||||||
reason
|
reason
|
||||||
@@ -48,7 +91,15 @@ export class ClaimedTaskDataService extends TasksService<ClaimedTask> {
|
|||||||
return this.postToEndpoint(this.linkPath, this.requestService.prepareBody(body), scopeId, this.makeHttpOptions());
|
return this.postToEndpoint(this.linkPath, this.requestService.prepareBody(body), scopeId, this.makeHttpOptions());
|
||||||
}
|
}
|
||||||
|
|
||||||
public returnToPoolTask(scopeId: string): Observable<any> {
|
/**
|
||||||
|
* Make a request to return the given task to the pool
|
||||||
|
*
|
||||||
|
* @param scopeId
|
||||||
|
* The task id
|
||||||
|
* @return {Observable<ProcessTaskResponse>}
|
||||||
|
* Emit the server response
|
||||||
|
*/
|
||||||
|
public returnToPoolTask(scopeId: string): Observable<ProcessTaskResponse> {
|
||||||
return this.deleteById(this.linkPath, scopeId, this.makeHttpOptions());
|
return this.deleteById(this.linkPath, scopeId, this.makeHttpOptions());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,5 +1,8 @@
|
|||||||
import { TaskObject } from './task-object.model';
|
import { TaskObject } from './task-object.model';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A model class for a ClaimedTask.
|
||||||
|
*/
|
||||||
export class ClaimedTask extends TaskObject {
|
export class ClaimedTask extends TaskObject {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -5,7 +5,7 @@ import { ClaimedTask } from './claimed-task-object.model';
|
|||||||
import { ResourceType } from '../../shared/resource-type';
|
import { ResourceType } from '../../shared/resource-type';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A model class for a NormalizedClaimedTaskObject.
|
* A normalized model class for a ClaimedTask.
|
||||||
*/
|
*/
|
||||||
@mapsTo(ClaimedTask)
|
@mapsTo(ClaimedTask)
|
||||||
@inheritSerialization(NormalizedTaskObject)
|
@inheritSerialization(NormalizedTaskObject)
|
||||||
|
@@ -5,7 +5,7 @@ import { mapsTo, relationship } from '../../cache/builders/build-decorators';
|
|||||||
import { ResourceType } from '../../shared/resource-type';
|
import { ResourceType } from '../../shared/resource-type';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A model class for a NormalizedPoolTaskObject.
|
* A normalized model class for a PoolTask.
|
||||||
*/
|
*/
|
||||||
@mapsTo(PoolTask)
|
@mapsTo(PoolTask)
|
||||||
@inheritSerialization(NormalizedTaskObject)
|
@inheritSerialization(NormalizedTaskObject)
|
||||||
|
@@ -6,7 +6,7 @@ import { TaskObject } from './task-object.model';
|
|||||||
import { DSpaceObject } from '../../shared/dspace-object.model';
|
import { DSpaceObject } from '../../shared/dspace-object.model';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An abstract model class for a DSpaceObject.
|
* An abstract normalized model class for a TaskObject.
|
||||||
*/
|
*/
|
||||||
@mapsTo(TaskObject)
|
@mapsTo(TaskObject)
|
||||||
@inheritSerialization(NormalizedDSpaceObject)
|
@inheritSerialization(NormalizedDSpaceObject)
|
||||||
|
@@ -1,5 +1,8 @@
|
|||||||
import { TaskObject } from './task-object.model';
|
import { TaskObject } from './task-object.model';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A model class for a PoolTask.
|
||||||
|
*/
|
||||||
export class PoolTask extends TaskObject {
|
export class PoolTask extends TaskObject {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -6,6 +6,9 @@ import { ListableObject } from '../../../shared/object-collection/shared/listabl
|
|||||||
import { RemoteData } from '../../data/remote-data';
|
import { RemoteData } from '../../data/remote-data';
|
||||||
import { Workflowitem } from '../../submission/models/workflowitem.model';
|
import { Workflowitem } from '../../submission/models/workflowitem.model';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An abstract model class for a TaskObject.
|
||||||
|
*/
|
||||||
export class TaskObject extends DSpaceObject implements CacheableObject, ListableObject {
|
export class TaskObject extends DSpaceObject implements CacheableObject, ListableObject {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
70
src/app/core/tasks/pool-task-data.service.spec.ts
Normal file
70
src/app/core/tasks/pool-task-data.service.spec.ts
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
import { HttpClient, HttpHeaders } from '@angular/common/http';
|
||||||
|
|
||||||
|
import { Store } from '@ngrx/store';
|
||||||
|
|
||||||
|
import { getMockRequestService } from '../../shared/mocks/mock-request.service';
|
||||||
|
import { HALEndpointServiceStub } from '../../shared/testing/hal-endpoint-service-stub';
|
||||||
|
import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service';
|
||||||
|
import { NotificationsService } from '../../shared/notifications/notifications.service';
|
||||||
|
import { NormalizedObjectBuildService } from '../cache/builders/normalized-object-build.service';
|
||||||
|
import { CoreState } from '../core.reducers';
|
||||||
|
import { PoolTaskDataService } from './pool-task-data.service';
|
||||||
|
import { HttpOptions } from '../dspace-rest-v2/dspace-rest-v2.service';
|
||||||
|
|
||||||
|
describe('PoolTaskDataService', () => {
|
||||||
|
let service: PoolTaskDataService;
|
||||||
|
let options: HttpOptions;
|
||||||
|
const taskEndpoint = 'https://rest.api/task';
|
||||||
|
const linkPath = 'pooltasks';
|
||||||
|
const requestService = getMockRequestService();
|
||||||
|
const halService: any = new HALEndpointServiceStub(taskEndpoint);
|
||||||
|
const rdbService = {} as RemoteDataBuildService;
|
||||||
|
const notificationsService = {} as NotificationsService;
|
||||||
|
const http = {} as HttpClient;
|
||||||
|
const comparator = {} as any;
|
||||||
|
const dataBuildService = {
|
||||||
|
normalize: (object) => object
|
||||||
|
} as NormalizedObjectBuildService;
|
||||||
|
const objectCache = {
|
||||||
|
addPatch: () => {
|
||||||
|
/* empty */
|
||||||
|
},
|
||||||
|
getObjectBySelfLink: () => {
|
||||||
|
/* empty */
|
||||||
|
}
|
||||||
|
} as any;
|
||||||
|
const store = {} as Store<CoreState>;
|
||||||
|
|
||||||
|
function initTestService(): PoolTaskDataService {
|
||||||
|
return new PoolTaskDataService(
|
||||||
|
requestService,
|
||||||
|
rdbService,
|
||||||
|
dataBuildService,
|
||||||
|
store,
|
||||||
|
objectCache,
|
||||||
|
halService,
|
||||||
|
notificationsService,
|
||||||
|
http,
|
||||||
|
comparator
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
service = initTestService();
|
||||||
|
options = Object.create({});
|
||||||
|
let headers = new HttpHeaders();
|
||||||
|
headers = headers.append('Content-Type', 'application/x-www-form-urlencoded');
|
||||||
|
options.headers = headers;
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('claimTask', () => {
|
||||||
|
|
||||||
|
it('should call postToEndpoint method', () => {
|
||||||
|
spyOn(service, 'postToEndpoint');
|
||||||
|
const scopeId = '1234';
|
||||||
|
service.claimTask(scopeId);
|
||||||
|
|
||||||
|
expect(service.postToEndpoint).toHaveBeenCalledWith(linkPath, {}, scopeId, options);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@@ -14,12 +14,37 @@ import { NormalizedObjectBuildService } from '../cache/builders/normalized-objec
|
|||||||
import { ObjectCacheService } from '../cache/object-cache.service';
|
import { ObjectCacheService } from '../cache/object-cache.service';
|
||||||
import { NotificationsService } from '../../shared/notifications/notifications.service';
|
import { NotificationsService } from '../../shared/notifications/notifications.service';
|
||||||
import { DSOChangeAnalyzer } from '../data/dso-change-analyzer.service';
|
import { DSOChangeAnalyzer } from '../data/dso-change-analyzer.service';
|
||||||
|
import { ProcessTaskResponse } from './models/process-task-response';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The service handling all REST requests for PoolTask
|
||||||
|
*/
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class PoolTaskDataService extends TasksService<PoolTask> {
|
export class PoolTaskDataService extends TasksService<PoolTask> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The endpoint link name
|
||||||
|
*/
|
||||||
protected linkPath = 'pooltasks';
|
protected linkPath = 'pooltasks';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When true, a new request is always dispatched
|
||||||
|
*/
|
||||||
protected forceBypassCache = true;
|
protected forceBypassCache = true;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize instance variables
|
||||||
|
*
|
||||||
|
* @param {RequestService} requestService
|
||||||
|
* @param {RemoteDataBuildService} rdbService
|
||||||
|
* @param {NormalizedObjectBuildService} dataBuildService
|
||||||
|
* @param {Store<CoreState>} store
|
||||||
|
* @param {ObjectCacheService} objectCache
|
||||||
|
* @param {HALEndpointService} halService
|
||||||
|
* @param {NotificationsService} notificationsService
|
||||||
|
* @param {HttpClient} http
|
||||||
|
* @param {DSOChangeAnalyzer<ClaimedTask} comparator
|
||||||
|
*/
|
||||||
constructor(
|
constructor(
|
||||||
protected requestService: RequestService,
|
protected requestService: RequestService,
|
||||||
protected rdbService: RemoteDataBuildService,
|
protected rdbService: RemoteDataBuildService,
|
||||||
@@ -33,7 +58,15 @@ export class PoolTaskDataService extends TasksService<PoolTask> {
|
|||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
public claimTask(scopeId: string): Observable<any> {
|
/**
|
||||||
|
* Make a request to claim the given task
|
||||||
|
*
|
||||||
|
* @param scopeId
|
||||||
|
* The task id
|
||||||
|
* @return {Observable<ProcessTaskResponse>}
|
||||||
|
* Emit the server response
|
||||||
|
*/
|
||||||
|
public claimTask(scopeId: string): Observable<ProcessTaskResponse> {
|
||||||
return this.postToEndpoint(this.linkPath, {}, scopeId, this.makeHttpOptions());
|
return this.postToEndpoint(this.linkPath, {}, scopeId, this.makeHttpOptions());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -11,17 +11,33 @@ import { ObjectCacheService } from '../cache/object-cache.service';
|
|||||||
import { NormalizedObjectFactory } from '../cache/models/normalized-object-factory';
|
import { NormalizedObjectFactory } from '../cache/models/normalized-object-factory';
|
||||||
import { ErrorResponse, RestResponse, TaskResponse } from '../cache/response.models';
|
import { ErrorResponse, RestResponse, TaskResponse } from '../cache/response.models';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides methods to parse response for a task request.
|
||||||
|
*/
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class TaskResponseParsingService extends BaseResponseParsingService implements ResponseParsingService {
|
export class TaskResponseParsingService extends BaseResponseParsingService implements ResponseParsingService {
|
||||||
|
|
||||||
protected objectFactory = NormalizedObjectFactory;
|
protected objectFactory = NormalizedObjectFactory;
|
||||||
protected toCache = false;
|
protected toCache = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize instance variables
|
||||||
|
*
|
||||||
|
* @param {GlobalConfig} EnvConfig
|
||||||
|
* @param {ObjectCacheService} objectCache
|
||||||
|
*/
|
||||||
constructor(@Inject(GLOBAL_CONFIG) protected EnvConfig: GlobalConfig,
|
constructor(@Inject(GLOBAL_CONFIG) protected EnvConfig: GlobalConfig,
|
||||||
protected objectCache: ObjectCacheService,) {
|
protected objectCache: ObjectCacheService,) {
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses data from the tasks endpoints
|
||||||
|
*
|
||||||
|
* @param {RestRequest} request
|
||||||
|
* @param {DSpaceRESTV2Response} data
|
||||||
|
* @returns {RestResponse}
|
||||||
|
*/
|
||||||
parse(request: RestRequest, data: DSpaceRESTV2Response): RestResponse {
|
parse(request: RestRequest, data: DSpaceRESTV2Response): RestResponse {
|
||||||
if (this.isSuccessStatus(data.statusCode)) {
|
if (this.isSuccessStatus(data.statusCode)) {
|
||||||
return new TaskResponse( data.statusCode, data.statusText);
|
return new TaskResponse( data.statusCode, data.statusText);
|
||||||
|
130
src/app/core/tasks/tasks.service.spec.ts
Normal file
130
src/app/core/tasks/tasks.service.spec.ts
Normal file
@@ -0,0 +1,130 @@
|
|||||||
|
import { getTestScheduler } from 'jasmine-marbles';
|
||||||
|
import { TestScheduler } from 'rxjs/testing';
|
||||||
|
|
||||||
|
import { getMockRequestService } from '../../shared/mocks/mock-request.service';
|
||||||
|
import { TasksService } from './tasks.service';
|
||||||
|
import { RequestService } from '../data/request.service';
|
||||||
|
import { TaskDeleteRequest, TaskPostRequest } from '../data/request.models';
|
||||||
|
import { HALEndpointService } from '../shared/hal-endpoint.service';
|
||||||
|
import { HALEndpointServiceStub } from '../../shared/testing/hal-endpoint-service-stub';
|
||||||
|
import { TaskObject } from './models/task-object.model';
|
||||||
|
import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service';
|
||||||
|
import { NormalizedObjectBuildService } from '../cache/builders/normalized-object-build.service';
|
||||||
|
import { Store } from '@ngrx/store';
|
||||||
|
import { CoreState } from '../core.reducers';
|
||||||
|
import { ObjectCacheService } from '../cache/object-cache.service';
|
||||||
|
import { NotificationsService } from '../../shared/notifications/notifications.service';
|
||||||
|
import { HttpClient, HttpHeaders } from '@angular/common/http';
|
||||||
|
import { DSOChangeAnalyzer } from '../data/dso-change-analyzer.service';
|
||||||
|
import { ChangeAnalyzer } from '../data/change-analyzer';
|
||||||
|
import { compare, Operation } from 'fast-json-patch';
|
||||||
|
import { NormalizedTaskObject } from './models/normalized-task-object.model';
|
||||||
|
import { HttpOptions } from '../dspace-rest-v2/dspace-rest-v2.service';
|
||||||
|
|
||||||
|
const LINK_NAME = 'test';
|
||||||
|
|
||||||
|
/* tslint:disable:max-classes-per-file */
|
||||||
|
class TestTask extends TaskObject {
|
||||||
|
}
|
||||||
|
|
||||||
|
class TestService extends TasksService<TestTask> {
|
||||||
|
protected linkPath = LINK_NAME;
|
||||||
|
protected forceBypassCache = true;
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
protected requestService: RequestService,
|
||||||
|
protected rdbService: RemoteDataBuildService,
|
||||||
|
protected dataBuildService: NormalizedObjectBuildService,
|
||||||
|
protected store: Store<CoreState>,
|
||||||
|
protected objectCache: ObjectCacheService,
|
||||||
|
protected halService: HALEndpointService,
|
||||||
|
protected notificationsService: NotificationsService,
|
||||||
|
protected http: HttpClient,
|
||||||
|
protected comparator: DSOChangeAnalyzer<TestTask>) {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class NormalizedTestTaskObject extends NormalizedTaskObject<TestTask> {
|
||||||
|
}
|
||||||
|
|
||||||
|
class DummyChangeAnalyzer implements ChangeAnalyzer<NormalizedTestTaskObject> {
|
||||||
|
diff(object1: NormalizedTestTaskObject, object2: NormalizedTestTaskObject): Operation[] {
|
||||||
|
return compare((object1 as any).metadata, (object2 as any).metadata);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
/* tslint:enable:max-classes-per-file */
|
||||||
|
|
||||||
|
describe('TasksService', () => {
|
||||||
|
let scheduler: TestScheduler;
|
||||||
|
let service: TestService;
|
||||||
|
const taskEndpoint = 'https://rest.api/task';
|
||||||
|
const linkPath = 'testTask';
|
||||||
|
const requestService = getMockRequestService();
|
||||||
|
const halService: any = new HALEndpointServiceStub(taskEndpoint);
|
||||||
|
const rdbService = {} as RemoteDataBuildService;
|
||||||
|
const notificationsService = {} as NotificationsService;
|
||||||
|
const http = {} as HttpClient;
|
||||||
|
const comparator = new DummyChangeAnalyzer() as any;
|
||||||
|
const dataBuildService = {
|
||||||
|
normalize: (object) => object
|
||||||
|
} as NormalizedObjectBuildService;
|
||||||
|
const objectCache = {
|
||||||
|
addPatch: () => {
|
||||||
|
/* empty */
|
||||||
|
},
|
||||||
|
getObjectBySelfLink: () => {
|
||||||
|
/* empty */
|
||||||
|
}
|
||||||
|
} as any;
|
||||||
|
const store = {} as Store<CoreState>;
|
||||||
|
|
||||||
|
function initTestService(): TestService {
|
||||||
|
return new TestService(
|
||||||
|
requestService,
|
||||||
|
rdbService,
|
||||||
|
dataBuildService,
|
||||||
|
store,
|
||||||
|
objectCache,
|
||||||
|
halService,
|
||||||
|
notificationsService,
|
||||||
|
http,
|
||||||
|
comparator
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
scheduler = getTestScheduler();
|
||||||
|
service = initTestService();
|
||||||
|
const options: HttpOptions = Object.create({});
|
||||||
|
let headers = new HttpHeaders();
|
||||||
|
headers = headers.append('Content-Type', 'application/x-www-form-urlencoded');
|
||||||
|
options.headers = headers;
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('postToEndpoint', () => {
|
||||||
|
|
||||||
|
it('should configure a new TaskPostRequest', () => {
|
||||||
|
const expected = new TaskPostRequest(requestService.generateRequestId(), `${taskEndpoint}/${linkPath}`, {});
|
||||||
|
scheduler.schedule(() => service.postToEndpoint('testTask', {}).subscribe());
|
||||||
|
scheduler.flush();
|
||||||
|
|
||||||
|
expect(requestService.configure).toHaveBeenCalledWith(expected);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('deleteById', () => {
|
||||||
|
|
||||||
|
it('should configure a new TaskPostRequest', () => {
|
||||||
|
const scopeId = '1234';
|
||||||
|
const expected = new TaskDeleteRequest(requestService.generateRequestId(), `${taskEndpoint}/${linkPath}/${scopeId}`, null);
|
||||||
|
scheduler.schedule(() => service.deleteById('testTask', scopeId).subscribe());
|
||||||
|
scheduler.flush();
|
||||||
|
|
||||||
|
expect(requestService.configure).toHaveBeenCalledWith(expected);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
@@ -13,12 +13,23 @@ import { getResponseFromEntry } from '../shared/operators';
|
|||||||
import { ErrorResponse, MessageResponse, RestResponse } from '../cache/response.models';
|
import { ErrorResponse, MessageResponse, RestResponse } from '../cache/response.models';
|
||||||
import { CacheableObject } from '../cache/object-cache.reducer';
|
import { CacheableObject } from '../cache/object-cache.reducer';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An abstract class that provides methods to handle task requests.
|
||||||
|
*/
|
||||||
export abstract class TasksService<T extends CacheableObject> extends DataService<T> {
|
export abstract class TasksService<T extends CacheableObject> extends DataService<T> {
|
||||||
|
|
||||||
public getBrowseEndpoint(options: FindAllOptions): Observable<string> {
|
public getBrowseEndpoint(options: FindAllOptions): Observable<string> {
|
||||||
return this.halService.getEndpoint(this.linkPath);
|
return this.halService.getEndpoint(this.linkPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch a RestRequest
|
||||||
|
*
|
||||||
|
* @param requestId
|
||||||
|
* The base endpoint for the type of object
|
||||||
|
* @return Observable<ProcessTaskResponse>
|
||||||
|
* server response
|
||||||
|
*/
|
||||||
protected fetchRequest(requestId: string): Observable<ProcessTaskResponse> {
|
protected fetchRequest(requestId: string): Observable<ProcessTaskResponse> {
|
||||||
const responses = this.requestService.getByUUID(requestId).pipe(
|
const responses = this.requestService.getByUUID(requestId).pipe(
|
||||||
getResponseFromEntry()
|
getResponseFromEntry()
|
||||||
@@ -39,14 +50,32 @@ export abstract class TasksService<T extends CacheableObject> extends DataServic
|
|||||||
return observableMerge(errorResponses, successResponses);
|
return observableMerge(errorResponses, successResponses);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create the HREF for a specific submission object based on its identifier
|
||||||
|
*
|
||||||
|
* @param endpoint
|
||||||
|
* The base endpoint for the type of object
|
||||||
|
* @param resourceID
|
||||||
|
* The identifier for the object
|
||||||
|
*/
|
||||||
protected getEndpointByIDHref(endpoint, resourceID): string {
|
protected getEndpointByIDHref(endpoint, resourceID): string {
|
||||||
return isNotEmpty(resourceID) ? `${endpoint}/${resourceID}` : `${endpoint}`;
|
return isNotEmpty(resourceID) ? `${endpoint}/${resourceID}` : `${endpoint}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected getEndpointByMethod(endpoint: string, method: string): string {
|
/**
|
||||||
return isNotEmpty(method) ? `${endpoint}/${method}` : `${endpoint}`;
|
* Make a new post request
|
||||||
}
|
*
|
||||||
|
* @param linkPath
|
||||||
|
* The endpoint link name
|
||||||
|
* @param body
|
||||||
|
* The request body
|
||||||
|
* @param scopeId
|
||||||
|
* The task id to be removed
|
||||||
|
* @param options
|
||||||
|
* The HttpOptions object
|
||||||
|
* @return Observable<SubmitDataResponseDefinitionObject>
|
||||||
|
* server response
|
||||||
|
*/
|
||||||
public postToEndpoint(linkPath: string, body: any, scopeId?: string, options?: HttpOptions): Observable<ProcessTaskResponse> {
|
public postToEndpoint(linkPath: string, body: any, scopeId?: string, options?: HttpOptions): Observable<ProcessTaskResponse> {
|
||||||
const requestId = this.requestService.generateRequestId();
|
const requestId = this.requestService.generateRequestId();
|
||||||
return this.halService.getEndpoint(linkPath).pipe(
|
return this.halService.getEndpoint(linkPath).pipe(
|
||||||
@@ -59,9 +88,21 @@ export abstract class TasksService<T extends CacheableObject> extends DataServic
|
|||||||
distinctUntilChanged());
|
distinctUntilChanged());
|
||||||
}
|
}
|
||||||
|
|
||||||
public deleteById(linkName: string, scopeId: string, options?: HttpOptions): Observable<ProcessTaskResponse> {
|
/**
|
||||||
|
* Delete an existing task on the server
|
||||||
|
*
|
||||||
|
* @param linkPath
|
||||||
|
* The endpoint link name
|
||||||
|
* @param scopeId
|
||||||
|
* The task id to be removed
|
||||||
|
* @param options
|
||||||
|
* The HttpOptions object
|
||||||
|
* @return Observable<SubmitDataResponseDefinitionObject>
|
||||||
|
* server response
|
||||||
|
*/
|
||||||
|
public deleteById(linkPath: string, scopeId: string, options?: HttpOptions): Observable<ProcessTaskResponse> {
|
||||||
const requestId = this.requestService.generateRequestId();
|
const requestId = this.requestService.generateRequestId();
|
||||||
return this.halService.getEndpoint(linkName || this.linkPath).pipe(
|
return this.halService.getEndpoint(linkPath || this.linkPath).pipe(
|
||||||
filter((href: string) => isNotEmpty(href)),
|
filter((href: string) => isNotEmpty(href)),
|
||||||
distinctUntilChanged(),
|
distinctUntilChanged(),
|
||||||
map((endpointURL: string) => this.getEndpointByIDHref(endpointURL, scopeId)),
|
map((endpointURL: string) => this.getEndpointByIDHref(endpointURL, scopeId)),
|
||||||
@@ -71,6 +112,9 @@ export abstract class TasksService<T extends CacheableObject> extends DataServic
|
|||||||
distinctUntilChanged());
|
distinctUntilChanged());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new HttpOptions
|
||||||
|
*/
|
||||||
protected makeHttpOptions() {
|
protected makeHttpOptions() {
|
||||||
const options: HttpOptions = Object.create({});
|
const options: HttpOptions = Object.create({});
|
||||||
let headers = new HttpHeaders();
|
let headers = new HttpHeaders();
|
||||||
|
@@ -8,6 +8,7 @@ export function getMockRequestService(requestEntry$: Observable<RequestEntry> =
|
|||||||
generateRequestId: 'clients/b186e8ce-e99c-4183-bc9a-42b4821bdb78',
|
generateRequestId: 'clients/b186e8ce-e99c-4183-bc9a-42b4821bdb78',
|
||||||
getByHref: requestEntry$,
|
getByHref: requestEntry$,
|
||||||
getByUUID: requestEntry$,
|
getByUUID: requestEntry$,
|
||||||
|
prepareBody: jasmine.createSpy('prepareBody'),
|
||||||
/* tslint:disable:no-empty */
|
/* tslint:disable:no-empty */
|
||||||
removeByHrefSubstring: () => {}
|
removeByHrefSubstring: () => {}
|
||||||
/* tslint:enable:no-empty */
|
/* tslint:enable:no-empty */
|
||||||
|
Reference in New Issue
Block a user