Ensure tag update/delete URLs are UTF-8 encoded
This commit is contained in:
parent
43f533a419
commit
d43c8fb379
3 changed files with 34 additions and 9 deletions
|
@ -13,10 +13,14 @@ class TestTags(unittest.TestCase):
|
||||||
test_tags_dict = [{"count": 11, "id": "tag1"},
|
test_tags_dict = [{"count": 11, "id": "tag1"},
|
||||||
{"count": 5, "id": "tag2"}]
|
{"count": 5, "id": "tag2"}]
|
||||||
|
|
||||||
|
test_tag_unicode_dict = {"id": "\xfcmlaut"}
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.client = trovebox.Trovebox(host=self.test_host)
|
self.client = trovebox.Trovebox(host=self.test_host)
|
||||||
self.test_tags = [trovebox.objects.tag.Tag(self.client, tag)
|
self.test_tags = [trovebox.objects.tag.Tag(self.client, tag)
|
||||||
for tag in self.test_tags_dict]
|
for tag in self.test_tags_dict]
|
||||||
|
self.test_tag_unicode = trovebox.objects.tag.Tag(self.client,
|
||||||
|
self.test_tag_unicode_dict)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _return_value(result, message="", code=200):
|
def _return_value(result, message="", code=200):
|
||||||
|
@ -89,6 +93,14 @@ class TestTagDelete(TestTags):
|
||||||
self.assertEqual(tag.get_fields(), {})
|
self.assertEqual(tag.get_fields(), {})
|
||||||
self.assertEqual(tag.id, None)
|
self.assertEqual(tag.id, None)
|
||||||
|
|
||||||
|
@mock.patch.object(trovebox.Trovebox, 'post')
|
||||||
|
def test_tag_object_delete_unicode(self, mock_post):
|
||||||
|
"""Check that a unicode tag can be deleted using its ID"""
|
||||||
|
mock_post.return_value = self._return_value(True)
|
||||||
|
result = self.client.tag.delete(self.test_tag_unicode)
|
||||||
|
mock_post.assert_called_with("/tag/%C3%BCmlaut/delete.json")
|
||||||
|
self.assertEqual(result, True)
|
||||||
|
|
||||||
class TestTagUpdate(TestTags):
|
class TestTagUpdate(TestTags):
|
||||||
@mock.patch.object(trovebox.Trovebox, 'post')
|
@mock.patch.object(trovebox.Trovebox, 'post')
|
||||||
def test_tag_update(self, mock_post):
|
def test_tag_update(self, mock_post):
|
||||||
|
@ -118,3 +130,11 @@ class TestTagUpdate(TestTags):
|
||||||
self.assertEqual(tag.id, "tag2")
|
self.assertEqual(tag.id, "tag2")
|
||||||
self.assertEqual(tag.count, 5)
|
self.assertEqual(tag.count, 5)
|
||||||
|
|
||||||
|
@mock.patch.object(trovebox.Trovebox, 'post')
|
||||||
|
def test_tag_object_update_unicode(self, mock_post):
|
||||||
|
"""Check that a unicode tag can be updated using its ID"""
|
||||||
|
mock_post.return_value = self._return_value(self.test_tag_unicode_dict)
|
||||||
|
result = self.client.tag.update(self.test_tag_unicode, name="Test")
|
||||||
|
mock_post.assert_called_with("/tag/%C3%BCmlaut/update.json", name="Test")
|
||||||
|
self.assertEqual(result.id, "\xfcmlaut")
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,11 @@
|
||||||
"""
|
"""
|
||||||
api_base.py: Base class for all API classes
|
api_base.py: Base class for all API classes
|
||||||
"""
|
"""
|
||||||
|
try:
|
||||||
|
from urllib.parse import quote # Python3
|
||||||
|
except ImportError:
|
||||||
|
from urllib import quote # Python2
|
||||||
|
|
||||||
|
|
||||||
class ApiBase(object):
|
class ApiBase(object):
|
||||||
""" Base class for all API objects """
|
""" Base class for all API objects """
|
||||||
|
@ -27,6 +32,11 @@ class ApiBase(object):
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
return obj
|
return obj
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _quote_url(string):
|
||||||
|
""" Make a string suitable for insertion into a URL """
|
||||||
|
return quote(string.encode('utf-8'))
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _result_to_list(result):
|
def _result_to_list(result):
|
||||||
""" Handle the case where the result contains no items """
|
""" Handle the case where the result contains no items """
|
||||||
|
|
|
@ -1,11 +1,6 @@
|
||||||
"""
|
"""
|
||||||
api_tag.py : Trovebox Tag API Classes
|
api_tag.py : Trovebox Tag API Classes
|
||||||
"""
|
"""
|
||||||
try:
|
|
||||||
from urllib.parse import quote # Python3
|
|
||||||
except ImportError:
|
|
||||||
from urllib import quote # Python2
|
|
||||||
|
|
||||||
from trovebox.objects.tag import Tag
|
from trovebox.objects.tag import Tag
|
||||||
from .api_base import ApiBase
|
from .api_base import ApiBase
|
||||||
|
|
||||||
|
@ -42,7 +37,7 @@ class ApiTag(ApiBase):
|
||||||
Raises a TroveboxError if not.
|
Raises a TroveboxError if not.
|
||||||
"""
|
"""
|
||||||
return self._client.post("/tag/%s/delete.json" %
|
return self._client.post("/tag/%s/delete.json" %
|
||||||
quote(self._extract_id(tag)),
|
self._quote_url(self._extract_id(tag)),
|
||||||
**kwds)["result"]
|
**kwds)["result"]
|
||||||
|
|
||||||
def update(self, tag, **kwds):
|
def update(self, tag, **kwds):
|
||||||
|
@ -53,7 +48,7 @@ class ApiTag(ApiBase):
|
||||||
Returns the updated tag object.
|
Returns the updated tag object.
|
||||||
"""
|
"""
|
||||||
result = self._client.post("/tag/%s/update.json" %
|
result = self._client.post("/tag/%s/update.json" %
|
||||||
quote(self._extract_id(tag)),
|
self._quote_url(self._extract_id(tag)),
|
||||||
**kwds)["result"]
|
**kwds)["result"]
|
||||||
return Tag(self._client, result)
|
return Tag(self._client, result)
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue