Skip to content

Commit 7ceee94

Browse files
authored
Online Automated Tests, Squashed a couple bugs (#32)
* Revise Memberships API wrapper tests Revise method for generating test accounts; the test accounts need to be ‘Messaging’ licensed users (to enable the moderator functionality). * Add TestPeople class to Manage Test Accounts Add a TestPeople class to create, manage and delete (when tests are complete) test (person) accounts. * Simplify pytest.fixture rooms_list and dependencies Add group_room, direct_rooms, and team_room to the use / dependency list of fixture rooms_list; remove these dependencies from the tests that depend on rooms_list * Change page_size to 1 in test_list_rooms_with_paging There is no need for each ‘page’ to contain more than a single item. This may help minimize the number of test rooms created, which will help minimize the number of API calls that must be made to create and delete these test rooms. * Initial TeamsAPI tests * Generalize test accounts Remove “group_room_” prefix from test account references to enable them to be reused by the team_memberships tests. * Optimize dependencies for authenticated_user_memberships Add group_room, team_room, and direct_rooms dependencies to authenticated_user_memberships and remove them from tests that depend on authenticated_user_memberships. * Change page_size to 1 in test_list_user_memberships_with_paging There is no need for each ‘page’ to contain more than a single item. This may help minimize the number of rooms created, which will help minimize the number of API calls that must be made to create and delete these test rooms. * Optimize use of test accounts when testing deleting memberships Use a generic / reusable ’named test account’ instead of a temp_account. This same test_account can be reused when testing team memberships. * Initial TeamMembershipsAPI tests * Initial PeopleAPI tests * mentionedPeople should be of type list not string_types * Add CiscoSparkAPI.people.delete() method / API call I don’t know how I missed this one… * Squash some test bugs * Initial MessagesAPI tests * Squash memberships test bugs * Temporarily disable test account deletion Temporarily disabling test account deletion to work on account capabilities issues. * Temp Disable Test: Update Person API is not working * Temp Disable Test: Spark API / documentation bug in GET 'team/memberships' * Temp Disable Test: Update team name API is not working
1 parent 52b3a2e commit 7ceee94

13 files changed

+1148
-78
lines changed

ciscosparkapi/api/messages.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,8 +161,7 @@ def list(self, roomId, mentionedPeople=None, before=None,
161161
"""
162162
# Process args
163163
assert isinstance(roomId, string_types)
164-
assert mentionedPeople is None or \
165-
isinstance(mentionedPeople, string_types)
164+
assert mentionedPeople is None or isinstance(mentionedPeople, list)
166165
assert before is None or isinstance(before, string_types)
167166
assert beforeMessage is None or isinstance(beforeMessage, string_types)
168167
assert max is None or isinstance(max, int)

ciscosparkapi/api/people.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ def create(self, emails, **person_attributes):
220220
221221
"""
222222
# Process args
223-
assert isinstance(emails, string_types) and len(emails) == 1
223+
assert isinstance(emails, list) and len(emails) == 1
224224
post_data = {}
225225
post_data['emails'] = emails
226226
post_data.update(person_attributes)
@@ -302,6 +302,24 @@ def get(self, personId):
302302
# Return a Person object created from the response JSON data
303303
return Person(json_obj)
304304

305+
def delete(self, personId):
306+
"""Remove a person from the system.
307+
308+
Only an admin can remove a person.
309+
310+
Args:
311+
personId(string_types): The personID of the person.
312+
313+
Raises:
314+
AssertionError: If the parameter types are incorrect.
315+
SparkApiError: If the Cisco Spark cloud returns an error.
316+
317+
"""
318+
# Process args
319+
assert isinstance(personId, string_types)
320+
# API request
321+
self._session.delete('people/' + personId)
322+
305323
def me(self):
306324
"""Get the person details of the account accessing the API 'me'.
307325

tests/api/test_licenses.py

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
# -*- coding: utf-8 -*-
2+
3+
"""pytest Licenses API wrapper tests and fixtures."""
4+
5+
6+
import pytest
7+
8+
import ciscosparkapi
9+
10+
11+
# Helper Functions
12+
13+
def get_list_of_licenses(api, orgId=None, max=None):
14+
return api.licenses.list(orgId=orgId, max=max)
15+
16+
17+
def get_license_by_id(api, licenseId):
18+
return api.licenses.get(licenseId)
19+
20+
21+
def is_valid_license(obj):
22+
return isinstance(obj, ciscosparkapi.License) and obj.id is not None
23+
24+
25+
def are_valid_licenses(iterable):
26+
return all([is_valid_license(obj) for obj in iterable])
27+
28+
29+
# pytest Fixtures
30+
31+
@pytest.fixture(scope="session")
32+
def licenses_list(api):
33+
return list(get_list_of_licenses(api))
34+
35+
36+
@pytest.fixture(scope="session")
37+
def licenses_dict(licenses_list):
38+
return {lic.name: lic for lic in licenses_list}
39+
40+
41+
# Tests
42+
43+
class TestLicensesAPI(object):
44+
"""Test LicensesAPI methods."""
45+
46+
def test_list_licenses(self, licenses_list):
47+
assert are_valid_licenses(licenses_list)
48+
49+
def test_list_licenses_with_paging(self, api):
50+
paging_generator = get_list_of_licenses(api, max=1)
51+
licenses = list(paging_generator)
52+
assert licenses > 1
53+
assert are_valid_licenses(licenses)
54+
55+
def test_get_licenses_for_organization(self, api, me):
56+
licenses = list(get_list_of_licenses(api, orgId=me.orgId))
57+
assert are_valid_licenses(licenses)
58+
59+
def test_get_license_by_id(self, api, licenses_list):
60+
assert len(licenses_list) >= 1
61+
license_id = licenses_list[0].id
62+
license = get_license_by_id(api, licenseId=license_id)
63+
assert is_valid_license(license)

tests/api/test_memberships.py

Lines changed: 210 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,45 +3,237 @@
33
"""pytest Memberships functions, fixtures and tests."""
44

55

6+
import itertools
7+
68
import pytest
79

810
import ciscosparkapi
911

1012

1113
# Helper Functions
1214

13-
def add_people_to_room(api, room, emails):
14-
for email in emails:
15-
api.memberships.create(room.id, personEmail=email)
15+
def add_person_to_room_by_email(api, room, person, isModerator=False):
16+
return api.memberships.create(room.id,
17+
personEmail=person.emails[0],
18+
isModerator=isModerator)
19+
20+
21+
def add_person_to_room_by_id(api, room, person, isModerator=False):
22+
return api.memberships.create(room.id,
23+
personId=person.id,
24+
isModerator=isModerator)
25+
26+
27+
def add_people_to_room_by_email(api, room, people):
28+
return [add_person_to_room_by_email(api, room, person)
29+
for person in people]
30+
31+
32+
def add_people_to_room_by_id(api, room, people):
33+
return [add_person_to_room_by_id(api, room, person)
34+
for person in people]
35+
36+
37+
def get_room_membership_list(api, room, **kwargs):
38+
return list(api.memberships.list(roomId=room.id, **kwargs))
39+
40+
41+
def get_my_membership(api, room, me):
42+
memberships = get_room_membership_list(api, room, personId=me.id)
43+
assert len(memberships) == 1
44+
membership = memberships[0]
45+
return membership
46+
47+
48+
def get_membership_by_id(api, id):
49+
return api.memberships.get(id)
50+
51+
52+
def make_moderator(api, membership):
53+
return api.memberships.update(membership.id, isModerator=True)
54+
55+
56+
def delete_membership(api, membership):
57+
api.memberships.delete(membership.id)
1658

1759

1860
def empty_room(api, me, room):
19-
"""Remove all memberships from a room (except the caller's membership)."""
61+
"""Remove all memberships from a room (except me)."""
2062
memberships = api.memberships.list(room.id)
2163
for membership in memberships:
2264
if membership.personId != me.id:
23-
api.memberships.delete(membership.id)
65+
delete_membership(api, membership)
66+
67+
68+
def is_valid_membership(membership):
69+
return isinstance(membership, ciscosparkapi.Membership) \
70+
and membership.id is not None
71+
72+
73+
def are_valid_memberships(iterable):
74+
are_valid = (is_valid_membership(item) for item in iterable)
75+
return all(are_valid)
76+
77+
78+
def membership_exists(api, membership):
79+
try:
80+
get_membership_by_id(api, membership.id)
81+
except ciscosparkapi.SparkApiError:
82+
return False
83+
else:
84+
return True
2485

2586

2687
# pytest Fixtures
2788

2889
@pytest.fixture(scope="session")
29-
def group_room_with_members(api, me, group_room, email_addresses):
30-
add_people_to_room(api, group_room, email_addresses)
31-
yield group_room
32-
empty_room(api, me, group_room)
90+
def authenticated_user_memberships(api, group_room, team_room, direct_rooms):
91+
return list(api.memberships.list())
3392

3493

3594
@pytest.fixture(scope="session")
36-
def team_room_with_members(api, me, team_room, email_addresses):
37-
add_people_to_room(api, team_room, email_addresses)
38-
yield team_room
39-
empty_room(api, me, team_room)
95+
def me_group_room_moderator(api, group_room, me):
96+
membership_id = get_my_membership(api, group_room, me)
97+
return make_moderator(api, membership_id)
4098

4199

42-
@pytest.fixture
43-
def temp_group_room_with_members(api, me, temp_group_room, email_addresses):
44-
add_people_to_room(api, temp_group_room, email_addresses)
45-
yield temp_group_room
46-
empty_room(api, me, temp_group_room)
100+
@pytest.fixture(scope="session")
101+
def group_room_member_added_by_email(api, me_group_room_moderator,
102+
group_room, test_people):
103+
person = test_people["member_added_by_email"]
104+
membership = add_person_to_room_by_email(api, group_room, person)
105+
106+
yield membership
107+
108+
delete_membership(api, membership)
109+
110+
111+
@pytest.fixture(scope="session")
112+
def group_room_member_added_by_id(api, me_group_room_moderator,
113+
group_room, test_people):
114+
person = test_people["member_added_by_id"]
115+
membership = add_person_to_room_by_id(api, group_room, person)
116+
117+
yield membership
118+
119+
delete_membership(api, membership)
120+
121+
122+
@pytest.fixture(scope="session")
123+
def group_room_moderator_added_by_email(api, me_group_room_moderator,
124+
group_room, test_people):
125+
person = test_people["moderator_added_by_email"]
126+
membership = add_person_to_room_by_email(api, group_room, person,
127+
isModerator=True)
128+
129+
yield membership
47130

131+
delete_membership(api, membership)
132+
133+
134+
@pytest.fixture(scope="session")
135+
def group_room_moderator_added_by_id(api, me_group_room_moderator,
136+
group_room, test_people):
137+
person = test_people["moderator_added_by_id"]
138+
membership = add_person_to_room_by_id(api, group_room, person,
139+
isModerator=True)
140+
141+
yield membership
142+
143+
delete_membership(api, membership)
144+
145+
146+
@pytest.fixture(scope="session")
147+
def additional_group_room_memberships(group_room_member_added_by_email,
148+
group_room_member_added_by_id,
149+
group_room_moderator_added_by_email,
150+
group_room_moderator_added_by_id):
151+
return [group_room_member_added_by_email,
152+
group_room_member_added_by_id,
153+
group_room_moderator_added_by_email,
154+
group_room_moderator_added_by_id]
155+
156+
157+
@pytest.fixture(scope="session")
158+
def group_room_with_members(group_room, additional_group_room_memberships):
159+
return group_room
160+
161+
162+
# Tests
163+
164+
class TestMembershipsAPI(object):
165+
"""Test MembershipsAPI methods."""
166+
167+
def test_get_membership_details(self, api, me_group_room_moderator):
168+
membership_id = me_group_room_moderator.id
169+
membership = get_membership_by_id(api, membership_id)
170+
assert is_valid_membership(membership)
171+
172+
def test_list_user_memberships(self, authenticated_user_memberships):
173+
assert len(authenticated_user_memberships) >= 3
174+
assert are_valid_memberships(authenticated_user_memberships)
175+
176+
def test_list_user_memberships_with_paging(self, api, add_rooms,
177+
authenticated_user_memberships):
178+
page_size = 1
179+
pages = 3
180+
num_memberships = pages * page_size
181+
if len(authenticated_user_memberships) < num_memberships:
182+
add_rooms(num_memberships - len(authenticated_user_memberships))
183+
memberships = api.memberships.list(max=page_size)
184+
memberships_list = list(itertools.islice(memberships, num_memberships))
185+
assert len(memberships_list) == num_memberships
186+
assert are_valid_memberships(memberships_list)
187+
188+
def test_create_membership_by_email(self,
189+
group_room_member_added_by_email):
190+
assert is_valid_membership(group_room_member_added_by_email)
191+
192+
def test_create_membership_by_person_id(self,
193+
group_room_member_added_by_id):
194+
assert is_valid_membership(group_room_member_added_by_id)
195+
196+
def test_create_moderator_by_email(self,
197+
group_room_moderator_added_by_email):
198+
assert is_valid_membership(group_room_moderator_added_by_email)
199+
200+
def test_create_moderator_by_person_id(self,
201+
group_room_moderator_added_by_id):
202+
assert is_valid_membership(group_room_moderator_added_by_id)
203+
204+
def test_update_membership_make_moderator(self,
205+
me_group_room_moderator):
206+
assert is_valid_membership(me_group_room_moderator)
207+
assert me_group_room_moderator.isModerator
208+
209+
def test_delete_membership(self, api, group_room, test_people):
210+
person = test_people["not_a_member"]
211+
membership = add_person_to_room_by_id(api, group_room, person)
212+
assert is_valid_membership(membership)
213+
delete_membership(api, membership)
214+
assert not membership_exists(api, membership)
215+
216+
def test_list_room_memberships(self, api, group_room_with_members):
217+
memberships = get_room_membership_list(api, group_room_with_members)
218+
assert len(memberships) > 1
219+
assert are_valid_memberships(memberships)
220+
221+
def test_filter_room_memberships_by_personEmail(self, api, test_people,
222+
group_room_with_members):
223+
email = test_people["member_added_by_email"].emails[0]
224+
memberships = get_room_membership_list(api, group_room_with_members,
225+
personEmail=email)
226+
assert len(memberships) == 1
227+
membership = memberships[0]
228+
assert is_valid_membership(membership)
229+
assert membership.roomId == group_room_with_members.id
230+
231+
def test_filter_room_memberships_by_personId(self, api, test_people,
232+
group_room_with_members):
233+
id = test_people["member_added_by_id"].id
234+
memberships = get_room_membership_list(api, group_room_with_members,
235+
personId=id)
236+
assert len(memberships) == 1
237+
membership = memberships[0]
238+
assert is_valid_membership(membership)
239+
assert membership.roomId == group_room_with_members.id

0 commit comments

Comments
 (0)