Skip to content

Commit b6b3b2f

Browse files
committed
Initial MessagesAPI tests
1 parent 9f04657 commit b6b3b2f

File tree

3 files changed

+219
-20
lines changed

3 files changed

+219
-20
lines changed

tests/api/test_messages.py

Lines changed: 181 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,50 +2,211 @@
22

33
"""pytest Messages functions, fixtures and tests."""
44

5+
import itertools
56

67
import pytest
78

89
import ciscosparkapi
9-
from tests.utils import create_string
10+
from tests.conftest import TEST_FILE_URL
11+
from tests.utils import create_string, download_file
1012

1113

1214
# Helper Functions
1315

14-
def send_direct_message_to_email(api, email, message=None):
15-
msg_text = message if message else create_string("Message")
16-
return api.messages.create(toPersonEmail=email, text=msg_text)
16+
def create_message(api, **message_attributes):
17+
return api.messages.create(**message_attributes)
18+
19+
20+
def get_message_by_id(api, id):
21+
return api.messages.get(id)
1722

1823

1924
def delete_message(api, message):
2025
api.messages.delete(message.id)
2126

2227

23-
def delete_messages(api, messages):
24-
for message in messages:
28+
def delete_messages(api, iterable):
29+
for message in iterable:
2530
delete_message(api, message)
2631

2732

33+
def list_messages(api, roomId, **query_parameters):
34+
return list(api.messages.list(roomId, **query_parameters))
35+
36+
37+
def is_valid_message(obj):
38+
return isinstance(obj, ciscosparkapi.Message) and obj.id is not None
39+
40+
41+
def are_valid_messages(iterable):
42+
return all([is_valid_message(obj) for obj in iterable])
43+
44+
45+
def message_exists(api, message):
46+
try:
47+
api.messages.get(message.id)
48+
except ciscosparkapi.SparkApiError:
49+
return False
50+
else:
51+
return True
52+
53+
2854
# pytest Fixtures
2955

3056
@pytest.fixture(scope="session")
31-
def direct_messages(api, additional_group_room_memberships, test_people):
32-
# Using additional_group_room_memberships to ensure some test_people
33-
# have been created
34-
direct_messages = []
35-
for person in test_people:
36-
message = send_direct_message_to_email(api, person.emails[0])
37-
direct_messages.append(message)
57+
def direct_message_by_email(api, test_people):
58+
person = test_people["member_added_by_email"]
59+
message = create_message(api, toPersonEmail=person.emails[0],
60+
text=create_string("Message"))
3861

39-
yield direct_messages
62+
yield message
4063

41-
for message in direct_messages:
42-
delete_message(api, message)
64+
delete_message(api, message)
4365

4466

4567
@pytest.fixture(scope="session")
46-
def send_direct_message(api):
68+
def direct_message_by_id(api, test_people):
69+
person = test_people["member_added_by_id"]
70+
message = create_message(api, toPersonId=person.id,
71+
text=create_string("Message"))
72+
73+
yield message
4774

48-
def inner_function(email_address, message=None):
49-
send_direct_message_to_email(api, email_address, message=message)
75+
delete_message(api, message)
5076

