Make HTTPClientMock#wait() to wait for all requests

This commit is contained in:
Jerko Steiner 2019-03-26 14:12:55 +08:00
parent d3f294a57c
commit 9dd6994498
2 changed files with 27 additions and 3 deletions

View File

@ -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/)
})
})
})

View File

@ -15,9 +15,14 @@ export class HTTPClientError extends Error {
}
}
export interface IRequestStatus {
request: IRequest
finished: boolean
}
export class HTTPClientMock<T extends IRoutes> extends HTTPClient<T> {
mocks: {[key: string]: IResponse} = {}
requests: IRequest[] = []
requests: IRequestStatus[] = []
protected waitPromise?: {
resolve: (r: IReqRes) => void
@ -34,13 +39,18 @@ export class HTTPClientMock<T extends IRoutes> extends HTTPClient<T> {
createRequestor() {
return {
request: (req: IRequest): Promise<IResponse> => {
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<T extends IRoutes> extends HTTPClient<T> {
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<T extends IRoutes> extends HTTPClient<T> {
if (!this.waitPromise) {
return
}
if (!this.requests.every(status => status.finished)) {
return
}
const waitPromise = this.waitPromise
this.waitPromise = undefined
if (r instanceof Error) {