-
Notifications
You must be signed in to change notification settings - Fork 171
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
cb44374
commit ac8e5b0
Showing
25 changed files
with
4,506 additions
and
3,644 deletions.
There are no files selected for viewing
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -5,3 +5,4 @@ npm-debug.log | |
coverage/ | ||
/test/fixtures/built-sw.js | ||
.nyc_output | ||
.eslintcache |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
# Upgrading from V6 to V7 | ||
|
||
Most changes are relatively minor and shouldn't affect most users. | ||
|
||
# Changes | ||
|
||
## `throws` option now rejects a Promise | ||
A regression was introduced in v6 whereby the `throws: true` option woudl throw an uncaught error. The `fetch` api catches all its internal errors and returns a rejected `Promise` in every case, so this change has been reverted to be more useful for mocking typical `fetch` errors. | ||
|
||
## Responses are wrapped in an ES Proxy | ||
This is to enable a more powerful `flush()` method, able to wait for asynchronous resolution of response methods such as `.json()` and `.text()`. `flush(true)` will resolve only when Promises returnes by any response methods called before `flush()` have resolved | ||
|
||
## Supports resolving dots in urls | ||
As resolving `../` and `./` as relative paths is [speced url behaviour](https://url.spec.whatwg.org/#double-dot-path-segment), fetch-mock has been updated to also do this resolution when matching urls. URLs are normalised _before_ any matchers try to match against them as, to the `fetch` api, `http://thing/decoy/../quarry` is indistinguishable from `http://thing/quarry`, so it would make no sense to allow different mocking based on which variant is used. | ||
|
||
## Agnostic as to whether hosts have a trailing slash or not | ||
A side-effect of the above normalisation - using [whatwg-url](https://www.npmjs.com/package/whatwg-url) - is that fetch-mock is no longer able to distinguish between pathless URLs which do/do not end in a trailing slash i.e. `http://thing` behaves exactly the same as `http://thing/` when used in any of the library's APIs, and any mocks that match one will match the other. As mentioned above, URL normalization happens _before_ any matching is attempted. | ||
|
||
## Request instances are normalized early to [url, options] pairs | ||
The `fetch` api can be called with either a `Request` object or a `url` with an `options` object. To make the library easier to maintain and its APIs - in particular the call inspecting APIs such as `called()` - agnostic as to how `fetch` was called, Request objects are normalised early into `url`, `options` pairs. So the fetch args returned by `calls()` will always be of the form `[url, options]` even if `fetch` was called with a `Request` object. The original `Request` object is still provided as a third item in the args array in case it is needed. | ||
|
||
## Exporting as property | ||
`fetch-mock` now has a property `fetchMock`, which means the libarry can be imported using any of the below | ||
|
||
```js | ||
const fetchMock = require('fetch-mock'); | ||
const fetchMock = require('fetch-mock').fetchMock; | ||
const { fetchMock } = require('fetch-mock'); | ||
``` | ||
|
||
The reason for this should become clear in the next point | ||
|
||
## Adds MATCHED and UNMATCHED constants | ||
The inspection APIs e.g. `calls()` can be passed `true` or `false` to return matched/unmatched calls respectively. To aid with more comprehensible code, fetchMock now exports `MATCHED` and `UNMATCHED` constants, equal to `true` and `false`. Using `true` or `false` still works, but I'd recommend using the constants. Compare the readbility of the following: | ||
|
||
```js | ||
const { fetchMock, MATCHED, UNMATCHED } = require('fetch-mock'); | ||
|
||
fetchMock.called(true); | ||
fetchMock.called(MATCHED); | ||
``` | ||
|
||
## Able to match requests based on the path of the url | ||
`fetchMock.mock('path:/apples/pears')` Will match any url whose `path` part is `apples/pears` | ||
|
||
## More powerful inspection filtering | ||
Previously, any filter passed in to `calls(filter)` etc... would always be converted to a string and then be used to lookup whether any fetch calls had been handled by a route matcher that also had the same `toString()` value. This is still the case, but if no calls match, then the filter will be converted into an on the fly route matcher, which is then used to filter the list of calls that were handled by fetch. This measn e.g. you can use any regex or glob to filter the calls. | ||
|
||
### Example | ||
```js | ||
fetchMock.mock('*', 200) | ||
await fetch('/main-course/lasagne', {method: 'POST', headers: {discount: true}}); | ||
await fetch('/main-course/bolognaise'); | ||
|
||
fetchMock.called(/l.+gne/) // true | ||
fetchMock.called('glob:/*/lasagne', {method: 'post'}) // true | ||
fetchMock.called((url, options) => options.headers.discount) // true | ||
``` | ||
And, copied directly from the API docs: | ||
|
||
Most of the methods below accept two parameters, `(filter, options)` | ||
- `filter` Enables filtering fetch calls for the most commonly use cases. The behaviour can be counterintuitive. The following rules, applied in the order they are described, are used to try to retrieve calls. If any rule retrieves no calls the next rule will be tried. | ||
- If `filter` is `undefined` all calls, matched _and_ unmatched, are returned | ||
- If `filter` is `true` (or `fetchMock.MATCHED`) all calls that matched some route are returned | ||
- If `filter` is `false` (or `fetchMock.UNMATCHED`) all calls that did not match any route are returned (when `.spy()`, `catch()` or `config.fallThroughToNetwork` were used to prevent errors being thrown) | ||
- If `filter` is the name of a named route, all calls handled by that route are returned | ||
- If `filter` is equal to `matcher` or `matcher.toString()` for a route, all calls handled by that route are returned | ||
- `filter` is executed using the same execution plan as matchers used in `.mock()`. Any calls matched by it will be returned. If `options` is also passed this is used in a similar way to the options used by `mock()`. Alternatively, `options` can be a string specifying a `method` to filter by | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.