Skip to content

Commit 6fa48f1

Browse files
committed
CR Updates: add runtime checks
1 parent 94d33c5 commit 6fa48f1

File tree

2 files changed

+42
-12
lines changed

2 files changed

+42
-12
lines changed

src/api.js

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,18 @@ function isEmptyObject(obj) {
88
return Object.keys(obj).length === 0 && obj.constructor === Object;
99
}
1010

11+
function validRequestHooks(requestHooks) {
12+
const isValid = Array.isArray(requestHooks) && requestHooks.every(requestHook =>
13+
typeof requestHook === 'function' && requestHook.length === 2
14+
);
15+
16+
if (!isValid) {
17+
console.warn('Request hooks should have the following signature: function requestHook(request, metadata) { return request; }');
18+
}
19+
20+
return isValid;
21+
}
22+
1123
const getFirstResult = result => result[0];
1224
const getFirstResultIfLengthGtOne = result => {
1325
if (result.length > 1) {
@@ -186,10 +198,10 @@ class DICOMwebClient {
186198
}
187199
}
188200

189-
if (requestHooks) {
201+
if (requestHooks && validRequestHooks(requestHooks)) {
190202
const metadata = { method, url };
191-
const pipeRequstHooks = functions => (args) => functions.reduce((args, fn) => fn(args, metadata), args);
192-
const pipedRequest = pipeRequstHooks(requestHooks);
203+
const pipeRequestHooks = functions => (args) => functions.reduce((args, fn) => fn(args, metadata), args);
204+
const pipedRequest = pipeRequestHooks(requestHooks);
193205
request = pipedRequest(request);
194206
}
195207

test/test.js

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -148,22 +148,40 @@ describe('dicomweb.api.DICOMwebClient', function() {
148148
}, 15000);
149149

150150
describe('Request hooks', function() {
151-
let requestHook1Spy, requestHook2Spy;
152-
153-
beforeAll(function() {
154-
requestHook1Spy = createSpy('requestHook1Spy').and.callFake((request, metadata) => request);
155-
requestHook2Spy = createSpy('requestHook2Spy').and.callFake((request, metadata) => request);
151+
let requestHook1Spy, requestHook2Spy, url, metadataUrl, request;
152+
153+
beforeEach(function() {
154+
request = new XMLHttpRequest();
155+
url = 'http://localhost:8008/dcm4chee-arc/aets/DCM4CHEE/rs';
156+
metadataUrl = 'http://localhost:8008/dcm4chee-arc/aets/DCM4CHEE/rs/studies/999.999.3859744/series/999.999.94827453/instances/999.999.133.1996.1.1800.1.6.25/metadata';
157+
requestHook1Spy = createSpy('requestHook1Spy', function (request, metadata) { return request }).and.callFake((request, metadata) => request);
158+
requestHook2Spy = createSpy('requestHook2Spy', function (request, metadata) { return request }).and.callFake((request, metadata) => request);
156159
});
157160

158-
it('request hooks should be called', async function() {
159-
const url = 'http://localhost:8008/dcm4chee-arc/aets/DCM4CHEE/rs';
160-
const metadataUrl = 'http://localhost:8008/dcm4chee-arc/aets/DCM4CHEE/rs/studies/999.999.3859744/series/999.999.94827453/instances/999.999.133.1996.1.1800.1.6.25/metadata';
161+
it('invalid request hooks should be notified and ignored', async function() {
162+
/** Spy with invalid request hook signature */
163+
requestHook2Spy = createSpy('requestHook2Spy', function (request) { return request }).and.callFake((request, metadata) => request);
164+
const dwc = new DICOMwebClient.api.DICOMwebClient({
165+
url,
166+
requestHooks: [requestHook1Spy, requestHook2Spy]
167+
});
168+
const metadata = { url: metadataUrl, method: 'get' };
169+
request.open('GET', metadata.url);
170+
await dwc.retrieveInstanceMetadata({
171+
studyInstanceUID: '999.999.3859744',
172+
seriesInstanceUID: '999.999.94827453',
173+
sopInstanceUID: '999.999.133.1996.1.1800.1.6.25',
174+
});
175+
expect(requestHook1Spy).not.toHaveBeenCalledWith(request, metadata);
176+
expect(requestHook2Spy).not.toHaveBeenCalledWith(request, metadata);
177+
})
178+
179+
it('valid request hooks should be called', async function() {
161180
const dwc = new DICOMwebClient.api.DICOMwebClient({
162181
url,
163182
requestHooks: [requestHook1Spy, requestHook2Spy]
164183
});
165184
const metadata = { url: metadataUrl, method: 'get' };
166-
const request = new XMLHttpRequest();
167185
request.open('GET', metadata.url);
168186
await dwc.retrieveInstanceMetadata({
169187
studyInstanceUID: '999.999.3859744',

0 commit comments

Comments
 (0)