From 9dd699449804d88fb1e395a63b000a1f4922548b Mon Sep 17 00:00:00 2001 From: Jerko Steiner Date: Tue, 26 Mar 2019 14:12:55 +0800 Subject: [PATCH] Make HTTPClientMock#wait() to wait for all requests --- .../src/test-utils/HTTPClientMock.test.ts | 11 ++++++++++- .../client/src/test-utils/HTTPClientMock.ts | 19 +++++++++++++++++-- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/packages/client/src/test-utils/HTTPClientMock.test.ts b/packages/client/src/test-utils/HTTPClientMock.test.ts index 033d956..df3f1aa 100644 --- a/packages/client/src/test-utils/HTTPClientMock.test.ts +++ b/packages/client/src/test-utils/HTTPClientMock.test.ts @@ -45,12 +45,21 @@ describe('HTTPClientMock', () => { const result2 = await promise expect(result1.res.data).toBe(result2) expect(result2).toBe(value) - expect(result1.req).toBe(http.requests[0]) + expect(result1.req).toBe(http.requests[0].request) expect(result1.req).toEqual({ method: 'get', url: '/test', }) }) + + it('waits for all pending requests to complete', async () => { + const promise1 = http.get('/test') + const promise2 = http.post('/test', {}) + const error = await getError(http.wait()) + await promise1 + await getError(promise2) + expect(error.message).toMatch(/No mock/) + }) }) }) diff --git a/packages/client/src/test-utils/HTTPClientMock.ts b/packages/client/src/test-utils/HTTPClientMock.ts index c6f88fb..60f21a7 100644 --- a/packages/client/src/test-utils/HTTPClientMock.ts +++ b/packages/client/src/test-utils/HTTPClientMock.ts @@ -15,9 +15,14 @@ export class HTTPClientError extends Error { } } +export interface IRequestStatus { + request: IRequest + finished: boolean +} + export class HTTPClientMock extends HTTPClient { mocks: {[key: string]: IResponse} = {} - requests: IRequest[] = [] + requests: IRequestStatus[] = [] protected waitPromise?: { resolve: (r: IReqRes) => void @@ -34,13 +39,18 @@ export class HTTPClientMock extends HTTPClient { createRequestor() { return { request: (req: IRequest): Promise => { - this.requests.push(req) + const currentRequest: IRequestStatus = { + request: req, + finished: false, + } + this.requests.push(currentRequest) return new Promise((resolve, reject) => { const key = this.serialize(req) if (!this.mocks.hasOwnProperty(key)) { setImmediate(() => { const err = new Error('No mock for request: ' + key) reject(err) + currentRequest.finished = true this.notify(err) }) return @@ -49,11 +59,13 @@ export class HTTPClientMock extends HTTPClient { setImmediate(() => { if (res.status >= 200 && res.status < 400) { resolve(res) + currentRequest.finished = true this.notify({req, res}) return } const error = new HTTPClientError(req, res) reject(error) + currentRequest.finished = true this.notify(error) }) }) @@ -88,6 +100,9 @@ export class HTTPClientMock extends HTTPClient { if (!this.waitPromise) { return } + if (!this.requests.every(status => status.finished)) { + return + } const waitPromise = this.waitPromise this.waitPromise = undefined if (r instanceof Error) {