Added photo view options parameter

Renamed "filter" parameters to "option"
This commit is contained in:
sneakypete81 2013-09-15 08:25:51 +01:00
parent 42b04b0c89
commit aeb06c0d8b
7 changed files with 73 additions and 51 deletions

View file

@ -30,9 +30,9 @@ class TestActivities(test_base.TestBase):
for photo in photos: for photo in photos:
photo.update(tags=self.TEST_TAG) photo.update(tags=self.TEST_TAG)
def test_list_filter(self): def test_list_option(self):
""" """
Check that the activity list filter parameter works correctly Check that the activity list options parameter works correctly
""" """
self._delete_all() self._delete_all()
self._create_test_photos(tag=False) self._create_test_photos(tag=False)
@ -42,8 +42,8 @@ class TestActivities(test_base.TestBase):
photos[0].update(tags=photos[0].tags) photos[0].update(tags=photos[0].tags)
# Check that the activities can be filtered # Check that the activities can be filtered
upload_activities = self.client.activities.list(filters={"type": "photo-upload"}) upload_activities = self.client.activities.list(options={"type": "photo-upload"})
update_activities = self.client.activities.list(filters={"type": "photo-update"}) update_activities = self.client.activities.list(options={"type": "photo-update"})
self.assertEqual(len(upload_activities), len(photos)) self.assertEqual(len(upload_activities), len(photos))
self.assertEqual(len(update_activities), 1) self.assertEqual(len(update_activities), 1)

View file

@ -12,21 +12,21 @@ from tests.functional import test_base
class TestPhotos(test_base.TestBase): class TestPhotos(test_base.TestBase):
testcase_name = "photo API" testcase_name = "photo API"
def test_list_filter(self): def test_list_option(self):
""" """
Check that the photo list filter parameter works correctly Check that the photo list options parameter works correctly
""" """
filter_tag = "Filter" option_tag = "Filter"
# Assign a photo with a new tag # Assign a photo with a new tag
self.photos[0].update(tagsAdd=filter_tag) self.photos[0].update(tagsAdd=option_tag)
# Check that the photos can be filtered # Check that the photos can be filtered
photos = self.client.photos.list(filters={"tags": filter_tag}) photos = self.client.photos.list(options={"tags": option_tag})
self.assertEqual(len(photos), 1) self.assertEqual(len(photos), 1)
self.assertEqual(photos[0].id, self.photos[0].id) self.assertEqual(photos[0].id, self.photos[0].id)
# Put the environment back the way we found it # Put the environment back the way we found it
photos[0].update(tagsRemove=filter_tag) photos[0].update(tagsRemove=option_tag)
# Photo share endpoint is currently not implemented # Photo share endpoint is currently not implemented
@unittest.expectedFailure @unittest.expectedFailure

View file

@ -69,10 +69,10 @@ class TestActivitiesList(TestActivities):
self.assertEqual(result, []) self.assertEqual(result, [])
@mock.patch.object(trovebox.Trovebox, 'get') @mock.patch.object(trovebox.Trovebox, 'get')
def test_filters(self, mock_get): def test_options(self, mock_get):
"""Check that the activity list filters are applied properly""" """Check that the activity list optionss are applied properly"""
mock_get.return_value = self._return_value(self.test_activities_dict) mock_get.return_value = self._return_value(self.test_activities_dict)
self.client.activities.list(filters={"foo": "bar", self.client.activities.list(options={"foo": "bar",
"test1": "test2"}, "test1": "test2"},
foo="bar") foo="bar")
# Dict element can be any order # Dict element can be any order

View file

