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 const result2 = await promise
expect(result1.res.data).toBe(result2) expect(result1.res.data).toBe(result2)
expect(result2).toBe(value) expect(result2).toBe(value)
expect(result1.req).toBe(http.requests[0]) expect(result1.req).toBe(http.requests[0].request)
expect(result1.req).toEqual({ expect(result1.req).toEqual({
method: 'get', method: 'get',
url: '/test', 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> { export class HTTPClientMock<T extends IRoutes> extends HTTPClient<T> {
mocks: {[key: string]: IResponse} = {} mocks: {[key: string]: IResponse} = {}
requests: IRequest[] = [] requests: IRequestStatus[] = []
protected waitPromise?: { protected waitPromise?: {
resolve: (r: IReqRes) => void resolve: (r: IReqRes) => void
@ -34,13 +39,18 @@ export class HTTPClientMock<T extends IRoutes> extends HTTPClient<T> {
createRequestor() { createRequestor() {
return { return {
request: (req: IRequest): Promise<IResponse> => { 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) => { return new Promise((resolve, reject) => {
const key = this.serialize(req) const key = this.serialize(req)
if (!this.mocks.hasOwnProperty(key)) { if (!this.mocks.hasOwnProperty(key)) {
setImmediate(() => { setImmediate(() => {
const err = new Error('No mock for request: ' + key) const err = new Error('No mock for request: ' + key)
reject(err) reject(err)
currentRequest.finished = true
this.notify(err) this.notify(err)
}) })
return return
@ -49,11 +59,13 @@ export class HTTPClientMock<T extends IRoutes> extends HTTPClient<T> {
setImmediate(() => { setImmediate(() => {
if (res.status >= 200 && res.status < 400) { if (res.status >= 200 && res.status < 400) {
resolve(res) resolve(res)
currentRequest.finished = true
this.notify({req, res}) this.notify({req, res})
return return
} }
const error = new HTTPClientError(req, res) const error = new HTTPClientError(req, res)
reject(error) reject(error)
currentRequest.finished = true
this.notify(error) this.notify(error)
}) })
}) })
@ -88,6 +100,9 @@ export class HTTPClientMock<T extends IRoutes> extends HTTPClient<T> {
if (!this.waitPromise) { if (!this.waitPromise) {
return return
} }
if (!this.requests.every(status => status.finished)) {
return
}
const waitPromise = this.waitPromise const waitPromise = this.waitPromise
this.waitPromise = undefined this.waitPromise = undefined
if (r instanceof Error) { if (r instanceof Error) {