From 662d32e7f88c00fb35ca509aff71e6ecf72214c5 Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Sun, 10 May 2015 12:23:08 +0100 Subject: [PATCH] added status response shorthand --- README.md | 18 ++++++++---------- src/fetch-mock.js | 6 +++++- test/spec.js | 16 ++++++++++++++++ 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index a575cc93..c00d134b 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,8 @@ Mock http requests made using fetch (or isomorphic-fetch) *notes* -- When using isomorphic-fetch or node-fetch fetch should be added as a global -- fetch-mock doesn't declare fetch or Promise as dependencies; as you're testing `fetch` it's assumed you're already taking care of these globals +- When using isomorphic-fetch or node-fetch `fetch` should be added as a global +- fetch-mock doesn't declare `fetch` or `Promise` as dependencies; as you're testing `fetch` it's assumed you're already taking care of these globals - If you prefer documentation by example skip to the bottom of this README ## API @@ -11,18 +11,19 @@ Mock http requests made using fetch (or isomorphic-fetch) `require('fetch-mock')` exports a singleton with the following methods ### `mock(config)` -Replaces `fetch()` with a sinon stub which, in addition to the default sinon behaviour, records each of its calls and optionally returns a stub response or passes the call through to `fetch()`. `config` is an optional* object with the following properties. +Replaces `fetch()` with a sinon stub which, in addition to the default sinon behaviour, records it's calls, grouped by route, and optionally returns a stub response or passes the call through to `fetch()`. `config` is an optional* object with the following properties. -* `routes`: Either a single object or an array of similar objects each defining how the mock handles a given request. Each route object must have the following properties. If multiple routes are specified the first matching route will be used to define the response +* `routes`: Either a single object or an array of similar objects each defining how the mock handles a given request. If multiple routes are specified the first matching route will be used to define the response. Each route object must have the following properties. * `name`: A unique string naming the route * `matcher`: The rule for matching calls to `fetch()`. Accepts any of the following * `string`: Either an exact url to match e.g. 'http://www.site.com/page.html' or, if the string begins with a `^`, the string following the `^` must begin the url e.g. '^http://www.site.com' would match 'http://www.site.com' or 'http://www.site.com/page.html' * `RegExp`: A regular expression to test the url against - * `Function(url, opts)`: A function that is passed the url and opts `fetch` is called with and that returns a Boolean + * `Function(url, opts)`: A function that is passed the url and opts `fetch()` is called with and that returns a Boolean * `response`: Configures the response object returned by the mock. Can take any of the following values + * `number`: creates a response with the number as the response status * `string`: creates a 200 response with the string as the response body * `object`: If the object contains any of the properties body, status, headers, throws; then these properties - all of them optional - are used to construct a response as follows - * `body`: Retunred in the response body + * `body`: Returned in the response body * `status`: Returned in the response status * `headers`: Returned in the response headers. They should be defined as an object literal (property names case-insensitive) which will be converted to a `Headers` instance * `throws`: If this property is present then a `Promise` rejected with the value of `throws` is returned @@ -68,7 +69,7 @@ Returns a Boolean denoting whether any calls matched the given route Normally calling `mock()` twice without restoring inbetween will throw an error. `reMock()` calls `restore()` internally before calling `mock()` again. This allows you to put a generic call to `mock()` in a `beforeEach()` while retaining the flexibility to vary the responses for some tests ### `registerRoute(name, matcher, response)` -Often your application/module will always need responses for some calls in order to initialise properly, even if the content of those calls are not the subject of a given test e.g. a mock response from an authentication service and a lti-variant testing service might be necessary in order to test the UI for a version of a log in form. It's helpful to be able to define some default responses for these services which will exist throughout all or a large subset of your tests. `registerRoute()` aims to fulfil this need. All these predefined routes can be overridden when `mock(config)` is called. +Often your application/module will need a mocked response for some http requests in order to initialise properly, even if the content of those calls are not the subject of a given test e.g. a mock response from an authentication service and a multi-variant testing service might be necessary in order to test the UI for a version of a log in form. It's helpful to be able to define some default responses for these services which will exist throughout all or a large subset of your tests. `registerRoute()` aims to fulfil this need. All these predefined routes can be overridden when `mock(config)` is called. `registerRoute()` takes either of the following parameters * `object`: An object similar to the route objects accepted by `mock()` @@ -78,8 +79,6 @@ Often your application/module will always need responses for some calls in order ### `unregisterRoute(name)` Unregisters one or more previously registered routes. Accepts either a string or an array of strings - - ## Example ```javascript @@ -156,7 +155,6 @@ describe('content', function () { }); after(function () { - // I wonder what this does?? fetchMock.unregisterRoute('content'); }) diff --git a/src/fetch-mock.js b/src/fetch-mock.js index 75ab54fa..2b0bd748 100644 --- a/src/fetch-mock.js +++ b/src/fetch-mock.js @@ -10,7 +10,11 @@ var theGlobal; function mockResponse (url, config) { // allow just body to be passed in as this is the commonest use case - if (typeof config === 'string' || !(config.body || config.headers || config.throws || config.status)) { + if (typeof config === 'number') { + config = { + status: config + }; + } else if (typeof config === 'string' || !(config.body || config.headers || config.throws || config.status)) { config = { body: config }; diff --git a/test/spec.js b/test/spec.js index a1868eb2..50820b49 100644 --- a/test/spec.js +++ b/test/spec.js @@ -333,6 +333,22 @@ module.exports = function (fetchMock, theGlobal) { }); describe('responses', function () { + + it('respond with a status', function (done) { + fetchMock.mock({ + routes: { + name: 'route', + matcher: 'http://it.at.there', + response: 300 + } + }); + fetch('http://it.at.there') + .then(function (res) { + expect(res.status).to.equal(300); + done(); + }); + }); + it('respond with a string', function (done) { fetchMock.mock({ routes: {