@ -56,10 +56,10 @@ class TestPhotosList(TestPhotos):
self.assertEqual(result, []) self.assertEqual(result, [])
@mock.patch.object(trovebox.Trovebox, 'get') @mock.patch.object(trovebox.Trovebox, 'get')
def test_filters(self, mock_get): def test_options(self, mock_get):
"""Check that the activity list filters are applied properly""" """Check that the activity list options are applied properly"""
mock_get.return_value = self._return_value(self.test_photos_dict) mock_get.return_value = self._return_value(self.test_photos_dict)
self.client.photos.list(filters={"foo": "bar", self.client.photos.list(options={"foo": "bar",
"test1": "test2"}, "test1": "test2"},
foo="bar") foo="bar")
# Dict element can be any order # Dict element can be any order
@ -71,7 +71,7 @@ class TestPhotosList(TestPhotos):
class TestPhotosShare(TestPhotos): class TestPhotosShare(TestPhotos):
@mock.patch.object(trovebox.Trovebox, 'post') @mock.patch.object(trovebox.Trovebox, 'post')
def test_photos_share(self, mock_post): def test_photos_share(self, mock_post):
self.client.photos.share(filters={"foo": "bar", self.client.photos.share(options={"foo": "bar",
"test1": "test2"}, "test1": "test2"},
foo="bar") foo="bar")
# Dict element can be any order # Dict element can be any order
@ -362,16 +362,30 @@ class TestPhotoView(TestPhotos):
"""Check that a photo can be viewed""" """Check that a photo can be viewed"""
mock_get.return_value = self._return_value(self.test_photos_dict[1]) mock_get.return_value = self._return_value(self.test_photos_dict[1])
result = self.client.photo.view(self.test_photos[0], result = self.client.photo.view(self.test_photos[0],
options={"foo": "bar",
"test1": "test2"},
returnSizes="20x20") returnSizes="20x20")
mock_get.assert_called_with("/photo/1a/view.json", returnSizes="20x20") # Dict elemet can be in any order
self.assertIn(mock_get.call_args[0],
[("/photo/1a/foo-bar/test1-test2/view.json",),
("/photo/1a/test1-test2/foo-bar/view.json",)])
self.assertEqual(mock_get.call_args[1], {"returnSizes": "20x20"})
self.assertEqual(result.get_fields(), self.test_photos_dict[1]) self.assertEqual(result.get_fields(), self.test_photos_dict[1])
@mock.patch.object(trovebox.Trovebox, 'get') @mock.patch.object(trovebox.Trovebox, 'get')
def test_photo_view_id(self, mock_get): def test_photo_view_id(self, mock_get):
"""Check that a photo can be viewed using its ID""" """Check that a photo can be viewed using its ID"""
mock_get.return_value = self._return_value(self.test_photos_dict[1]) mock_get.return_value = self._return_value(self.test_photos_dict[1])
result = self.client.photo.view("1a", returnSizes="20x20") result = self.client.photo.view("1a",
mock_get.assert_called_with("/photo/1a/view.json", returnSizes="20x20") options={"foo": "bar",
"test1": "test2"},
returnSizes="20x20")
# Dict elemet can be in any order
self.assertIn(mock_get.call_args[0],
[("/photo/1a/foo-bar/test1-test2/view.json",),
("/photo/1a/test1-test2/foo-bar/view.json",)])
self.assertEqual(mock_get.call_args[1], {"returnSizes": "20x20"})
self.assertEqual(result.get_fields(), self.test_photos_dict[1]) self.assertEqual(result.get_fields(), self.test_photos_dict[1])
@mock.patch.object(trovebox.Trovebox, 'get') @mock.patch.object(trovebox.Trovebox, 'get')
@ -382,8 +396,14 @@ class TestPhotoView(TestPhotos):
""" """
mock_get.return_value = self._return_value(self.test_photos_dict[1]) mock_get.return_value = self._return_value(self.test_photos_dict[1])
photo = self.test_photos[0] photo = self.test_photos[0]
photo.view(returnSizes="20x20") photo.view(returnSizes="20x20", options={"foo": "bar",
mock_get.assert_called_with("/photo/1a/view.json", returnSizes="20x20") "test1": "test2"})
# Dict elemet can be in any order
self.assertIn(mock_get.call_args[0],
[("/photo/1a/foo-bar/test1-test2/view.json",),
("/photo/1a/test1-test2/foo-bar/view.json",)])
self.assertEqual(mock_get.call_args[1], {"returnSizes": "20x20"})
self.assertEqual(photo.get_fields(), self.test_photos_dict[1]) self.assertEqual(photo.get_fields(), self.test_photos_dict[1])
class TestPhotoUpload(TestPhotos): class TestPhotoUpload(TestPhotos):

View file

