Got test coverage to 97%. Added missing file.

This commit is contained in:
Joe Gregorio
2010-09-22 11:42:32 -04:00
parent 6273cdd7ef
commit c5c5a37c50
7 changed files with 115 additions and 8 deletions

View File

@@ -5,3 +5,4 @@ syntax: glob
*/.git/*
.gitignore
samples/cmdline/*.dat
htmlcov/*

View File

@@ -102,7 +102,7 @@ class JsonModel(object):
return simplejson.loads(content)['data']
else:
logging.debug('Content from bad request was: %s' % content)
if resp['content-type'] != 'application/json':
if resp.get('content-type', '') != 'application/json':
raise HttpError('%d %s' % (resp.status, resp.reason))
else:
raise HttpError(simplejson.loads(content)['error'])
@@ -263,7 +263,7 @@ def createResource(http, baseUrl, model, resourceName, resourceDesc,
for key in methodDesc['location']:
p = p[key]
url = p
except KeyError:
except (KeyError, TypeError):
return None
headers = {}

34
apiclient/http.py Normal file
View File

@@ -0,0 +1,34 @@
# Copyright 2010 Google Inc. All Rights Reserved.
"""One-line documentation for http module.
A detailed description of http.
"""
__author__ = 'jcgregorio@google.com (Joe Gregorio)'
class HttpRequest(object):
"""Encapsulate an HTTP request.
"""
def __init__(self, http, uri, method="GET", body=None, headers=None, postproc=None):
self.uri = uri
self.method = method
self.body = body
self.headers = headers or {}
self.http = http
self.postproc = postproc
def execute(self, http=None):
"""Execute the request.
If an http object is passed in it is used instead of the
httplib2.Http object that the request was constructed with.
"""
if http is None:
http = self.http
resp, content = http.request(self.uri, self.method,
body=self.body,
headers=self.headers)
return self.postproc(resp, content)

View File

@@ -24,8 +24,12 @@ class BuzzFunctionalTest(unittest.TestCase):
def test_can_get_buzz_activities_with_many_params(self):
buzz = build('buzz', 'v1')
max_results = 2
activities = buzz.activities().list(userId='googlebuzz', scope='@self',
max_comments=max_results*2 ,max_liked=max_results*3,
max_results=max_results).execute()['items']
actcol = buzz.activities()
activities = actcol.list(userId='googlebuzz', scope='@self',
max_comments=max_results*2 ,max_liked=max_results*3,
max_results=max_results).execute()['items']
activity_count = len(activities)
self.assertEquals(max_results, activity_count)
activities = actcol.list_next(activities)
self.assertEquals(activities, None) # Public streams don't have next links

View File

@@ -28,8 +28,11 @@ def main():
p = build("buzz", "v1", http=http)
activities = p.activities()
activitylist = activities.list(scope='@self', userId='@me').execute()
activitylist = activities.list(max_results='2', scope='@self', userId='@me').execute()
print activitylist['items'][0]['title']
activitylist = activities.list_next(activitylist).execute()
print activitylist['items'][0]['title']
activities.insert(userId='@me', body={
'title': 'Testing insert',
'object': {

View File

@@ -22,7 +22,7 @@ Unit tests for objects created from discovery documents.
__author__ = 'jcgregorio@google.com (Joe Gregorio)'
from apiclient.discovery import build
from apiclient.discovery import build, key2param
import httplib2
import os
import unittest
@@ -41,6 +41,12 @@ class HttpMock(object):
return httplib2.Response(self.headers), self.data
class Utilities(unittest.TestCase):
def test_key2param(self):
self.assertEqual('max_results', key2param('max-results'))
self.assertEqual('x007_bond', key2param('007-bond'))
class Discovery(unittest.TestCase):
def test_method_error_checking(self):
self.http = HttpMock('buzz.json', {'status': '200'})
@@ -86,6 +92,23 @@ class Discovery(unittest.TestCase):
self.assertTrue(getattr(buzz, 'comments'))
self.assertTrue(getattr(buzz, 'related'))
def test_auth(self):
self.http = HttpMock('buzz.json', {'status': '200'})
buzz = build('buzz', 'v1', self.http)
auth = buzz.auth_discovery()
self.assertTrue('request' in auth)
class Next(unittest.TestCase):
def test_next(self):
self.http = HttpMock('buzz.json', {'status': '200'})
buzz = build('buzz', 'v1', self.http)
activities = {'links':
{'next':
[{'href': 'http://www.googleapis.com/next-link'}]}}
request = buzz.activities().list_next(activities)
self.assertEqual(request.uri, 'http://www.googleapis.com/next-link')
if __name__ == '__main__':
unittest.main()

View File

@@ -21,9 +21,10 @@ Unit tests for the JSON model.
__author__ = 'jcgregorio@google.com (Joe Gregorio)'
from apiclient.discovery import JsonModel
from apiclient.discovery import JsonModel, HttpError
import os
import unittest
import httplib2
# Python 2.5 requires different modules
try:
@@ -82,6 +83,47 @@ class Model(unittest.TestCase):
self.assertEqual(query_dict['bar'], [u'\N{COMET}'.encode('utf-8')])
self.assertEqual(body, '{"data": {}}')
def test_user_agent(self):
model = JsonModel()
headers = {'user-agent': 'my-test-app/1.23.4'}
path_params = {}
query_params = {}
body = {}
headers, params, query, body = model.request(headers, path_params, query_params, body)
self.assertEqual(headers['user-agent'], 'my-test-app/1.23.4 google-api-python-client/1.0')
def test_bad_response(self):
model = JsonModel()
resp = httplib2.Response({'status': '401'})
resp.reason = 'Unauthorized'
content = '{"error": "not authorized"}'
try:
content = model.response(resp, content)
self.fail('Should have thrown an exception')
except HttpError, e:
self.assertTrue('Unauthorized' in str(e))
resp['content-type'] = 'application/json'
try:
content = model.response(resp, content)
self.fail('Should have thrown an exception')
except HttpError, e:
self.assertTrue('not authorized' in str(e))
def test_good_response(self):
model = JsonModel()
resp = httplib2.Response({'status': '200'})
resp.reason = 'OK'
content = '{"data": "is good"}'
content = model.response(resp, content)
self.assertEqual(content, 'is good')
if __name__ == '__main__':
unittest.main()