Skip to content

Commit

Permalink
feat: suffix fixture URLs with fixture IDs
Browse files Browse the repository at this point in the history
BREAKING CHANGE: Before, a returned fixture URL looked like this

```
http://localhost:3000/api.github.com
```

All requests required a `X-Fixtures-Id` header set to the fixtures ID received before.

Now the Returned URL looks like this

```
http://localhost:3000/api.github.com/123fixturesid456
```

The `X-Fixtures-Id` header is now obsolete.
  • Loading branch information
gr2m committed Feb 14, 2018
1 parent 1af73dd commit ba5c9a4
Show file tree
Hide file tree
Showing 4 changed files with 18 additions and 27 deletions.
2 changes: 1 addition & 1 deletion index.js
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ function fixtureServereMiddleware (options) {

response.status(201).json({
id,
url: urlResolve(state.fixturesUrl, urlParse(requestedFixture[0].scope).hostname)
url: urlResolve(state.fixturesUrl, urlParse(requestedFixture[0].scope).hostname + '/' + id)
})
})

Expand Down
5 changes: 2 additions & 3 deletions lib/additions.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,13 @@ module.exports = fixtureAdditions
const mapValuesDeep = require('./map-values-deep')

function fixtureAdditions (state, {id, fixture}) {
fixture.reqheaders['x-fixtures-id'] = id
fixture = mapValuesDeep(fixture, value => {
if (typeof value !== 'string') {
return value
}

// e.g. https://api.github.com/user -> http://localhost/api.github.com/user
return value.replace(/https?:\/\/([^/]+)\//, `${state.fixturesUrl}/$1/`)
// e.g. https://api.github.com/user -> http://localhost/api.github.com/fixturesid123/user
return value.replace(/https?:\/\/([^/]+)\//, `${state.fixturesUrl}/$1/${id}/`)
})

fixture.headers['content-length'] = String(calculateBodyLength(fixture.response))
Expand Down
11 changes: 5 additions & 6 deletions lib/proxy.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,12 @@ function proxy (state, {target}) {
const middleware = express.Router()
const hostname = urlParse(target).hostname

middleware.use(`/${hostname}`, validateRequest.bind(null, state), httpProxyMiddleware({
middleware.use(`/${hostname}/:fixturesId`, validateRequest.bind(null, state), httpProxyMiddleware({
target: target,
changeOrigin: true,
logLevel: state.logLevel,
pathRewrite: {
'^/[^/]+/': '/'
'^/[^/]+/[\\w]+/': '/'
},
onError (error, request, response) {
/* istanbul ignore if */
Expand Down Expand Up @@ -48,11 +48,10 @@ function proxy (state, {target}) {
}, null, 2) + '\n')
},
onProxyRes (proxyRes, request, response) {
const fixturesId = request.headers['x-fixtures-id']
const mock = state.cachimo.get(fixturesId)
const mock = state.cachimo.get(request.params.fixturesId)
if (mock.isDone()) {
state.cachimo.remove(fixturesId)
state.log.debug(`Fixtures "${fixturesId}" completed`)
state.cachimo.remove(request.params.fixturesId)
state.log.debug(`Fixtures "${request.params.fixturesId}" completed`)
}
}
}))
Expand Down
27 changes: 10 additions & 17 deletions lib/request-validation-middleware.js
Original file line number Diff line number Diff line change
@@ -1,26 +1,19 @@
module.exports = requireFixturesId
module.exports = requestValidationMiddleware

const urlParse = require('url').parse

function requireFixturesId (state, req, res, next) {
if (!req.headers['accept']) {
return res.status(400).json({
function requestValidationMiddleware (state, request, response, next) {
if (!request.headers['accept']) {
return response.status(400).json({
error: 'Accept header required'
})
}

const fixturesId = req.headers['x-fixtures-id']
if (!fixturesId) {
return res.status(400).json({
error: 'X-Fixtures-Id header required'
})
}

const mock = state.cachimo.get(fixturesId)
const mock = state.cachimo.get(request.params.fixturesId)

if (!mock) {
return res.status(404).json({
error: `Fixture "${fixturesId}" not found`
return response.status(404).json({
error: `Fixture "${request.params.fixturesId}" not found`
})
}

Expand All @@ -29,9 +22,9 @@ function requireFixturesId (state, req, res, next) {
const nextFixtureMethod = nextFixture.split(' ')[0].toUpperCase()
const nextFixturePath = urlParse(nextFixture.substr(nextFixtureMethod.length + 1)).pathname

if (req.method !== nextFixtureMethod || req.path !== nextFixturePath) {
return res.status(404).json({
error: `${req.method} ${req.path} does not match next fixture: ${nextFixtureMethod} ${nextFixturePath}`
if (request.method !== nextFixtureMethod || request.path !== nextFixturePath) {
return response.status(404).json({
error: `${request.method} ${request.path} does not match next fixture: ${nextFixtureMethod} ${nextFixturePath}`
})
}

Expand Down

0 comments on commit ba5c9a4

Please sign in to comment.