Skip to content

Commit b3e7069

Browse files
authored
Merge pull request #21 from messagebird/add-groups
Add groups
2 parents d150161 + ecfc63d commit b3e7069

File tree

3 files changed

+160
-0
lines changed

3 files changed

+160
-0
lines changed

messagebird/client.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from messagebird.balance import Balance
66
from messagebird.contact import Contact, ContactList
77
from messagebird.error import Error
8+
from messagebird.group import ContactReference, Group, GroupList
89
from messagebird.hlr import HLR
910
from messagebird.http_client import HttpClient
1011
from messagebird.message import Message
@@ -147,3 +148,36 @@ def contact_update(self, id, params=None):
147148
def contact_list(self, limit=0, offset=0):
148149
query = 'limit='+str(limit)+'&offset='+str(offset)
149150
return ContactList().load(self.request('contacts?'+query, 'GET', None))
151+
152+
def group(self, id):
153+
return Group().load(self.request('groups/' + str(id), 'GET', None))
154+
155+
def group_create(self, name, params=None):
156+
if params is None: params = {}
157+
params.update({'name': name})
158+
return Group().load(self.request('groups', 'POST', params))
159+
160+
def group_delete(self, id):
161+
self.request_plain_text('groups/' + str(id), 'DELETE', None)
162+
163+
def group_list(self, limit=0, offset=0):
164+
query = 'limit=' + str(limit) + '&offset=' + str(offset)
165+
return GroupList().load(self.request('groups?'+query, 'GET', None))
166+
167+
def group_update(self, id, name, params=None):
168+
if params is None: params = {}
169+
params.update({'name': name})
170+
self.request_plain_text('groups/' + str(id), 'PATCH', params)
171+
172+
def group_add_contacts(self, groupId, contactIds):
173+
query = self.__group_add_contacts_query(contactIds)
174+
self.request_plain_text('groups/' + str(groupId) + '?' + query, 'PUT', None)
175+
176+
def __group_add_contacts_query(self, contactIds):
177+
# __group_add_contacts_query gets a query string to add contacts to a
178+
# group. The expected format is ids[]=first-contact&ids[]=second-contact.
179+
# See: https://developers.messagebird.com/docs/groups#add-contact-to-group.
180+
return '&'.join('ids[]=' + str(id) for id in contactIds)
181+
182+
def group_remove_contact(self, groupId, contactId):
183+
self.request_plain_text('groups/' + str(groupId) + '/contacts/' + str(contactId), 'DELETE', None)

messagebird/group.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
from messagebird.base import Base
2+
from messagebird.base_list import BaseList
3+
4+
5+
class ContactReference(Base):
6+
7+
def __init__(self):
8+
self.href = None
9+
self.totalCount = None
10+
11+
12+
class GroupList(BaseList):
13+
14+
def __init__(self):
15+
# Signal the BaseList that we're expecting items of type Group...
16+
super(GroupList, self).__init__(Group)
17+
18+
19+
class Group(Base):
20+
21+
def __init__(self):
22+
self.id = None
23+
self.href = None
24+
self.name = None
25+
self._contacts = None
26+
self.createdDatetime = None
27+
self.updatedDatetime = None
28+
29+
@property
30+
def contacts(self):
31+
return self._contacts
32+
33+
@contacts.setter
34+
def contacts(self, value):
35+
self._contacts = ContactReference().load(value)
36+
37+
@property
38+
def createdDatetime(self):
39+
return self._createdDatetime
40+
41+
@createdDatetime.setter
42+
def createdDatetime(self, value):
43+
self._createdDatetime = self.value_to_time(value)
44+
45+
@property
46+
def updatedDatetime(self):
47+
return self._updatedDatetime
48+
49+
@updatedDatetime.setter
50+
def updatedDatetime(self, value):
51+
self._updatedDatetime = self.value_to_time(value)

