Move HttpMock out of tests and into apiclient.http. Update tests that used HttpMock
This commit is contained in:
@@ -9,10 +9,12 @@ actuall HTTP request.
|
|||||||
|
|
||||||
__author__ = 'jcgregorio@google.com (Joe Gregorio)'
|
__author__ = 'jcgregorio@google.com (Joe Gregorio)'
|
||||||
__all__ = [
|
__all__ = [
|
||||||
'HttpRequest', 'RequestMockBuilder'
|
'HttpRequest', 'RequestMockBuilder', 'HttpMock'
|
||||||
]
|
]
|
||||||
|
|
||||||
import httplib2
|
import httplib2
|
||||||
|
import os
|
||||||
|
|
||||||
from model import JsonModel
|
from model import JsonModel
|
||||||
|
|
||||||
|
|
||||||
@@ -147,3 +149,20 @@ class RequestMockBuilder(object):
|
|||||||
else:
|
else:
|
||||||
model = JsonModel()
|
model = JsonModel()
|
||||||
return HttpRequestMock(None, '{}', model.response)
|
return HttpRequestMock(None, '{}', model.response)
|
||||||
|
|
||||||
|
class HttpMock(object):
|
||||||
|
"""Mock of httplib2.Http"""
|
||||||
|
|
||||||
|
def __init__(self, filename, headers):
|
||||||
|
"""
|
||||||
|
Args:
|
||||||
|
filename: string, absolute filename to read response from
|
||||||
|
headers: dict, header to return with response
|
||||||
|
"""
|
||||||
|
f = file(filename, 'r')
|
||||||
|
self.data = f.read()
|
||||||
|
f.close()
|
||||||
|
self.headers = headers
|
||||||
|
|
||||||
|
def request(self, uri, method="GET", body=None, headers=None, redirections=1, connection_type=None):
|
||||||
|
return httplib2.Response(self.headers), self.data
|
||||||
|
@@ -22,7 +22,8 @@ actuall HTTP request.</tt></p>
|
|||||||
|
|
||||||
<tr><td bgcolor="#aa55cc"><tt> </tt></td><td> </td>
|
<tr><td bgcolor="#aa55cc"><tt> </tt></td><td> </td>
|
||||||
<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="httplib2.html">httplib2</a><br>
|
<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="httplib2.html">httplib2</a><br>
|
||||||
</td><td width="25%" valign=top></td><td width="25%" valign=top></td><td width="25%" valign=top></td></tr></table></td></tr></table><p>
|
</td><td width="25%" valign=top><a href="os.html">os</a><br>
|
||||||
|
</td><td width="25%" valign=top></td><td width="25%" valign=top></td></tr></table></td></tr></table><p>
|
||||||
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
|
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
|
||||||
<tr bgcolor="#ee77aa">
|
<tr bgcolor="#ee77aa">
|
||||||
<td colspan=3 valign=bottom> <br>
|
<td colspan=3 valign=bottom> <br>
|
||||||
@@ -33,7 +34,8 @@ actuall HTTP request.</tt></p>
|
|||||||
<dt><font face="helvetica, arial"><a href="__builtin__.html#object">__builtin__.object</a>
|
<dt><font face="helvetica, arial"><a href="__builtin__.html#object">__builtin__.object</a>
|
||||||
</font></dt><dd>
|
</font></dt><dd>
|
||||||
<dl>
|
<dl>
|
||||||
<dt><font face="helvetica, arial"><a href="apiclient.http.html#HttpRequest">HttpRequest</a>
|
<dt><font face="helvetica, arial"><a href="apiclient.http.html#HttpMock">HttpMock</a>
|
||||||
|
</font></dt><dt><font face="helvetica, arial"><a href="apiclient.http.html#HttpRequest">HttpRequest</a>
|
||||||
</font></dt><dt><font face="helvetica, arial"><a href="apiclient.http.html#RequestMockBuilder">RequestMockBuilder</a>
|
</font></dt><dt><font face="helvetica, arial"><a href="apiclient.http.html#RequestMockBuilder">RequestMockBuilder</a>
|
||||||
</font></dt></dl>
|
</font></dt></dl>
|
||||||
</dd>
|
</dd>
|
||||||
@@ -42,6 +44,30 @@ actuall HTTP request.</tt></p>
|
|||||||
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
|
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
|
||||||
<tr bgcolor="#ffc8d8">
|
<tr bgcolor="#ffc8d8">
|
||||||
<td colspan=3 valign=bottom> <br>
|
<td colspan=3 valign=bottom> <br>
|
||||||
|
<font color="#000000" face="helvetica, arial"><a name="HttpMock">class <strong>HttpMock</strong></a>(<a href="__builtin__.html#object">__builtin__.object</a>)</font></td></tr>
|
||||||
|
|
||||||
|
<tr bgcolor="#ffc8d8"><td rowspan=2><tt> </tt></td>
|
||||||
|
<td colspan=2><tt>Mock of httplib2.Http<br> </tt></td></tr>
|
||||||
|
<tr><td> </td>
|
||||||
|
<td width="100%">Methods defined here:<br>
|
||||||
|
<dl><dt><a name="HttpMock-__init__"><strong>__init__</strong></a>(self, filename, headers)</dt><dd><tt>Args:<br>
|
||||||
|
filename: string, absolute filename to read response from<br>
|
||||||
|
headers: dict, header to return with response</tt></dd></dl>
|
||||||
|
|
||||||
|
<dl><dt><a name="HttpMock-request"><strong>request</strong></a>(self, uri, method<font color="#909090">='GET'</font>, body<font color="#909090">=None</font>, headers<font color="#909090">=None</font>, redirections<font color="#909090">=1</font>, connection_type<font color="#909090">=None</font>)</dt></dl>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
Data descriptors defined here:<br>
|
||||||
|
<dl><dt><strong>__dict__</strong></dt>
|
||||||
|
<dd><tt>dictionary for instance variables (if defined)</tt></dd>
|
||||||
|
</dl>
|
||||||
|
<dl><dt><strong>__weakref__</strong></dt>
|
||||||
|
<dd><tt>list of weak references to the object (if defined)</tt></dd>
|
||||||
|
</dl>
|
||||||
|
</td></tr></table> <p>
|
||||||
|
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
|
||||||
|
<tr bgcolor="#ffc8d8">
|
||||||
|
<td colspan=3 valign=bottom> <br>
|
||||||
<font color="#000000" face="helvetica, arial"><a name="HttpRequest">class <strong>HttpRequest</strong></a>(<a href="__builtin__.html#object">__builtin__.object</a>)</font></td></tr>
|
<font color="#000000" face="helvetica, arial"><a name="HttpRequest">class <strong>HttpRequest</strong></a>(<a href="__builtin__.html#object">__builtin__.object</a>)</font></td></tr>
|
||||||
|
|
||||||
<tr bgcolor="#ffc8d8"><td rowspan=2><tt> </tt></td>
|
<tr bgcolor="#ffc8d8"><td rowspan=2><tt> </tt></td>
|
||||||
@@ -143,7 +169,7 @@ Data descriptors defined here:<br>
|
|||||||
<font color="#ffffff" face="helvetica, arial"><big><strong>Data</strong></big></font></td></tr>
|
<font color="#ffffff" face="helvetica, arial"><big><strong>Data</strong></big></font></td></tr>
|
||||||
|
|
||||||
<tr><td bgcolor="#55aa55"><tt> </tt></td><td> </td>
|
<tr><td bgcolor="#55aa55"><tt> </tt></td><td> </td>
|
||||||
<td width="100%"><strong>__all__</strong> = ['HttpRequest', 'RequestMockBuilder']<br>
|
<td width="100%"><strong>__all__</strong> = ['HttpRequest', 'RequestMockBuilder', 'HttpMock']<br>
|
||||||
<strong>__author__</strong> = 'jcgregorio@google.com (Joe Gregorio)'</td></tr></table><p>
|
<strong>__author__</strong> = 'jcgregorio@google.com (Joe Gregorio)'</td></tr></table><p>
|
||||||
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
|
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
|
||||||
<tr bgcolor="#7799ee">
|
<tr bgcolor="#7799ee">
|
||||||
|
@@ -32,7 +32,13 @@ except ImportError:
|
|||||||
from cgi import parse_qs
|
from cgi import parse_qs
|
||||||
|
|
||||||
from apiclient.discovery import build, key2param
|
from apiclient.discovery import build, key2param
|
||||||
from tests.util import HttpMock
|
from apiclient.http import HttpMock
|
||||||
|
|
||||||
|
|
||||||
|
DATA_DIR = os.path.join(os.path.dirname(__file__), 'data')
|
||||||
|
|
||||||
|
def datafile(filename):
|
||||||
|
return os.path.join(DATA_DIR, filename)
|
||||||
|
|
||||||
|
|
||||||
class Utilities(unittest.TestCase):
|
class Utilities(unittest.TestCase):
|
||||||
@@ -44,7 +50,7 @@ class Utilities(unittest.TestCase):
|
|||||||
class Discovery(unittest.TestCase):
|
class Discovery(unittest.TestCase):
|
||||||
|
|
||||||
def test_method_error_checking(self):
|
def test_method_error_checking(self):
|
||||||
self.http = HttpMock('buzz.json', {'status': '200'})
|
self.http = HttpMock(datafile('buzz.json'), {'status': '200'})
|
||||||
buzz = build('buzz', 'v1', self.http)
|
buzz = build('buzz', 'v1', self.http)
|
||||||
|
|
||||||
# Missing required parameters
|
# Missing required parameters
|
||||||
@@ -76,7 +82,7 @@ class Discovery(unittest.TestCase):
|
|||||||
self.assertTrue('unexpected' in str(e))
|
self.assertTrue('unexpected' in str(e))
|
||||||
|
|
||||||
def test_buzz_resources(self):
|
def test_buzz_resources(self):
|
||||||
self.http = HttpMock('buzz.json', {'status': '200'})
|
self.http = HttpMock(datafile('buzz.json'), {'status': '200'})
|
||||||
buzz = build('buzz', 'v1', self.http)
|
buzz = build('buzz', 'v1', self.http)
|
||||||
self.assertTrue(getattr(buzz, 'activities'))
|
self.assertTrue(getattr(buzz, 'activities'))
|
||||||
self.assertTrue(getattr(buzz, 'feeds'))
|
self.assertTrue(getattr(buzz, 'feeds'))
|
||||||
@@ -87,7 +93,7 @@ class Discovery(unittest.TestCase):
|
|||||||
self.assertTrue(getattr(buzz, 'related'))
|
self.assertTrue(getattr(buzz, 'related'))
|
||||||
|
|
||||||
def test_auth(self):
|
def test_auth(self):
|
||||||
self.http = HttpMock('buzz.json', {'status': '200'})
|
self.http = HttpMock(datafile('buzz.json'), {'status': '200'})
|
||||||
buzz = build('buzz', 'v1', self.http)
|
buzz = build('buzz', 'v1', self.http)
|
||||||
auth = buzz.auth_discovery()
|
auth = buzz.auth_discovery()
|
||||||
self.assertTrue('request' in auth)
|
self.assertTrue('request' in auth)
|
||||||
@@ -95,7 +101,7 @@ class Discovery(unittest.TestCase):
|
|||||||
def test_full_featured(self):
|
def test_full_featured(self):
|
||||||
# Zoo should exercise all discovery facets
|
# Zoo should exercise all discovery facets
|
||||||
# and should also have no future.json file.
|
# and should also have no future.json file.
|
||||||
self.http = HttpMock('zoo.json', {'status': '200'})
|
self.http = HttpMock(datafile('zoo.json'), {'status': '200'})
|
||||||
zoo = build('zoo', 'v1', self.http)
|
zoo = build('zoo', 'v1', self.http)
|
||||||
self.assertTrue(getattr(zoo, 'animals'))
|
self.assertTrue(getattr(zoo, 'animals'))
|
||||||
request = zoo.animals().list(name="bat", projection="size")
|
request = zoo.animals().list(name="bat", projection="size")
|
||||||
@@ -105,7 +111,7 @@ class Discovery(unittest.TestCase):
|
|||||||
self.assertEqual(q['projection'], ['size'])
|
self.assertEqual(q['projection'], ['size'])
|
||||||
|
|
||||||
def test_nested_resources(self):
|
def test_nested_resources(self):
|
||||||
self.http = HttpMock('zoo.json', {'status': '200'})
|
self.http = HttpMock(datafile('zoo.json'), {'status': '200'})
|
||||||
zoo = build('zoo', 'v1', self.http)
|
zoo = build('zoo', 'v1', self.http)
|
||||||
self.assertTrue(getattr(zoo, 'animals'))
|
self.assertTrue(getattr(zoo, 'animals'))
|
||||||
request = zoo.my().favorites().list(max_results="5")
|
request = zoo.my().favorites().list(max_results="5")
|
||||||
@@ -114,7 +120,7 @@ class Discovery(unittest.TestCase):
|
|||||||
self.assertEqual(q['max-results'], ['5'])
|
self.assertEqual(q['max-results'], ['5'])
|
||||||
|
|
||||||
def test_top_level_functions(self):
|
def test_top_level_functions(self):
|
||||||
self.http = HttpMock('zoo.json', {'status': '200'})
|
self.http = HttpMock(datafile('zoo.json'), {'status': '200'})
|
||||||
zoo = build('zoo', 'v1', self.http)
|
zoo = build('zoo', 'v1', self.http)
|
||||||
self.assertTrue(getattr(zoo, 'query'))
|
self.assertTrue(getattr(zoo, 'query'))
|
||||||
request = zoo.query(q="foo")
|
request = zoo.query(q="foo")
|
||||||
@@ -125,7 +131,7 @@ class Discovery(unittest.TestCase):
|
|||||||
|
|
||||||
class Next(unittest.TestCase):
|
class Next(unittest.TestCase):
|
||||||
def test_next_for_people_liked(self):
|
def test_next_for_people_liked(self):
|
||||||
self.http = HttpMock('buzz.json', {'status': '200'})
|
self.http = HttpMock(datafile('buzz.json'), {'status': '200'})
|
||||||
buzz = build('buzz', 'v1', self.http)
|
buzz = build('buzz', 'v1', self.http)
|
||||||
people = {'links':
|
people = {'links':
|
||||||
{'next':
|
{'next':
|
||||||
@@ -136,7 +142,7 @@ class Next(unittest.TestCase):
|
|||||||
|
|
||||||
class DeveloperKey(unittest.TestCase):
|
class DeveloperKey(unittest.TestCase):
|
||||||
def test_param(self):
|
def test_param(self):
|
||||||
self.http = HttpMock('buzz.json', {'status': '200'})
|
self.http = HttpMock(datafile('buzz.json'), {'status': '200'})
|
||||||
buzz = build('buzz', 'v1', self.http, developerKey='foobie_bletch')
|
buzz = build('buzz', 'v1', self.http, developerKey='foobie_bletch')
|
||||||
activities = {'links':
|
activities = {'links':
|
||||||
{'next':
|
{'next':
|
||||||
@@ -147,7 +153,7 @@ class DeveloperKey(unittest.TestCase):
|
|||||||
self.assertEqual(q['key'], ['foobie_bletch'])
|
self.assertEqual(q['key'], ['foobie_bletch'])
|
||||||
|
|
||||||
def test_next_for_activities_list(self):
|
def test_next_for_activities_list(self):
|
||||||
self.http = HttpMock('buzz.json', {'status': '200'})
|
self.http = HttpMock(datafile('buzz.json'), {'status': '200'})
|
||||||
buzz = build('buzz', 'v1', self.http, developerKey='foobie_bletch')
|
buzz = build('buzz', 'v1', self.http, developerKey='foobie_bletch')
|
||||||
activities = {'links':
|
activities = {'links':
|
||||||
{'next':
|
{'next':
|
||||||
|
@@ -24,15 +24,22 @@ __author__ = 'jcgregorio@google.com (Joe Gregorio)'
|
|||||||
from apiclient.errors import HttpError
|
from apiclient.errors import HttpError
|
||||||
from apiclient.discovery import build
|
from apiclient.discovery import build
|
||||||
from apiclient.http import RequestMockBuilder
|
from apiclient.http import RequestMockBuilder
|
||||||
from tests.util import HttpMock
|
from apiclient.http import HttpMock
|
||||||
|
|
||||||
import unittest
|
|
||||||
import httplib2
|
import httplib2
|
||||||
|
import os
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
|
||||||
|
DATA_DIR = os.path.join(os.path.dirname(__file__), 'data')
|
||||||
|
|
||||||
|
def datafile(filename):
|
||||||
|
return os.path.join(DATA_DIR, filename)
|
||||||
|
|
||||||
|
|
||||||
class Mocks(unittest.TestCase):
|
class Mocks(unittest.TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.http = HttpMock('buzz.json', {'status': '200'})
|
self.http = HttpMock(datafile('buzz.json'), {'status': '200'})
|
||||||
|
|
||||||
def test_default_response(self):
|
def test_default_response(self):
|
||||||
requestBuilder = RequestMockBuilder({})
|
requestBuilder = RequestMockBuilder({})
|
||||||
|
@@ -1,27 +0,0 @@
|
|||||||
#!/usr/bin/python2.4
|
|
||||||
#
|
|
||||||
# Copyright 2010 Google Inc. All Rights Reserved.
|
|
||||||
|
|
||||||
"""One-line documentation for util module.
|
|
||||||
|
|
||||||
A detailed description of util.
|
|
||||||
"""
|
|
||||||
|
|
||||||
__author__ = 'jcgregorio@google.com (Joe Gregorio)'
|
|
||||||
|
|
||||||
import httplib2
|
|
||||||
import os
|
|
||||||
|
|
||||||
DATA_DIR = os.path.join(os.path.dirname(__file__), 'data')
|
|
||||||
|
|
||||||
|
|
||||||
class HttpMock(object):
|
|
||||||
|
|
||||||
def __init__(self, filename, headers):
|
|
||||||
f = file(os.path.join(DATA_DIR, filename), 'r')
|
|
||||||
self.data = f.read()
|
|
||||||
f.close()
|
|
||||||
self.headers = headers
|
|
||||||
|
|
||||||
def request(self, uri, method="GET", body=None, headers=None, redirections=1, connection_type=None):
|
|
||||||
return httplib2.Response(self.headers), self.data
|
|
Reference in New Issue
Block a user