Files
edx-platform/lms/djangoapps/teams/tests/test_csv.py
Nathan Sprenkle 08269e8367 Before adding user to a team, check the organization protection status (#23134)
* Check learner enrollment status to avoid mixing learners from incompatible tracks (e.g. masters/audit) to the same team
* When a new team is encountered on a team management CSV, create it with the protection status of the user
2020-02-20 10:08:41 -05:00

177 lines
7.4 KiB
Python

""" Tests for the functionality in csv """
from io import StringIO
from lms.djangoapps.teams import csv
from lms.djangoapps.teams.models import CourseTeam
from lms.djangoapps.teams.tests.factories import CourseTeamFactory
from student.tests.factories import CourseEnrollmentFactory, UserFactory
from xmodule.modulestore.tests.django_utils import SharedModuleStoreTestCase
from xmodule.modulestore.tests.factories import CourseFactory
from openedx.core.lib.teams_config import TeamsConfig
class TeamMembershipCsvTests(SharedModuleStoreTestCase):
""" Tests for functionality related to the team membership csv report """
@classmethod
def setUpClass(cls):
super(TeamMembershipCsvTests, cls).setUpClass()
teams_config = TeamsConfig({
'team_sets': [
{
'id': 'teamset_{}'.format(i),
'name': 'teamset_{}_name'.format(i),
'description': 'teamset_{}_desc'.format(i),
}
for i in [1, 2, 3, 4]
]
})
cls.course = CourseFactory(teams_configuration=teams_config)
cls.course_no_teamsets = CourseFactory()
team1_1 = CourseTeamFactory(course_id=cls.course.id, name='team_1_1', topic_id='teamset_1')
CourseTeamFactory(course_id=cls.course.id, name='team_1_2', topic_id='teamset_1')
team2_1 = CourseTeamFactory(course_id=cls.course.id, name='team_2_1', topic_id='teamset_2')
team2_2 = CourseTeamFactory(course_id=cls.course.id, name='team_2_2', topic_id='teamset_2')
team3_1 = CourseTeamFactory(course_id=cls.course.id, name='team_3_1', topic_id='teamset_3')
# protected team
team3_2 = CourseTeamFactory(
course_id=cls.course.id,
name='team_3_2',
topic_id='teamset_3',
organization_protected=True
)
# No teams in teamset 4
user1 = UserFactory.create(username='user1')
user2 = UserFactory.create(username='user2')
user3 = UserFactory.create(username='user3')
user4 = UserFactory.create(username='user4')
user5 = UserFactory.create(username='user5')
CourseEnrollmentFactory.create(user=user1, course_id=cls.course.id, mode='audit')
CourseEnrollmentFactory.create(user=user2, course_id=cls.course.id, mode='verified')
CourseEnrollmentFactory.create(user=user3, course_id=cls.course.id, mode='honors')
CourseEnrollmentFactory.create(user=user4, course_id=cls.course.id, mode='masters')
CourseEnrollmentFactory.create(user=user5, course_id=cls.course.id, mode='masters')
team1_1.add_user(user1)
team2_2.add_user(user1)
team3_1.add_user(user1)
team1_1.add_user(user2)
team2_2.add_user(user2)
team3_1.add_user(user2)
team2_1.add_user(user3)
team3_1.add_user(user3)
team3_2.add_user(user4)
def setUp(self):
super(TeamMembershipCsvTests, self).setUp()
self.buf = StringIO()
def test_get_headers(self):
# pylint: disable=protected-access
headers = csv._get_team_membership_csv_headers(self.course)
self.assertEqual(
headers,
['user', 'mode', 'teamset_1', 'teamset_2', 'teamset_3', 'teamset_4']
)
def test_get_headers_no_teamsets(self):
# pylint: disable=protected-access
headers = csv._get_team_membership_csv_headers(self.course_no_teamsets)
self.assertEqual(
headers,
['user', 'mode']
)
def test_lookup_team_membership_data(self):
with self.assertNumQueries(3):
# pylint: disable=protected-access
data = csv._lookup_team_membership_data(self.course)
self.assertEqual(len(data), 5)
self.assert_teamset_membership(data[0], 'user1', 'audit', 'team_1_1', 'team_2_2', 'team_3_1')
self.assert_teamset_membership(data[1], 'user2', 'verified', 'team_1_1', 'team_2_2', 'team_3_1')
self.assert_teamset_membership(data[2], 'user3', 'honors', None, 'team_2_1', 'team_3_1')
self.assert_teamset_membership(data[3], 'user4', 'masters', None, None, 'team_3_2')
self.assert_teamset_membership(data[4], 'user5', 'masters', None, None, None)
def assert_teamset_membership(
self,
user_row,
expected_username,
expected_mode,
expected_teamset_1_team,
expected_teamset_2_team,
expected_teamset_3_team
):
"""
Assert that user_row has the expected
-username
-mode
-team name for teamset_(123)
"""
self.assertEqual(user_row['user'], expected_username)
self.assertEqual(user_row['mode'], expected_mode)
self.assertEqual(user_row.get('teamset_1'), expected_teamset_1_team)
self.assertEqual(user_row.get('teamset_2'), expected_teamset_2_team)
self.assertEqual(user_row.get('teamset_3'), expected_teamset_3_team)
def test_load_team_membership_csv(self):
expected_csv_output = ('user,mode,teamset_1,teamset_2,teamset_3,teamset_4\r\n'
'user1,audit,team_1_1,team_2_2,team_3_1,\r\n'
'user2,verified,team_1_1,team_2_2,team_3_1,\r\n'
'user3,honors,,team_2_1,team_3_1,\r\n'
'user4,masters,,,team_3_2,\r\n'
'user5,masters,,,,\r\n')
csv.load_team_membership_csv(self.course, self.buf)
self.assertEqual(expected_csv_output, self.buf.getvalue())
class TeamMembershipImportManagerTests(SharedModuleStoreTestCase):
""" Tests for TeamMembershipImportManager """
@classmethod
def setUpClass(cls):
super(TeamMembershipImportManagerTests, cls).setUpClass()
teams_config = TeamsConfig({
'team_sets': [{
'id': 'teamset_1',
'name': 'teamset_name',
'description': 'teamset_desc',
}]
})
cls.course = CourseFactory(teams_configuration=teams_config)
# initialize import manager
cls.import_manager = csv.TeamMembershipImportManager(cls.course)
cls.import_manager.teamset_ids = {ts.teamset_id for ts in cls.course.teamsets}
def test_add_user_to_new_protected_team(self):
"""Adding a masters learner to a new team should create a team with organization protected status"""
masters_learner = UserFactory.create(username='masters_learner')
CourseEnrollmentFactory.create(user=masters_learner, course_id=self.course.id, mode='masters')
row = {
'mode': 'masters',
'teamset_1': 'new_protected_team',
'user': masters_learner
}
self.import_manager.add_user_to_team(row)
self.assertTrue(CourseTeam.objects.get(team_id__startswith='new_protected_team').organization_protected)
def test_add_user_to_new_unprotected_team(self):
"""Adding a non-masters learner to a new team should create a team with no organization protected status"""
audit_learner = UserFactory.create(username='audit_learner')
CourseEnrollmentFactory.create(user=audit_learner, course_id=self.course.id, mode='audit')
row = {
'mode': 'audit',
'teamset_1': 'new_unprotected_team',
'user': audit_learner
}
self.import_manager.add_user_to_team(row)
self.assertFalse(CourseTeam.objects.get(team_id__startswith='new_unprotected_team').organization_protected)