tests/test_group.py

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
import unittest
2+
from messagebird import Client
3+
4+
try:
5+
from unittest.mock import Mock
6+
except ImportError:
7+
# mock was added to unittest in Python 3.3, but was an external library
8+
# before.
9+
from mock import Mock
10+
11+
12+
class TestGroup(unittest.TestCase):
13+
14+
def test_group(self):
15+
http_client = Mock()
16+
http_client.request.return_value = '{"id": "group-id","href": "https://rest.messagebird.com/groups/group-id","name": "Friends","contacts": {"totalCount": 3,"href": "https://rest.messagebird.com/groups/group-id"},"createdDatetime": "2018-07-25T12:16:10+00:00","updatedDatetime": "2018-07-25T12:16:23+00:00"}'
17+
18+
group = Client('', http_client).group('group-id')
19+
20+
http_client.request.assert_called_once_with('groups/group-id', 'GET', None)
21+
22+
self.assertEqual('Friends', group.name)
23+
self.assertEqual(3, group.contacts.totalCount)
24+
25+
def test_group_create(self):
26+
http_client = Mock()
27+
http_client.request.return_value = '{}'
28+
29+
Client('', http_client).group_create('Family', {'foo': 'bar'})
30+
31+
http_client.request.assert_called_once_with('groups', 'POST', {'name': 'Family', 'foo': 'bar'})
32+
33+
def test_group_delete(self):
34+
http_client = Mock()
35+
http_client.request.return_value = ''
36+
37+
Client('', http_client).group_delete('group-id')
38+
39+
http_client.request.assert_called_once_with('groups/group-id', 'DELETE', None)
40+
41+
def test_list(self):
42+
http_client = Mock()
43+
http_client.request.return_value = '{"offset": 0,"limit": 25,"count": 2,"totalCount": 2,"links": {"first": "https://rest.messagebird.com/groups?offset=0&limit=10","previous": null,"next": null,"last": "https://rest.messagebird.com/groups?offset=0&limit=10"},"items": [{"id": "first-id","href": "https://rest.messagebird.com/groups/first-id","name": "First","contacts": {"totalCount": 3,"href": "https://rest.messagebird.com/groups/first-id/contacts"},"createdDatetime": "2018-07-25T11:47:42+00:00","updatedDatetime": "2018-07-25T14:03:09+00:00"},{"id": "second-id","href": "https://rest.messagebird.com/groups/second-id","name": "Second","contacts": {"totalCount": 4,"href": "https://rest.messagebird.com/groups/second-id/contacts"},"createdDatetime": "2018-07-25T11:47:39+00:00","updatedDatetime": "2018-07-25T14:03:09+00:00"}]}'
44+
45+
group_list = Client('', http_client).group_list(limit=25, offset=0)
46+
47+
http_client.request.assert_called_once_with('groups?limit=25&offset=0', 'GET', None)
48+
49+
self.assertEqual(2, group_list.totalCount)
50+
self.assertEqual('https://rest.messagebird.com/groups?offset=0&limit=10', group_list.links.first)
51+
self.assertEqual('Second', group_list.items[1].name)
52+
53+
def test_group_update(self):
54+
http_client = Mock()
55+
http_client.request.return_value = ''
56+
57+
Client('', http_client).group_update('group-id', 'friends')
58+
59+
http_client.request.assert_called_once_with('groups/group-id', 'PATCH', {'name': 'friends'})
60+
61+
def test_group_add_contacts(self):
62+
http_client = Mock()
63+
http_client.request.return_value = ''
64+
65+
Client('', http_client).group_add_contacts('group-id', ['contact-id', 'other-contact-id'])
66+
67+
http_client.request.assert_called_once_with('groups/group-id?ids[]=contact-id&ids[]=other-contact-id', 'PUT', None)
68+
69+
def test_group_remove_contact(self):
70+
http_client = Mock()
71+
http_client.request.return_value = ''
72+
73+
Client('', http_client).group_remove_contact('group-id', 'contact-id')
74+
75+
http_client.request.assert_called_once_with('groups/group-id/contacts/contact-id', 'DELETE', None)

0 commit comments

Comments
 (0)