51-
return inner_function
77+
78+
@pytest.fixture(scope="session")
79+
def send_group_room_message(api):
80+
messages = []
81+
82+
def inner_function(roomId, **message_attributes):
83+
message = create_message(api, roomId=roomId, **message_attributes)
84+
messages.append(message)
85+
return message
86+
87+
yield inner_function
88+
89+
for message in messages:
90+
try:
91+
delete_message(api, message)
92+
except ciscosparkapi.SparkApiError as e:
93+
pass
94+
95+
96+
@pytest.fixture(scope="session")
97+
def group_room_text_message(group_room, send_group_room_message):
98+
text = create_string("Message")
99+
return send_group_room_message(group_room.id, text=text)
100+
101+
102+
@pytest.fixture(scope="session")
103+
def group_room_markdown_message(group_room, send_group_room_message, me,
104+
group_room_member_added_by_email,
105+
group_room_text_message):
106+
# Uses / depends on group_room_text_message to ensure this message is
107+
# created after group_room_text_message, so that we can be sure that a
108+
# message exists 'before' this one - used to test 'before' list filters.
109+
mention_email = me.emails[0]
110+
markdown = create_string("<personEmail:{}>, This is **markdown** with a "
111+
"mention.".format(mention_email))
112+
return send_group_room_message(group_room.id, markdown=markdown)
113+
114+
115+
@pytest.fixture(scope="session")
116+
def group_room_file_by_URL_message(group_room, send_group_room_message):
117+
text = "File posted via URL"
118+
return send_group_room_message(group_room.id, text=text,
119+
files=[TEST_FILE_URL])
120+
121+
122+
@pytest.fixture(scope="session")
123+
def group_room_file_by_local_upload_message(api, group_room, local_file,
124+
send_group_room_message):
125+
text = "File posted via URL"
126+
return send_group_room_message(group_room.id, text=text,
127+
files=[local_file])
128+
129+
130+
@pytest.fixture(scope="session")
131+
def group_room_messages(api, group_room,
132+
group_room_text_message,
133+
group_room_markdown_message,
134+
group_room_file_by_URL_message,
135+
group_room_file_by_local_upload_message):
136+
return list(list_messages(api, group_room.id))
137+
138+
139+
@pytest.fixture(scope="session")
140+
def direct_messages(api, direct_message_by_email, direct_message_by_id):
141+
return [direct_message_by_email, direct_message_by_id]
142+
143+
144+
# Tests
145+
146+
class TestMessagesAPI(object):
147+
"""Test MessagesAPI methods."""
148+
149+
def test_create_direct_messages_by_email(self, direct_message_by_email):
150+
assert is_valid_message(direct_message_by_email)
151+
152+
def test_create_direct_messages_by_id(self, direct_message_by_id):
153+
assert is_valid_message(direct_message_by_id)
154+
155+
def test_create_text_message(self, group_room_text_message):
156+
assert is_valid_message(group_room_text_message)
157+
158+
def test_create_markdown_message(self, group_room_markdown_message):
159+
assert is_valid_message(group_room_markdown_message)
160+
161+
def test_post_file_by_url(self, group_room_file_by_URL_message):
162+
assert is_valid_message(group_room_file_by_URL_message)
163+
164+
def test_post_file_by_local_upload(self, group_room_file_by_local_upload_message):
165+
assert is_valid_message(group_room_file_by_local_upload_message)
166+
167+
def test_get_message_by_id(self, api, group_room_text_message):
168+
message = get_message_by_id(api, group_room_text_message.id)
169+
assert is_valid_message(message)
170+
171+
def test_delete_message(self, api, group_room, send_group_room_message):
172+
text = create_string("Message")
173+
message = create_message(api, roomId=group_room.id, text=text)
174+
assert is_valid_message(message)
175+
delete_message(api, message)
176+
assert not message_exists(api, message)
177+
178+
def test_list_all_messages_in_room(self, group_room_messages):
179+
assert len(group_room_messages) >= 1
180+
assert are_valid_messages(group_room_messages)
181+
182+
def test_list_messages_before(self, api, group_room,
183+
group_room_markdown_message):
184+
message_list = list_messages(api, group_room.id,
185+
before=group_room_markdown_message.created)
186+
assert len(message_list) >= 1
187+
assert are_valid_messages(message_list)
188+
189+
def test_list_messages_before_message(self, api, group_room,
190+
group_room_markdown_message):
191+
message_list = list_messages(api, group_room.id,
192+
beforeMessage=group_room_markdown_message.id)
193+
assert len(message_list) >= 1
194+
assert are_valid_messages(message_list)
195+
196+
def test_list_messages_with_paging(self, api, group_room,
197+
group_room_messages):
198+
page_size = 1
199+
pages = 3
200+
num_messages = pages * page_size
201+
assert len(group_room_messages) >= num_messages
202+
messages = list_messages(api, group_room.id, max=page_size)
203+
messages_list = list(itertools.islice(messages, num_messages))
204+
assert len(messages_list) == num_messages
205+
assert are_valid_messages(messages_list)
206+
207+
# TODO: Investigate API list messages with 'me' mentions not working
208+
# def test_list_messages_with_me_mention(self, api, group_room, me):
209+
# messages = list_messages(api, group_room.id, mentionedPeople=["me"])
210+
# messages_list = list(messages)
211+
# assert len(messages_list) >= 1
212+
# assert are_valid_messages(messages_list)

tests/conftest.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,24 @@ def new_email_generator():
4545

4646
# pytest Fixtures
4747

48+
@pytest.fixture("session")
49+
def temp_directory():
50+
directory_abs_path = tempfile.mkdtemp()
51+
52+
yield directory_abs_path
53+
54+
os.rmdir(directory_abs_path)
55+
56+
57+
@pytest.fixture("session")
58+
def local_file(temp_directory):
59+
file = download_file(TEST_FILE_URL, temp_directory)
60+
61+
yield file
62+
63+
os.remove(file)
64+
65+
4866
@pytest.fixture(scope="session")
4967
def get_new_email_address():
5068
generator = new_email_generator()

tests/utils.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,11 @@
44

55

66
import datetime
7+
import os
78
import string
89

10+
import requests
11+
912

1013
STRING_PREFIX = "ciscosparkapi py.test"
1114
STRING_TEMPLATE = string.Template("$prefix $item [$datetime]")
@@ -14,6 +17,23 @@
1417
# Helper Functions
1518

1619
def create_string(item):
20+
"""Create strings for tests; prefixed-timestamped strings."""
1721
return STRING_TEMPLATE.substitute(prefix=STRING_PREFIX,
1822
item=item,
1923
datetime=str(datetime.datetime.now()))
24+
25+
26+
def download_file(url, local_directory, local_filename=None):
27+
"""Download a file from a remote URL to a local directory."""
28+
# http://stackoverflow.com/questions/16694907/
29+
# how-to-download-large-file-in-python-with-requests-py
30+
local_filename = local_filename if local_filename \
31+
else url.split('/')[-1]
32+
local_path = os.path.normpath(os.path.join(local_directory,
33+
local_filename))
34+
response = requests.get(url, stream=True)
35+
with open(local_path, 'wb') as f:
36+
for chunk in response.iter_content(chunk_size=1024):
37+
if chunk:
38+
f.write(chunk)
39+
return local_path

0 commit comments

Comments
 (0)