1
1
require ( 'isomorphic-fetch' )
2
2
3
3
if ( ! Promise ) {
4
- Promise = require ( 'promise-polyfill' ) ;
4
+ Promise = require ( 'promise-polyfill' )
5
5
} else if ( ! Promise . finally ) {
6
- Promise . finally = require ( 'promise-polyfill' ) . finally ;
6
+ Promise . finally = require ( 'promise-polyfill' ) . finally
7
7
}
8
8
9
9
const ActualResponse = Response
10
10
11
- function ResponseWrapper ( body , init ) {
11
+ function ResponseWrapper ( body , init ) {
12
12
if ( body && typeof body . constructor === 'function' && body . constructor . __isFallback ) {
13
13
const response = new ActualResponse ( null , init )
14
14
response . body = body
@@ -28,40 +28,37 @@ function ResponseWrapper(body, init) {
28
28
return new ActualResponse ( body , init )
29
29
}
30
30
31
+ const isAPromise = obj => obj && obj . then && ( typeof obj . then === 'function' )
32
+
33
+ function resolve ( bodyOrPromise , init ) {
34
+ return ( ) =>
35
+ isAPromise ( bodyOrPromise ) ?
36
+ bodyOrPromise . then ( ( res ) => new ResponseWrapper ( res . body , res . init ) )
37
+ : Promise . resolve ( new ResponseWrapper ( bodyOrPromise , init ) )
38
+ }
39
+
31
40
const fetch = jest . fn ( )
32
41
fetch . Headers = Headers
33
42
fetch . Response = ResponseWrapper
34
43
fetch . Request = Request
35
- fetch . mockResponse = ( body , init ) => {
36
- return fetch . mockImplementation ( ( ) =>
37
- Promise . resolve ( new ResponseWrapper ( body , init ) )
38
- )
39
- }
44
+ fetch . mockResponse = ( bodyOrPromise , init ) => fetch . mockImplementation ( resolve ( bodyOrPromise , init ) )
40
45
41
46
fetch . mockReject = error => {
42
47
return fetch . mockImplementation ( ( ) => Promise . reject ( error ) )
43
48
}
44
49
45
- const mockResponseOnce = ( body , init ) => {
46
- return fetch . mockImplementationOnce ( ( ) =>
47
- Promise . resolve ( new ResponseWrapper ( body , init ) )
48
- )
49
- }
50
+ const mockResponseOnce = ( bodyOrPromise , init ) => fetch . mockImplementationOnce ( resolve ( bodyOrPromise , init ) )
50
51
51
52
fetch . mockResponseOnce = mockResponseOnce
52
53
53
54
fetch . once = mockResponseOnce
54
55
55
- fetch . mockRejectOnce = error => {
56
- return fetch . mockImplementationOnce ( ( ) => Promise . reject ( error ) )
56
+ fetch . mockRejectOnce = errorOrPromise => {
57
+ return fetch . mockImplementationOnce ( ( ) => isAPromise ( errorOrPromise ) ? errorOrPromise : Promise . reject ( error ) )
57
58
}
58
59
59
60
fetch . mockResponses = ( ...responses ) => {
60
- responses . forEach ( ( [ body , init ] ) => {
61
- fetch . mockImplementationOnce ( ( ) =>
62
- Promise . resolve ( new ResponseWrapper ( body , init ) )
63
- )
64
- } )
61
+ responses . forEach ( ( [ bodyOrPromise , init ] ) => fetch . mockImplementationOnce ( resolve ( bodyOrPromise , init ) ) )
65
62
return fetch
66
63
}
67
64
0 commit comments