Team details page.
TNL-1906
This commit is contained in:
@@ -252,3 +252,63 @@ class TeamPage(CoursePage, PaginatedUIMixin):
|
||||
def team_description(self):
|
||||
"""Get the team's description as displayed in the page header"""
|
||||
return self.q(css=TEAMS_HEADER_CSS + ' .page-description')[0].text
|
||||
|
||||
@property
|
||||
def team_members_present(self):
|
||||
"""Verifies that team members are present"""
|
||||
return self.q(css='.page-content-secondary .team-members .team-member').present
|
||||
|
||||
@property
|
||||
def team_capacity_text(self):
|
||||
"""Returns team capacity text"""
|
||||
return self.q(css='.page-content-secondary .team-capacity :last-child').text[0]
|
||||
|
||||
@property
|
||||
def team_location(self):
|
||||
""" Returns team location/country. """
|
||||
return self.q(css='.page-content-secondary .team-country :last-child').text[0]
|
||||
|
||||
@property
|
||||
def team_language(self):
|
||||
""" Returns team location/country. """
|
||||
return self.q(css='.page-content-secondary .team-language :last-child').text[0]
|
||||
|
||||
@property
|
||||
def team_user_membership_text(self):
|
||||
"""Returns the team membership text"""
|
||||
query = self.q(css='.page-content-secondary > .team-user-membership-status')
|
||||
return query.text[0] if query.present else ''
|
||||
|
||||
@property
|
||||
def team_leave_link_present(self):
|
||||
"""Verifies that team leave link is present"""
|
||||
return self.q(css='.leave-team-link').present
|
||||
|
||||
@property
|
||||
def team_invite_section_present(self):
|
||||
"""Verifies that invite section is present"""
|
||||
return self.q(css='.page-content-secondary .invite-team').present
|
||||
|
||||
@property
|
||||
def team_members(self):
|
||||
"""Returns the number of team members in this team"""
|
||||
return len(self.q(css='.page-content-secondary .team-member'))
|
||||
|
||||
def click_first_profile_image(self):
|
||||
"""Clicks on first team member's profile image"""
|
||||
self.q(css='.page-content-secondary .members-info > .team-member').first.click()
|
||||
|
||||
@property
|
||||
def first_member_username(self):
|
||||
"""Returns the username of team member"""
|
||||
return self.q(css='.page-content-secondary .tooltip-custom').text[0]
|
||||
|
||||
@property
|
||||
def team_invite_help_text(self):
|
||||
"""Returns the team invite help text"""
|
||||
return self.q(css='.page-content-secondary .invite-text').text[0]
|
||||
|
||||
@property
|
||||
def team_invite_url(self):
|
||||
"""Returns the url of invite link box"""
|
||||
return self.q(css='.page-content-secondary .invite-link-input').attrs('value')[0]
|
||||
|
||||
@@ -16,6 +16,7 @@ from ...fixtures.discussion import (
|
||||
)
|
||||
from ...pages.lms.auto_auth import AutoAuthPage
|
||||
from ...pages.lms.course_info import CourseInfoPage
|
||||
from ...pages.lms.learner_profile import LearnerProfilePage
|
||||
from ...pages.lms.tab_nav import TabNavPage
|
||||
from ...pages.lms.teams import TeamsPage, MyTeamsPage, BrowseTopicsPage, BrowseTeamsPage, CreateTeamPage, TeamPage
|
||||
|
||||
@@ -40,7 +41,9 @@ class TeamsTabBase(UniqueCourseTest):
|
||||
'course_id': self.course_id,
|
||||
'topic_id': topic['id'],
|
||||
'name': 'Team {}'.format(i),
|
||||
'description': 'Description {}'.format(i)
|
||||
'description': 'Description {}'.format(i),
|
||||
'language': 'aa',
|
||||
'country': 'AF'
|
||||
}
|
||||
response = self.course_fixture.session.post(
|
||||
LMS_BASE_URL + '/api/team/v0/teams/',
|
||||
@@ -711,6 +714,7 @@ class CreateTeamTest(TeamsTabBase):
|
||||
When I fill all the fields present with appropriate data
|
||||
And I click Create button
|
||||
Then I should see the page for my team
|
||||
And I should see the message that says "You are member of this team"
|
||||
"""
|
||||
self.verify_and_navigate_to_create_team_page()
|
||||
|
||||
@@ -722,6 +726,7 @@ class CreateTeamTest(TeamsTabBase):
|
||||
team_page.wait_for_page()
|
||||
self.assertEqual(team_page.team_name, self.team_name)
|
||||
self.assertEqual(team_page.team_description, 'The Avengers are a fictional team of superheroes.')
|
||||
self.assertEqual(team_page.team_user_membership_text, 'You are a member of this team.')
|
||||
|
||||
def test_user_can_cancel_the_team_creation(self):
|
||||
"""
|
||||
@@ -748,9 +753,37 @@ class TeamPageTest(TeamsTabBase):
|
||||
def setUp(self):
|
||||
super(TeamPageTest, self).setUp()
|
||||
self.topic = {u"name": u"Example Topic", u"id": "example_topic", u"description": "Description"}
|
||||
self.set_team_configuration({'course_id': self.course_id, 'max_team_size': 10, 'topics': [self.topic]})
|
||||
self.team = self.create_teams(self.topic, 1)[0]
|
||||
self.team_page = TeamPage(self.browser, self.course_id, self.team)
|
||||
|
||||
def _set_team_configuration_and_membership(
|
||||
self,
|
||||
max_team_size=10,
|
||||
membership_team_index=0,
|
||||
visit_team_index=0,
|
||||
create_membership=True,
|
||||
another_user=False):
|
||||
"""
|
||||
Set team configuration.
|
||||
|
||||
Arguments:
|
||||
max_team_size (int): number of users a team can have
|
||||
membership_team_index (int): index of team user will join
|
||||
visit_team_index (int): index of team user will visit
|
||||
create_membership (bool): whether to create membership or not
|
||||
another_user (bool): another user to visit a team
|
||||
"""
|
||||
#pylint: disable=attribute-defined-outside-init
|
||||
self.set_team_configuration(
|
||||
{'course_id': self.course_id, 'max_team_size': max_team_size, 'topics': [self.topic]}
|
||||
)
|
||||
self.teams = self.create_teams(self.topic, 2)
|
||||
|
||||
if create_membership:
|
||||
self.create_membership(self.user_info['username'], self.teams[membership_team_index]['id'])
|
||||
|
||||
if another_user:
|
||||
AutoAuthPage(self.browser, course_id=self.course_id).visit()
|
||||
|
||||
self.team_page = TeamPage(self.browser, self.course_id, self.teams[visit_team_index])
|
||||
|
||||
def setup_thread(self):
|
||||
"""
|
||||
@@ -758,7 +791,7 @@ class TeamPageTest(TeamsTabBase):
|
||||
"""
|
||||
thread = Thread(
|
||||
id="test_thread_{}".format(uuid4().hex),
|
||||
commentable_id=self.team['discussion_topic_id'],
|
||||
commentable_id=self.teams[0]['discussion_topic_id'],
|
||||
body="Dummy text body."
|
||||
)
|
||||
thread_fixture = MultipleThreadFixture([thread])
|
||||
@@ -787,7 +820,7 @@ class TeamPageTest(TeamsTabBase):
|
||||
"""
|
||||
thread = self.setup_thread()
|
||||
self.team_page.visit()
|
||||
self.assertEqual(self.team_page.discussion_id, self.team['discussion_topic_id'])
|
||||
self.assertEqual(self.team_page.discussion_id, self.teams[0]['discussion_topic_id'])
|
||||
discussion = self.team_page.discussion_page
|
||||
self.assertTrue(discussion.is_browser_on_page())
|
||||
self.assertTrue(discussion.is_discussion_expanded())
|
||||
@@ -809,7 +842,7 @@ class TeamPageTest(TeamsTabBase):
|
||||
And I should see the existing thread
|
||||
And I should see controls to change the state of the discussion
|
||||
"""
|
||||
self.create_membership(self.user_info['username'], self.team['id'])
|
||||
self._set_team_configuration_and_membership()
|
||||
self.verify_teams_discussion_permissions(True)
|
||||
|
||||
@ddt.data(True, False)
|
||||
@@ -825,10 +858,142 @@ class TeamPageTest(TeamsTabBase):
|
||||
And I should see the team's thread
|
||||
And I should not see controls to change the state of the discussion
|
||||
"""
|
||||
self._set_team_configuration_and_membership(create_membership=False)
|
||||
self.setup_discussion_user(staff=is_staff)
|
||||
self.verify_teams_discussion_permissions(False)
|
||||
|
||||
@ddt.data('Moderator', 'Community TA', 'Administrator')
|
||||
def test_discussion_privileged(self, role):
|
||||
self._set_team_configuration_and_membership(create_membership=False)
|
||||
self.setup_discussion_user(role=role)
|
||||
self.verify_teams_discussion_permissions(True)
|
||||
|
||||
def assert_team_details(self, num_members, is_member=True, max_size=10, invite_text=''):
|
||||
"""
|
||||
Verifies that user can see all the information, present on detail page according to their membership status.
|
||||
|
||||
Arguments:
|
||||
num_members (int): number of users in a team
|
||||
is_member (bool) default True: True if request user is member else False
|
||||
max_size (int): number of users a team can have
|
||||
invite_text (str): help text for invite link.
|
||||
"""
|
||||
self.assertEqual(
|
||||
self.team_page.team_capacity_text,
|
||||
'{num_members} / {max_size} {members_text}'.format(
|
||||
num_members=num_members,
|
||||
max_size=max_size,
|
||||
members_text='Member' if num_members == max_size else 'Members'
|
||||
)
|
||||
)
|
||||
self.assertEqual(self.team_page.team_location, 'Afghanistan')
|
||||
self.assertEqual(self.team_page.team_language, 'Afar')
|
||||
self.assertEqual(self.team_page.team_members, num_members)
|
||||
|
||||
if num_members > 0:
|
||||
self.assertTrue(self.team_page.team_members_present)
|
||||
else:
|
||||
self.assertFalse(self.team_page.team_members_present)
|
||||
|
||||
if is_member:
|
||||
self.assertEqual(self.team_page.team_user_membership_text, 'You are a member of this team.')
|
||||
self.assertTrue(self.team_page.team_leave_link_present)
|
||||
self.assertTrue(self.team_page.team_invite_section_present)
|
||||
self.assertEqual(self.team_page.team_invite_help_text, invite_text)
|
||||
else:
|
||||
self.assertEqual(self.team_page.team_user_membership_text, '')
|
||||
self.assertFalse(self.team_page.team_leave_link_present)
|
||||
self.assertFalse(self.team_page.team_invite_section_present)
|
||||
|
||||
def test_team_member_can_see_full_team_details(self):
|
||||
"""
|
||||
Scenario: Team member can see full info for team.
|
||||
Given I am enrolled in a course with a team configuration, a topic,
|
||||
and a team belonging to that topic of which I am a member
|
||||
When I visit the Team page for that team
|
||||
Then I should see the full team detail
|
||||
And I should see the team members
|
||||
And I should see my team membership text
|
||||
And I should see the language & country
|
||||
And I should see the Leave Team and Invite Team
|
||||
"""
|
||||
self._set_team_configuration_and_membership()
|
||||
self.team_page.visit()
|
||||
|
||||
self.assert_team_details(
|
||||
num_members=1,
|
||||
invite_text='Send this link to friends so that they can join too.'
|
||||
)
|
||||
|
||||
def test_other_users_can_see_limited_team_details(self):
|
||||
"""
|
||||
Scenario: Users who are not member of this team can only see limited info for this team.
|
||||
Given I am enrolled in a course with a team configuration, a topic,
|
||||
and a team belonging to that topic of which I am not a member
|
||||
When I visit the Team page for that team
|
||||
Then I should not see full team detail
|
||||
And I should see the team members
|
||||
And I should not see my team membership text
|
||||
And I should not see the Leave Team and Invite Team links
|
||||
"""
|
||||
self._set_team_configuration_and_membership(create_membership=False)
|
||||
self.team_page.visit()
|
||||
|
||||
self.assert_team_details(is_member=False, num_members=0)
|
||||
|
||||
def test_user_can_navigate_to_members_profile_page(self):
|
||||
"""
|
||||
Scenario: User can navigate to profile page via team member profile image.
|
||||
Given I am enrolled in a course with a team configuration, a topic,
|
||||
and a team belonging to that topic of which I am a member
|
||||
When I visit the Team page for that team
|
||||
Then I should see profile images for the team members
|
||||
When I click on the first profile image
|
||||
Then I should be taken to the user's profile page
|
||||
And I should see the username on profile page
|
||||
"""
|
||||
self._set_team_configuration_and_membership()
|
||||
self.team_page.visit()
|
||||
|
||||
self.team_page.click_first_profile_image()
|
||||
|
||||
learner_profile_page = LearnerProfilePage(self.browser, self.team_page.first_member_username)
|
||||
learner_profile_page.wait_for_page()
|
||||
learner_profile_page.wait_for_field('username')
|
||||
self.assertTrue(learner_profile_page.field_is_visible('username'))
|
||||
|
||||
def test_team_member_cannot_see_invite_link_if_team_full(self):
|
||||
"""
|
||||
Scenario: Team members should not see the invite link if the team is full.
|
||||
Given I am enrolled in a course with a team configuration, a topic,
|
||||
and a team belonging to that topic of which I am a member
|
||||
When I visit the Team page for that team
|
||||
Then I should see the "team is full" message
|
||||
And I should not see the invite link
|
||||
"""
|
||||
self._set_team_configuration_and_membership(max_team_size=1)
|
||||
self.team_page.visit()
|
||||
|
||||
self.assert_team_details(
|
||||
num_members=1,
|
||||
max_size=1,
|
||||
invite_text='No invitations are available. This team is full.'
|
||||
)
|
||||
|
||||
def test_team_member_can_see_invite_link(self):
|
||||
"""
|
||||
Scenario: Team members should see the invite link if the team has capacity.
|
||||
Given I am enrolled in a course with a team configuration, a topic,
|
||||
and a team belonging to that topic of which I am a member
|
||||
When I visit the Team page for that team
|
||||
Then I should see the invite link help message
|
||||
And I should see the invite link that can be selected
|
||||
"""
|
||||
self._set_team_configuration_and_membership()
|
||||
self.team_page.visit()
|
||||
|
||||
self.assert_team_details(
|
||||
num_members=1,
|
||||
invite_text='Send this link to friends so that they can join too.'
|
||||
)
|
||||
self.assertEqual(self.team_page.team_invite_url, '{0}?invite=true'.format(self.team_page.url))
|
||||
|
||||
Reference in New Issue
Block a user