def test_select_candidate(self): testassignment = mommy.make('core.Assignment') testgroup = mommy.make('core.AssignmentGroup', parentnode=testassignment) candidate1 = core_mommy.candidate(group=testgroup, shortname='mrcool', fullname='Mr. Cool') candidate2 = core_mommy.candidate(group=testgroup, shortname='mrman', fullname='Mr. Man') candidate3 = core_mommy.candidate(group=testgroup, shortname='sirtoby', fullname='sir. Toby') mockresponse = self.mock_http200_getrequest_htmls( cradmin_role=testassignment, cradmin_instance=self.__mockinstance_with_devilryrole( 'departmentadmin'), viewkwargs={'pk': testgroup.id}) selectlist = [ elem.alltext_normalized for elem in mockresponse.selector.list('#id_students > option') ] self.assertIn(candidate1.relatedstudent.user.get_displayname(), selectlist) self.assertIn(candidate2.relatedstudent.user.get_displayname(), selectlist) self.assertIn(candidate3.relatedstudent.user.get_displayname(), selectlist)
def test_send_invite_mail(self): assignment = mommy.make( 'core.Assignment', long_name='Assignment 1', short_name='assignment1', parentnode__long_name='Spring2017', parentnode__short_name='s17', parentnode__parentnode__long_name='DUCK1010 - Object Oriented Programming', parentnode__parentnode__short_name='Duck1010', students_can_create_groups=True, ) testgroup = mommy.make('core.AssignmentGroup', parentnode=assignment) testgroup1 = mommy.make('core.AssignmentGroup', parentnode=assignment) sent_by = core_mommy.candidate(testgroup, shortname="*****@*****.**", fullname="April").relatedstudent.user sent_to = core_mommy.candidate(testgroup1, shortname="*****@*****.**", fullname="Dewey").relatedstudent.user mommy.make('devilry_account.UserEmail', user=sent_to, email="*****@*****.**") invite = GroupInvite(group=testgroup, sent_by=sent_by, sent_to=sent_to) invite.full_clean() invite.save() request = self.__fake_request() invite.send_invite_notification(request) self.assertEqual(len(mail.outbox), 1) self.assertEqual(mail.outbox[0].subject, '[Devilry] Project group invite for Duck1010.s17.assignment1') url = request.build_absolute_uri( reverse('devilry_student_groupinvite_respond', kwargs={'invite_id': invite.id})) self.assertIn(url, mail.outbox[0].body)
def test_validation_user_id_send_to_error_already_in_group(self): assignment = mommy.make('core.Assignment', students_can_create_groups=True) testgroup = mommy.make('core.AssignmentGroup', parentnode=assignment) core_mommy.candidate(testgroup) sent_to = core_mommy.candidate(testgroup) with self.assertRaisesMessage(ValidationError, 'The selected student is not eligible to join the group.'): GroupInvite.validate_candidate_id_sent_to(testgroup, sent_to.id)
def test_send_accept_mail(self): assignment = mommy.make( 'core.Assignment', long_name='Assignment 1', short_name='assignment1', parentnode__long_name='Spring2017', parentnode__short_name='s17', parentnode__parentnode__long_name='DUCK1010 - Object Oriented Programming', parentnode__parentnode__short_name='Duck1010', students_can_create_groups=True, ) testgroup = mommy.make('core.AssignmentGroup', parentnode=assignment) testgroup1 = mommy.make('core.AssignmentGroup', parentnode=assignment) sent_by = core_mommy.candidate(testgroup, shortname="*****@*****.**", fullname="April").relatedstudent.user sent_to = core_mommy.candidate(testgroup1, shortname="*****@*****.**", fullname="Dewey").relatedstudent.user mommy.make('devilry_account.UserEmail', user=sent_to, email="*****@*****.**") mommy.make('devilry_account.UserEmail', user=sent_by, email="*****@*****.**") invite = GroupInvite( group=testgroup, sent_by=sent_by, sent_to=sent_to ) invite.full_clean() invite.save() invite.send_invite_notification(self.__fake_request()) invite.respond(True) self.assertEqual(len(mail.outbox), 2) self.assertEqual(mail.outbox[1].subject, '[Devilry] Dewey accepted your project group invite')
def test_send_accept_mail(self): assignment = mommy.make( 'core.Assignment', long_name='Assignment 1', short_name='assignment1', parentnode__long_name='Spring2017', parentnode__short_name='s17', parentnode__parentnode__long_name= 'DUCK1010 - Object Oriented Programming', parentnode__parentnode__short_name='Duck1010', students_can_create_groups=True, ) testgroup = mommy.make('core.AssignmentGroup', parentnode=assignment) testgroup1 = mommy.make('core.AssignmentGroup', parentnode=assignment) sent_by = core_mommy.candidate(testgroup, shortname="*****@*****.**", fullname="April").relatedstudent.user sent_to = core_mommy.candidate(testgroup1, shortname="*****@*****.**", fullname="Dewey").relatedstudent.user mommy.make('devilry_account.UserEmail', user=sent_to, email="*****@*****.**") mommy.make('devilry_account.UserEmail', user=sent_by, email="*****@*****.**") invite = GroupInvite(group=testgroup, sent_by=sent_by, sent_to=sent_to) invite.full_clean() invite.save() invite.send_invite_notification(self.__fake_request()) invite.respond(True) self.assertEqual(len(mail.outbox), 2) self.assertEqual(mail.outbox[1].subject, '[Devilry] Dewey accepted your project group invite')
def test_success_merge_2_groups_message(self): testuser = mommy.make(settings.AUTH_USER_MODEL) testassignment = mommy.make_recipe( 'devilry.apps.core.assignment_activeperiod_start') group1 = mommy.make('core.AssignmentGroup', parentnode=testassignment, id=10) group2 = mommy.make('core.AssignmentGroup', parentnode=testassignment, id=11) core_mommy.candidate(group=group1, shortname='*****@*****.**', fullname='April') core_mommy.candidate(group=group2, shortname='*****@*****.**', fullname='Dewey') messagesmock = mock.MagicMock() self.mock_http302_postrequest( cradmin_role=testassignment, cradmin_instance=self.__mockinstance_with_devilryrole( 'departmentadmin'), requestuser=testuser, messagesmock=messagesmock, requestkwargs={'data': { 'selected_items': [10, 11] }}) messagesmock.add.assert_called_once_with( messages.SUCCESS, 'A group with [email protected], [email protected] has been created!', '')
def test_success_merge_2_groups_db(self): testuser = mommy.make(settings.AUTH_USER_MODEL) testassignment = mommy.make_recipe( 'devilry.apps.core.assignment_activeperiod_start') group1 = mommy.make('core.AssignmentGroup', parentnode=testassignment, id=10) group2 = mommy.make('core.AssignmentGroup', parentnode=testassignment, id=11) core_mommy.candidate(group=group1) core_mommy.candidate(group=group2) self.mock_http302_postrequest( cradmin_role=testassignment, cradmin_instance=self.__mockinstance_with_devilryrole( 'departmentadmin'), requestuser=testuser, requestkwargs={'data': { 'selected_items': [10, 11] }}) self.assertTrue(AssignmentGroup.objects.filter(id=group1.id).exists()) self.assertFalse(AssignmentGroup.objects.filter(id=group2.id).exists()) self.assertEqual( AssignmentGroup.objects.get(id=group1.id).candidates.count(), 2) self.assertEqual( AssignmentGroup.objects.get(id=group1.id).feedbackset_set.count(), 3)
def test_warning_some_candidates_does_not_qualify(self): testassignment1 = mommy.make_recipe( 'devilry.apps.core.assignment_oldperiod_start', short_name='cool', passing_grade_min_points=1, max_points=1, ) group1 = mommy.make('core.AssignmentGroup', parentnode=testassignment1) candidate1 = core_mommy.candidate(group=group1, shortname='april', fullname='April Duck') group_mommy.feedbackset_first_attempt_published(group=group1, grading_points=1) group2 = mommy.make('core.AssignmentGroup', parentnode=testassignment1) candidate2 = core_mommy.candidate(group=group2, shortname='donald', fullname='Donald Duck') group_mommy.feedbackset_first_attempt_published(group=group2, grading_points=1) testassignment0 = mommy.make_recipe( 'devilry.apps.core.assignment_oldperiod_middle', short_name='imba', parentnode__parentnode=testassignment1.parentnode.parentnode, passing_grade_min_points=1, max_points=1, ) group3 = mommy.make('core.AssignmentGroup', parentnode=testassignment0) candidate3 = core_mommy.candidate(group=group3, shortname='dewey', fullname='Dewey Duck') group_mommy.feedbackset_first_attempt_published(group=group3, grading_points=1) testassignment2 = mommy.make_recipe( 'devilry.apps.core.assignment_activeperiod_start', short_name='cool', parentnode__parentnode=testassignment1.parentnode.parentnode, passing_grade_min_points=2, max_points=3, ) new_group1 = mommy.make('core.AssignmentGroup', parentnode=testassignment2) mommy.make('core.Candidate', assignment_group=new_group1, relatedstudent__user=candidate1.relatedstudent.user) new_group2 = mommy.make('core.AssignmentGroup', parentnode=testassignment2) mommy.make('core.Candidate', assignment_group=new_group2, relatedstudent__user=candidate2.relatedstudent.user) new_group3 = mommy.make('core.AssignmentGroup', parentnode=testassignment2) mommy.make('core.Candidate', assignment_group=new_group3, relatedstudent__user=candidate3.relatedstudent.user) messagesmock = mock.MagicMock() self.mock_http302_postrequest( cradmin_role=testassignment2, viewkwargs={'period_id': testassignment1.parentnode.id}, messagesmock=messagesmock, requestkwargs={ 'data': { 'candidates': '[{}, {}, {}]'.format(candidate1.id, candidate2.id, candidate3.id) } }, cradmin_instance=self.__mockinstance_with_devilryrole('departmentadmin') ) messagesmock.add.assert_called_once_with( messages.WARNING, 'Some students does not qualify to pass the assignment.', '' )
def test_filter_unanswered_received_invites(self): group = mommy.make('core.AssignmentGroup') sent_by = core_mommy.candidate(group=group).relatedstudent.user sent_to = core_mommy.candidate(group=group).relatedstudent.user mommy.make('core.GroupInvite', sent_by=sent_by, sent_to=sent_to, accepted=False, id=10) mommy.make('core.GroupInvite', sent_by=sent_by, sent_to=sent_to, accepted=None, id=11) mommy.make('core.GroupInvite', sent_by=sent_by, sent_to=sent_to, accepted=True, id=100) mommy.make('core.GroupInvite', sent_by=sent_by, sent_to=sent_to, accepted=None, id=101) self.assertEqual( set(invite.id for invite in GroupInvite.objects. filter_unanswered_received_invites(sent_to)), {11, 101})
def test_validate_user_id_send_to(self): assignment = mommy.make('core.Assignment', students_can_create_groups=True) testgroup = mommy.make('core.AssignmentGroup', parentnode=assignment) testgroup1 = mommy.make('core.AssignmentGroup', parentnode=assignment) core_mommy.candidate(testgroup) sent_to = core_mommy.candidate(testgroup1) with self.assertNumQueries(1): GroupInvite.validate_candidate_id_sent_to(testgroup, sent_to.id)
def test_num_queries_reject(self): group1 = mommy.make('core.AssignmentGroup', parentnode__students_can_create_groups=True) group2 = mommy.make('core.AssignmentGroup', parentnode=group1.parentnode) student1 = core_mommy.candidate(group=group1).relatedstudent.user student2 = core_mommy.candidate(group=group2).relatedstudent.user invite = mommy.make('core.GroupInvite', sent_by=student1, sent_to=student2, group=group1) with self.assertNumQueries(9): invite.respond(False)
def test_invite_has_already_been_declined(self): testgroup = mommy.make('core.AssignmentGroup', parentnode__students_can_create_groups=True) testgroup1 = mommy.make('core.AssignmentGroup', parentnode=testgroup.parentnode) sent_by = core_mommy.candidate(testgroup).relatedstudent.user sent_to = core_mommy.candidate(testgroup1).relatedstudent.user invite = mommy.make('core.GroupInvite', group=testgroup, sent_by=sent_by, sent_to=sent_to, accepted=False) with self.assertRaisesMessage(ValidationError, 'This invite has already been declined.'): invite.respond(False)
def test_multiple_title(self): testassignment1 = mommy.make_recipe( 'devilry.apps.core.assignment_oldperiod_start', short_name='cool', parentnode__short_name='s16', parentnode__long_name='spring16', passing_grade_min_points=1, max_points=1, ) group1 = mommy.make('core.AssignmentGroup', parentnode=testassignment1) candidate1 = core_mommy.candidate(group=group1, shortname='april', fullname='April Duck') group_mommy.feedbackset_first_attempt_published(group=group1, grading_points=1) group2 = mommy.make('core.AssignmentGroup', parentnode=testassignment1) candidate2 = core_mommy.candidate(group=group2, shortname='donald', fullname='Donald Duck') group_mommy.feedbackset_first_attempt_published(group=group2, grading_points=1) group3 = mommy.make('core.AssignmentGroup', parentnode=testassignment1) candidate3 = core_mommy.candidate(group=group3, shortname='dewey', fullname='Dewey Duck') group_mommy.feedbackset_first_attempt_published(group=group3, grading_points=1) testassignment2 = mommy.make_recipe( 'devilry.apps.core.assignment_activeperiod_start', short_name='cool', parentnode__parentnode=testassignment1.parentnode.parentnode, passing_grade_min_points=2, max_points=3, ) new_group1 = mommy.make('core.AssignmentGroup', parentnode=testassignment2) mommy.make('core.Candidate', assignment_group=new_group1, relatedstudent__user=candidate1.relatedstudent.user) new_group2 = mommy.make('core.AssignmentGroup', parentnode=testassignment2) mommy.make('core.Candidate', assignment_group=new_group2, relatedstudent__user=candidate2.relatedstudent.user) new_group3 = mommy.make('core.AssignmentGroup', parentnode=testassignment2) mommy.make('core.Candidate', assignment_group=new_group3, relatedstudent__user=candidate3.relatedstudent.user) mockresponse = self.mock_http200_getrequest_htmls( cradmin_role=testassignment2, viewkwargs={'period_id': testassignment1.parentnode.id}, cradmin_instance=self.__mockinstance_with_devilryrole('departmentadmin') ) valuelist = [elem.alltext_normalized for elem in mockresponse.selector.list( '.django-cradmin-listbuilder-itemvalue-titledescription-title')] self.assertEqual(3, len(valuelist)) self.assertIn( '{}({})'.format(candidate1.relatedstudent.user.fullname, candidate1.relatedstudent.user.shortname), valuelist ) self.assertIn( '{}({})'.format(candidate2.relatedstudent.user.fullname, candidate2.relatedstudent.user.shortname), valuelist ) self.assertIn( '{}({})'.format(candidate3.relatedstudent.user.fullname, candidate3.relatedstudent.user.shortname), valuelist )
def test_validation_user_id_send_to_error_already_in_group(self): assignment = mommy.make('core.Assignment', students_can_create_groups=True) testgroup = mommy.make('core.AssignmentGroup', parentnode=assignment) core_mommy.candidate(testgroup) sent_to = core_mommy.candidate(testgroup) with self.assertRaisesMessage( ValidationError, 'The selected student is not eligible to join the group.'): GroupInvite.validate_candidate_id_sent_to(testgroup, sent_to.id)
def test_h1(self): testgroup = mommy.make('core.AssignmentGroup') devilry_core_mommy_factories.candidate(group=testgroup, fullname='Test User') mockresponse = self.mock_http200_getrequest_htmls( cradmin_role=testgroup.assignment, cradmin_instance=self.__mockinstance_with_devilryrole('subjectadmin'), viewkwargs={'pk': testgroup.id}) self.assertEqual( 'Test User', mockresponse.selector.one('h1').alltext_normalized)
def test_respond_reject(self): group1 = mommy.make('core.AssignmentGroup', parentnode__students_can_create_groups=True) group2 = mommy.make('core.AssignmentGroup', parentnode=group1.parentnode) student1 = core_mommy.candidate(group=group1).relatedstudent.user student2 = core_mommy.candidate(group=group2).relatedstudent.user invite = mommy.make('core.GroupInvite', sent_by=student1, sent_to=student2, group=group1) invite.respond(False) self.assertFalse(GroupInvite.objects.get(id=invite.id).accepted) group = AssignmentGroup.objects.filter_user_is_candidate(student2) self.assertEqual(group.count(), 1) self.assertEqual(group.first().id, group2.id)
def test_h1(self): testgroup = mommy.make('core.AssignmentGroup') devilry_core_mommy_factories.candidate(group=testgroup, fullname='Test User') mockresponse = self.mock_http200_getrequest_htmls( cradmin_role=testgroup.assignment, cradmin_instance=self.__mockinstance_with_devilryrole( 'subjectadmin'), viewkwargs={'pk': testgroup.id}) self.assertEqual('Test User', mockresponse.selector.one('h1').alltext_normalized)
def test_student_already_member_of_the_group(self): testgroup = mommy.make('core.AssignmentGroup') sent_by = core_mommy.candidate(testgroup).relatedstudent.user sent_to = core_mommy.candidate(testgroup).relatedstudent.user with self.assertRaisesMessage( ValidationError, 'The student is already a member of the group.'): invite = GroupInvite(group=testgroup, sent_by=sent_by, sent_to=sent_to) invite.full_clean()
def test_filter_unanswered_received_invites(self): group = mommy.make('core.AssignmentGroup') sent_by = core_mommy.candidate(group=group).relatedstudent.user sent_to = core_mommy.candidate(group=group).relatedstudent.user mommy.make('core.GroupInvite', sent_by=sent_by, sent_to=sent_to, accepted=False, id=10) mommy.make('core.GroupInvite', sent_by=sent_by, sent_to=sent_to, accepted=None, id=11) mommy.make('core.GroupInvite', sent_by=sent_by, sent_to=sent_to, accepted=True, id=100) mommy.make('core.GroupInvite', sent_by=sent_by, sent_to=sent_to, accepted=None, id=101) self.assertEqual( set(invite.id for invite in GroupInvite.objects.filter_unanswered_received_invites(sent_to)), {11, 101} )
def test_sanity(self): testgroup = mommy.make('core.AssignmentGroup', parentnode__students_can_create_groups=True) testgroup1 = mommy.make('core.AssignmentGroup', parentnode=testgroup.parentnode) sent_by = core_mommy.candidate(testgroup).relatedstudent.user sent_to = core_mommy.candidate(testgroup1).relatedstudent.user invite = GroupInvite(group=testgroup, sent_by=sent_by, sent_to=sent_to) invite.full_clean() self.assertEqual(invite.sent_to, sent_to) self.assertEqual(invite.sent_by, sent_by) self.assertEqual(invite.group, testgroup) self.assertIsNotNone(invite.sent_datetime)
def test_success_merge_multiple_groups_db(self): testuser = mommy.make(settings.AUTH_USER_MODEL) testassignment = mommy.make_recipe( 'devilry.apps.core.assignment_activeperiod_start') group1 = mommy.make('core.AssignmentGroup', parentnode=testassignment) group2 = mommy.make('core.AssignmentGroup', parentnode=testassignment) group3 = mommy.make('core.AssignmentGroup', parentnode=testassignment) group4 = mommy.make('core.AssignmentGroup', parentnode=testassignment) core_mommy.candidate(group=group1) core_mommy.candidate(group=group2) core_mommy.candidate(group=group3) core_mommy.candidate(group=group4) core_mommy.examiner(group=group1) core_mommy.examiner(group=group2) core_mommy.examiner(group=group3) core_mommy.examiner(group=group4) self.mock_http302_postrequest( cradmin_role=testassignment, cradmin_instance=self.__mockinstance_with_devilryrole( 'departmentadmin'), requestuser=testuser, requestkwargs={ 'data': { 'selected_items': [group1.id, group2.id, group3.id, group4.id] } }) self.assertFalse(AssignmentGroup.objects.filter(id=group2.id).exists()) self.assertFalse(AssignmentGroup.objects.filter(id=group3.id).exists()) self.assertFalse(AssignmentGroup.objects.filter(id=group4.id).exists()) self.assertTrue(AssignmentGroup.objects.filter(id=group1.id).exists())
def test_student_already_member_of_the_group(self): testgroup = mommy.make('core.AssignmentGroup') sent_by = core_mommy.candidate(testgroup).relatedstudent.user sent_to = core_mommy.candidate(testgroup).relatedstudent.user with self.assertRaisesMessage( ValidationError, 'The student is already a member of the group.'): invite = GroupInvite( group=testgroup, sent_by=sent_by, sent_to=sent_to ) invite.full_clean()
def test_student_sent_to_is_not_registerd_on_assignment(self): testgroup = mommy.make('core.AssignmentGroup', parentnode__students_can_create_groups=True) testgroup1 = mommy.make('core.AssignmentGroup') sent_by = core_mommy.candidate(testgroup).relatedstudent.user sent_to = core_mommy.candidate(testgroup1).relatedstudent.user with self.assertRaisesMessage( ValidationError, 'The invited student is not registered on this assignment.'): invite = GroupInvite(group=testgroup, sent_by=sent_by, sent_to=sent_to) invite.full_clean()
def test_success_merge_multiple_groups_db(self): testuser = mommy.make(settings.AUTH_USER_MODEL) testassignment = mommy.make_recipe('devilry.apps.core.assignment_activeperiod_start') group1 = mommy.make('core.AssignmentGroup', parentnode=testassignment) group2 = mommy.make('core.AssignmentGroup', parentnode=testassignment) group3 = mommy.make('core.AssignmentGroup', parentnode=testassignment) group4 = mommy.make('core.AssignmentGroup', parentnode=testassignment) core_mommy.candidate(group=group1) core_mommy.candidate(group=group2) core_mommy.candidate(group=group3) core_mommy.candidate(group=group4) core_mommy.examiner(group=group1) core_mommy.examiner(group=group2) core_mommy.examiner(group=group3) core_mommy.examiner(group=group4) self.mock_http302_postrequest( cradmin_role=testassignment, cradmin_instance=self.__mockinstance_with_devilryrole('departmentadmin'), requestuser=testuser, requestkwargs={ 'data': { 'selected_items': [group1.id, group2.id, group3.id, group4.id] } }) self.assertFalse(AssignmentGroup.objects.filter(id=group2.id).exists()) self.assertFalse(AssignmentGroup.objects.filter(id=group3.id).exists()) self.assertFalse(AssignmentGroup.objects.filter(id=group4.id).exists()) self.assertTrue(AssignmentGroup.objects.filter(id=group1.id).exists())
def test_select_candidate(self): testassignment = mommy.make('core.Assignment') testgroup = mommy.make('core.AssignmentGroup', parentnode=testassignment) candidate1 = core_mommy.candidate(group=testgroup, shortname='mrcool', fullname='Mr. Cool') candidate2 = core_mommy.candidate(group=testgroup, shortname='mrman', fullname='Mr. Man') candidate3 = core_mommy.candidate(group=testgroup, shortname='sirtoby', fullname='sir. Toby') mockresponse = self.mock_http200_getrequest_htmls( cradmin_role=testassignment, cradmin_instance=self.__mockinstance_with_devilryrole('departmentadmin'), viewkwargs={'pk': testgroup.id} ) selectlist = [elem.alltext_normalized for elem in mockresponse.selector.list('#id_students > option')] self.assertIn(candidate1.relatedstudent.user.get_displayname(), selectlist) self.assertIn(candidate2.relatedstudent.user.get_displayname(), selectlist) self.assertIn(candidate3.relatedstudent.user.get_displayname(), selectlist)
def test_sanity(self): testgroup = mommy.make('core.AssignmentGroup', parentnode__students_can_create_groups=True) testgroup1 = mommy.make('core.AssignmentGroup', parentnode=testgroup.parentnode) sent_by = core_mommy.candidate(testgroup).relatedstudent.user sent_to = core_mommy.candidate(testgroup1).relatedstudent.user invite = GroupInvite( group=testgroup, sent_by=sent_by, sent_to=sent_to ) invite.full_clean() self.assertEqual(invite.sent_to, sent_to) self.assertEqual(invite.sent_by, sent_by) self.assertEqual(invite.group, testgroup) self.assertIsNotNone(invite.sent_datetime)
def test_student_sent_to_is_not_registerd_on_assignment(self): testgroup = mommy.make('core.AssignmentGroup', parentnode__students_can_create_groups=True) testgroup1 = mommy.make('core.AssignmentGroup') sent_by = core_mommy.candidate(testgroup).relatedstudent.user sent_to = core_mommy.candidate(testgroup1).relatedstudent.user with self.assertRaisesMessage( ValidationError, 'The invited student is not registered on this assignment.'): invite = GroupInvite( group=testgroup, sent_by=sent_by, sent_to=sent_to ) invite.full_clean()
def test_invite_has_already_been_declined(self): testgroup = mommy.make('core.AssignmentGroup', parentnode__students_can_create_groups=True) testgroup1 = mommy.make('core.AssignmentGroup', parentnode=testgroup.parentnode) sent_by = core_mommy.candidate(testgroup).relatedstudent.user sent_to = core_mommy.candidate(testgroup1).relatedstudent.user invite = mommy.make('core.GroupInvite', group=testgroup, sent_by=sent_by, sent_to=sent_to, accepted=False) with self.assertRaisesMessage( ValidationError, 'This invite has already been declined.'): invite.respond(False)
def test_simple_description(self): testassignment1 = mommy.make_recipe( 'devilry.apps.core.assignment_oldperiod_start', short_name='cool', parentnode__short_name='s16', parentnode__long_name='spring16', passing_grade_min_points=1, max_points=1, ) group1 = mommy.make('core.AssignmentGroup', parentnode=testassignment1) candidate1 = core_mommy.candidate(group=group1, shortname='april', fullname='April Duck') group_mommy.feedbackset_first_attempt_published(group=group1, grading_points=1) testassignment2 = mommy.make_recipe( 'devilry.apps.core.assignment_activeperiod_start', short_name='cool', parentnode__parentnode=testassignment1.parentnode.parentnode, passing_grade_min_points=2, max_points=3, ) group2 = mommy.make('core.AssignmentGroup', parentnode=testassignment2) mommy.make('core.Candidate', assignment_group=group2, relatedstudent__user=candidate1.relatedstudent.user) mockresponse = self.mock_http200_getrequest_htmls( cradmin_role=testassignment2, viewkwargs={'period_id': testassignment1.parentnode.id}, cradmin_instance=self.__mockinstance_with_devilryrole('departmentadmin') ) valuelist = [elem.alltext_normalized for elem in mockresponse.selector.list( '.django-cradmin-listbuilder-itemvalue-titledescription-description')] self.assertEqual(3, len(valuelist)) self.assertIn('{} - {}'.format(testassignment1.long_name, testassignment1.parentnode.long_name), valuelist) self.assertIn('01.1000 - 12.1999 (semester start/semester end)', valuelist) self.assertIn('passed (1/1) passed (3/3)', valuelist)
def test_user_sending_is_not_part_of_the_group(self): testgroup = mommy.make('core.AssignmentGroup') testgroup1 = mommy.make('core.AssignmentGroup', parentnode=testgroup.parentnode) testgroup2 = mommy.make('core.AssignmentGroup', parentnode=testgroup.parentnode) sent_by = core_mommy.candidate(testgroup1).relatedstudent.user sent_to = core_mommy.candidate(testgroup2).relatedstudent.user with self.assertRaisesMessage( ValidationError, 'The user sending an invite must be a Candiate on the group.'): invite = GroupInvite( group=testgroup, sent_by=sent_by, sent_to=sent_to ) invite.full_clean()
def test_assignment_does_not_allow_students_to_form_groups(self): testgroup = mommy.make('core.AssignmentGroup', parentnode__students_can_create_groups=False) testgroup1 = mommy.make('core.AssignmentGroup', parentnode=testgroup.parentnode) sent_by = core_mommy.candidate(testgroup).relatedstudent.user sent_to = core_mommy.candidate(testgroup1).relatedstudent.user with self.assertRaisesMessage( ValidationError, 'This assignment does not allow students to form project groups on their own.' ): invite = GroupInvite(group=testgroup, sent_by=sent_by, sent_to=sent_to) invite.full_clean()
def test_student_already_invited_but_not_responded(self): testgroup = mommy.make('core.AssignmentGroup', parentnode__students_can_create_groups=True) testgroup1 = mommy.make('core.AssignmentGroup', parentnode=testgroup.parentnode) sent_by = core_mommy.candidate(testgroup).relatedstudent.user sent_to = core_mommy.candidate(testgroup1).relatedstudent.user mommy.make('core.GroupInvite', group=testgroup, sent_by=sent_by, sent_to=sent_to) with self.assertRaisesMessage( ValidationError, 'The student is already invited to join the group, but they have not responded yet.'): invite = GroupInvite( group=testgroup, sent_by=sent_by, sent_to=sent_to ) invite.full_clean()
def test_user_sending_is_not_part_of_the_group(self): testgroup = mommy.make('core.AssignmentGroup') testgroup1 = mommy.make('core.AssignmentGroup', parentnode=testgroup.parentnode) testgroup2 = mommy.make('core.AssignmentGroup', parentnode=testgroup.parentnode) sent_by = core_mommy.candidate(testgroup1).relatedstudent.user sent_to = core_mommy.candidate(testgroup2).relatedstudent.user with self.assertRaisesMessage( ValidationError, 'The user sending an invite must be a Candiate on the group.'): invite = GroupInvite(group=testgroup, sent_by=sent_by, sent_to=sent_to) invite.full_clean()
def test_assignment_does_not_allow_students_to_form_groups(self): testgroup = mommy.make('core.AssignmentGroup', parentnode__students_can_create_groups=False) testgroup1 = mommy.make('core.AssignmentGroup', parentnode=testgroup.parentnode) sent_by = core_mommy.candidate(testgroup).relatedstudent.user sent_to = core_mommy.candidate(testgroup1).relatedstudent.user with self.assertRaisesMessage( ValidationError, 'This assignment does not allow students to form project groups on their own.'): invite = GroupInvite( group=testgroup, sent_by=sent_by, sent_to=sent_to ) invite.full_clean()
def test_student_sent_to_is_already_in_a_group_with_more_than_one_student(self): testgroup = mommy.make('core.AssignmentGroup', parentnode__students_can_create_groups=True) testgroup1 = mommy.make('core.AssignmentGroup', parentnode=testgroup.parentnode) sent_by = core_mommy.candidate(testgroup).relatedstudent.user sent_to = core_mommy.candidate(testgroup1).relatedstudent.user core_mommy.candidate(testgroup1) with self.assertRaisesMessage( ValidationError, 'The invited student is already in a project group with more than 1 students.'): invite = GroupInvite( group=testgroup, sent_by=sent_by, sent_to=sent_to, accepted=True ) invite.full_clean()
def test_pop_candidate_db(self): testgroup = mommy.make('core.AssignmentGroup') core_mommy.candidate(group=testgroup) candidate = core_mommy.candidate(group=testgroup, shortname='sirtoby', fullname='sir. Toby') self.mock_http302_postrequest( cradmin_role=testgroup.parentnode, cradmin_instance=self.__mockinstance_with_devilryrole('departmentadmin'), viewkwargs={'pk': testgroup.id}, requestkwargs={ 'data': {'students': candidate.id} } ) candidate = Candidate.objects.get(id=candidate.id) self.assertNotEqual(candidate.assignment_group, testgroup) testgroup = AssignmentGroup.objects.get(id=testgroup.id) self.assertEqual(1, testgroup.cached_data.candidate_count);
def test_pop_candidate_db(self): testgroup = mommy.make('core.AssignmentGroup') core_mommy.candidate(group=testgroup) candidate = core_mommy.candidate(group=testgroup, shortname='sirtoby', fullname='sir. Toby') self.mock_http302_postrequest( cradmin_role=testgroup.parentnode, cradmin_instance=self.__mockinstance_with_devilryrole('departmentadmin'), viewkwargs={'pk': testgroup.id}, requestkwargs={ 'data': {'students': candidate.id} } ) candidate = Candidate.objects.get(id=candidate.id) self.assertNotEqual(candidate.assignment_group, testgroup) testgroup = AssignmentGroup.objects.get(id=testgroup.id) self.assertEqual(1, testgroup.cached_data.candidate_count)
def test_send_invite_to_choices_queryset_pending_is_excluded(self): group1 = mommy.make('core.AssignmentGroup', parentnode__students_can_create_groups=True) group2 = mommy.make('core.AssignmentGroup', parentnode=group1.parentnode) group3 = mommy.make('core.AssignmentGroup', parentnode=group1.parentnode) group4 = mommy.make('core.AssignmentGroup', parentnode=group1.parentnode) candidate1 = core_mommy.candidate(group=group1, fullname="Louie", shortname="louie") core_mommy.candidate(group=group2, fullname="Huey", shortname="huey") core_mommy.candidate(group=group2, fullname="Donald", shortname="donald") candidate4 = core_mommy.candidate(group=group3, fullname="April", shortname="april") candidate5 = core_mommy.candidate(group=group4, fullname="Dewey", shortname="dewey") mommy.make('core.GroupInvite', group=group1, sent_to=candidate4.relatedstudent.user, sent_by=candidate1.relatedstudent.user) candidates = GroupInvite.send_invite_to_choices_queryset(group1) self.assertEqual(candidates.count(), 1) self.assertEqual(set(candidate.id for candidate in candidates), {candidate5.id})
def test_pop_candidate_sanity(self): testgroup = mommy.make('core.AssignmentGroup') core_mommy.candidate(group=testgroup) candidate = core_mommy.candidate(group=testgroup, shortname='sirtoby', fullname='sir. Toby') messagesmock = mock.MagicMock() self.mock_http302_postrequest( cradmin_role=testgroup.parentnode, cradmin_instance=self.__mockinstance_with_devilryrole( 'departmentadmin'), messagesmock=messagesmock, viewkwargs={'pk': testgroup.id}, requestkwargs={'data': { 'students': candidate.id }}) messagesmock.add.assert_called_once_with( messages.SUCCESS, '{} was removed from the project group'.format( candidate.relatedstudent.user.get_displayname()), '')
def test_student_sent_to_is_already_in_a_group_with_more_than_one_student( self): testgroup = mommy.make('core.AssignmentGroup', parentnode__students_can_create_groups=True) testgroup1 = mommy.make('core.AssignmentGroup', parentnode=testgroup.parentnode) sent_by = core_mommy.candidate(testgroup).relatedstudent.user sent_to = core_mommy.candidate(testgroup1).relatedstudent.user core_mommy.candidate(testgroup1) with self.assertRaisesMessage( ValidationError, 'The invited student is already in a project group with more than 1 students.' ): invite = GroupInvite(group=testgroup, sent_by=sent_by, sent_to=sent_to, accepted=True) invite.full_clean()
def test_create_groups_expired(self): testgroup = mommy.make('core.AssignmentGroup', parentnode__students_can_create_groups=True, parentnode__students_can_not_create_groups_after=timezone.now() - timedelta(days=1)) testgroup1 = mommy.make('core.AssignmentGroup', parentnode=testgroup.parentnode) sent_by = core_mommy.candidate(testgroup).relatedstudent.user sent_to = core_mommy.candidate(testgroup1).relatedstudent.user with self.assertRaisesMessage( ValidationError, 'Creating project groups without administrator approval is not ' 'allowed on this assignment anymore. Please contact you course ' 'administrator if you think this is wrong.'): invite = GroupInvite( group=testgroup, sent_by=sent_by, sent_to=sent_to ) invite.full_clean()
def test_merge_assignmentgroup_multiple_times(self): test_assignment = mommy.make_recipe('devilry.apps.core.assignment_activeperiod_start') group1 = mommy.make('core.AssignmentGroup', parentnode=test_assignment, name='group1') group2 = mommy.make('core.AssignmentGroup', parentnode=test_assignment, name='group2') group3 = mommy.make('core.AssignmentGroup', parentnode=test_assignment, name='group3') group4 = mommy.make('core.AssignmentGroup', parentnode=test_assignment, name='group4') core_mommy.candidate(group=group1) core_mommy.candidate(group=group1) core_mommy.candidate(group=group2) core_mommy.candidate(group=group3) core_mommy.candidate(group=group4) core_mommy.examiner(group=group1) core_mommy.examiner(group=group2) core_mommy.examiner(group=group2) core_mommy.examiner(group=group3) group1_state = group1.get_current_state() group2_state = group2.get_current_state() group3_state = group3.get_current_state() group4_state = group4.get_current_state() AssignmentGroup.merge_groups([group1, group3]) AssignmentGroup.merge_groups([group2, group4]) group1_merge_history = AssignmentGroupHistory.objects.get(assignment_group__id=group1.id).merge_history group2_merge_history = AssignmentGroupHistory.objects.get(assignment_group__id=group2.id).merge_history self.assertDictEqual(group1_merge_history['groups'][0]['state'], group1_state) self.assertDictEqual(group1_merge_history['groups'][1]['state'], group3_state) self.assertDictEqual(group2_merge_history['groups'][0]['state'], group2_state) self.assertDictEqual(group2_merge_history['groups'][1]['state'], group4_state) group1 = AssignmentGroup.objects.get(id=group1.id) group2 = AssignmentGroup.objects.get(id=group2.id) # Checking one more level in the Btree group1_state = AssignmentGroup.objects.get(id=group1.id).get_current_state() group2_state = AssignmentGroup.objects.get(id=group2.id).get_current_state() AssignmentGroup.merge_groups([group1, group2]) group1_merge_history_new = AssignmentGroupHistory.objects.get(assignment_group__id=group1.id).merge_history self.assertListEqual(group1_merge_history_new['groups'][0]['groups'], group1_merge_history['groups']) self.assertListEqual(group1_merge_history_new['groups'][1]['groups'], group2_merge_history['groups']) self.assertDictEqual(group1_merge_history_new['groups'][0]['state'], group1_state) self.assertDictEqual(group1_merge_history_new['groups'][1]['state'], group2_state)
def test_student_already_invited_but_not_responded(self): testgroup = mommy.make('core.AssignmentGroup', parentnode__students_can_create_groups=True) testgroup1 = mommy.make('core.AssignmentGroup', parentnode=testgroup.parentnode) sent_by = core_mommy.candidate(testgroup).relatedstudent.user sent_to = core_mommy.candidate(testgroup1).relatedstudent.user mommy.make('core.GroupInvite', group=testgroup, sent_by=sent_by, sent_to=sent_to) with self.assertRaisesMessage( ValidationError, 'The student is already invited to join the group, but they have not responded yet.' ): invite = GroupInvite(group=testgroup, sent_by=sent_by, sent_to=sent_to) invite.full_clean()
def test_error_merge_less_than_2_groups(self): testuser = mommy.make(settings.AUTH_USER_MODEL) testassignment = mommy.make_recipe( 'devilry.apps.core.assignment_activeperiod_start') group = mommy.make('core.AssignmentGroup', parentnode=testassignment, id=10) core_mommy.candidate(group=group) messagesmock = mock.MagicMock() self.mock_http302_postrequest( cradmin_role=testassignment, cradmin_instance=self.__mockinstance_with_devilryrole( 'departmentadmin'), requestuser=testuser, messagesmock=messagesmock, requestkwargs={'data': { 'selected_items': [10] }}) messagesmock.add.assert_called_once_with( messages.WARNING, 'Cannot merge less than 2 groups', '')
def test_pop_candidate_sanity(self): testgroup = mommy.make('core.AssignmentGroup') core_mommy.candidate(group=testgroup) candidate = core_mommy.candidate(group=testgroup, shortname='sirtoby', fullname='sir. Toby') messagesmock = mock.MagicMock() self.mock_http302_postrequest( cradmin_role=testgroup.parentnode, cradmin_instance=self.__mockinstance_with_devilryrole('departmentadmin'), messagesmock=messagesmock, viewkwargs={'pk': testgroup.id}, requestkwargs={ 'data': {'students': candidate.id} } ) messagesmock.add.assert_called_once_with( messages.SUCCESS, '{} was removed from the project group'.format(candidate.relatedstudent.user.get_displayname()), '' )
def test_create_groups_expired(self): testgroup = mommy.make( 'core.AssignmentGroup', parentnode__students_can_create_groups=True, parentnode__students_can_not_create_groups_after=timezone.now() - timedelta(days=1)) testgroup1 = mommy.make('core.AssignmentGroup', parentnode=testgroup.parentnode) sent_by = core_mommy.candidate(testgroup).relatedstudent.user sent_to = core_mommy.candidate(testgroup1).relatedstudent.user with self.assertRaisesMessage( ValidationError, 'Creating project groups without administrator approval is not ' 'allowed on this assignment anymore. Please contact you course ' 'administrator if you think this is wrong.'): invite = GroupInvite(group=testgroup, sent_by=sent_by, sent_to=sent_to) invite.full_clean()
def test_success_merge_2_groups_db(self): testuser = mommy.make(settings.AUTH_USER_MODEL) testassignment = mommy.make_recipe('devilry.apps.core.assignment_activeperiod_start') group1 = mommy.make('core.AssignmentGroup', parentnode=testassignment, id=10) group2 = mommy.make('core.AssignmentGroup', parentnode=testassignment, id=11) core_mommy.candidate(group=group1) core_mommy.candidate(group=group2) self.mock_http302_postrequest( cradmin_role=testassignment, cradmin_instance=self.__mockinstance_with_devilryrole('departmentadmin'), requestuser=testuser, requestkwargs={ 'data': { 'selected_items': [10, 11] } }) self.assertTrue(AssignmentGroup.objects.filter(id=group1.id).exists()) self.assertFalse(AssignmentGroup.objects.filter(id=group2.id).exists()) self.assertEqual(AssignmentGroup.objects.get(id=group1.id).candidates.count(), 2) self.assertEqual(AssignmentGroup.objects.get(id=group1.id).feedbackset_set.count(), 3)
def test_error_merge_less_than_2_groups(self): testuser = mommy.make(settings.AUTH_USER_MODEL) testassignment = mommy.make_recipe('devilry.apps.core.assignment_activeperiod_start') group = mommy.make('core.AssignmentGroup', parentnode=testassignment, id=10) core_mommy.candidate(group=group) messagesmock = mock.MagicMock() self.mock_http302_postrequest( cradmin_role=testassignment, cradmin_instance=self.__mockinstance_with_devilryrole('departmentadmin'), requestuser=testuser, messagesmock=messagesmock, requestkwargs={ 'data': { 'selected_items': [10] } }) messagesmock.add.assert_called_once_with( messages.WARNING, 'Cannot merge less than 2 groups', '' )
def test_success_merge_2_groups_message(self): testuser = mommy.make(settings.AUTH_USER_MODEL) testassignment = mommy.make_recipe('devilry.apps.core.assignment_activeperiod_start') group1 = mommy.make('core.AssignmentGroup', parentnode=testassignment, id=10) group2 = mommy.make('core.AssignmentGroup', parentnode=testassignment, id=11) core_mommy.candidate(group=group1, shortname='*****@*****.**', fullname='April') core_mommy.candidate(group=group2, shortname='*****@*****.**', fullname='Dewey') messagesmock = mock.MagicMock() self.mock_http302_postrequest( cradmin_role=testassignment, cradmin_instance=self.__mockinstance_with_devilryrole('departmentadmin'), requestuser=testuser, messagesmock=messagesmock, requestkwargs={ 'data': { 'selected_items': [10, 11] } }) messagesmock.add.assert_called_once_with( messages.SUCCESS, 'A group with [email protected], [email protected] has been created!', '' )
def test_send_invite_to_choices_queryset(self): group1 = mommy.make('core.AssignmentGroup', parentnode__students_can_create_groups=True) group2 = mommy.make('core.AssignmentGroup', parentnode=group1.parentnode) group3 = mommy.make('core.AssignmentGroup', parentnode=group1.parentnode) group4 = mommy.make('core.AssignmentGroup', parentnode=group1.parentnode) core_mommy.candidate(group=group1, fullname="Louie", shortname="louie") core_mommy.candidate(group=group2, fullname="Huey", shortname="huey") core_mommy.candidate(group=group2, fullname="Donald", shortname="donald") candidate4 = core_mommy.candidate(group=group3, fullname="April", shortname="april") candidate5 = core_mommy.candidate(group=group4, fullname="Dewey", shortname="dewey") candidates = GroupInvite.send_invite_to_choices_queryset(group1) self.assertEqual(candidates.count(), 2) self.assertEqual( set(candidate.id for candidate in candidates), {candidate4.id, candidate5.id} )
def test_send_invite_mail(self): assignment = mommy.make( 'core.Assignment', long_name='Assignment 1', short_name='assignment1', parentnode__long_name='Spring2017', parentnode__short_name='s17', parentnode__parentnode__long_name= 'DUCK1010 - Object Oriented Programming', parentnode__parentnode__short_name='Duck1010', students_can_create_groups=True, ) testgroup = mommy.make('core.AssignmentGroup', parentnode=assignment) testgroup1 = mommy.make('core.AssignmentGroup', parentnode=assignment) sent_by = core_mommy.candidate(testgroup, shortname="*****@*****.**", fullname="April").relatedstudent.user sent_to = core_mommy.candidate(testgroup1, shortname="*****@*****.**", fullname="Dewey").relatedstudent.user mommy.make('devilry_account.UserEmail', user=sent_to, email="*****@*****.**") invite = GroupInvite(group=testgroup, sent_by=sent_by, sent_to=sent_to) invite.full_clean() invite.save() request = self.__fake_request() invite.send_invite_notification(request) self.assertEqual(len(mail.outbox), 1) self.assertEqual( mail.outbox[0].subject, '[Devilry] Project group invite for Duck1010.s17.assignment1') url = request.build_absolute_uri( reverse('devilry_student_groupinvite_respond', kwargs={'invite_id': invite.id})) self.assertIn(url, mail.outbox[0].body)
def test_cannot_pop_candidate_if_there_is_only_one(self): testgroup = mommy.make('core.AssignmentGroup') candidate = core_mommy.candidate(group=testgroup) messagesmock = mock.MagicMock() self.mock_http302_postrequest( cradmin_role=testgroup.parentnode, cradmin_instance=self.__mockinstance_with_devilryrole( 'departmentadmin'), messagesmock=messagesmock, viewkwargs={'pk': testgroup.id}, requestkwargs={'data': { 'students': candidate.id }}) messagesmock.add.assert_called_once_with( messages.WARNING, 'Cannot split student if there is less than 2 students in project group.', '')
def test_cannot_pop_candidate_if_there_is_only_one(self): testgroup = mommy.make('core.AssignmentGroup') candidate = core_mommy.candidate(group=testgroup) messagesmock = mock.MagicMock() self.mock_http302_postrequest( cradmin_role=testgroup.parentnode, cradmin_instance=self.__mockinstance_with_devilryrole('departmentadmin'), messagesmock=messagesmock, viewkwargs={'pk': testgroup.id}, requestkwargs={ 'data': {'students': candidate.id} } ) messagesmock.add.assert_called_once_with( messages.WARNING, 'Cannot split student if there is less than 2 students in project group.', '' )
def test_title_multiple_candidates(self): testgroup = mommy.make('core.AssignmentGroup') devilry_core_mommy_factories.candidate(group=testgroup, fullname='UserB') devilry_core_mommy_factories.candidate(group=testgroup, shortname='usera') devilry_core_mommy_factories.candidate(group=testgroup, fullname='UserC') mockresponse = self.mock_http200_getrequest_htmls( cradmin_role=testgroup.assignment, cradmin_instance=self.__mockinstance_with_devilryrole('subjectadmin'), viewkwargs={'pk': testgroup.id}) self.assertIn( 'usera, UserB, UserC', mockresponse.selector.one('title').alltext_normalized)
def test_examiner_count_filter(self): testuser = mommy.make(settings.AUTH_USER_MODEL) testassignment = mommy.make_recipe('devilry.apps.core.assignment_activeperiod_start') group1 = mommy.make('core.AssignmentGroup', parentnode=testassignment) group2 = mommy.make('core.AssignmentGroup', parentnode=testassignment) core_mommy.candidate(group=group1) core_mommy.candidate(group=group1) core_mommy.candidate(group=group2) core_mommy.examiner(group=group2) core_mommy.examiner(group=group2) mockresponse = self.mock_http200_getrequest_htmls( cradmin_role=testassignment, cradmin_instance=self.__mockinstance_with_devilryrole('departmentadmin'), requestuser=testuser, viewkwargs={ 'filters_string': 'examinercount-eq-2' }) self.assertEqual( 1, mockresponse.selector.count('.django-cradmin-listbuilder-itemvalue'))