Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added support to multiple Axios instances. Added params to md5 digest. Recording and Replaying 404 requests. #11

Open
wants to merge 9 commits into
base: master
Choose a base branch
from
11 changes: 8 additions & 3 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,17 @@ const ResponseMiddleware = require('./lib/ResponseMiddleware');

const cassettes = {}

function mountCassette(cassettePath) {
const axios = require('axios');
function mountCassette(cassettePath, client) {
let axios = null;
if ( client == null ) {
axios = require('axios');
} else {
axios = client;
}

let responseInterceptor = axios.interceptors.response.use(
ResponseMiddleware.success(cassettePath),
ResponseMiddleware.failure
ResponseMiddleware.failure(cassettePath)
);

let requestInterceptor = axios.interceptors.request.use(
Expand Down
15 changes: 13 additions & 2 deletions lib/RequestMiddleware.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
const digest = require('./digest')
const jsonDB = require('./jsonDb')
const createError = require('axios/lib/core/createError');

function loadFixture(cassettePath, axiosConfig) {
let requestKey = digest(axiosConfig)
Expand All @@ -26,9 +27,19 @@ exports.success = function (cassettePath) {

return loadFixture(cassettePath, axiosConfig).then(function(cassette) {
axiosConfig.adapter = function() {
return new Promise(function(resolve) {
return new Promise(function(resolve, reject) {
cassette.originalResponseData.fixture = true
return resolve(cassette.originalResponseData)
if ( cassette.originalResponseData && 404 == cassette.originalResponseData.status ) {
return reject(createError(
'Request failed with status code ' + cassette.originalResponseData.status,
cassette.originalResponseData.config,
null,
cassette.originalResponseData.request,
cassette.originalResponseData
))
} else {
return resolve(cassette.originalResponseData)
}
});
}
return axiosConfig
Expand Down
12 changes: 10 additions & 2 deletions lib/ResponseMiddleware.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ function serialize(response) {
function storeFixture(cassettePath, response) {
let requestKey = digest(response.config)
let fixture = serialize(response)

return jsonDB.writeAt(cassettePath, requestKey, fixture)
}

Expand All @@ -40,6 +41,13 @@ exports.success = function (cassettePath) {
}
}

exports.failure = function(error) {
return Promise.reject(error)
exports.failure = function(cassettePath) {
return function(error) {
if ( error && error.response && "404" == error.response.status ) {
return storeFixture(cassettePath, error.response).then(function(){
return Promise.reject(error)
})
}
return Promise.reject(error)
}
}
4 changes: 2 additions & 2 deletions lib/digest.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ function key(axiosConfig) {
let method = axiosConfig.method
let data = axiosConfig.data
let headers = axiosConfig.headers
let params = axiosConfig.params

if (_.isString(data)) {
data = JSON.parse(data)
Expand All @@ -27,8 +28,7 @@ function key(axiosConfig) {
headers = _.omit(headers, [
'Content-Length', 'content-length'
])

return md5(JSON.stringify({ url, method, data, headers }))
return md5(JSON.stringify({ url, method, data, headers, params }))
}

module.exports = key
6 changes: 3 additions & 3 deletions lib/jsonDb.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const fs = require('fs-promise')
const fs = require('fs-extra')
const _ = require('lodash')
const mkdirp = require('mkdirp')
const getDirName = require('path').dirname
Expand All @@ -11,14 +11,14 @@ function loadAt(filePath, jsonPath) {
let value = _.get(json, jsonPath)
if (!_.isUndefined(value))
return value
else
else {
throw "Invalid JSON Path"
}
})
}

function writeAt(filePath, jsonPath, value) {
mkdirp.sync(getDirName(filePath))

return fs.readJson(filePath).then(function(json) {
_.set(json, jsonPath, value)
return fs.writeJson(filePath, json)
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
"rimraf": "^2.5.2"
},
"dependencies": {
"fs-promise": "^0.5.0",
"fs-extra": "^3.0.0",
"lodash": "^4.13.1",
"md5": "^2.1.0",
"mkdirp": "^0.5.1"
Expand Down