Make HTTPClientMock#wait() to wait for all requests
This commit is contained in:
parent
d3f294a57c
commit
9dd6994498
@ -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/)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
})
|
})
|
||||||
|
|||||||
@ -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) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user