@ -7,16 +7,16 @@ from .api_base import ApiBase
class ApiActivities(ApiBase): class ApiActivities(ApiBase):
""" Definitions of /activities/ API endpoints """ """ Definitions of /activities/ API endpoints """
def list(self, filters=None, **kwds): def list(self, options=None, **kwds):
""" """
Endpoint: /activities/[<filters>]/list.json Endpoint: /activities/[<options>]/list.json
Returns a list of Activity objects. Returns a list of Activity objects.
The filters parameter can be used to narrow down the activities. The options parameter can be used to narrow down the activities.
Eg: filters={"type": "photo-upload"} Eg: options={"type": "photo-upload"}
""" """
filter_string = self._build_filter_string(filters) option_string = self._build_option_string(options)
activities = self._client.get("/activities/%slist.json" % filter_string, activities = self._client.get("/activities/%slist.json" % option_string,
**kwds)["result"] **kwds)["result"]
activities = self._result_to_list(activities) activities = self._result_to_list(activities)
return [Activity(self._client, activity) for activity in activities] return [Activity(self._client, activity) for activity in activities]

View file

@ -8,16 +8,16 @@ class ApiBase(object):
self._client = client self._client = client
@staticmethod @staticmethod
def _build_filter_string(filters): def _build_option_string(options):
""" """
:param filters: dictionary containing the filters :param options: dictionary containing the options
:returns: filter_string formatted for an API endpoint :returns: option_string formatted for an API endpoint
""" """
filter_string = "" option_string = ""
if filters is not None: if options is not None:
for filt in filters: for key in options:
filter_string += "%s-%s/" % (filt, filters[filt]) option_string += "%s-%s/" % (key, options[key])
return filter_string return option_string
@staticmethod @staticmethod
def _extract_id(obj): def _extract_id(obj):

View file

@ -8,28 +8,28 @@ from .api_base import ApiBase
class ApiPhotos(ApiBase): class ApiPhotos(ApiBase):
""" Definitions of /photos/ API endpoints """ """ Definitions of /photos/ API endpoints """
def list(self, filters=None, **kwds): def list(self, options=None, **kwds):
""" """
Endpoint: /photos/[<filters>]/list.json Endpoint: /photos/[<options>]/list.json
Returns a list of Photo objects. Returns a list of Photo objects.
The filters parameter can be used to narrow down the list. The options parameter can be used to narrow down the list.
Eg: filters={"album": <album_id>} Eg: options={"album": <album_id>}
""" """
filter_string = self._build_filter_string(filters) option_string = self._build_option_string(options)
photos = self._client.get("/photos/%slist.json" % filter_string, photos = self._client.get("/photos/%slist.json" % option_string,
**kwds)["result"] **kwds)["result"]
photos = self._result_to_list(photos) photos = self._result_to_list(photos)
return [Photo(self._client, photo) for photo in photos] return [Photo(self._client, photo) for photo in photos]
def share(self, filters=None, **kwds): def share(self, options=None, **kwds):
""" """
Endpoint: /photos/[<filters>/share.json Endpoint: /photos/[<options>/share.json
Not currently implemented. Not currently implemented.
""" """
filter_string = self._build_filter_string(filters) option_string = self._build_option_string(options)
return self._client.post("/photos/%sshare.json" % filter_string, return self._client.post("/photos/%sshare.json" % option_string,
**kwds)["result"] **kwds)["result"]
def delete(self, photos, **kwds): def delete(self, photos, **kwds):
@ -136,18 +136,20 @@ class ApiPhoto(ApiBase):
**kwds)["result"] **kwds)["result"]
return Photo(self._client, result) return Photo(self._client, result)
# TODO: Add options def view(self, photo, options=None, **kwds):
def view(self, photo, **kwds):
""" """
Endpoint: /photo/<id>/view.json Endpoint: /photo/<id>/[<options>]/view.json
Requests all properties of a photo. Requests all properties of a photo.
Can be used to obtain URLs for the photo at a particular size, Can be used to obtain URLs for the photo at a particular size,
by using the "returnSizes" parameter. by using the "returnSizes" parameter.
Returns the requested photo object. Returns the requested photo object.
The options parameter can be used to pass in additional options.
Eg: options={"token": <token_data>}
""" """
result = self._client.get("/photo/%s/view.json" % option_string = self._build_option_string(options)
self._extract_id(photo), result = self._client.get("/photo/%s/%sview.json" %
(self._extract_id(photo), option_string),
**kwds)["result"] **kwds)["result"]
return Photo(self._client, result) return Photo(self._client, result)