diff options
| author | Dan Radez <dradez@redhat.com> | 2012-11-13 18:24:12 -0500 |
|---|---|---|
| committer | Dan Radez <dradez@redhat.com> | 2012-11-13 18:34:22 -0500 |
| commit | cfb2205a965c610abafe39ced35584be42e22717 (patch) | |
| tree | 63c794f895b0047729decb09de0131383c4aa1c4 /tests | |
| parent | 116e1afd36585b72dcfef7ff8e9298eb2a24b169 (diff) | |
| download | python-heatclient-cfb2205a965c610abafe39ced35584be42e22717.tar.gz | |
adding test coverage for common/http, improving the redirect handling
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/test_common_http.py | 229 |
1 files changed, 229 insertions, 0 deletions
diff --git a/tests/test_common_http.py b/tests/test_common_http.py new file mode 100644 index 0000000..e32ce0e --- /dev/null +++ b/tests/test_common_http.py @@ -0,0 +1,229 @@ +import StringIO +import os +import httplib2 +import httplib +import sys + +import mox +import unittest +try: + import json +except ImportError: + import simplejson as json +from keystoneclient.v2_0 import client as ksclient + +from heatclient import exc +from heatclient.common import http +import fakes + + +class HttpClientTest(unittest.TestCase): + + # Patch os.environ to avoid required auth info. + def setUp(self): + self.m = mox.Mox() + self.m.StubOutClassWithMocks(http.httplib, 'HTTPConnection') + self.m.StubOutClassWithMocks(http.httplib, 'HTTPSConnection') + + def tearDown(self): + self.m.UnsetStubs() + self.m.ResetAll() + + def test_http_raw_request(self): + # Record a 200 + mock_conn = http.httplib.HTTPConnection('example.com', 8004, + '', timeout=600.0) + mock_conn.request('GET', '/', + headers={'Content-Type': 'application/octet-stream', + 'User-Agent': 'python-heatclient'}) + mock_conn.getresponse().AndReturn(fakes.FakeHTTPResponse(200, 'OK', + {'content-type': 'application/octet-stream'}, + '')) + # Replay, create client, assert + self.m.ReplayAll() + client = http.HTTPClient('http://example.com:8004') + resp, body = client.raw_request('GET', '') + self.assertEqual(resp.status, 200) + self.assertEqual(''.join([x for x in body]), '') + self.m.VerifyAll() + + def test_http_json_request(self): + # Record a 200 + mock_conn = http.httplib.HTTPConnection('example.com', 8004, + '', timeout=600.0) + mock_conn.request('GET', '/', + headers={'Content-Type': 'application/json', + 'Accept': 'application/json', + 'User-Agent': 'python-heatclient'}) + mock_conn.getresponse().AndReturn(fakes.FakeHTTPResponse(200, 'OK', + {'content-type': 'application/json'}, + '{}')) + # Replay, create client, assert + self.m.ReplayAll() + client = http.HTTPClient('http://example.com:8004') + resp, body = client.json_request('GET', '') + self.assertEqual(resp.status, 200) + self.assertEqual(body, {}) + self.m.VerifyAll() + + def test_http_json_request_w_req_body(self): + # Record a 200 + mock_conn = http.httplib.HTTPConnection('example.com', 8004, + '', timeout=600.0) + mock_conn.request('GET', '/', body='"test-body"', + headers={'Content-Type': 'application/json', + 'Accept': 'application/json', + 'User-Agent': 'python-heatclient'}) + mock_conn.getresponse().AndReturn(fakes.FakeHTTPResponse(200, 'OK', + {'content-type': 'application/json'}, + '{}')) + # Replay, create client, assert + self.m.ReplayAll() + client = http.HTTPClient('http://example.com:8004') + resp, body = client.json_request('GET', '', body='test-body') + self.assertEqual(resp.status, 200) + self.assertEqual(body, {}) + self.m.VerifyAll() + + def test_http_json_request_non_json_resp_cont_type(self): + # Record a 200 + mock_conn = http.httplib.HTTPConnection('example.com', 8004, + '', timeout=600.0) + mock_conn.request('GET', '/', body='"test-body"', + headers={'Content-Type': 'application/json', + 'Accept': 'application/json', + 'User-Agent': 'python-heatclient'}) + mock_conn.getresponse().AndReturn(fakes.FakeHTTPResponse(200, 'OK', + {'content-type': 'not/json'}, + '{}')) + # Replay, create client, assert + self.m.ReplayAll() + client = http.HTTPClient('http://example.com:8004') + resp, body = client.json_request('GET', '', body='test-body') + self.assertEqual(resp.status, 200) + self.assertEqual(body, None) + self.m.VerifyAll() + + def test_http_json_request_invalid_json(self): + # Record a 200 + mock_conn = http.httplib.HTTPConnection('example.com', 8004, + '', timeout=600.0) + mock_conn.request('GET', '/', + headers={'Content-Type': 'application/json', + 'Accept': 'application/json', + 'User-Agent': 'python-heatclient'}) + mock_conn.getresponse().AndReturn(fakes.FakeHTTPResponse(200, 'OK', + {'content-type': 'application/json'}, + 'invalid-json')) + # Replay, create client, assert + self.m.ReplayAll() + client = http.HTTPClient('http://example.com:8004') + resp, body = client.json_request('GET', '') + self.assertEqual(resp.status, 200) + self.assertEqual(body, 'invalid-json') + self.m.VerifyAll() + + def test_http_json_request_redirect(self): + # Record the 302 + mock_conn = http.httplib.HTTPConnection('example.com', 8004, + '', timeout=600.0) + mock_conn.request('GET', '/', + headers={'Content-Type': 'application/json', + 'Accept': 'application/json', + 'User-Agent': 'python-heatclient'}) + mock_conn.getresponse().AndReturn(fakes.FakeHTTPResponse(302, 'Found', + {'location': 'http://example.com:8004' + }, '')) + # Record the following 200 + mock_conn = http.httplib.HTTPConnection('example.com', 8004, + '', timeout=600.0) + mock_conn.request('GET', '/', + headers={'Content-Type': 'application/json', + 'Accept': 'application/json', + 'User-Agent': 'python-heatclient'}) + mock_conn.getresponse().AndReturn(fakes.FakeHTTPResponse(200, 'OK', + {'content-type': 'application/json'}, + '{}')) + # Replay, create client, assert + self.m.ReplayAll() + client = http.HTTPClient('http://example.com:8004') + resp, body = client.json_request('GET', '') + self.assertEqual(resp.status, 200) + self.assertEqual(body, {}) + self.m.VerifyAll() + + def test_http_json_request_prohibited_redirect(self): + # Record the 302 + mock_conn = http.httplib.HTTPConnection('example.com', 8004, + '', timeout=600.0) + mock_conn.request('GET', '/', + headers={'Content-Type': 'application/json', + 'Accept': 'application/json', + 'User-Agent': 'python-heatclient'}) + mock_conn.getresponse().AndReturn(fakes.FakeHTTPResponse(302, 'Found', + {'location': 'http://prohibited.example.com:8004' + }, '')) + # Replay, create client, assert + self.m.ReplayAll() + client = http.HTTPClient('http://example.com:8004') + self.assertRaises(exc.InvalidEndpoint, client.json_request, 'GET', '') + self.m.VerifyAll() + + def test_http_404_json_request(self): + # Record a 404 + mock_conn = http.httplib.HTTPConnection('example.com', 8004, + '', timeout=600.0) + mock_conn.request('GET', '/', + headers={'Content-Type': 'application/json', + 'Accept': 'application/json', + 'User-Agent': 'python-heatclient'}) + mock_conn.getresponse().AndReturn(fakes.FakeHTTPResponse(404, 'OK', + {'content-type': 'application/json'}, + '{}')) + # Replay, create client, assert + self.m.ReplayAll() + client = http.HTTPClient('http://example.com:8004') + self.assertRaises(exc.HTTPNotFound, client.json_request, 'GET', '') + self.m.VerifyAll() + + def test_http_300_json_request(self): + # Record a 300 + mock_conn = http.httplib.HTTPConnection('example.com', 8004, + '', timeout=600.0) + mock_conn.request('GET', '/', + headers={'Content-Type': 'application/json', + 'Accept': 'application/json', + 'User-Agent': 'python-heatclient'}) + mock_conn.getresponse().AndReturn(fakes.FakeHTTPResponse(300, 'OK', + {'content-type': 'application/json'}, + '{}')) + # Replay, create client, assert + self.m.ReplayAll() + client = http.HTTPClient('http://example.com:8004') + self.assertRaises(exc.HTTPMultipleChoices, client.json_request, 'GET', '') + self.m.VerifyAll() + + #def test_https_json_request(self): + # # Record a 200 + # mock_conn = http.httplib.HTTPSConnection('example.com', 8004, + # '', timeout=600.0) + # mock_conn.request('GET', '/', + # headers={'Content-Type': 'application/json', + # 'Accept': 'application/json', + # 'User-Agent': 'python-heatclient'}) + # mock_conn.getresponse().AndReturn(fakes.FakeHTTPResponse(200, 'OK', + # {'content-type': 'application/json'}, + # '{}')) + # # Replay, create client, assert + # self.m.ReplayAll() + # client = http.HTTPClient('https://example.com:8004', ca_file='dummy', + # cert_file='dummy', + # key_file='dummy') + # resp, body = client.json_request('GET', '') + # self.assertEqual(resp.status, 200) + # self.assertEqual(body, {}) + # self.m.VerifyAll() + + def test_fake_json_request(self): + self.assertRaises(exc.InvalidEndpoint, http.HTTPClient, 'fake://example.com:8004') + |
