Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

Commit 99ad41f

Browse files
committed
refactor(ngMocks): clean up MockHttpExpectation
1 parent 132344c commit 99ad41f

File tree

1 file changed

+87
-79
lines changed

1 file changed

+87
-79
lines changed

src/ngMock/angular-mocks.js

+87-79
Original file line numberDiff line numberDiff line change
@@ -2096,112 +2096,120 @@ function stripQueryAndHash(url) {
20962096
return url.replace(/[?#].*$/, '');
20972097
}
20982098

2099-
function MockHttpExpectation(method, url, data, headers, keys) {
2099+
function MockHttpExpectation(expectedMethod, expectedUrl, expectedData, expectedHeaders,
2100+
expectedKeys) {
21002101

2101-
function getUrlParams(u) {
2102-
var params = u.slice(u.indexOf('?') + 1).split('&');
2103-
return params.sort();
2104-
}
2105-
2106-
function compareUrl(u) {
2107-
return (url.slice(0, url.indexOf('?')) === u.slice(0, u.indexOf('?')) &&
2108-
getUrlParams(url).join() === getUrlParams(u).join());
2109-
}
2110-
2111-
this.data = data;
2112-
this.headers = headers;
2102+
this.data = expectedData;
2103+
this.headers = expectedHeaders;
21132104

2114-
this.match = function(m, u, d, h) {
2115-
if (method !== m) return false;
2116-
if (!this.matchUrl(u)) return false;
2117-
if (angular.isDefined(d) && !this.matchData(d)) return false;
2118-
if (angular.isDefined(h) && !this.matchHeaders(h)) return false;
2105+
this.match = function(method, url, data, headers) {
2106+
if (expectedMethod !== method) return false;
2107+
if (!this.matchUrl(url)) return false;
2108+
if (angular.isDefined(data) && !this.matchData(data)) return false;
2109+
if (angular.isDefined(headers) && !this.matchHeaders(headers)) return false;
21192110
return true;
21202111
};
21212112

2122-
this.matchUrl = function(u) {
2123-
if (!url) return true;
2124-
if (angular.isFunction(url.test)) return url.test(u);
2125-
if (angular.isFunction(url)) return url(u);
2126-
return (url === u || compareUrl(u));
2113+
this.matchUrl = function(url) {
2114+
if (!expectedUrl) return true;
2115+
if (angular.isFunction(expectedUrl.test)) return expectedUrl.test(url);
2116+
if (angular.isFunction(expectedUrl)) return expectedUrl(url);
2117+
return (expectedUrl === url || compareUrlWithQuery(url));
21272118
};
21282119

2129-
this.matchHeaders = function(h) {
2130-
if (angular.isUndefined(headers)) return true;
2131-
if (angular.isFunction(headers)) return headers(h);
2132-
return angular.equals(headers, h);
2120+
this.matchHeaders = function(headers) {
2121+
if (angular.isUndefined(expectedHeaders)) return true;
2122+
if (angular.isFunction(expectedHeaders)) return expectedHeaders(headers);
2123+
return angular.equals(expectedHeaders, headers);
21332124
};
21342125

2135-
this.matchData = function(d) {
2136-
if (angular.isUndefined(data)) return true;
2137-
if (data && angular.isFunction(data.test)) return data.test(d);
2138-
if (data && angular.isFunction(data)) return data(d);
2139-
if (data && !angular.isString(data)) {
2140-
return angular.equals(angular.fromJson(angular.toJson(data)), angular.fromJson(d));
2126+
this.matchData = function(data) {
2127+
if (angular.isUndefined(expectedData)) return true;
2128+
if (expectedData && angular.isFunction(expectedData.test)) return expectedData.test(data);
2129+
if (expectedData && angular.isFunction(expectedData)) return expectedData(data);
2130+
if (expectedData && !angular.isString(expectedData)) {
2131+
return angular.equals(angular.fromJson(angular.toJson(expectedData)), angular.fromJson(data));
21412132
}
21422133
// eslint-disable-next-line eqeqeq
2143-
return data == d;
2134+
return expectedData == data;
21442135
};
21452136

21462137
this.toString = function() {
2147-
return method + ' ' + url;
2138+
return expectedMethod + ' ' + expectedUrl;
21482139
};
21492140

2150-
this.params = function(u) {
2151-
var queryStr = u.indexOf('?') === -1 ? '' : u.substring(u.indexOf('?') + 1);
2152-
var strippedUrl = stripQueryAndHash(u);
2141+
this.params = function(url) {
2142+
var queryStr = url.indexOf('?') === -1 ? '' : url.substring(url.indexOf('?') + 1);
2143+
var strippedUrl = stripQueryAndHash(url);
21532144

2154-
return angular.extend(parseQuery(queryStr), pathParams(strippedUrl));
2145+
return angular.extend(extractParamsFromQuery(queryStr), extractParamsFromPath(strippedUrl));
2146+
};
21552147

2156-
function pathParams(strippedUrl) {
2157-
var keyObj = {};
2158-
if (!url || !angular.isFunction(url.test) || !keys || keys.length === 0) return keyObj;
2148+
function compareUrlWithQuery(url) {
2149+
var urlWithQueryRe = /^([^?]*)\?(.*)$/;
21592150

2160-
var m = url.exec(strippedUrl);
2161-
if (!m) return keyObj;
2151+
var expectedMatch = urlWithQueryRe.exec(expectedUrl);
2152+
var actualMatch = urlWithQueryRe.exec(url);
21622153

2163-
for (var i = 1, len = m.length; i < len; ++i) {
2164-
var key = keys[i - 1];
2165-
var val = m[i];
2166-
if (key && val) {
2167-
keyObj[key.name || key] = val;
2168-
}
2169-
}
2154+
return !!(expectedMatch && actualMatch) &&
2155+
(expectedMatch[1] === actualMatch[1]) &&
2156+
(normalizeQuery(expectedMatch[2]) === normalizeQuery(actualMatch[2]));
2157+
}
21702158

2171-
return keyObj;
2172-
}
2159+
function normalizeQuery(queryStr) {
2160+
return queryStr.split('&').sort().join('&');
2161+
}
21732162

2174-
function parseQuery(queryStr) {
2175-
var obj = {},
2176-
keyValuePairs = queryStr.split('&').
2177-
filter(angular.identity). // Ignore empty segments.
2178-
map(function(keyValue) { return keyValue.replace(/\+/g, '%20').split('='); });
2179-
2180-
angular.forEach(keyValuePairs, function(pair) {
2181-
var key = tryDecodeURIComponent(pair[0]);
2182-
if (angular.isDefined(key)) {
2183-
var val = angular.isDefined(pair[1]) ? tryDecodeURIComponent(pair[1]) : true;
2184-
if (!hasOwnProperty.call(obj, key)) {
2185-
obj[key] = val;
2186-
} else if (angular.isArray(obj[key])) {
2187-
obj[key].push(val);
2188-
} else {
2189-
obj[key] = [obj[key], val];
2190-
}
2191-
}
2192-
});
2163+
function extractParamsFromPath(strippedUrl) {
2164+
var keyObj = {};
21932165

2194-
return obj;
2166+
if (!expectedUrl || !angular.isFunction(expectedUrl.test) ||
2167+
!expectedKeys || !expectedKeys.length) return keyObj;
2168+
2169+
var match = expectedUrl.exec(strippedUrl);
2170+
if (!match) return keyObj;
2171+
2172+
for (var i = 1, len = match.length; i < len; ++i) {
2173+
var key = expectedKeys[i - 1];
2174+
var val = match[i];
2175+
if (key && val) {
2176+
keyObj[key.name || key] = val;
2177+
}
21952178
}
21962179

2197-
function tryDecodeURIComponent(value) {
2198-
try {
2199-
return decodeURIComponent(value);
2200-
} catch (e) {
2201-
// Ignore any invalid uri component
2180+
return keyObj;
2181+
}
2182+
2183+
function extractParamsFromQuery(queryStr) {
2184+
var obj = {},
2185+
keyValuePairs = queryStr.split('&').
2186+
filter(angular.identity). // Ignore empty segments.
2187+
map(function(keyValue) { return keyValue.replace(/\+/g, '%20').split('='); });
2188+
2189+
angular.forEach(keyValuePairs, function(pair) {
2190+
var key = tryDecodeURIComponent(pair[0]);
2191+
if (angular.isDefined(key)) {
2192+
var val = angular.isDefined(pair[1]) ? tryDecodeURIComponent(pair[1]) : true;
2193+
if (!hasOwnProperty.call(obj, key)) {
2194+
obj[key] = val;
2195+
} else if (angular.isArray(obj[key])) {
2196+
obj[key].push(val);
2197+
} else {
2198+
obj[key] = [obj[key], val];
2199+
}
22022200
}
2201+
});
2202+
2203+
return obj;
2204+
}
2205+
2206+
function tryDecodeURIComponent(value) {
2207+
try {
2208+
return decodeURIComponent(value);
2209+
} catch (e) {
2210+
// Ignore any invalid uri component
22032211
}
2204-
};
2212+
}
22052213
}
22062214

22072215
function createMockXhr() {

0 commit comments

Comments
 (0)