@@ -2096,112 +2096,120 @@ function stripQueryAndHash(url) {
2096
2096
return url . replace ( / [ ? # ] .* $ / , '' ) ;
2097
2097
}
2098
2098
2099
- function MockHttpExpectation ( method , url , data , headers , keys ) {
2099
+ function MockHttpExpectation ( expectedMethod , expectedUrl , expectedData , expectedHeaders ,
2100
+ expectedKeys ) {
2100
2101
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 ;
2113
2104
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 ;
2119
2110
return true ;
2120
2111
} ;
2121
2112
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 ) ) ;
2127
2118
} ;
2128
2119
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 ) ;
2133
2124
} ;
2134
2125
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 ) ) ;
2141
2132
}
2142
2133
// eslint-disable-next-line eqeqeq
2143
- return data == d ;
2134
+ return expectedData == data ;
2144
2135
} ;
2145
2136
2146
2137
this . toString = function ( ) {
2147
- return method + ' ' + url ;
2138
+ return expectedMethod + ' ' + expectedUrl ;
2148
2139
} ;
2149
2140
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 ) ;
2153
2144
2154
- return angular . extend ( parseQuery ( queryStr ) , pathParams ( strippedUrl ) ) ;
2145
+ return angular . extend ( extractParamsFromQuery ( queryStr ) , extractParamsFromPath ( strippedUrl ) ) ;
2146
+ } ;
2155
2147
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 = / ^ ( [ ^ ? ] * ) \? ( .* ) $ / ;
2159
2150
2160
- var m = url . exec ( strippedUrl ) ;
2161
- if ( ! m ) return keyObj ;
2151
+ var expectedMatch = urlWithQueryRe . exec ( expectedUrl ) ;
2152
+ var actualMatch = urlWithQueryRe . exec ( url ) ;
2162
2153
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
+ }
2170
2158
2171
- return keyObj ;
2172
- }
2159
+ function normalizeQuery ( queryStr ) {
2160
+ return queryStr . split ( '&' ) . sort ( ) . join ( '&' ) ;
2161
+ }
2173
2162
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 = { } ;
2193
2165
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
+ }
2195
2178
}
2196
2179
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
+ }
2202
2200
}
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
2203
2211
}
2204
- } ;
2212
+ }
2205
2213
}
2206
2214
2207
2215
function createMockXhr ( ) {
0 commit comments