| 66 | }; |
| 67 | |
| 68 | const stubFetch = (win, routes) => { |
| 69 | const fetch = win.fetch; |
| 70 | cy.stub(win, 'fetch').callsFake((...args) => { |
| 71 | let routeIndex = routes.findIndex(r => matchRoute(r, args)); |
| 72 | if (routeIndex >= 0) { |
| 73 | let route = routes.splice(routeIndex, 1)[0]; |
| 74 | const message = `matched ${args[0]} to ${route.url} ${route.method} ${route.status}`; |
| 75 | console.log(message); |
| 76 | if (route.status === 302) { |
| 77 | console.log(`resolving redirect to ${route.headers.Location}`); |
| 78 | routeIndex = routes.findIndex(r => matchRoute(r, [route.headers.Location])); |
| 79 | route = routes.splice(routeIndex, 1)[0]; |
| 80 | } |
| 81 | |
| 82 | let blob; |
| 83 | if (route.response && route.response.encoding === 'base64') { |
| 84 | const buffer = Buffer.from(route.response.content, 'base64'); |
| 85 | blob = new Blob([buffer]); |
| 86 | } else { |
| 87 | blob = new Blob([route.response || '']); |
| 88 | } |
| 89 | const fetchResponse = { |
| 90 | status: route.status, |
| 91 | headers: new Headers(route.headers), |
| 92 | blob: () => Promise.resolve(blob), |
| 93 | text: () => Promise.resolve(route.response), |
| 94 | json: () => Promise.resolve(JSON.parse(route.response)), |
| 95 | ok: route.status >= 200 && route.status <= 299, |
| 96 | }; |
| 97 | return Promise.resolve(fetchResponse); |
| 98 | } else if ( |
| 99 | args[0].includes('api.github.com') || |
| 100 | args[0].includes('api.bitbucket.org') || |
| 101 | args[0].includes('bitbucket.org') || |
| 102 | args[0].includes('api.media.atlassian.com') || |
| 103 | args[0].includes('gitlab.com') || |
| 104 | args[0].includes('netlify.com') || |
| 105 | args[0].includes('s3.amazonaws.com') |
| 106 | ) { |
| 107 | console.warn( |
| 108 | `No route match for api request. Fetch args: ${JSON.stringify(args)}. Returning 404`, |
| 109 | ); |
| 110 | const fetchResponse = { |
| 111 | status: 404, |
| 112 | headers: new Headers(), |
| 113 | blob: () => Promise.resolve(new Blob(['{}'])), |
| 114 | text: () => Promise.resolve('{}'), |
| 115 | json: () => Promise.resolve({}), |
| 116 | ok: false, |
| 117 | }; |
| 118 | return Promise.resolve(fetchResponse); |
| 119 | } else { |
| 120 | console.log(`No route match for fetch args: ${JSON.stringify(args)}`); |
| 121 | return fetch(...args); |
| 122 | } |
| 123 | }); |
| 124 | }; |
| 125 | |