""" 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)