mirror of
https://github.com/DSpace/dspace-angular.git
synced 2025-10-07 01:54:15 +00:00
217 lines
7.4 KiB
TypeScript
217 lines
7.4 KiB
TypeScript
import { HttpHeaders } from '@angular/common/http';
|
|
import { of as observableOf } from 'rxjs';
|
|
|
|
import { RequestCopyEmail } from '../../request-copy/email-request-copy/request-copy-email.model';
|
|
import { MockBitstream1 } from '../../shared/mocks/item.mock';
|
|
import { createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils';
|
|
import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service';
|
|
import { ConfigurationProperty } from '../shared/configuration-property.model';
|
|
import { HALEndpointService } from '../shared/hal-endpoint.service';
|
|
import { ItemRequest } from '../shared/item-request.model';
|
|
import { ConfigurationDataService } from './configuration-data.service';
|
|
import { AuthorizationDataService } from './feature-authorization/authorization-data.service';
|
|
import { FeatureID } from './feature-authorization/feature-id';
|
|
import { FindListOptions } from './find-list-options.model';
|
|
import { ItemRequestDataService } from './item-request-data.service';
|
|
import { PostRequest } from './request.models';
|
|
import { RequestService } from './request.service';
|
|
import { RestRequestMethod } from './rest-request-method';
|
|
|
|
describe('ItemRequestDataService', () => {
|
|
let service: ItemRequestDataService;
|
|
|
|
let requestService: RequestService;
|
|
let rdbService: RemoteDataBuildService;
|
|
let halService: HALEndpointService;
|
|
let configService: ConfigurationDataService;
|
|
let authorizationDataService: AuthorizationDataService;
|
|
|
|
const restApiEndpoint = 'rest/api/endpoint/';
|
|
const requestId = 'request-id';
|
|
let itemRequest: ItemRequest;
|
|
|
|
beforeEach(() => {
|
|
configService = jasmine.createSpyObj('ConfigurationDataService', ['findByPropertyName']);
|
|
(configService.findByPropertyName as jasmine.Spy).and.callFake((propertyName: string) => {
|
|
switch (propertyName) {
|
|
case 'request.item.create.captcha':
|
|
return createSuccessfulRemoteDataObject$(Object.assign(new ConfigurationProperty(), {
|
|
name: 'request.item.create.captcha',
|
|
values: ['true'],
|
|
}));
|
|
case 'request.item.grant.link.period':
|
|
return createSuccessfulRemoteDataObject$(Object.assign(new ConfigurationProperty(), {
|
|
name: 'request.item.grant.link.period',
|
|
values: ['FOREVER', '+1DAY', '+1MONTH'],
|
|
}));
|
|
default:
|
|
return createSuccessfulRemoteDataObject$(new ConfigurationProperty());
|
|
}
|
|
});
|
|
|
|
|
|
authorizationDataService = jasmine.createSpyObj('authorizationService', {
|
|
isAuthorized: observableOf(false),
|
|
});
|
|
itemRequest = Object.assign(new ItemRequest(), {
|
|
token: 'item-request-token',
|
|
});
|
|
requestService = jasmine.createSpyObj('requestService', {
|
|
generateRequestId: requestId,
|
|
send: '',
|
|
});
|
|
rdbService = jasmine.createSpyObj('rdbService', {
|
|
buildFromRequestUUID: createSuccessfulRemoteDataObject$(itemRequest),
|
|
});
|
|
halService = jasmine.createSpyObj('halService', {
|
|
getEndpoint: observableOf(restApiEndpoint),
|
|
});
|
|
|
|
service = new ItemRequestDataService(requestService, rdbService, null, halService, configService, authorizationDataService);
|
|
});
|
|
|
|
describe('searchBy', () => {
|
|
it('should use searchData to perform search operations', () => {
|
|
const searchMethod = 'testMethod';
|
|
const options = new FindListOptions();
|
|
|
|
const searchDataSpy = spyOn((service as any).searchData, 'searchBy').and.returnValue(observableOf(null));
|
|
|
|
service.searchBy(searchMethod, options);
|
|
|
|
expect(searchDataSpy).toHaveBeenCalledWith(
|
|
searchMethod,
|
|
options,
|
|
undefined,
|
|
undefined,
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('requestACopy', () => {
|
|
it('should send a POST request containing the provided item request', (done) => {
|
|
const captchaPayload = 'payload';
|
|
service.requestACopy(itemRequest, captchaPayload).subscribe(() => {
|
|
expect(requestService.send).toHaveBeenCalledWith(
|
|
new PostRequest(
|
|
requestId,
|
|
restApiEndpoint,
|
|
itemRequest,
|
|
{
|
|
headers: new HttpHeaders().set('x-captcha-payload', captchaPayload),
|
|
},
|
|
),
|
|
false,
|
|
);
|
|
done();
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('grant', () => {
|
|
let email: RequestCopyEmail;
|
|
|
|
beforeEach(() => {
|
|
email = new RequestCopyEmail('subject', 'message');
|
|
});
|
|
|
|
it('should send a PUT request containing the correct properties', (done) => {
|
|
service.grant(itemRequest.token, email, true, '+1DAY').subscribe(() => {
|
|
expect(requestService.send).toHaveBeenCalledWith(jasmine.objectContaining({
|
|
method: RestRequestMethod.PUT,
|
|
href: `${restApiEndpoint}/${itemRequest.token}`,
|
|
body: JSON.stringify({
|
|
acceptRequest: true,
|
|
responseMessage: email.message,
|
|
subject: email.subject,
|
|
suggestOpenAccess: true,
|
|
accessPeriod: '+1DAY',
|
|
}),
|
|
options: jasmine.objectContaining({
|
|
headers: jasmine.any(HttpHeaders),
|
|
}),
|
|
}));
|
|
done();
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('deny', () => {
|
|
let email: RequestCopyEmail;
|
|
|
|
beforeEach(() => {
|
|
email = new RequestCopyEmail('subject', 'message');
|
|
});
|
|
|
|
it('should send a PUT request containing the correct properties', (done) => {
|
|
service.deny(itemRequest.token, email).subscribe(() => {
|
|
expect(requestService.send).toHaveBeenCalledWith(jasmine.objectContaining({
|
|
method: RestRequestMethod.PUT,
|
|
href: `${restApiEndpoint}/${itemRequest.token}`,
|
|
body: JSON.stringify({
|
|
acceptRequest: false,
|
|
responseMessage: email.message,
|
|
subject: email.subject,
|
|
suggestOpenAccess: false,
|
|
accessPeriod: null,
|
|
}),
|
|
options: jasmine.objectContaining({
|
|
headers: jasmine.any(HttpHeaders),
|
|
}),
|
|
}));
|
|
done();
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('requestACopy', () => {
|
|
it('should send a POST request containing the provided item request', (done) => {
|
|
const captchaPayload = 'payload';
|
|
service.requestACopy(itemRequest, captchaPayload).subscribe(() => {
|
|
expect(requestService.send).toHaveBeenCalledWith(
|
|
new PostRequest(
|
|
requestId,
|
|
restApiEndpoint,
|
|
itemRequest,
|
|
{
|
|
headers: new HttpHeaders().set('x-captcha-payload', captchaPayload),
|
|
},
|
|
),
|
|
false,
|
|
);
|
|
done();
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('getConfiguredAccessPeriods', () => {
|
|
it('should return parsed integer values from config', () => {
|
|
service.getConfiguredAccessPeriods().subscribe(periods => {
|
|
expect(periods).toEqual(['FOREVER', '+1DAY', '+1MONTH']);
|
|
});
|
|
});
|
|
});
|
|
describe('isProtectedByCaptcha', () => {
|
|
it('should return true when config value is "true"', () => {
|
|
const mockConfigProperty = {
|
|
name: 'request.item.create.captcha',
|
|
values: ['true'],
|
|
} as ConfigurationProperty;
|
|
service.isProtectedByCaptcha().subscribe(result => {
|
|
expect(result).toBe(true);
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('canDownload', () => {
|
|
it('should check authorization for bitstream download', () => {
|
|
service.canDownload(MockBitstream1).subscribe(result => {
|
|
expect(authorizationDataService.isAuthorized).toHaveBeenCalledWith(FeatureID.CanDownload, MockBitstream1.self);
|
|
expect(result).toBe(false);
|
|
});
|
|
});
|
|
});
|
|
|
|
|
|
});
|