Skip to content

Commit 143bbbe

Browse files
committed
Spec for mergeConfig, finalize logic
1 parent ff61caa commit 143bbbe

File tree

3 files changed

+85
-11
lines changed

3 files changed

+85
-11
lines changed

lib/core/mergeConfig.js

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,20 @@ module.exports = function mergeConfig(config1, config2) {
1616
var config = {};
1717

1818
utils.forEach(['url', 'method', 'params', 'data'], function valueFromConfig2(prop) {
19-
config[prop] = config2[prop];
19+
if (typeof config2[prop] !== 'undefined') {
20+
config[prop] = config2[prop];
21+
}
2022
});
2123

22-
utils.forEach(['headers', 'auth', 'proxy'], function mergeValues(prop) {
23-
if (typeof config2[prop] !== 'undefined') {
24-
if (typeof config2[prop] === 'object') {
25-
config[prop] = utils.deepMerge(config1[prop], config2[prop]);
26-
} else {
27-
config[prop] = config2[prop];
28-
}
29-
} else if (typeof config1[prop] !== 'undefined') {
24+
utils.forEach(['headers', 'auth', 'proxy'], function mergeDeepProperties(prop) {
25+
if (utils.isObject(config2[prop])) {
26+
config[prop] = utils.deepMerge(config1[prop], config2[prop]);
27+
} else if (typeof config2[prop] !== 'undefined') {
28+
config[prop] = config2[prop];
29+
} else if (utils.isObject(config1[prop])) {
3030
config[prop] = utils.deepMerge(config1[prop]);
31+
} else if (typeof config1[prop] !== 'undefined') {
32+
config[prop] = config1[prop];
3133
}
3234
});
3335

@@ -37,7 +39,11 @@ module.exports = function mergeConfig(config1, config2) {
3739
'xsrfHeaderName', 'onUploadProgress', 'onDownloadProgress', 'maxContentLength',
3840
'validateStatus', 'maxRedirects', 'httpAgent', 'httpsAgent', 'cancelToken'
3941
], function defaultToConfig2(prop) {
40-
config[prop] = typeof config2[prop] === 'undefined' ? config1[prop] : config2[prop];
42+
if (typeof config2[prop] !== 'undefined') {
43+
config[prop] = config2[prop];
44+
} else if (typeof config1[prop] !== 'undefined') {
45+
config[prop] = config1[prop];
46+
}
4147
});
4248

4349
return config;

lib/defaults.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ function getDefaultAdapter() {
2626
}
2727

2828
var defaults = {
29-
method: 'get',
3029
adapter: getDefaultAdapter(),
3130

3231
transformRequest: [function transformRequest(data, headers) {

test/specs/core/mergeConfig.spec.js

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
var defaults = require('../../../lib/defaults');
2+
var mergeConfig = require('../../../lib/core/mergeConfig');
3+
4+
describe('core::mergeConfig', function() {
5+
it('should accept undefined for second argument', function() {
6+
expect(mergeConfig(defaults, undefined)).toEqual(defaults);
7+
});
8+
9+
it('should accept an object for second argument', function() {
10+
expect(mergeConfig(defaults, {})).toEqual(defaults);
11+
});
12+
13+
it('should not leave references', function() {
14+
var merged = mergeConfig(defaults, {});
15+
expect(merged).not.toBe(defaults);
16+
expect(merged.headers).not.toBe(defaults.headers);
17+
});
18+
19+
it('should allow setting request options', function() {
20+
var config = {
21+
url: '__sample url__',
22+
method: '__sample method__',
23+
params: '__sample params__',
24+
data: { foo: true }
25+
};
26+
var merged = mergeConfig(defaults, config);
27+
expect(merged.url).toEqual(config.url);
28+
expect(merged.method).toEqual(config.method);
29+
expect(merged.params).toEqual(config.params);
30+
expect(merged.data).toEqual(config.data);
31+
});
32+
33+
it('should not inherit request options', function() {
34+
var localDefaults = {
35+
url: '__sample url__',
36+
method: '__sample method__',
37+
params: '__sample params__',
38+
data: { foo: true }
39+
};
40+
var merged = mergeConfig(localDefaults, {});
41+
expect(merged.url).toEqual(undefined);
42+
expect(merged.method).toEqual(undefined);
43+
expect(merged.params).toEqual(undefined);
44+
expect(merged.data).toEqual(undefined);
45+
});
46+
47+
it('should merge auth, headers, proxy with defaults', function() {
48+
expect(mergeConfig({ auth: undefined }, { auth: { user: 'foo', pass: 'test' } })).toEqual({
49+
auth: { user: 'foo', pass: 'test' }
50+
});
51+
expect(mergeConfig({ auth: { user: 'foo', pass: 'test' } }, { auth: { pass: 'foobar' } })).toEqual({
52+
auth: { user: 'foo', pass: 'foobar' }
53+
});
54+
});
55+
56+
it('should overwrite auth, headers, proxy with a non-object value', function() {
57+
expect(mergeConfig({ auth: { user: 'foo', pass: 'test' } }, { auth: false })).toEqual({
58+
auth: false
59+
});
60+
expect(mergeConfig({ auth: { user: 'foo', pass: 'test' } }, { auth: null })).toEqual({
61+
auth: null
62+
});
63+
});
64+
65+
it('should allow setting other options', function() {
66+
var merged = mergeConfig(defaults, { timeout: 123 });
67+
expect(merged.timeout).toEqual(123);
68+
});
69+
});

0 commit comments

Comments
 (0)