From 2baf881f01ef22d35e10bc0b84b143023cc91018 Mon Sep 17 00:00:00 2001 From: Giuseppe Date: Thu, 11 Oct 2018 18:48:27 +0200 Subject: [PATCH] Added http status text to rest response object and fixed tests --- .../search-service/search.service.spec.ts | 21 +++---- .../auth-response-parsing.service.spec.ts | 10 +++- .../auth/auth-response-parsing.service.ts | 4 +- .../builders/remote-data-build.service.ts | 8 +-- src/app/core/cache/response-cache.models.ts | 60 ++++++++++++------- .../core/cache/response-cache.reducer.spec.ts | 6 +- .../core/cache/response-cache.service.spec.ts | 5 +- ...e-entries-response-parsing.service.spec.ts | 8 ++- ...browse-entries-response-parsing.service.ts | 4 +- .../browse-response-parsing.service.spec.ts | 8 +-- .../data/browse-response-parsing.service.ts | 4 +- .../config-response-parsing.service.spec.ts | 11 ++-- .../data/config-response-parsing.service.ts | 4 +- .../core/data/dso-response-parsing.service.ts | 2 +- .../endpoint-map-response-parsing.service.ts | 4 +- .../facet-config-response-parsing.service.ts | 2 +- ...acet-value-map-response-parsing.service.ts | 4 +- .../facet-value-response-parsing.service.ts | 2 +- .../data/metadataschema-parsing.service.ts | 2 +- ...tstreamformats-response-parsing.service.ts | 2 +- ...metadatafields-response-parsing.service.ts | 2 +- ...etadataschemas-response-parsing.service.ts | 2 +- src/app/core/data/remote-data-error.ts | 2 +- src/app/core/data/request.models.ts | 3 +- .../data/search-response-parsing.service.ts | 5 +- .../dspace-rest-v2-response.model.ts | 3 +- .../dspace-rest-v2.service.spec.ts | 6 +- .../dspace-rest-v2/dspace-rest-v2.service.ts | 5 +- .../eperson-response-parsing.service.ts | 4 +- ...tegration-response-parsing.service.spec.ts | 39 +++++++----- .../integration-response-parsing.service.ts | 5 +- .../core/registry/registry.service.spec.ts | 20 +++---- .../submission-response-parsing.service.ts | 6 +- 33 files changed, 153 insertions(+), 120 deletions(-) diff --git a/src/app/+search-page/search-service/search.service.spec.ts b/src/app/+search-page/search-service/search.service.spec.ts index 5cc71d9bbd..be146a7c65 100644 --- a/src/app/+search-page/search-service/search.service.spec.ts +++ b/src/app/+search-page/search-service/search.service.spec.ts @@ -1,14 +1,11 @@ -import { TestBed, fakeAsync, tick } from '@angular/core/testing'; +import { TestBed } from '@angular/core/testing'; import { RouterTestingModule } from '@angular/router/testing'; import { CommonModule } from '@angular/common'; import { Component } from '@angular/core'; import { SearchService } from './search.service'; -import { ItemDataService } from './../../core/data/item-data.service'; import { ViewMode } from '../../+search-page/search-options.model'; -import { RouteService } from '../../shared/services/route.service'; -import { GLOBAL_CONFIG } from '../../../config'; import { RemoteDataBuildService } from '../../core/cache/builders/remote-data-build.service'; import { ActivatedRoute, Router, UrlTree } from '@angular/router'; import { RequestService } from '../../core/data/request.service'; @@ -17,19 +14,15 @@ import { ActivatedRouteStub } from '../../shared/testing/active-router-stub'; import { RouterStub } from '../../shared/testing/router-stub'; import { HALEndpointService } from '../../core/shared/hal-endpoint.service'; import { Observable } from 'rxjs/Observable'; +import 'rxjs/add/observable/of'; +import 'rxjs/add/observable/combineLatest'; import { PaginatedSearchOptions } from '../paginated-search-options.model'; import { RemoteData } from '../../core/data/remote-data'; -import { PaginatedList } from '../../core/data/paginated-list'; -import { SearchResult } from '../search-result.model'; -import { DSpaceObject } from '../../core/shared/dspace-object.model'; import { ResponseCacheEntry } from '../../core/cache/response-cache.reducer'; import { RequestEntry } from '../../core/data/request.reducer'; import { getMockRequestService } from '../../shared/mocks/mock-request.service'; import { getMockResponseCacheService } from '../../shared/mocks/mock-response-cache.service'; -import { - FacetConfigSuccessResponse, RestResponse, - SearchSuccessResponse -} from '../../core/cache/response-cache.models'; +import { FacetConfigSuccessResponse, SearchSuccessResponse } from '../../core/cache/response-cache.models'; import { SearchQueryResponse } from './search-query-response.model'; import { SearchFilterConfig } from './search-filter-config.model'; @@ -157,7 +150,7 @@ describe('SearchService', () => { const endPoint = 'http://endpoint.com/test/test'; const searchOptions = new PaginatedSearchOptions(); const queryResponse = Object.assign(new SearchQueryResponse(), { objects: [] }); - const response = new SearchSuccessResponse(queryResponse, '200'); + const response = new SearchSuccessResponse(queryResponse, 200,'OK'); const responseEntry = Object.assign(new ResponseCacheEntry(), { response: response }); beforeEach(() => { spyOn((searchService as any).halService, 'getEndpoint').and.returnValue(Observable.of(endPoint)); @@ -187,7 +180,7 @@ describe('SearchService', () => { describe('when getConfig is called without a scope', () => { const endPoint = 'http://endpoint.com/test/config'; const filterConfig = [new SearchFilterConfig()]; - const response = new FacetConfigSuccessResponse(filterConfig, '200'); + const response = new FacetConfigSuccessResponse(filterConfig, 200, 'OK'); const responseEntry = Object.assign(new ResponseCacheEntry(), { response: response }); beforeEach(() => { spyOn((searchService as any).halService, 'getEndpoint').and.returnValue(Observable.of(endPoint)); @@ -219,7 +212,7 @@ describe('SearchService', () => { const scope = 'test'; const requestUrl = endPoint + '?scope=' + scope; const filterConfig = [new SearchFilterConfig()]; - const response = new FacetConfigSuccessResponse(filterConfig, '200'); + const response = new FacetConfigSuccessResponse(filterConfig, 200, 'OK'); const responseEntry = Object.assign(new ResponseCacheEntry(), { response: response }); beforeEach(() => { spyOn((searchService as any).halService, 'getEndpoint').and.returnValue(Observable.of(endPoint)); diff --git a/src/app/core/auth/auth-response-parsing.service.spec.ts b/src/app/core/auth/auth-response-parsing.service.spec.ts index f7d899a9bc..366aa28416 100644 --- a/src/app/core/auth/auth-response-parsing.service.spec.ts +++ b/src/app/core/auth/auth-response-parsing.service.spec.ts @@ -40,12 +40,14 @@ describe('ConfigResponseParsingService', () => { expires: 1526318322000 }, } as AuthStatus, - statusCode: '200' + statusCode: 200, + statusText: '200' }; const validResponse1 = { payload: {}, - statusCode: '404' + statusCode: 404, + statusText: '404' }; const validResponse2 = { @@ -95,7 +97,9 @@ describe('ConfigResponseParsingService', () => { self: 'https://hasselt-dspace.dev01.4science.it/dspace-spring-rest/api/authn/status' } }, - statusCode: '200' + statusCode: 200, + statusText: '200' + }; it('should return a AuthStatusResponse if data contains a valid AuthStatus object as payload', () => { diff --git a/src/app/core/auth/auth-response-parsing.service.ts b/src/app/core/auth/auth-response-parsing.service.ts index 06f68b495e..a74efda15c 100644 --- a/src/app/core/auth/auth-response-parsing.service.ts +++ b/src/app/core/auth/auth-response-parsing.service.ts @@ -27,9 +27,9 @@ export class AuthResponseParsingService extends BaseResponseParsingService imple parse(request: RestRequest, data: DSpaceRESTV2Response): RestResponse { if (isNotEmpty(data.payload) && isNotEmpty(data.payload._links) && (data.statusCode === 200)) { const response = this.process(data.payload, request.href); - return new AuthStatusResponse(response[Object.keys(response)[0]][0], data.statusCode); + return new AuthStatusResponse(response[Object.keys(response)[0]][0], data.statusCode, data.statusText); } else { - return new AuthStatusResponse(data.payload as AuthStatus, data.statusCode); + return new AuthStatusResponse(data.payload as AuthStatus, data.statusCode, data.statusText); } } diff --git a/src/app/core/cache/builders/remote-data-build.service.ts b/src/app/core/cache/builders/remote-data-build.service.ts index 36e0f51af8..53838ab9b2 100644 --- a/src/app/core/cache/builders/remote-data-build.service.ts +++ b/src/app/core/cache/builders/remote-data-build.service.ts @@ -93,7 +93,7 @@ export class RemoteDataBuildService { isSuccessful = resEntry.response.isSuccessful; const errorMessage = isSuccessful === false ? (resEntry.response as ErrorResponse).errorMessage : undefined; if (hasValue(errorMessage)) { - error = new RemoteDataError(resEntry.response.statusCode.toString(), errorMessage); + error = new RemoteDataError((resEntry.response as ErrorResponse).statusText, errorMessage); } } @@ -226,16 +226,16 @@ export class RemoteDataBuildService { }).filter((e: string) => hasValue(e)) .join(', '); - const statusCode: string = arr + const statusText: string = arr .map((d: RemoteData) => d.error) .map((e: RemoteDataError, idx: number) => { if (hasValue(e)) { - return `[${idx}]: ${e.statusCode}`; + return `[${idx}]: ${e.statusText}`; } }).filter((c: string) => hasValue(c)) .join(', '); - const error = new RemoteDataError(statusCode, errorMessage); + const error = new RemoteDataError(statusText, errorMessage); const payload: T[] = arr.map((d: RemoteData) => d.payload); diff --git a/src/app/core/cache/response-cache.models.ts b/src/app/core/cache/response-cache.models.ts index 56a1c40eab..1a7d59d699 100644 --- a/src/app/core/cache/response-cache.models.ts +++ b/src/app/core/cache/response-cache.models.ts @@ -19,6 +19,7 @@ export class RestResponse { constructor( public isSuccessful: boolean, public statusCode: number, + public statusText: string ) { } } @@ -27,9 +28,10 @@ export class DSOSuccessResponse extends RestResponse { constructor( public resourceSelfLinks: string[], public statusCode: number, + public statusText: string, public pageInfo?: PageInfo ) { - super(true, statusCode); + super(true, statusCode, statusText); } } @@ -37,9 +39,10 @@ export class RegistryMetadataschemasSuccessResponse extends RestResponse { constructor( public metadataschemasResponse: RegistryMetadataschemasResponse, public statusCode: number, + public statusText: string, public pageInfo?: PageInfo ) { - super(true, statusCode); + super(true, statusCode, statusText); } } @@ -47,9 +50,10 @@ export class RegistryMetadatafieldsSuccessResponse extends RestResponse { constructor( public metadatafieldsResponse: RegistryMetadatafieldsResponse, public statusCode: number, + public statusText: string, public pageInfo?: PageInfo ) { - super(true, statusCode); + super(true, statusCode, statusText); } } @@ -57,18 +61,20 @@ export class RegistryBitstreamformatsSuccessResponse extends RestResponse { constructor( public bitstreamformatsResponse: RegistryBitstreamformatsResponse, public statusCode: number, + public statusText: string, public pageInfo?: PageInfo ) { - super(true, statusCode); + super(true, statusCode, statusText); } } export class MetadataschemaSuccessResponse extends RestResponse { constructor( public metadataschema: MetadataSchema, - public statusCode: number + public statusCode: number, + public statusText: string, ) { - super(true, statusCode); + super(true, statusCode, statusText); } } @@ -76,18 +82,20 @@ export class SearchSuccessResponse extends RestResponse { constructor( public results: SearchQueryResponse, public statusCode: number, + public statusText: string, public pageInfo?: PageInfo ) { - super(true, statusCode); + super(true, statusCode, statusText); } } export class FacetConfigSuccessResponse extends RestResponse { constructor( public results: SearchFilterConfig[], - public statusCode: number + public statusCode: number, + public statusText: string, ) { - super(true, statusCode); + super(true, statusCode, statusText); } } @@ -99,8 +107,9 @@ export class FacetValueSuccessResponse extends RestResponse { constructor( public results: FacetValue[], public statusCode: number, + public statusText: string, public pageInfo?: PageInfo) { - super(true, statusCode); + super(true, statusCode, statusText); } } @@ -108,8 +117,9 @@ export class FacetValueMapSuccessResponse extends RestResponse { constructor( public results: FacetValueMap, public statusCode: number, + public statusText: string ) { - super(true, statusCode); + super(true, statusCode, statusText); } } @@ -121,8 +131,9 @@ export class EndpointMapSuccessResponse extends RestResponse { constructor( public endpointMap: EndpointMap, public statusCode: number, + public statusText: string ) { - super(true, statusCode); + super(true, statusCode, statusText); } } @@ -130,9 +141,10 @@ export class GenericSuccessResponse extends RestResponse { constructor( public payload: T, public statusCode: number, + public statusText: string, public pageInfo?: PageInfo ) { - super(true, statusCode); + super(true, statusCode, statusText); } } @@ -140,7 +152,7 @@ export class ErrorResponse extends RestResponse { errorMessage: string; constructor(error: RequestError) { - super(false, error.statusText); + super(false, error.statusCode, error.statusText); console.error(error); this.errorMessage = error.message; } @@ -150,9 +162,10 @@ export class ConfigSuccessResponse extends RestResponse { constructor( public configDefinition: ConfigObject[], public statusCode: number, + public statusText: string, public pageInfo?: PageInfo ) { - super(true, statusCode); + super(true, statusCode, statusText); } } @@ -161,9 +174,10 @@ export class AuthStatusResponse extends RestResponse { constructor( public response: AuthStatus, - public statusCode: number + public statusCode: number, + public statusText: string, ) { - super(true, statusCode); + super(true, statusCode, statusText); } } @@ -171,9 +185,10 @@ export class IntegrationSuccessResponse extends RestResponse { constructor( public dataDefinition: IntegrationModel[], public statusCode: number, + public statusText: string, public pageInfo?: PageInfo ) { - super(true, statusCode); + super(true, statusCode, statusText); } } @@ -181,9 +196,10 @@ export class PostPatchSuccessResponse extends RestResponse { constructor( public dataDefinition: any[], public statusCode: number, + public statusText: string, public pageInfo?: PageInfo ) { - super(true, statusCode); + super(true, statusCode, statusText); } } @@ -191,9 +207,10 @@ export class SubmissionSuccessResponse extends RestResponse { constructor( public dataDefinition: Array, public statusCode: number, + public statusText: string, public pageInfo?: PageInfo ) { - super(true, statusCode); + super(true, statusCode, statusText); } } @@ -201,9 +218,10 @@ export class EpersonSuccessResponse extends RestResponse { constructor( public epersonDefinition: NormalizedObject[], public statusCode: number, + public statusText: string, public pageInfo?: PageInfo ) { - super(true, statusCode); + super(true, statusCode, statusText); } } diff --git a/src/app/core/cache/response-cache.reducer.spec.ts b/src/app/core/cache/response-cache.reducer.spec.ts index 9037b20030..3e88a71eb9 100644 --- a/src/app/core/cache/response-cache.reducer.spec.ts +++ b/src/app/core/cache/response-cache.reducer.spec.ts @@ -28,13 +28,13 @@ describe('responseCacheReducer', () => { const testState: ResponseCacheState = { [keys[0]]: { key: keys[0], - response: new RestResponse(true, '200'), + response: new RestResponse(true, 200, 'OK'), timeAdded: new Date().getTime(), msToLive: msToLive }, [keys[1]]: { key: keys[1], - response: new RestResponse(true, '200'), + response: new RestResponse(true, 200, 'OK'), timeAdded: new Date().getTime(), msToLive: msToLive } @@ -65,7 +65,7 @@ describe('responseCacheReducer', () => { describe('ADD', () => { const addTimeAdded = new Date().getTime(); const addMsToLive = 5; - const addResponse = new RestResponse(true, '200'); + const addResponse = new RestResponse(true, 200, 'OK'); const action = new ResponseCacheAddAction(keys[0], addResponse, addTimeAdded, addMsToLive); it('should perform the action without affecting the previous state', () => { diff --git a/src/app/core/cache/response-cache.service.spec.ts b/src/app/core/cache/response-cache.service.spec.ts index 1def7faa02..724836ffc5 100644 --- a/src/app/core/cache/response-cache.service.spec.ts +++ b/src/app/core/cache/response-cache.service.spec.ts @@ -2,6 +2,7 @@ import { Store } from '@ngrx/store'; import { ResponseCacheService } from './response-cache.service'; import { Observable } from 'rxjs/Observable'; +import 'rxjs/add/observable/of'; import { CoreState } from '../core.reducers'; import { RestResponse } from './response-cache.models'; import { ResponseCacheEntry } from './response-cache.reducer'; @@ -15,7 +16,7 @@ describe('ResponseCacheService', () => { const validCacheEntry = (key) => { return { key: key, - response: new RestResponse(true, '200'), + response: new RestResponse(true, 200,'OK'), timeAdded: timestamp, msToLive: 24 * 60 * 60 * 1000 // a day } @@ -23,7 +24,7 @@ describe('ResponseCacheService', () => { const invalidCacheEntry = (key) => { return { key: key, - response: new RestResponse(true, '200'), + response: new RestResponse(true, 200,'OK'), timeAdded: 0, msToLive: 0 } diff --git a/src/app/core/data/browse-entries-response-parsing.service.spec.ts b/src/app/core/data/browse-entries-response-parsing.service.spec.ts index dd04e4f2f5..14b6ced61c 100644 --- a/src/app/core/data/browse-entries-response-parsing.service.spec.ts +++ b/src/app/core/data/browse-entries-response-parsing.service.spec.ts @@ -101,7 +101,8 @@ describe('BrowseEntriesResponseParsingService', () => { number: 0 } }, - statusCode: '200' + statusCode: 200, + statusText: 'OK' } as DSpaceRESTV2Response; const invalidResponseNotAList = { @@ -120,11 +121,12 @@ describe('BrowseEntriesResponseParsingService', () => { } }, }, - statusCode: '200' + statusCode: 200, + statusText: 'OK' } as DSpaceRESTV2Response; const invalidResponseStatusCode = { - payload: {}, statusCode: '500' + payload: {}, statusCode: 500, statusText: 'Internal Server Error' } as DSpaceRESTV2Response; it('should return a GenericSuccessResponse if data contains a valid browse entries response', () => { diff --git a/src/app/core/data/browse-entries-response-parsing.service.ts b/src/app/core/data/browse-entries-response-parsing.service.ts index 171def60df..602618248c 100644 --- a/src/app/core/data/browse-entries-response-parsing.service.ts +++ b/src/app/core/data/browse-entries-response-parsing.service.ts @@ -34,12 +34,12 @@ export class BrowseEntriesResponseParsingService extends BaseResponseParsingServ && Array.isArray(data.payload._embedded[Object.keys(data.payload._embedded)[0]])) { const serializer = new DSpaceRESTv2Serializer(BrowseEntry); const browseEntries = serializer.deserializeArray(data.payload._embedded[Object.keys(data.payload._embedded)[0]]); - return new GenericSuccessResponse(browseEntries, data.statusCode, this.processPageInfo(data.payload)); + return new GenericSuccessResponse(browseEntries, data.statusCode, data.statusText, this.processPageInfo(data.payload)); } else { return new ErrorResponse( Object.assign( new Error('Unexpected response from browse endpoint'), - { statusText: data.statusCode } + { statusCode: data.statusCode, statusText: data.statusText } ) ); } diff --git a/src/app/core/data/browse-response-parsing.service.spec.ts b/src/app/core/data/browse-response-parsing.service.spec.ts index b0fbb1f977..e1d5dbe467 100644 --- a/src/app/core/data/browse-response-parsing.service.spec.ts +++ b/src/app/core/data/browse-response-parsing.service.spec.ts @@ -48,7 +48,7 @@ describe('BrowseResponseParsingService', () => { }, _links: { self: { href: 'https://rest.api/discover/browses' } }, page: { size: 20, totalElements: 2, totalPages: 1, number: 0 } - }, statusCode: '200' + }, statusCode: 200, statusText: 'OK' } as DSpaceRESTV2Response; const invalidResponse1 = { @@ -71,21 +71,21 @@ describe('BrowseResponseParsingService', () => { }, _links: { self: { href: 'https://rest.api/discover/browses' } }, page: { size: 20, totalElements: 2, totalPages: 1, number: 0 } - }, statusCode: '200' + }, statusCode: 200, statusText: 'OK' } as DSpaceRESTV2Response; const invalidResponse2 = { payload: { _links: { self: { href: 'https://rest.api/discover/browses' } }, page: { size: 20, totalElements: 2, totalPages: 1, number: 0 } - }, statusCode: '200' + }, statusCode: 200, statusText: 'OK' } as DSpaceRESTV2Response ; const invalidResponse3 = { payload: { _links: { self: { href: 'https://rest.api/discover/browses' } }, page: { size: 20, totalElements: 2, totalPages: 1, number: 0 } - }, statusCode: '500' + }, statusCode: 500, statusText: 'Internal Server Error' } as DSpaceRESTV2Response; const definitions = [ diff --git a/src/app/core/data/browse-response-parsing.service.ts b/src/app/core/data/browse-response-parsing.service.ts index 8feb1bc82b..7d4691d2a1 100644 --- a/src/app/core/data/browse-response-parsing.service.ts +++ b/src/app/core/data/browse-response-parsing.service.ts @@ -15,12 +15,12 @@ export class BrowseResponseParsingService implements ResponseParsingService { && Array.isArray(data.payload._embedded[Object.keys(data.payload._embedded)[0]])) { const serializer = new DSpaceRESTv2Serializer(BrowseDefinition); const browseDefinitions = serializer.deserializeArray(data.payload._embedded[Object.keys(data.payload._embedded)[0]]); - return new GenericSuccessResponse(browseDefinitions, data.statusCode); + return new GenericSuccessResponse(browseDefinitions, data.statusCode, data.statusText); } else { return new ErrorResponse( Object.assign( new Error('Unexpected response from browse endpoint'), - { statusText: data.statusCode } + { statusCode: data.statusCode, statusText: data.statusText } ) ); } diff --git a/src/app/core/data/config-response-parsing.service.spec.ts b/src/app/core/data/config-response-parsing.service.spec.ts index 3a09de6e4c..64c5e22b0b 100644 --- a/src/app/core/data/config-response-parsing.service.spec.ts +++ b/src/app/core/data/config-response-parsing.service.spec.ts @@ -121,12 +121,14 @@ describe('ConfigResponseParsingService', () => { } } }, - statusCode:'200' + statusCode: 200, + statusText: 'OK' }; const invalidResponse1 = { payload: {}, - statusCode:'200' + statusCode: 200, + statusText: 'OK' }; const invalidResponse2 = { @@ -150,14 +152,15 @@ describe('ConfigResponseParsingService', () => { } } }, - statusCode:'200' + statusCode: 200, + statusText: 'OK' }; const invalidResponse3 = { payload: { _links: { self: { href: 'https://rest.api/config/submissiondefinitions/traditional' } }, page: { size: 20, totalElements: 2, totalPages: 1, number: 0 } - }, statusCode: '500' + }, statusCode: 500, statusText: 'Internal Server Error' }; const definitions = [ diff --git a/src/app/core/data/config-response-parsing.service.ts b/src/app/core/data/config-response-parsing.service.ts index a6ed7bd64c..a3342f2874 100644 --- a/src/app/core/data/config-response-parsing.service.ts +++ b/src/app/core/data/config-response-parsing.service.ts @@ -29,12 +29,12 @@ export class ConfigResponseParsingService extends BaseResponseParsingService imp parse(request: RestRequest, data: DSpaceRESTV2Response): RestResponse { if (isNotEmpty(data.payload) && isNotEmpty(data.payload._links) && (data.statusCode === 201 || data.statusCode === 200)) { const configDefinition = this.process(data.payload, request.href); - return new ConfigSuccessResponse(configDefinition[Object.keys(configDefinition)[0]], data.statusCode, this.processPageInfo(data.payload)); + return new ConfigSuccessResponse(configDefinition[Object.keys(configDefinition)[0]], data.statusCode, data.statusText, this.processPageInfo(data.payload)); } else { return new ErrorResponse( Object.assign( new Error('Unexpected response from config endpoint'), - { statusText: data.statusCode } + { statusCode: data.statusCode, statusText: data.statusText } ) ); } diff --git a/src/app/core/data/dso-response-parsing.service.ts b/src/app/core/data/dso-response-parsing.service.ts index 9651eb3157..4f4ba217b4 100644 --- a/src/app/core/data/dso-response-parsing.service.ts +++ b/src/app/core/data/dso-response-parsing.service.ts @@ -28,7 +28,7 @@ export class DSOResponseParsingService extends BaseResponseParsingService implem parse(request: RestRequest, data: DSpaceRESTV2Response): RestResponse { const processRequestDTO = this.process(data.payload, request.href); const selfLinks = this.flattenSingleKeyObject(processRequestDTO).map((no) => no.self); - return new DSOSuccessResponse(selfLinks, data.statusCode, this.processPageInfo(data.payload)) + return new DSOSuccessResponse(selfLinks, data.statusCode, data.statusText, this.processPageInfo(data.payload)) } } diff --git a/src/app/core/data/endpoint-map-response-parsing.service.ts b/src/app/core/data/endpoint-map-response-parsing.service.ts index b850e13932..b960f9ec71 100644 --- a/src/app/core/data/endpoint-map-response-parsing.service.ts +++ b/src/app/core/data/endpoint-map-response-parsing.service.ts @@ -20,12 +20,12 @@ export class EndpointMapResponseParsingService implements ResponseParsingService for (const link of Object.keys(links)) { links[link] = links[link].href; } - return new EndpointMapSuccessResponse(links, data.statusCode); + return new EndpointMapSuccessResponse(links, data.statusCode, data.statusText); } else { return new ErrorResponse( Object.assign( new Error('Unexpected response from root endpoint'), - { statusText: data.statusCode } + { statusCode: data.statusCode, statusText: data.statusText } ) ); } diff --git a/src/app/core/data/facet-config-response-parsing.service.ts b/src/app/core/data/facet-config-response-parsing.service.ts index b0d89fb03e..4728ea768a 100644 --- a/src/app/core/data/facet-config-response-parsing.service.ts +++ b/src/app/core/data/facet-config-response-parsing.service.ts @@ -27,6 +27,6 @@ export class FacetConfigResponseParsingService extends BaseResponseParsingServic const config = data.payload._embedded.facets; const serializer = new DSpaceRESTv2Serializer(SearchFilterConfig); const facetConfig = serializer.deserializeArray(config); - return new FacetConfigSuccessResponse(facetConfig, data.statusCode); + return new FacetConfigSuccessResponse(facetConfig, data.statusCode, data.statusText); } } diff --git a/src/app/core/data/facet-value-map-response-parsing.service.ts b/src/app/core/data/facet-value-map-response-parsing.service.ts index 8588e4aa0b..555f5fa124 100644 --- a/src/app/core/data/facet-value-map-response-parsing.service.ts +++ b/src/app/core/data/facet-value-map-response-parsing.service.ts @@ -37,10 +37,10 @@ export class FacetValueMapResponseParsingService extends BaseResponseParsingServ payload._embedded.facets.map((facet) => { const values = facet._embedded.values.map((value) => {value.search = value._links.search.href; return value;}); const facetValues = serializer.deserializeArray(values); - const valuesResponse = new FacetValueSuccessResponse(facetValues, data.statusCode, this.processPageInfo(data.payload)); + const valuesResponse = new FacetValueSuccessResponse(facetValues, data.statusCode, data.statusText, this.processPageInfo(data.payload)); facetMap[facet.name] = valuesResponse; }); - return new FacetValueMapSuccessResponse(facetMap, data.statusCode); + return new FacetValueMapSuccessResponse(facetMap, data.statusCode, data.statusText); } } diff --git a/src/app/core/data/facet-value-response-parsing.service.ts b/src/app/core/data/facet-value-response-parsing.service.ts index bc3f4e5368..84d0bc5e3c 100644 --- a/src/app/core/data/facet-value-response-parsing.service.ts +++ b/src/app/core/data/facet-value-response-parsing.service.ts @@ -33,6 +33,6 @@ export class FacetValueResponseParsingService extends BaseResponseParsingService // const values = payload._embedded.values.map((value) => {value.search = value._links.search.href; return value;}); const facetValues = serializer.deserializeArray(payload._embedded.values); - return new FacetValueSuccessResponse(facetValues, data.statusCode, this.processPageInfo(data.payload)); + return new FacetValueSuccessResponse(facetValues, data.statusCode, data.statusText, this.processPageInfo(data.payload)); } } diff --git a/src/app/core/data/metadataschema-parsing.service.ts b/src/app/core/data/metadataschema-parsing.service.ts index cdd87c19d4..51fbcd3767 100644 --- a/src/app/core/data/metadataschema-parsing.service.ts +++ b/src/app/core/data/metadataschema-parsing.service.ts @@ -13,7 +13,7 @@ export class MetadataschemaParsingService implements ResponseParsingService { const payload = data.payload; const deserialized = new DSpaceRESTv2Serializer(MetadataSchema).deserialize(payload); - return new MetadataschemaSuccessResponse(deserialized, data.statusCode); + return new MetadataschemaSuccessResponse(deserialized, data.statusCode, data.statusText); } } diff --git a/src/app/core/data/registry-bitstreamformats-response-parsing.service.ts b/src/app/core/data/registry-bitstreamformats-response-parsing.service.ts index d981a12719..7821502d9d 100644 --- a/src/app/core/data/registry-bitstreamformats-response-parsing.service.ts +++ b/src/app/core/data/registry-bitstreamformats-response-parsing.service.ts @@ -19,7 +19,7 @@ export class RegistryBitstreamformatsResponseParsingService implements ResponseP payload.bitstreamformats = bitstreamformats; const deserialized = new DSpaceRESTv2Serializer(RegistryBitstreamformatsResponse).deserialize(payload); - return new RegistryBitstreamformatsSuccessResponse(deserialized, data.statusCode, this.dsoParser.processPageInfo(data.payload.page)); + return new RegistryBitstreamformatsSuccessResponse(deserialized, data.statusCode, data.statusText, this.dsoParser.processPageInfo(data.payload.page)); } } diff --git a/src/app/core/data/registry-metadatafields-response-parsing.service.ts b/src/app/core/data/registry-metadatafields-response-parsing.service.ts index 2620916070..4e22cad982 100644 --- a/src/app/core/data/registry-metadatafields-response-parsing.service.ts +++ b/src/app/core/data/registry-metadatafields-response-parsing.service.ts @@ -28,7 +28,7 @@ export class RegistryMetadatafieldsResponseParsingService implements ResponsePar payload.metadatafields = metadatafields; const deserialized = new DSpaceRESTv2Serializer(RegistryMetadatafieldsResponse).deserialize(payload); - return new RegistryMetadatafieldsSuccessResponse(deserialized, data.statusCode, this.dsoParser.processPageInfo(data.payload.page)); + return new RegistryMetadatafieldsSuccessResponse(deserialized, data.statusCode, data.statusText, this.dsoParser.processPageInfo(data.payload.page)); } } diff --git a/src/app/core/data/registry-metadataschemas-response-parsing.service.ts b/src/app/core/data/registry-metadataschemas-response-parsing.service.ts index 2bb1302450..ace7fb0e6c 100644 --- a/src/app/core/data/registry-metadataschemas-response-parsing.service.ts +++ b/src/app/core/data/registry-metadataschemas-response-parsing.service.ts @@ -19,7 +19,7 @@ export class RegistryMetadataschemasResponseParsingService implements ResponsePa payload.metadataschemas = metadataschemas; const deserialized = new DSpaceRESTv2Serializer(RegistryMetadataschemasResponse).deserialize(payload); - return new RegistryMetadataschemasSuccessResponse(deserialized, data.statusCode, this.dsoParser.processPageInfo(data.payload.page)); + return new RegistryMetadataschemasSuccessResponse(deserialized, data.statusCode, data.statusText, this.dsoParser.processPageInfo(data.payload.page)); } } diff --git a/src/app/core/data/remote-data-error.ts b/src/app/core/data/remote-data-error.ts index a2ff27a073..d2a0dd5add 100644 --- a/src/app/core/data/remote-data-error.ts +++ b/src/app/core/data/remote-data-error.ts @@ -1,6 +1,6 @@ export class RemoteDataError { constructor( - public statusCode: string, + public statusText: string, public message: string ) { } diff --git a/src/app/core/data/request.models.ts b/src/app/core/data/request.models.ts index 24921b7bb0..7a759c4490 100644 --- a/src/app/core/data/request.models.ts +++ b/src/app/core/data/request.models.ts @@ -303,6 +303,7 @@ export class EpersonRequest extends GetRequest { } export class RequestError extends Error { - statusText: number; + statusCode: number; + statusText: string; } /* tslint:enable:max-classes-per-file */ diff --git a/src/app/core/data/search-response-parsing.service.ts b/src/app/core/data/search-response-parsing.service.ts index c7456aa2f9..ff3a28e313 100644 --- a/src/app/core/data/search-response-parsing.service.ts +++ b/src/app/core/data/search-response-parsing.service.ts @@ -39,7 +39,8 @@ export class SearchResponseParsingService implements ResponseParsingService { .map((dso) => Object.assign({}, dso, { _embedded: undefined })) .map((dso) => this.dsoParser.parse(request, { payload: dso, - statusCode: data.statusCode + statusCode: data.statusCode, + statusText: data.statusText })) .map((obj) => obj.resourceSelfLinks) .reduce((combined, thisElement) => [...combined, ...thisElement], []); @@ -56,6 +57,6 @@ export class SearchResponseParsingService implements ResponseParsingService { })); payload.objects = objects; const deserialized = new DSpaceRESTv2Serializer(SearchQueryResponse).deserialize(payload); - return new SearchSuccessResponse(deserialized, data.statusCode, this.dsoParser.processPageInfo(data.payload)); + return new SearchSuccessResponse(deserialized, data.statusCode, data.statusText, this.dsoParser.processPageInfo(data.payload)); } } diff --git a/src/app/core/dspace-rest-v2/dspace-rest-v2-response.model.ts b/src/app/core/dspace-rest-v2/dspace-rest-v2-response.model.ts index 5d8e71670d..d09d398d7c 100644 --- a/src/app/core/dspace-rest-v2/dspace-rest-v2-response.model.ts +++ b/src/app/core/dspace-rest-v2/dspace-rest-v2-response.model.ts @@ -8,5 +8,6 @@ export interface DSpaceRESTV2Response { page?: any; }, headers?: HttpHeaders, - statusCode: number + statusCode: number, + statusText: string } diff --git a/src/app/core/dspace-rest-v2/dspace-rest-v2.service.spec.ts b/src/app/core/dspace-rest-v2/dspace-rest-v2.service.spec.ts index 4893908627..9918173fa5 100644 --- a/src/app/core/dspace-rest-v2/dspace-rest-v2.service.spec.ts +++ b/src/app/core/dspace-rest-v2/dspace-rest-v2.service.spec.ts @@ -30,17 +30,19 @@ describe('DSpaceRESTv2Service', () => { const mockPayload = { page: 1 }; - const mockStatusCode = 'GREAT'; + const mockStatusCode = 200; + const mockStatusText = 'GREAT'; dSpaceRESTv2Service.get(url).subscribe((response) => { expect(response).toBeTruthy(); expect(response.statusCode).toEqual(mockStatusCode); + expect(response.statusText).toEqual(mockStatusText); expect(response.payload.page).toEqual(mockPayload.page); }); const req = httpMock.expectOne(url); expect(req.request.method).toBe('GET'); - req.flush(mockPayload, { statusText: mockStatusCode}); + req.flush(mockPayload, { status: mockStatusCode, statusText: mockStatusText}); }); }); diff --git a/src/app/core/dspace-rest-v2/dspace-rest-v2.service.ts b/src/app/core/dspace-rest-v2/dspace-rest-v2.service.ts index ffa1abb005..fe911e3f89 100644 --- a/src/app/core/dspace-rest-v2/dspace-rest-v2.service.ts +++ b/src/app/core/dspace-rest-v2/dspace-rest-v2.service.ts @@ -1,5 +1,4 @@ import { Injectable } from '@angular/core'; -import { Request } from '@angular/http'; import { HttpClient, HttpHeaders, HttpParams, HttpResponse } from '@angular/common/http' import { Observable } from 'rxjs/Observable'; import { RestRequestMethod } from '../data/request.models'; @@ -37,7 +36,7 @@ export class DSpaceRESTv2Service { */ get(absoluteURL: string): Observable { return this.http.get(absoluteURL, { observe: 'response' }) - .map((res: HttpResponse) => ({ payload: res.body, statusCode: res.statusText })) + .map((res: HttpResponse) => ({ payload: res.body, statusCode: res.status, statusText: res.statusText })) .catch((err) => { console.log('Error: ', err); return Observable.throw(err); @@ -67,7 +66,7 @@ export class DSpaceRESTv2Service { requestOptions.responseType = options.responseType; } return this.http.request(method, url, requestOptions) - .map((res) => ({ payload: res.body, headers: res.headers, statusCode: res.status })) + .map((res) => ({ payload: res.body, headers: res.headers, statusCode: res.status, statusText: res.statusText })) .catch((err) => { console.log('Error: ', err); return Observable.throw(err); diff --git a/src/app/core/eperson/eperson-response-parsing.service.ts b/src/app/core/eperson/eperson-response-parsing.service.ts index b4bc9e4676..53d148084d 100644 --- a/src/app/core/eperson/eperson-response-parsing.service.ts +++ b/src/app/core/eperson/eperson-response-parsing.service.ts @@ -29,12 +29,12 @@ export class EpersonResponseParsingService extends BaseResponseParsingService im parse(request: RestRequest, data: DSpaceRESTV2Response): RestResponse { if (isNotEmpty(data.payload) && isNotEmpty(data.payload._links)) { const epersonDefinition = this.process(data.payload, request.href); - return new EpersonSuccessResponse(epersonDefinition[Object.keys(epersonDefinition)[0]], data.statusCode, this.processPageInfo(data.payload)); + return new EpersonSuccessResponse(epersonDefinition[Object.keys(epersonDefinition)[0]], data.statusCode, data.statusText, this.processPageInfo(data.payload)); } else { return new ErrorResponse( Object.assign( new Error('Unexpected response from EPerson endpoint'), - {statusText: data.statusCode} + {statusCode: data.statusCode, statusText: data.statusText} ) ); } diff --git a/src/app/core/integration/integration-response-parsing.service.spec.ts b/src/app/core/integration/integration-response-parsing.service.spec.ts index e2e2f92d5a..0377656b99 100644 --- a/src/app/core/integration/integration-response-parsing.service.spec.ts +++ b/src/app/core/integration/integration-response-parsing.service.spec.ts @@ -22,14 +22,20 @@ describe('IntegrationResponseParsingService', () => { const integrationEndpoint = 'https://rest.api/integration/authorities'; const entriesEndpoint = `${integrationEndpoint}/${name}/entries?query=${query}&metadata=${metadata}&uuid=${uuid}`; + let validRequest; + + let validResponse; + + let invalidResponse1; + + let invalidResponse2; + + let definitions; + beforeEach(() => { service = new IntegrationResponseParsingService(EnvConfig, objectCacheService); - }); - - describe('parse', () => { - const validRequest = new IntegrationRequest('69f375b5-19f4-4453-8c7a-7dc5c55aafbb', entriesEndpoint); - - const validResponse = { + validRequest = new IntegrationRequest('69f375b5-19f4-4453-8c7a-7dc5c55aafbb', entriesEndpoint); + validResponse = { payload: { page: { number: 0, @@ -81,15 +87,15 @@ describe('IntegrationResponseParsingService', () => { self: 'https://rest.api/integration/authorities/type/entries' } }, - statusCode: '200' + statusCode: 200, + statusText: 'OK' }; - - const invalidResponse1 = { + invalidResponse1 = { payload: {}, - statusCode: '200' + statusCode: 400, + statusText: 'Bad Request' }; - - const invalidResponse2 = { + invalidResponse2 = { payload: { page: { number: 0, @@ -139,10 +145,10 @@ describe('IntegrationResponseParsingService', () => { }, _links: {} }, - statusCode: '200' + statusCode: 500, + statusText: 'Internal Server Error' }; - - const definitions = [ + definitions = [ Object.assign(new AuthorityValueModel(), { display: 'One', id: 'One', @@ -174,6 +180,9 @@ describe('IntegrationResponseParsingService', () => { value: 'Five' }) ]; + }); + + describe('parse', () => { it('should return a IntegrationSuccessResponse if data contains a valid endpoint response', () => { const response = service.parse(validRequest, validResponse); diff --git a/src/app/core/integration/integration-response-parsing.service.ts b/src/app/core/integration/integration-response-parsing.service.ts index d07cf02025..f6e93e3f01 100644 --- a/src/app/core/integration/integration-response-parsing.service.ts +++ b/src/app/core/integration/integration-response-parsing.service.ts @@ -32,13 +32,14 @@ export class IntegrationResponseParsingService extends BaseResponseParsingServic parse(request: RestRequest, data: DSpaceRESTV2Response): RestResponse { if (isNotEmpty(data.payload) && isNotEmpty(data.payload._links)) { + console.log(request); const dataDefinition = this.process(data.payload, request.href); - return new IntegrationSuccessResponse(dataDefinition[Object.keys(dataDefinition)[0]], data.statusCode, this.processPageInfo(data.payload)); + return new IntegrationSuccessResponse(dataDefinition[Object.keys(dataDefinition)[0]], data.statusCode, data.statusText, this.processPageInfo(data.payload)); } else { return new ErrorResponse( Object.assign( new Error('Unexpected response from Integration endpoint'), - {statusText: data.statusCode} + {statusCode: data.statusCode, statusText: data.statusText} ) ); } diff --git a/src/app/core/registry/registry.service.spec.ts b/src/app/core/registry/registry.service.spec.ts index ef1533278d..ecb50bd2c8 100644 --- a/src/app/core/registry/registry.service.spec.ts +++ b/src/app/core/registry/registry.service.spec.ts @@ -1,4 +1,4 @@ -import { async, TestBed } from '@angular/core/testing'; +import { TestBed } from '@angular/core/testing'; import { RegistryService } from './registry.service'; import { CommonModule } from '@angular/common'; import { ResponseCacheService } from '../cache/response-cache.service'; @@ -7,21 +7,19 @@ import { RemoteDataBuildService } from '../cache/builders/remote-data-build.serv import { HALEndpointService } from '../shared/hal-endpoint.service'; import { PaginationComponentOptions } from '../../shared/pagination/pagination-component-options.model'; import { Observable } from 'rxjs/Observable'; +import 'rxjs/add/observable/of'; +import 'rxjs/add/observable/combineLatest'; import { ResponseCacheEntry } from '../cache/response-cache.reducer'; import { RequestEntry } from '../data/request.reducer'; import { RemoteData } from '../data/remote-data'; -import { PaginatedList } from '../data/paginated-list'; import { PageInfo } from '../shared/page-info.model'; -import { GetRequest } from '../data/request.models'; -import { URLCombiner } from '../url-combiner/url-combiner'; import { getMockRequestService } from '../../shared/mocks/mock-request.service'; import { getMockResponseCacheService } from '../../shared/mocks/mock-response-cache.service'; import { RegistryBitstreamformatsSuccessResponse, - RegistryMetadatafieldsSuccessResponse, RegistryMetadataschemasSuccessResponse, - SearchSuccessResponse + RegistryMetadatafieldsSuccessResponse, + RegistryMetadataschemasSuccessResponse } from '../cache/response-cache.models'; -import { SearchQueryResponse } from '../../+search-page/search-service/search-query-response.model'; import { Component } from '@angular/core'; import { RegistryMetadataschemasResponse } from './registry-metadataschemas-response.model'; import { RegistryMetadatafieldsResponse } from './registry-metadatafields-response.model'; @@ -161,7 +159,7 @@ describe('RegistryService', () => { describe('when requesting metadataschemas', () => { const queryResponse = Object.assign(new RegistryMetadataschemasResponse(), { metadataschemas: mockSchemasList, page: pageInfo }); - const response = new RegistryMetadataschemasSuccessResponse(queryResponse, '200', pageInfo); + const response = new RegistryMetadataschemasSuccessResponse(queryResponse, 200, 'OK', pageInfo); const responseEntry = Object.assign(new ResponseCacheEntry(), { response: response }); beforeEach(() => { @@ -191,7 +189,7 @@ describe('RegistryService', () => { describe('when requesting metadataschema by name', () => { const queryResponse = Object.assign(new RegistryMetadataschemasResponse(), { metadataschemas: mockSchemasList, page: pageInfo }); - const response = new RegistryMetadataschemasSuccessResponse(queryResponse, '200', pageInfo); + const response = new RegistryMetadataschemasSuccessResponse(queryResponse, 200, 'OK', pageInfo); const responseEntry = Object.assign(new ResponseCacheEntry(), { response: response }); beforeEach(() => { @@ -221,7 +219,7 @@ describe('RegistryService', () => { describe('when requesting metadatafields', () => { const queryResponse = Object.assign(new RegistryMetadatafieldsResponse(), { metadatafields: mockFieldsList, page: pageInfo }); - const response = new RegistryMetadatafieldsSuccessResponse(queryResponse, '200', pageInfo); + const response = new RegistryMetadatafieldsSuccessResponse(queryResponse, 200, 'OK', pageInfo); const responseEntry = Object.assign(new ResponseCacheEntry(), { response: response }); beforeEach(() => { @@ -251,7 +249,7 @@ describe('RegistryService', () => { describe('when requesting bitstreamformats', () => { const queryResponse = Object.assign(new RegistryBitstreamformatsResponse(), { bitstreamformats: mockFieldsList, page: pageInfo }); - const response = new RegistryBitstreamformatsSuccessResponse(queryResponse, '200', pageInfo); + const response = new RegistryBitstreamformatsSuccessResponse(queryResponse, 200, 'OK', pageInfo); const responseEntry = Object.assign(new ResponseCacheEntry(), { response: response }); beforeEach(() => { diff --git a/src/app/core/submission/submission-response-parsing.service.ts b/src/app/core/submission/submission-response-parsing.service.ts index 2fd0a4756d..42724dff1e 100644 --- a/src/app/core/submission/submission-response-parsing.service.ts +++ b/src/app/core/submission/submission-response-parsing.service.ts @@ -35,15 +35,15 @@ export class SubmissionResponseParsingService extends BaseResponseParsingService && isNotEmpty(data.payload._links) && (data.statusCode === 201 || data.statusCode === 200)) { const dataDefinition = this.processResponse(data.payload, request.href); - return new SubmissionSuccessResponse(dataDefinition[Object.keys(dataDefinition)[0]], data.statusCode, this.processPageInfo(data.payload)); + return new SubmissionSuccessResponse(dataDefinition[Object.keys(dataDefinition)[0]], data.statusCode, data.statusText, this.processPageInfo(data.payload)); } else if (isEmpty(data.payload) && data.statusCode === 204) { // Response from a DELETE request - return new SubmissionSuccessResponse(null, data.statusCode); + return new SubmissionSuccessResponse(null, data.statusCode, data.statusText); } else { return new ErrorResponse( Object.assign( new Error('Unexpected response from server'), - {statusText: data.statusCode} + {statusCode: data.statusCode, statusText: data.statusText} ) ); }