Now correctly using urlencode for query parameters. Also handling unicode by converting to utf-8.

This commit is contained in:
Joe Gregorio
2010-08-30 12:04:04 -04:00
parent 6d5e94f0ce
commit fe695fbaa4
3 changed files with 47 additions and 11 deletions

View File

@@ -27,6 +27,7 @@ import os
import re import re
import simplejson import simplejson
import uritemplate import uritemplate
import urllib
import urlparse import urlparse
@@ -93,10 +94,13 @@ class JsonModel(object):
return (headers, path_params, query, simplejson.dumps(model)) return (headers, path_params, query, simplejson.dumps(model))
def build_query(self, params): def build_query(self, params):
query = '?alt=json&prettyprint=true' params.update({'alt': 'json', 'prettyprint': 'true'})
for key,value in params.iteritems(): astuples = []
query += '&%s=%s' % (key, value) for key, value in params.iteritems():
return query if getattr(value, 'encode', False) and callable(value.encode):
value = value.encode('utf-8')
astuples.append((key, value))
return '?' + urllib.urlencode(astuples)
def response(self, resp, content): def response(self, resp, content):
# Error handling is TBD, for example, do we retry # Error handling is TBD, for example, do we retry

View File

@@ -1,5 +1,9 @@
#!/usr/bin/env python #!/usr/bin/env python
import glob, unittest, os, sys import glob
import logging
import os
import sys
import unittest
from trace import fullmodname from trace import fullmodname
try: try:
@@ -10,6 +14,20 @@ except:
sys.path.insert(0, os.getcwd()) sys.path.insert(0, os.getcwd())
verbosity = 1
if "-q" in sys.argv or '--quiet' in sys.argv:
verbosity = 0
if "-v" in sys.argv or '--verbose' in sys.argv:
verbosity = 2
if verbosity == 0:
logging.disable(logging.CRITICAL)
elif verbosity == 1:
logging.disable(logging.ERROR)
elif verbosity == 2:
logging.basicConfig(level=logging.DEBUG)
def build_suite(folder): def build_suite(folder):
# find all of the test modules # find all of the test modules
modules = map(fullmodname, glob.glob(os.path.join(folder, 'test_*.py'))) modules = map(fullmodname, glob.glob(os.path.join(folder, 'test_*.py')))
@@ -25,12 +43,6 @@ def build_suite(folder):
__import__(module) __import__(module)
raise raise
verbosity = 1
if "-q" in sys.argv or '--quiet' in sys.argv:
verbosity = 0
if "-v" in sys.argv or '--verbose' in sys.argv:
verbosity = 2
unit_tests = build_suite('tests') unit_tests = build_suite('tests')
functional_tests = build_suite('functional_tests') functional_tests = build_suite('functional_tests')

View File

@@ -24,6 +24,7 @@ __author__ = 'jcgregorio@google.com (Joe Gregorio)'
from apiclient.discovery import JsonModel from apiclient.discovery import JsonModel
import os import os
import unittest import unittest
import urlparse
class Model(unittest.TestCase): class Model(unittest.TestCase):
@@ -57,5 +58,24 @@ class Model(unittest.TestCase):
self.assertNotEqual(query, '') self.assertNotEqual(query, '')
self.assertEqual(body, '{"data": {}}') self.assertEqual(body, '{"data": {}}')
def test_json_build_query(self):
model = JsonModel()
headers = {}
path_params = {}
query_params = {'foo': 1, 'bar': u'\N{COMET}'}
body = {}
headers, params, query, body = model.request(headers, path_params, query_params, body)
self.assertEqual(headers['accept'], 'application/json')
self.assertEqual(headers['content-type'], 'application/json')
query_dict = urlparse.parse_qs(query)
self.assertEqual(query_dict['foo'], ['1'])
self.assertEqual(query_dict['bar'], [u'\N{COMET}'.encode('utf-8')])
self.assertEqual(body, '{"data": {}}')
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()