diff --git a/CHANGES.rst b/CHANGES.rst index 054e2957..3a81e5d3 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,6 +1,8 @@ Changelog ========= +* 3.0.2 + * Added multipage support for Event.find_all. (`#147 `_) * 3.0.1 * Added support for HTTP keep-alive. (`#146 `_) * 3.0 diff --git a/README.rst b/README.rst index a87b8e47..5df64973 100644 --- a/README.rst +++ b/README.rst @@ -359,6 +359,9 @@ Events } ) + # Retrieve event list for user with id:'123abc' + intercom.events.find_all(type='user', "intercom_user_id"="123abc) + Metadata Objects support a few simple types that Intercom can present on your behalf diff --git a/intercom/__init__.py b/intercom/__init__.py index accbc662..1f0100d4 100644 --- a/intercom/__init__.py +++ b/intercom/__init__.py @@ -6,7 +6,7 @@ MultipleMatchingUsersError, RateLimitExceeded, ResourceNotFound, ServerError, ServiceUnavailableError, UnexpectedError, TokenUnauthorizedError) -__version__ = '3.0.1' +__version__ = '3.0.2' RELATED_DOCS_TEXT = "See https://github.com/jkeyes/python-intercom \ diff --git a/intercom/api_operations/find_all.py b/intercom/api_operations/find_all.py index cd8b251e..8538f57a 100644 --- a/intercom/api_operations/find_all.py +++ b/intercom/api_operations/find_all.py @@ -8,6 +8,8 @@ class FindAll(object): """A mixin that provides `find_all` functionality.""" + proxy_class = CollectionProxy + def find_all(self, **params): """Find all instances of the resource based on the supplied parameters.""" collection = utils.resource_class_to_collection_name( @@ -17,6 +19,6 @@ def find_all(self, **params): else: finder_url = "/%s" % (collection) finder_params = params - return CollectionProxy( + return self.proxy_class( self.client, self.collection_class, collection, finder_url, finder_params) diff --git a/intercom/service/event.py b/intercom/service/event.py index 2243e6fe..2ae1492c 100644 --- a/intercom/service/event.py +++ b/intercom/service/event.py @@ -3,10 +3,20 @@ from intercom import event from intercom.api_operations.bulk import Submit from intercom.api_operations.save import Save +from intercom.api_operations.find_all import FindAll from intercom.service.base_service import BaseService +from intercom.collection_proxy import CollectionProxy -class Event(BaseService, Save, Submit): +class EventCollectionProxy(CollectionProxy): + + def paging_info_present(self, response): + return 'pages' in response and 'next' in response['pages'] + + +class Event(BaseService, Save, Submit, FindAll): + + proxy_class = EventCollectionProxy @property def collection_class(self): diff --git a/tests/unit/__init__.py b/tests/unit/__init__.py index d0b2824d..5a76c1e4 100644 --- a/tests/unit/__init__.py +++ b/tests/unit/__init__.py @@ -161,6 +161,20 @@ def get_company(name): } +def get_event(name="the-event-name"): + return { + "type": "event", + "event_name": name, + "created_at": 1389913941, + "user_id": "314159", + "metadata": { + "type": "user", + "invitee_email": "pi@example.org", + "invite_code": "ADDAFRIEND" + } + } + + def page_of_users(include_next_link=False): page = { "type": "user.list", @@ -182,6 +196,21 @@ def page_of_users(include_next_link=False): return page +def page_of_events(include_next_link=False): + page = { + "type": "event.list", + "pages": { + "next": None, + }, + "events": [ + get_event("invited-friend"), + get_event("bought-sub")], + } + if include_next_link: + page["pages"]["next"] = "https://api.intercom.io/events?type=user&intercom_user_id=55a3b&before=144474756550" # noqa + return page + + def page_of_companies(include_next_link=False): page = { "type": "company.list", diff --git a/tests/unit/test_event.py b/tests/unit/test_event.py index 2b953413..83fb4e3e 100644 --- a/tests/unit/test_event.py +++ b/tests/unit/test_event.py @@ -6,8 +6,11 @@ from datetime import datetime from intercom.client import Client from intercom.user import User +from mock import call from mock import patch +from nose.tools import eq_ from nose.tools import istest +from tests.unit import page_of_events class EventTest(unittest.TestCase): @@ -22,6 +25,29 @@ def setUp(self): # noqa name="Jim Bob") self.created_time = now - 300 + @istest + def it_stops_iterating_if_no_next_link(self): + body = page_of_events(include_next_link=False) + with patch.object(Client, 'get', return_value=body) as mock_method: # noqa + event_names = [event.event_name for event in self.client.events.find_all( + type='user', email='joe@example.com')] + mock_method.assert_called_once_with( + '/events', {'type': 'user', 'email': 'joe@example.com'}) + eq_(event_names, ['invited-friend', 'bought-sub']) # noqa + + @istest + def it_keeps_iterating_if_next_link(self): + page1 = page_of_events(include_next_link=True) + page2 = page_of_events(include_next_link=False) + side_effect = [page1, page2] + with patch.object(Client, 'get', side_effect=side_effect) as mock_method: # noqa + event_names = [event.event_name for event in self.client.events.find_all( + type='user', email='joe@example.com')] + eq_([call('/events', {'type': 'user', 'email': 'joe@example.com'}), + call('/events?type=user&intercom_user_id=55a3b&before=144474756550', {})], # noqa + mock_method.mock_calls) + eq_(event_names, ['invited-friend', 'bought-sub'] * 2) # noqa + @istest def it_creates_an_event_with_metadata(self): data = {