Skip to content

Commit c978305

Browse files
authored
Merge pull request #147 from jkeyes/events-find-all
Adding multipage support for Event.find_all
2 parents d9705e1 + 18a3491 commit c978305

File tree

7 files changed

+75
-3
lines changed

7 files changed

+75
-3
lines changed

CHANGES.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
Changelog
22
=========
33

4+
* 3.0.2
5+
* Added multipage support for Event.find_all. (`#147 <https://github.com/jkeyes/python-intercom/pull/147>`_)
46
* 3.0.1
57
* Added support for HTTP keep-alive. (`#146 <https://github.com/jkeyes/python-intercom/pull/146>`_)
68
* 3.0

README.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,9 @@ Events
359359
}
360360
)
361361
362+
# Retrieve event list for user with id:'123abc'
363+
intercom.events.find_all(type='user', "intercom_user_id"="123abc)
364+
362365
Metadata Objects support a few simple types that Intercom can present on
363366
your behalf
364367

intercom/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
MultipleMatchingUsersError, RateLimitExceeded, ResourceNotFound,
77
ServerError, ServiceUnavailableError, UnexpectedError, TokenUnauthorizedError)
88

9-
__version__ = '3.0.1'
9+
__version__ = '3.0.2'
1010

1111

1212
RELATED_DOCS_TEXT = "See https://github.com/jkeyes/python-intercom \

intercom/api_operations/find_all.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
class FindAll(object):
99
"""A mixin that provides `find_all` functionality."""
1010

11+
proxy_class = CollectionProxy
12+
1113
def find_all(self, **params):
1214
"""Find all instances of the resource based on the supplied parameters."""
1315
collection = utils.resource_class_to_collection_name(
@@ -17,6 +19,6 @@ def find_all(self, **params):
1719
else:
1820
finder_url = "/%s" % (collection)
1921
finder_params = params
20-
return CollectionProxy(
22+
return self.proxy_class(
2123
self.client, self.collection_class, collection,
2224
finder_url, finder_params)

intercom/service/event.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,20 @@
33
from intercom import event
44
from intercom.api_operations.bulk import Submit
55
from intercom.api_operations.save import Save
6+
from intercom.api_operations.find_all import FindAll
67
from intercom.service.base_service import BaseService
8+
from intercom.collection_proxy import CollectionProxy
79

810

9-
class Event(BaseService, Save, Submit):
11+
class EventCollectionProxy(CollectionProxy):
12+
13+
def paging_info_present(self, response):
14+
return 'pages' in response and 'next' in response['pages']
15+
16+
17+
class Event(BaseService, Save, Submit, FindAll):
18+
19+
proxy_class = EventCollectionProxy
1020

1121
@property
1222
def collection_class(self):

tests/unit/__init__.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,20 @@ def get_company(name):
161161
}
162162

163163

164+
def get_event(name="the-event-name"):
165+
return {
166+
"type": "event",
167+
"event_name": name,
168+
"created_at": 1389913941,
169+
"user_id": "314159",
170+
"metadata": {
171+
"type": "user",
172+
"invitee_email": "pi@example.org",
173+
"invite_code": "ADDAFRIEND"
174+
}
175+
}
176+
177+
164178
def page_of_users(include_next_link=False):
165179
page = {
166180
"type": "user.list",
@@ -182,6 +196,21 @@ def page_of_users(include_next_link=False):
182196
return page
183197

184198

199+
def page_of_events(include_next_link=False):
200+
page = {
201+
"type": "event.list",
202+
"pages": {
203+
"next": None,
204+
},
205+
"events": [
206+
get_event("invited-friend"),
207+
get_event("bought-sub")],
208+
}
209+
if include_next_link:
210+
page["pages"]["next"] = "https://api.intercom.io/events?type=user&intercom_user_id=55a3b&before=144474756550" # noqa
211+
return page
212+
213+
185214
def page_of_companies(include_next_link=False):
186215
page = {
187216
"type": "company.list",

tests/unit/test_event.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,11 @@
66
from datetime import datetime
77
from intercom.client import Client
88
from intercom.user import User
9+
from mock import call
910
from mock import patch
11+
from nose.tools import eq_
1012
from nose.tools import istest
13+
from tests.unit import page_of_events
1114

1215

1316
class EventTest(unittest.TestCase):
@@ -22,6 +25,29 @@ def setUp(self): # noqa
2225
name="Jim Bob")
2326
self.created_time = now - 300
2427

28+
@istest
29+
def it_stops_iterating_if_no_next_link(self):
30+
body = page_of_events(include_next_link=False)
31+
with patch.object(Client, 'get', return_value=body) as mock_method: # noqa
32+
event_names = [event.event_name for event in self.client.events.find_all(
33+
type='user', email='joe@example.com')]
34+
mock_method.assert_called_once_with(
35+
'/events', {'type': 'user', 'email': 'joe@example.com'})
36+
eq_(event_names, ['invited-friend', 'bought-sub']) # noqa
37+
38+
@istest
39+
def it_keeps_iterating_if_next_link(self):
40+
page1 = page_of_events(include_next_link=True)
41+
page2 = page_of_events(include_next_link=False)
42+
side_effect = [page1, page2]
43+
with patch.object(Client, 'get', side_effect=side_effect) as mock_method: # noqa
44+
event_names = [event.event_name for event in self.client.events.find_all(
45+
type='user', email='joe@example.com')]
46+
eq_([call('/events', {'type': 'user', 'email': 'joe@example.com'}),
47+
call('/events?type=user&intercom_user_id=55a3b&before=144474756550', {})], # noqa
48+
mock_method.mock_calls)
49+
eq_(event_names, ['invited-friend', 'bought-sub'] * 2) # noqa
50+
2551
@istest
2652
def it_creates_an_event_with_metadata(self):
2753
data = {

0 commit comments

Comments
 (0)