1515
1616from __future__ import absolute_import
1717
18+ import re
19+
1820import six
1921import mock
2022import unittest2
2123
24+ from st2common .constants .action import LIVEACTION_STATUS_SUCCEEDED
2225from http_runner .http_runner import HTTPClient
26+ from http_runner .http_runner import HttpRunner
27+
2328import st2tests .config as tests_config
2429
30+ __all__ = [
31+ 'HTTPClientTestCase' ,
32+ 'HTTPRunnerTestCase'
33+ ]
34+
2535
2636if six .PY2 :
2737 EXPECTED_DATA = ''
@@ -33,7 +43,7 @@ class MockResult(object):
3343 close = mock .Mock ()
3444
3545
36- class HTTPRunnerTestCase (unittest2 .TestCase ):
46+ class HTTPClientTestCase (unittest2 .TestCase ):
3747 @classmethod
3848 def setUpClass (cls ):
3949 tests_config .parse_args ()
@@ -212,3 +222,163 @@ def test_http_unicode_body_data(self, mock_requests):
212222 expected_data = body
213223
214224 self .assertEqual (call_kwargs ['data' ], expected_data )
225+
226+ @mock .patch ('http_runner.http_runner.requests' )
227+ def test_blacklisted_url_url_hosts_blacklist_runner_parameter (self , mock_requests ):
228+ # Black list is empty
229+ self .assertEqual (mock_requests .request .call_count , 0 )
230+
231+ url = 'http://www.example.com'
232+ client = HTTPClient (url = url , method = 'GET' )
233+ client .run ()
234+
235+ self .assertEqual (mock_requests .request .call_count , 1 )
236+
237+ # Blacklist is set
238+ url_hosts_blacklist = [
239+ 'example.com' ,
240+ '127.0.0.1' ,
241+ '::1' ,
242+ '2001:0db8:85a3:0000:0000:8a2e:0370:7334'
243+ ]
244+
245+ # Blacklisted urls
246+ urls = [
247+ 'https://example.com' ,
248+ 'http://example.com' ,
249+ 'http://example.com:81' ,
250+ 'http://example.com:80' ,
251+ 'http://example.com:9000' ,
252+ 'http://[::1]:80/' ,
253+ 'http://[::1]' ,
254+ 'http://[::1]:9000' ,
255+ 'http://[2001:0db8:85a3:0000:0000:8a2e:0370:7334]' ,
256+ 'https://[2001:0db8:85a3:0000:0000:8a2e:0370:7334]:8000'
257+ ]
258+
259+ for url in urls :
260+ expected_msg = r'URL "%s" is blacklisted' % (re .escape (url ))
261+ client = HTTPClient (url = url , method = 'GET' , url_hosts_blacklist = url_hosts_blacklist )
262+ self .assertRaisesRegexp (ValueError , expected_msg , client .run )
263+
264+ # Non blacklisted URLs
265+ urls = [
266+ 'https://example2.com' ,
267+ 'http://example3.com' ,
268+ 'http://example4.com:81'
269+ ]
270+
271+ for url in urls :
272+ mock_requests .request .reset_mock ()
273+
274+ self .assertEqual (mock_requests .request .call_count , 0 )
275+
276+ client = HTTPClient (url = url , method = 'GET' , url_hosts_blacklist = url_hosts_blacklist )
277+ client .run ()
278+
279+ self .assertEqual (mock_requests .request .call_count , 1 )
280+
281+ @mock .patch ('http_runner.http_runner.requests' )
282+ def test_whitelisted_url_url_hosts_whitelist_runner_parameter (self , mock_requests ):
283+ # Whitelist is empty
284+ self .assertEqual (mock_requests .request .call_count , 0 )
285+
286+ url = 'http://www.example.com'
287+ client = HTTPClient (url = url , method = 'GET' )
288+ client .run ()
289+
290+ self .assertEqual (mock_requests .request .call_count , 1 )
291+
292+ # Whitelist is set
293+ url_hosts_whitelist = [
294+ 'example.com' ,
295+ '127.0.0.1' ,
296+ '::1' ,
297+ '2001:0db8:85a3:0000:0000:8a2e:0370:7334'
298+ ]
299+
300+ # Non whitelisted urls
301+ urls = [
302+ 'https://www.google.com' ,
303+ 'https://www.example2.com' ,
304+ 'http://127.0.0.2'
305+ ]
306+
307+ for url in urls :
308+ expected_msg = r'URL "%s" is not whitelisted' % (re .escape (url ))
309+ client = HTTPClient (url = url , method = 'GET' , url_hosts_whitelist = url_hosts_whitelist )
310+ self .assertRaisesRegexp (ValueError , expected_msg , client .run )
311+
312+ # Whitelisted URLS
313+ urls = [
314+ 'https://example.com' ,
315+ 'http://example.com' ,
316+ 'http://example.com:81' ,
317+ 'http://example.com:80' ,
318+ 'http://example.com:9000' ,
319+ 'http://[::1]:80/' ,
320+ 'http://[::1]' ,
321+ 'http://[::1]:9000' ,
322+ 'http://[2001:0db8:85a3:0000:0000:8a2e:0370:7334]' ,
323+ 'https://[2001:0db8:85a3:0000:0000:8a2e:0370:7334]:8000'
324+ ]
325+
326+ for url in urls :
327+ mock_requests .request .reset_mock ()
328+
329+ self .assertEqual (mock_requests .request .call_count , 0 )
330+
331+ client = HTTPClient (url = url , method = 'GET' , url_hosts_whitelist = url_hosts_whitelist )
332+ client .run ()
333+
334+ self .assertEqual (mock_requests .request .call_count , 1 )
335+
336+ def test_url_host_blacklist_and_url_host_blacklist_params_are_mutually_exclusive (self ):
337+ url = 'http://www.example.com'
338+
339+ expected_msg = (r'"url_hosts_blacklist" and "url_hosts_whitelist" parameters are mutually '
340+ 'exclusive.' )
341+ self .assertRaisesRegexp (ValueError , expected_msg , HTTPClient , url = url , method = 'GET' ,
342+ url_hosts_blacklist = [url ], url_hosts_whitelist = [url ])
343+
344+
345+ class HTTPRunnerTestCase (unittest2 .TestCase ):
346+ @mock .patch ('http_runner.http_runner.requests' )
347+ def test_get_success (self , mock_requests ):
348+ mock_result = MockResult ()
349+
350+ # Unknown content type, body should be returned raw
351+ mock_result .text = 'foo bar ponies'
352+ mock_result .headers = {'Content-Type' : 'text/html' }
353+ mock_result .status_code = 200
354+
355+ mock_requests .request .return_value = mock_result
356+
357+ runner_parameters = {
358+ 'url' : 'http://www.example.com' ,
359+ 'method' : 'GET'
360+ }
361+ runner = HttpRunner ('id' )
362+ runner .runner_parameters = runner_parameters
363+ runner .pre_run ()
364+
365+ status , result , _ = runner .run ({})
366+ self .assertEqual (status , LIVEACTION_STATUS_SUCCEEDED )
367+ self .assertEqual (result ['body' ], 'foo bar ponies' )
368+ self .assertEqual (result ['status_code' ], 200 )
369+ self .assertEqual (result ['parsed' ], False )
370+
371+ def test_url_host_blacklist_and_url_host_blacklist_params_are_mutually_exclusive (self ):
372+ runner_parameters = {
373+ 'url' : 'http://www.example.com' ,
374+ 'method' : 'GET' ,
375+ 'url_hosts_blacklist' : ['http://127.0.0.1' ],
376+ 'url_hosts_whitelist' : ['http://127.0.0.1' ],
377+ }
378+ runner = HttpRunner ('id' )
379+ runner .runner_parameters = runner_parameters
380+ runner .pre_run ()
381+
382+ expected_msg = (r'"url_hosts_blacklist" and "url_hosts_whitelist" parameters are mutually '
383+ 'exclusive.' )
384+ self .assertRaisesRegexp (ValueError , expected_msg , runner .run , {})
0 commit comments