diff --git a/lib/core/mergeConfig.js b/lib/core/mergeConfig.js index ad7d0f8..1da9040 100644 --- a/lib/core/mergeConfig.js +++ b/lib/core/mergeConfig.js @@ -16,18 +16,20 @@ module.exports = function mergeConfig(config1, config2) { var config = {}; utils.forEach(['url', 'method', 'params', 'data'], function valueFromConfig2(prop) { - config[prop] = config2[prop]; + if (typeof config2[prop] !== 'undefined') { + config[prop] = config2[prop]; + } }); - utils.forEach(['headers', 'auth', 'proxy'], function mergeValues(prop) { - if (typeof config2[prop] !== 'undefined') { - if (typeof config2[prop] === 'object') { - config[prop] = utils.deepMerge(config1[prop], config2[prop]); - } else { - config[prop] = config2[prop]; - } - } else if (typeof config1[prop] !== 'undefined') { + utils.forEach(['headers', 'auth', 'proxy'], function mergeDeepProperties(prop) { + if (utils.isObject(config2[prop])) { + config[prop] = utils.deepMerge(config1[prop], config2[prop]); + } else if (typeof config2[prop] !== 'undefined') { + config[prop] = config2[prop]; + } else if (utils.isObject(config1[prop])) { config[prop] = utils.deepMerge(config1[prop]); + } else if (typeof config1[prop] !== 'undefined') { + config[prop] = config1[prop]; } }); @@ -37,7 +39,11 @@ module.exports = function mergeConfig(config1, config2) { 'xsrfHeaderName', 'onUploadProgress', 'onDownloadProgress', 'maxContentLength', 'validateStatus', 'maxRedirects', 'httpAgent', 'httpsAgent', 'cancelToken' ], function defaultToConfig2(prop) { - config[prop] = typeof config2[prop] === 'undefined' ? config1[prop] : config2[prop]; + if (typeof config2[prop] !== 'undefined') { + config[prop] = config2[prop]; + } else if (typeof config1[prop] !== 'undefined') { + config[prop] = config1[prop]; + } }); return config; diff --git a/lib/defaults.js b/lib/defaults.js index e1bc1ca..65a25d5 100644 --- a/lib/defaults.js +++ b/lib/defaults.js @@ -26,7 +26,6 @@ function getDefaultAdapter() { } var defaults = { - method: 'get', adapter: getDefaultAdapter(), transformRequest: [function transformRequest(data, headers) { diff --git a/test/specs/core/mergeConfig.spec.js b/test/specs/core/mergeConfig.spec.js new file mode 100644 index 0000000..bf6d209 --- /dev/null +++ b/test/specs/core/mergeConfig.spec.js @@ -0,0 +1,69 @@ +var defaults = require('../../../lib/defaults'); +var mergeConfig = require('../../../lib/core/mergeConfig'); + +describe('core::mergeConfig', function() { + it('should accept undefined for second argument', function() { + expect(mergeConfig(defaults, undefined)).toEqual(defaults); + }); + + it('should accept an object for second argument', function() { + expect(mergeConfig(defaults, {})).toEqual(defaults); + }); + + it('should not leave references', function() { + var merged = mergeConfig(defaults, {}); + expect(merged).not.toBe(defaults); + expect(merged.headers).not.toBe(defaults.headers); + }); + + it('should allow setting request options', function() { + var config = { + url: '__sample url__', + method: '__sample method__', + params: '__sample params__', + data: { foo: true } + }; + var merged = mergeConfig(defaults, config); + expect(merged.url).toEqual(config.url); + expect(merged.method).toEqual(config.method); + expect(merged.params).toEqual(config.params); + expect(merged.data).toEqual(config.data); + }); + + it('should not inherit request options', function() { + var localDefaults = { + url: '__sample url__', + method: '__sample method__', + params: '__sample params__', + data: { foo: true } + }; + var merged = mergeConfig(localDefaults, {}); + expect(merged.url).toEqual(undefined); + expect(merged.method).toEqual(undefined); + expect(merged.params).toEqual(undefined); + expect(merged.data).toEqual(undefined); + }); + + it('should merge auth, headers, proxy with defaults', function() { + expect(mergeConfig({ auth: undefined }, { auth: { user: 'foo', pass: 'test' } })).toEqual({ + auth: { user: 'foo', pass: 'test' } + }); + expect(mergeConfig({ auth: { user: 'foo', pass: 'test' } }, { auth: { pass: 'foobar' } })).toEqual({ + auth: { user: 'foo', pass: 'foobar' } + }); + }); + + it('should overwrite auth, headers, proxy with a non-object value', function() { + expect(mergeConfig({ auth: { user: 'foo', pass: 'test' } }, { auth: false })).toEqual({ + auth: false + }); + expect(mergeConfig({ auth: { user: 'foo', pass: 'test' } }, { auth: null })).toEqual({ + auth: null + }); + }); + + it('should allow setting other options', function() { + var merged = mergeConfig(defaults, { timeout: 123 }); + expect(merged.timeout).toEqual(123); + }); +});