From c828beb5d1e071e516f181267b3217629a619406 Mon Sep 17 00:00:00 2001 From: Aarif <MrAarif@outlook.com> Date: Tue, 23 Feb 2021 10:24:42 +0500 Subject: [PATCH] replaced unittest assertions pytest assertions (#26549) --- lms/djangoapps/teams/tests/test_api.py | 102 ++--- lms/djangoapps/teams/tests/test_csv.py | 99 ++--- lms/djangoapps/teams/tests/test_models.py | 45 +-- .../teams/tests/test_serializers.py | 72 +--- lms/djangoapps/teams/tests/test_services.py | 21 +- lms/djangoapps/teams/tests/test_views.py | 361 ++++++++---------- ...sso_verifications_for_old_account_links.py | 18 +- .../tests/test_manual_verify_student.py | 8 +- .../tests/test_populate_expiry_date.py | 6 +- .../test_send_verification_expiry_email.py | 34 +- .../tests/test_update_expiration_date.py | 10 +- .../commands/tests/test_verify_student.py | 4 +- .../verify_student/tests/__init__.py | 8 +- .../tests/test_fake_software_secure.py | 4 +- .../verify_student/tests/test_integration.py | 2 +- .../verify_student/tests/test_models.py | 114 +++--- .../verify_student/tests/test_services.py | 18 +- .../verify_student/tests/test_signals.py | 12 +- .../verify_student/tests/test_utils.py | 26 +- .../verify_student/tests/test_views.py | 218 +++++------ 20 files changed, 505 insertions(+), 677 deletions(-) diff --git a/lms/djangoapps/teams/tests/test_api.py b/lms/djangoapps/teams/tests/test_api.py index 2d82796237c..3aaba906773 100644 --- a/lms/djangoapps/teams/tests/test_api.py +++ b/lms/djangoapps/teams/tests/test_api.py @@ -103,51 +103,51 @@ class PythonAPITests(SharedModuleStoreTestCase): cls.team2a.add_user(cls.user4) def test_get_team_by_team_id_non_existence(self): - self.assertIsNone(teams_api.get_team_by_team_id('DO_NOT_EXIST')) + assert teams_api.get_team_by_team_id('DO_NOT_EXIST') is None def test_get_team_by_team_id_exists(self): team = teams_api.get_team_by_team_id(self.team1.team_id) - self.assertEqual(team, self.team1) + assert team == self.team1 def test_get_team_by_discussion_non_existence(self): - self.assertIsNone(teams_api.get_team_by_discussion('DO_NOT_EXIST')) + assert teams_api.get_team_by_discussion('DO_NOT_EXIST') is None def test_get_team_by_discussion_exists(self): team = teams_api.get_team_by_discussion(DISCUSSION_TOPIC_ID) - self.assertEqual(team, self.team1) + assert team == self.team1 def test_is_team_discussion_private_is_private(self): - self.assertTrue(teams_api.is_team_discussion_private(self.team1)) + assert teams_api.is_team_discussion_private(self.team1) def test_is_team_discussion_private_is_public(self): - self.assertFalse(teams_api.is_team_discussion_private(None)) - self.assertFalse(teams_api.is_team_discussion_private(self.team2)) - self.assertFalse(teams_api.is_team_discussion_private(self.team3)) + assert not teams_api.is_team_discussion_private(None) + assert not teams_api.is_team_discussion_private(self.team2) + assert not teams_api.is_team_discussion_private(self.team3) def test_is_instructor_managed_team(self): - self.assertTrue(teams_api.is_instructor_managed_team(self.team1)) - self.assertFalse(teams_api.is_instructor_managed_team(self.team2)) - self.assertTrue(teams_api.is_instructor_managed_team(self.team3)) + assert teams_api.is_instructor_managed_team(self.team1) + assert not teams_api.is_instructor_managed_team(self.team2) + assert teams_api.is_instructor_managed_team(self.team3) def test_is_instructor_managed_topic(self): - self.assertTrue(teams_api.is_instructor_managed_topic(COURSE_KEY1, TOPIC1)) - self.assertFalse(teams_api.is_instructor_managed_topic(COURSE_KEY2, TOPIC2)) - self.assertTrue(teams_api.is_instructor_managed_topic(COURSE_KEY2, TOPIC3)) + assert teams_api.is_instructor_managed_topic(COURSE_KEY1, TOPIC1) + assert not teams_api.is_instructor_managed_topic(COURSE_KEY2, TOPIC2) + assert teams_api.is_instructor_managed_topic(COURSE_KEY2, TOPIC3) def test_user_is_a_team_member(self): - self.assertTrue(teams_api.user_is_a_team_member(self.user1, self.team1)) - self.assertFalse(teams_api.user_is_a_team_member(self.user1, None)) - self.assertFalse(teams_api.user_is_a_team_member(self.user1, self.team2)) + assert teams_api.user_is_a_team_member(self.user1, self.team1) + assert not teams_api.user_is_a_team_member(self.user1, None) + assert not teams_api.user_is_a_team_member(self.user1, self.team2) def test_private_discussion_visible_by_user(self): - self.assertTrue(teams_api.discussion_visible_by_user(DISCUSSION_TOPIC_ID, self.user1)) - self.assertTrue(teams_api.discussion_visible_by_user(DISCUSSION_TOPIC_ID, self.user2)) + assert teams_api.discussion_visible_by_user(DISCUSSION_TOPIC_ID, self.user1) + assert teams_api.discussion_visible_by_user(DISCUSSION_TOPIC_ID, self.user2) # self.assertFalse(teams_api.discussion_visible_by_user(DISCUSSION_TOPIC_ID, self.user3)) def test_public_discussion_visible_by_user(self): - self.assertTrue(teams_api.discussion_visible_by_user(self.team2.discussion_topic_id, self.user1)) - self.assertTrue(teams_api.discussion_visible_by_user(self.team2.discussion_topic_id, self.user2)) - self.assertTrue(teams_api.discussion_visible_by_user('DO_NOT_EXISTS', self.user3)) + assert teams_api.discussion_visible_by_user(self.team2.discussion_topic_id, self.user1) + assert teams_api.discussion_visible_by_user(self.team2.discussion_topic_id, self.user2) + assert teams_api.discussion_visible_by_user('DO_NOT_EXISTS', self.user3) @ddt.unpack @ddt.data( @@ -162,10 +162,10 @@ class PythonAPITests(SharedModuleStoreTestCase): user3_team = teams_api.get_team_for_user_course_topic(self.user3, str(course_key), topic_id) user4_team = teams_api.get_team_for_user_course_topic(self.user4, str(course_key), topic_id) - self.assertEqual(user1_team.team_id if user1_team else None, expected_team_ids[0]) - self.assertEqual(user2_team.team_id if user2_team else None, expected_team_ids[1]) - self.assertEqual(user3_team.team_id if user3_team else None, expected_team_ids[2]) - self.assertEqual(user4_team.team_id if user4_team else None, expected_team_ids[3]) + assert (user1_team.team_id if user1_team else None) == expected_team_ids[0] + assert (user2_team.team_id if user2_team else None) == expected_team_ids[1] + assert (user3_team.team_id if user3_team else None) == expected_team_ids[2] + assert (user4_team.team_id if user4_team else None) == expected_team_ids[3] @mock.patch('lms.djangoapps.teams.api.CourseTeam.objects') def test_get_team_multiple_teams(self, mocked_manager): @@ -180,11 +180,11 @@ class PythonAPITests(SharedModuleStoreTestCase): mock_qs.first.return_value = expected_result mocked_manager.filter.return_value = mock_qs result = teams_api.get_team_for_user_course_topic(self.user1, str(COURSE_KEY1), TOPIC1) - self.assertEqual(result, expected_result) + assert result == expected_result def test_get_team_course_not_found(self): team = teams_api.get_team_for_user_course_topic(self.user1, 'nonsense/garbage/nonexistant', 'topic') - self.assertIsNone(team) + assert team is None def test_get_team_invalid_course(self): invalid_course_id = 'lol!()#^$&course' @@ -197,8 +197,8 @@ class PythonAPITests(SharedModuleStoreTestCase): A learner should be able to get the anonymous user IDs of their team members """ team_anonymous_user_ids = teams_api.anonymous_user_ids_for_team(self.user1, self.team1) - self.assertTrue(AnonymousUserId.objects.get(user=self.user1, course_id=self.team1.course_id)) - self.assertEqual(len(self.team1.users.all()), len(team_anonymous_user_ids)) + assert AnonymousUserId.objects.get(user=self.user1, course_id=self.team1.course_id) + assert len(self.team1.users.all()) == len(team_anonymous_user_ids) def test_anonymous_user_ids_for_team_not_on_team(self): """ @@ -221,7 +221,7 @@ class PythonAPITests(SharedModuleStoreTestCase): CourseStaffRole(COURSE_KEY1).add_users(user_staff) team_anonymous_user_ids = teams_api.anonymous_user_ids_for_team(user_staff, self.team1) - self.assertEqual(len(self.team1.users.all()), len(team_anonymous_user_ids)) + assert len(self.team1.users.all()) == len(team_anonymous_user_ids) @ddt.ddt @@ -296,10 +296,7 @@ class TeamAccessTests(SharedModuleStoreTestCase): @ddt.unpack def test_has_team_api_access(self, username, expected_have_access): user = self.users[username] - self.assertEqual( - expected_have_access, - teams_api.has_team_api_access(user, COURSE_KEY1) - ) + assert expected_have_access == teams_api.has_team_api_access(user, COURSE_KEY1) @ddt.data( ('user_audit', teams_api.OrganizationProtectionStatus.unprotected), @@ -311,12 +308,9 @@ class TeamAccessTests(SharedModuleStoreTestCase): def test_user_organization_protection_status(self, username, expected_protection_status): user = self.users[username] try: - self.assertEqual( - expected_protection_status, - teams_api.user_organization_protection_status(user, COURSE_KEY1) - ) + assert expected_protection_status == teams_api.user_organization_protection_status(user, COURSE_KEY1) except ValueError: - self.assertFalse(CourseEnrollment.is_enrolled(user, COURSE_KEY1)) + assert not CourseEnrollment.is_enrolled(user, COURSE_KEY1) @ddt.data( ('user_audit', True), @@ -328,12 +322,9 @@ class TeamAccessTests(SharedModuleStoreTestCase): def test_has_specific_team_access_unprotected_team(self, username, expected_return): user = self.users[username] try: - self.assertEqual( - expected_return, - teams_api.has_specific_team_access(user, self.team_unprotected_1) - ) + assert expected_return == teams_api.has_specific_team_access(user, self.team_unprotected_1) except ValueError: - self.assertFalse(CourseEnrollment.is_enrolled(user, self.team_unprotected_1.course_id)) + assert not CourseEnrollment.is_enrolled(user, self.team_unprotected_1.course_id) @ddt.data( ('user_audit', False), @@ -345,12 +336,9 @@ class TeamAccessTests(SharedModuleStoreTestCase): def test_has_specific_team_access_protected_team(self, username, expected_return): user = self.users[username] try: - self.assertEqual( - expected_return, - teams_api.has_specific_team_access(user, self.team_protected_1) - ) + assert expected_return == teams_api.has_specific_team_access(user, self.team_protected_1) except ValueError: - self.assertFalse(CourseEnrollment.is_enrolled(user, self.team_protected_1.course_id)) + assert not CourseEnrollment.is_enrolled(user, self.team_protected_1.course_id) @ddt.data( ('user_audit', 3), @@ -367,7 +355,7 @@ class TeamAccessTests(SharedModuleStoreTestCase): COURSE_KEY1 ) except ValueError: - self.assertFalse(CourseEnrollment.is_enrolled(user, COURSE_KEY1)) + assert not CourseEnrollment.is_enrolled(user, COURSE_KEY1) return teams_query_set = teams_api.get_teams_accessible_by_user( user, @@ -375,10 +363,7 @@ class TeamAccessTests(SharedModuleStoreTestCase): COURSE_KEY1, organization_protection_status ) - self.assertEqual( - expected_count, - teams_query_set.count() - ) + assert expected_count == teams_query_set.count() @ddt.data( ('user_audit', 3), @@ -395,7 +380,7 @@ class TeamAccessTests(SharedModuleStoreTestCase): COURSE_KEY1 ) except ValueError: - self.assertFalse(CourseEnrollment.is_enrolled(user, COURSE_KEY1)) + assert not CourseEnrollment.is_enrolled(user, COURSE_KEY1) return topic = { 'id': self.topic_id @@ -406,7 +391,4 @@ class TeamAccessTests(SharedModuleStoreTestCase): COURSE_KEY1, organization_protection_status ) - self.assertEqual( - expected_team_count, - topic.get('team_count') - ) + assert expected_team_count == topic.get('team_count') diff --git a/lms/djangoapps/teams/tests/test_csv.py b/lms/djangoapps/teams/tests/test_csv.py index 371d09bf960..842d0a4825e 100644 --- a/lms/djangoapps/teams/tests/test_csv.py +++ b/lms/djangoapps/teams/tests/test_csv.py @@ -128,24 +128,18 @@ class TeamMembershipCsvTests(SharedModuleStoreTestCase): 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'] - ) + assert 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'] - ) + assert 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) + assert 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') @@ -167,11 +161,11 @@ class TeamMembershipCsvTests(SharedModuleStoreTestCase): -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) + assert user_row['user'] == expected_username + assert user_row['mode'] == expected_mode + assert user_row.get('teamset_1') == expected_teamset_1_team + assert user_row.get('teamset_2') == expected_teamset_2_team + assert user_row.get('teamset_3') == expected_teamset_3_team def test_load_team_membership_csv(self): expected_csv_headers = ['user', 'mode', 'teamset_1', 'teamset_2', 'teamset_3', 'teamset_4'] @@ -196,7 +190,7 @@ class TeamMembershipCsvTests(SharedModuleStoreTestCase): self._add_blanks_to_expected_data(expected_data, expected_csv_headers) reader = csv_export(self.course) - self.assertEqual(expected_csv_headers, reader.fieldnames) + assert expected_csv_headers == reader.fieldnames self.assertDictEqual(expected_data, _user_keyed_dict(reader)) def _add_blanks_to_expected_data(self, expected_data, headers): @@ -281,7 +275,7 @@ class TeamMembershipImportManagerTests(TeamMembershipEventTestMixin, SharedModul self.import_manager.add_user_to_team(row) team = CourseTeam.objects.get(team_id__startswith='new_protected_team') - self.assertTrue(team.organization_protected) + assert team.organization_protected self.assert_learner_added_emitted(team.team_id, masters_learner.id) def test_add_user_to_new_unprotected_team(self): @@ -296,7 +290,7 @@ class TeamMembershipImportManagerTests(TeamMembershipEventTestMixin, SharedModul self.import_manager.add_user_to_team(row) team = CourseTeam.objects.get(team_id__startswith='new_unprotected_team') - self.assertFalse(team.organization_protected) + assert not team.organization_protected self.assert_learner_added_emitted(team.team_id, audit_learner.id) def test_team_removals_are_scoped_correctly(self): @@ -316,7 +310,7 @@ class TeamMembershipImportManagerTests(TeamMembershipEventTestMixin, SharedModul ) course_2_team.add_user(audit_learner) - self.assertTrue(CourseTeamMembership.is_user_on_team(audit_learner, course_1_team)) + assert CourseTeamMembership.is_user_on_team(audit_learner, course_1_team) # When I try to remove them from the team row = { @@ -327,7 +321,7 @@ class TeamMembershipImportManagerTests(TeamMembershipEventTestMixin, SharedModul self.import_manager.remove_user_from_team_for_reassignment(row) # They are successfully removed from the team - self.assertFalse(CourseTeamMembership.is_user_on_team(audit_learner, course_1_team)) + assert not CourseTeamMembership.is_user_on_team(audit_learner, course_1_team) self.assert_learner_removed_emitted(course_1_team.team_id, audit_learner.id) def test_user_moved_to_another_team(self): @@ -343,8 +337,8 @@ class TeamMembershipImportManagerTests(TeamMembershipEventTestMixin, SharedModul csv_row = _csv_dict_row(audit_learner, 'audit', teamset_1=team_2.name) csv_import(self.course, [csv_row]) - self.assertFalse(CourseTeamMembership.is_user_on_team(audit_learner, team_1)) - self.assertTrue(CourseTeamMembership.is_user_on_team(audit_learner, team_2)) + assert not CourseTeamMembership.is_user_on_team(audit_learner, team_1) + assert CourseTeamMembership.is_user_on_team(audit_learner, team_2) self.assert_learner_removed_emitted(team_1.team_id, audit_learner.id) self.assert_learner_added_emitted(team_2.team_id, audit_learner.id) @@ -380,16 +374,13 @@ class TeamMembershipImportManagerTests(TeamMembershipEventTestMixin, SharedModul result = self.import_manager.set_team_memberships(csv_data) # Then the import fails with no events emitted and a "team is full" error - self.assertFalse(result) + assert not result self.assert_no_events_were_emitted() - self.assertEqual( - self.import_manager.validation_errors[0], - 'New membership for team team_1 would exceed max size of 3.' - ) + assert self.import_manager.validation_errors[0] == 'New membership for team team_1 would exceed max size of 3.' # Confirm that memberships were not altered for i in range(2): - self.assertTrue(CourseTeamMembership.is_user_on_team(user, team)) + assert CourseTeamMembership.is_user_on_team(user, team) def test_remove_from_team(self): # Given a user already in a course and on a team @@ -398,7 +389,7 @@ class TeamMembershipImportManagerTests(TeamMembershipEventTestMixin, SharedModul CourseEnrollmentFactory.create(user=user, course_id=self.course.id, mode=mode) team = CourseTeamFactory(course_id=self.course.id, name='team_1', topic_id='teamset_1') team.add_user(user) - self.assertTrue(CourseTeamMembership.is_user_on_team(user, team)) + assert CourseTeamMembership.is_user_on_team(user, team) # When I try to remove them from the team csv_data = self._csv_reader_from_array([ @@ -408,7 +399,7 @@ class TeamMembershipImportManagerTests(TeamMembershipEventTestMixin, SharedModul result = self.import_manager.set_team_memberships(csv_data) # lint-amnesty, pylint: disable=unused-variable # Then they are removed from the team and the correct events are issued - self.assertFalse(CourseTeamMembership.is_user_on_team(user, team)) + assert not CourseTeamMembership.is_user_on_team(user, team) self.assert_learner_removed_emitted(team.team_id, user.id) def test_switch_memberships(self): @@ -435,15 +426,15 @@ class TeamMembershipImportManagerTests(TeamMembershipEventTestMixin, SharedModul result = self.import_manager.set_team_memberships(csv_data) # Then membership size is calculated correctly, import finishes w/out error - self.assertTrue(result) + assert result # ... and the users are assigned to the correct teams team_1 = CourseTeam.objects.get(course_id=self.course.id, topic_id='teamset_1', name='team_1') - self.assertTrue(CourseTeamMembership.is_user_on_team(users[4], team_1)) + assert CourseTeamMembership.is_user_on_team(users[4], team_1) self.assert_learner_added_emitted(team_1.team_id, users[4].id) team_2 = CourseTeam.objects.get(course_id=self.course.id, topic_id='teamset_1', name='team_2') - self.assertTrue(CourseTeamMembership.is_user_on_team(users[0], team_2)) + assert CourseTeamMembership.is_user_on_team(users[0], team_2) self.assert_learner_added_emitted(team_2.team_id, users[0].id) def test_create_new_team_from_import(self): @@ -453,7 +444,7 @@ class TeamMembershipImportManagerTests(TeamMembershipEventTestMixin, SharedModul CourseEnrollmentFactory.create(user=user, course_id=self.course.id, mode=mode) # When I add them to a team that does not exist - self.assertEqual(CourseTeam.objects.all().count(), 0) + assert CourseTeam.objects.all().count() == 0 csv_data = self._csv_reader_from_array([ ['user', 'mode', 'teamset_1'], [user.username, mode, 'new_exciting_team'], @@ -461,11 +452,11 @@ class TeamMembershipImportManagerTests(TeamMembershipEventTestMixin, SharedModul result = self.import_manager.set_team_memberships(csv_data) # lint-amnesty, pylint: disable=unused-variable # Then a new team is created - self.assertEqual(CourseTeam.objects.all().count(), 1) + assert CourseTeam.objects.all().count() == 1 # ... and the user is assigned to the team new_team = CourseTeam.objects.get(topic_id='teamset_1', name='new_exciting_team') - self.assertTrue(CourseTeamMembership.is_user_on_team(user, new_team)) + assert CourseTeamMembership.is_user_on_team(user, new_team) self.assert_learner_added_emitted(new_team.team_id, user.id) # Team protection status tests @@ -475,7 +466,7 @@ class TeamMembershipImportManagerTests(TeamMembershipEventTestMixin, SharedModul masters_learner = self._create_and_enroll_test_user('masters_learner', mode='masters') # When I attempt to add them to the same team - self.assertEqual(CourseTeam.objects.all().count(), 0) + assert CourseTeam.objects.all().count() == 0 csv_data = self._csv_reader_from_array([ ['user', 'mode', 'teamset_1'], [verified_learner.username, 'verified', 'new_exciting_team'], @@ -484,13 +475,11 @@ class TeamMembershipImportManagerTests(TeamMembershipEventTestMixin, SharedModul result = self.import_manager.set_team_memberships(csv_data) # The import fails with "mixed users" error and no team was created - self.assertFalse(result) + assert not result self.assert_no_events_were_emitted() - self.assertEqual( - self.import_manager.validation_errors[0], - 'Team new_exciting_team cannot have Master’s track users mixed with users in other tracks.' - ) - self.assertEqual(CourseTeam.objects.all().count(), 0) + assert self.import_manager.validation_errors[0] ==\ + 'Team new_exciting_team cannot have Master’s track users mixed with users in other tracks.' + assert CourseTeam.objects.all().count() == 0 def test_add_incompatible_mode_to_existing_unprotected_team_fails(self): # Given an existing unprotected team @@ -507,13 +496,11 @@ class TeamMembershipImportManagerTests(TeamMembershipEventTestMixin, SharedModul result = self.import_manager.set_team_memberships(csv_data) # The import fails with "mixed users" error and learner not added to team - self.assertFalse(result) + assert not result self.assert_no_events_were_emitted() - self.assertEqual( - self.import_manager.validation_errors[0], - 'Team unprotected_team cannot have Master’s track users mixed with users in other tracks.' - ) - self.assertFalse(CourseTeamMembership.is_user_on_team(masters_learner, unprotected_team)) + assert self.import_manager.validation_errors[0] ==\ + 'Team unprotected_team cannot have Master’s track users mixed with users in other tracks.' + assert not CourseTeamMembership.is_user_on_team(masters_learner, unprotected_team) def test_add_incompatible_mode_to_existing_protected_team_fails(self): # Given an existing protected team @@ -535,13 +522,11 @@ class TeamMembershipImportManagerTests(TeamMembershipEventTestMixin, SharedModul result = self.import_manager.set_team_memberships(csv_data) # The import fails with "mixed users" error and learner not added to team - self.assertFalse(result) + assert not result self.assert_no_events_were_emitted() - self.assertEqual( - self.import_manager.validation_errors[0], - 'Team protected_team cannot have Master’s track users mixed with users in other tracks.' - ) - self.assertFalse(CourseTeamMembership.is_user_on_team(verified_learner, protected_team)) + assert self.import_manager.validation_errors[0] ==\ + 'Team protected_team cannot have Master’s track users mixed with users in other tracks.' + assert not CourseTeamMembership.is_user_on_team(verified_learner, protected_team) def _create_and_enroll_test_user(self, username, course_id=None, mode="audit"): """ @@ -628,10 +613,10 @@ class ExternalKeyCsvTests(TeamMembershipEventTestMixin, SharedModuleStoreTestCas ) def assert_user_on_team(self, user): - self.assertTrue(CourseTeamMembership.is_user_on_team(user, self.team)) + assert CourseTeamMembership.is_user_on_team(user, self.team) def assert_user_not_on_team(self, user): - self.assertFalse(CourseTeamMembership.is_user_on_team(user, self.team)) + assert not CourseTeamMembership.is_user_on_team(user, self.team) def test_add_user_to_team_with_external_key(self): # Make a new user with an external_user_key who is enrolled in the course and program, with an external_key, @@ -661,7 +646,7 @@ class ExternalKeyCsvTests(TeamMembershipEventTestMixin, SharedModuleStoreTestCas Assert that the four test users should be listed as members of the team, and user_in_program should be identified by their external_user_key """ - self.assertEqual(len(data), 4) + assert len(data) == 4 expected_data = { user_identifier: _csv_dict_row(user_identifier, 'audit', teamset_id=self.team.name) for user_identifier in [ diff --git a/lms/djangoapps/teams/tests/test_models.py b/lms/djangoapps/teams/tests/test_models.py index eac072b988b..3848ed2e880 100644 --- a/lms/djangoapps/teams/tests/test_models.py +++ b/lms/djangoapps/teams/tests/test_models.py @@ -5,6 +5,7 @@ Tests for the teams API at the HTTP request level. import itertools +import pytest from contextlib import contextmanager from datetime import datetime @@ -134,16 +135,16 @@ class CourseTeamTest(SharedModuleStoreTestCase): def test_add_user(self): """Test that we can add users with correct protection status to a team""" - self.assertIsNotNone(self.masters_team.add_user(self.masters_learner)) - self.assertIsNotNone(self.audit_team.add_user(self.audit_learner)) + assert self.masters_team.add_user(self.masters_learner) is not None + assert self.audit_team.add_user(self.audit_learner) is not None def test_add_user_bad_team_access(self): """Test that we are blocked from adding a user to a team of mixed enrollment types""" - with self.assertRaises(AddToIncompatibleTeamError): + with pytest.raises(AddToIncompatibleTeamError): self.audit_team.add_user(self.masters_learner) - with self.assertRaises(AddToIncompatibleTeamError): + with pytest.raises(AddToIncompatibleTeamError): self.masters_team.add_user(self.audit_learner) @@ -189,31 +190,31 @@ class TeamMembershipTest(SharedModuleStoreTestCase): def test_membership_last_activity_set(self): current_last_activity = self.team_membership11.last_activity_at # Assert that the first save in the setUp sets a value. - self.assertIsNotNone(current_last_activity) + assert current_last_activity is not None self.team_membership11.save() # Verify that we only change the last activity_at when it doesn't # already exist. - self.assertEqual(self.team_membership11.last_activity_at, current_last_activity) + assert self.team_membership11.last_activity_at == current_last_activity def test_team_size_delete_membership(self): """Test that the team size field is correctly updated when deleting a team membership. """ - self.assertEqual(self.team1.team_size, 2) + assert self.team1.team_size == 2 self.team_membership11.delete() team = CourseTeam.objects.get(id=self.team1.id) - self.assertEqual(team.team_size, 1) + assert team.team_size == 1 def test_team_size_create_membership(self): """Test that the team size field is correctly updated when creating a team membership. """ - self.assertEqual(self.team1.team_size, 2) + assert self.team1.team_size == 2 self.team1.add_user(self.user3) team = CourseTeam.objects.get(id=self.team1.id) - self.assertEqual(team.team_size, 3) + assert team.team_size == 3 @ddt.data( (None, None, None, 3), @@ -224,10 +225,9 @@ class TeamMembershipTest(SharedModuleStoreTestCase): ) @ddt.unpack def test_get_memberships(self, username, course_ids, team_ids, expected_count): - self.assertEqual( - CourseTeamMembership.get_memberships(username=username, course_ids=course_ids, team_ids=team_ids).count(), - expected_count - ) + assert CourseTeamMembership.get_memberships(username=username, + course_ids=course_ids, + team_ids=team_ids).count() == expected_count @ddt.data( ('user1', COURSE_KEY1, TEAMSET_1_ID, True), @@ -240,10 +240,7 @@ class TeamMembershipTest(SharedModuleStoreTestCase): @ddt.unpack def test_user_in_team_for_course_teamset(self, username, course_id, teamset_id, expected_value): user = getattr(self, username) - self.assertEqual( - CourseTeamMembership.user_in_team_for_teamset(user, course_id, teamset_id), - expected_value - ) + assert CourseTeamMembership.user_in_team_for_teamset(user, course_id, teamset_id) == expected_value @ddt.ddt @@ -296,18 +293,18 @@ class TeamSignalsTest(EventTestMixin, SharedModuleStoreTestCase): team = CourseTeam.objects.get(id=self.team.id) team_membership = CourseTeamMembership.objects.get(id=self.team_membership.id) if should_update: - self.assertGreater(team.last_activity_at, team_last_activity) - self.assertGreater(team_membership.last_activity_at, team_membership_last_activity) + assert team.last_activity_at > team_last_activity + assert team_membership.last_activity_at > team_membership_last_activity now = datetime.utcnow().replace(tzinfo=pytz.utc) - self.assertGreater(now, team.last_activity_at) - self.assertGreater(now, team_membership.last_activity_at) + assert now > team.last_activity_at + assert now > team_membership.last_activity_at self.assert_event_emitted( 'edx.team.activity_updated', team_id=team.team_id, ) else: - self.assertEqual(team.last_activity_at, team_last_activity) - self.assertEqual(team_membership.last_activity_at, team_membership_last_activity) + assert team.last_activity_at == team_last_activity + assert team_membership.last_activity_at == team_membership_last_activity self.assert_no_events_were_emitted() @ddt.data( diff --git a/lms/djangoapps/teams/tests/test_serializers.py b/lms/djangoapps/teams/tests/test_serializers.py index 517146e6585..b77fea6c856 100644 --- a/lms/djangoapps/teams/tests/test_serializers.py +++ b/lms/djangoapps/teams/tests/test_serializers.py @@ -55,19 +55,14 @@ class MembershipSerializerTestCase(SerializerTestCase): 'request': RequestFactory().get('/api/team/v0/team_membership') }).data username = self.user.username - self.assertEqual(data['user'], { - 'url': 'http://testserver/api/user/v1/accounts/' + username, - 'username': username, - 'profile_image': { - 'image_url_full': 'http://testserver/static/default_500.png', - 'image_url_large': 'http://testserver/static/default_120.png', - 'image_url_medium': 'http://testserver/static/default_50.png', - 'image_url_small': 'http://testserver/static/default_30.png', - 'has_image': False - }, - 'account_privacy': 'private' - }) - self.assertNotIn('membership', data['team']) + assert data['user'] == {'url': ('http://testserver/api/user/v1/accounts/' + username), + 'username': username, + 'profile_image': {'image_url_full': 'http://testserver/static/default_500.png', + 'image_url_large': 'http://testserver/static/default_120.png', + 'image_url_medium': 'http://testserver/static/default_50.png', + 'image_url_small': 'http://testserver/static/default_30.png', + 'has_image': False}, 'account_privacy': 'private'} + assert 'membership' not in data['team'] class TopicSerializerTestCase(SerializerTestCase): @@ -86,17 +81,8 @@ class TopicSerializerTestCase(SerializerTestCase): self.course.teamsets[0].cleaned_data, context={'course_id': self.course.id}, ) - self.assertEqual( - serializer.data, - { - u'name': u'Tøpic', - u'description': u'The bést topic!', - u'id': u'0', - u'team_count': 0, - u'type': u'open', - u'max_team_size': None - } - ) + assert serializer.data == {u'name': u'Tøpic', u'description': u'The bést topic!', u'id': u'0', + u'team_count': 0, u'type': u'open', u'max_team_size': None} def test_topic_with_team_count(self): """ @@ -111,17 +97,8 @@ class TopicSerializerTestCase(SerializerTestCase): self.course.teamsets[0].cleaned_data, context={'course_id': self.course.id}, ) - self.assertEqual( - serializer.data, - { - u'name': u'Tøpic', - u'description': u'The bést topic!', - u'id': u'0', - u'team_count': 1, - u'type': u'open', - u'max_team_size': None - } - ) + assert serializer.data == {u'name': u'Tøpic', u'description': u'The bést topic!', u'id': u'0', + u'team_count': 1, u'type': u'open', u'max_team_size': None} def test_scoped_within_course(self): """Verify that team count is scoped within a course.""" @@ -139,17 +116,8 @@ class TopicSerializerTestCase(SerializerTestCase): self.course.teamsets[0].cleaned_data, context={'course_id': self.course.id}, ) - self.assertEqual( - serializer.data, - { - u'name': u'Tøpic', - u'description': u'The bést topic!', - u'id': u'0', - u'team_count': 1, - u'type': u'open', - u'max_team_size': None - } - ) + assert serializer.data == {u'name': u'Tøpic', u'description': u'The bést topic!', u'id': u'0', + u'team_count': 1, u'type': u'open', u'max_team_size': None} class BaseTopicSerializerTestCase(SerializerTestCase): @@ -203,10 +171,8 @@ class BaseTopicSerializerTestCase(SerializerTestCase): ).page(1) # pylint: disable=not-callable serializer = self.serializer(instance=page, context={'course_id': self.course.id}) - self.assertEqual( - serializer.data['results'], - [self._merge_dicts(topic, {u'team_count': num_teams_per_topic}) for topic in topics] - ) + assert serializer.data['results'] ==\ + [self._merge_dicts(topic, {u'team_count': num_teams_per_topic}) for topic in topics] def test_no_topics(self): """ @@ -295,10 +261,8 @@ class BulkTeamCountTopicSerializerTestCase(BaseTopicSerializerTestCase): }, many=True ) - self.assertEqual( - serializer.data, - [self._merge_dicts(topic, {u'team_count': num_teams_per_topic}) for topic in topics] - ) + assert serializer.data ==\ + [self._merge_dicts(topic, {u'team_count': num_teams_per_topic}) for topic in topics] def test_no_topics(self): """ diff --git a/lms/djangoapps/teams/tests/test_services.py b/lms/djangoapps/teams/tests/test_services.py index 7423da77b83..d6eb53ad6a9 100644 --- a/lms/djangoapps/teams/tests/test_services.py +++ b/lms/djangoapps/teams/tests/test_services.py @@ -27,31 +27,22 @@ class TeamsServiceTests(ModuleStoreTestCase): def test_get_team_by_team_id(self): team = self.service.get_team_by_team_id('NONEXISTANCE') - self.assertIsNone(team) + assert team is None team = self.service.get_team_by_team_id(self.team.team_id) - self.assertEqual(team, self.team) + assert team == self.team def test_get_team(self): user_team = self.service.get_team(self.user, self.course_key, self.team.topic_id) - self.assertEqual(user_team, self.team) + assert user_team == self.team user2 = UserFactory.create() user2_team = self.service.get_team(user2, self.course_key, self.team.topic_id) - self.assertIsNone(user2_team) + assert user2_team is None def test_get_team_detail_url(self): # edx.org/courses/blah/teams/#teams/topic_id/team_id team_detail_url = self.service.get_team_detail_url(self.team) split_url = team_detail_url.split('/') - self.assertEqual( - split_url[1:], - [ - 'courses', - str(self.course_run['key']), - 'teams', - '#teams', - self.team.topic_id, - self.team.team_id, - ] - ) + assert split_url[1:] ==\ + ['courses', str(self.course_run['key']), 'teams', '#teams', self.team.topic_id, self.team.team_id] diff --git a/lms/djangoapps/teams/tests/test_views.py b/lms/djangoapps/teams/tests/test_views.py index d63c24b68e1..1eeec4c186f 100644 --- a/lms/djangoapps/teams/tests/test_views.py +++ b/lms/djangoapps/teams/tests/test_views.py @@ -86,7 +86,7 @@ class TestDashboard(SharedModuleStoreTestCase): """ Verifies that a student who is not enrolled cannot access the team dashboard. """ self.client.login(username=self.user.username, password=self.test_password) response = self.client.get(self.teams_url) - self.assertEqual(404, response.status_code) + assert 404 == response.status_code def test_not_enrolled_staff(self): """ @@ -117,7 +117,7 @@ class TestDashboard(SharedModuleStoreTestCase): CourseEnrollmentFactory.create(user=self.user, course_id=course.id) self.client.login(username=self.user.username, password=self.test_password) response = self.client.get(teams_url) - self.assertEqual(404, response.status_code) + assert 404 == response.status_code @unittest.skip("Fix this - getting unreliable query counts") def test_query_counts(self): @@ -153,11 +153,11 @@ class TestDashboard(SharedModuleStoreTestCase): CourseEnrollmentFactory.create(user=self.user, course_id=self.course.id) self.client.login(username=self.user.username, password=self.test_password) response = self.client.get(bad_team_url) - self.assertEqual(404, response.status_code) + assert 404 == response.status_code bad_team_url = bad_team_url.replace(bad_org, "invalid/course/id") response = self.client.get(bad_team_url) - self.assertEqual(404, response.status_code) + assert 404 == response.status_code def get_user_course_specific_teams_list(self): """Gets the list of user course specific teams.""" @@ -614,15 +614,9 @@ class TeamAPITestCase(APITestCase, SharedModuleStoreTestCase): response = func(url, data=data, content_type=content_type) else: response = func(url, data=data) - self.assertEqual( - expected_status, - response.status_code, - msg=u"Expected status {expected} but got {actual}: {content}".format( - expected=expected_status, - actual=response.status_code, - content=response.content.decode(response.charset), - ) - ) + assert expected_status == response.status_code, "Expected status {expected} but got {actual}: {content}"\ + .format(expected=expected_status, actual=response.status_code, + content=response.content.decode(response.charset)) if expected_status == 200: return json.loads(response.content.decode('utf-8')) @@ -649,18 +643,18 @@ class TeamAPITestCase(APITestCase, SharedModuleStoreTestCase): # Check that initially list of user teams in course one is empty team_list = self.get_teams_list(user=user, expected_status=200, data=course_one_data) - self.assertEqual(team_list['count'], 0) + assert team_list['count'] == 0 # Add user to a course one team self.solar_team.add_user(self.users[user]) # Check that list of user teams in course one is not empty now team_list = self.get_teams_list(user=user, expected_status=200, data=course_one_data) - self.assertEqual(team_list['count'], 1) + assert team_list['count'] == 1 # Check that list of user teams in course two is still empty team_list = self.get_teams_list(user=user, expected_status=200, data=course_two_data) - self.assertEqual(team_list['count'], 0) + assert team_list['count'] == 0 def build_team_data( self, @@ -753,19 +747,19 @@ class TeamAPITestCase(APITestCase, SharedModuleStoreTestCase): def verify_expanded_public_user(self, user): """Verifies that fields exist on the returned user json indicating that it is expanded.""" for field in ['username', 'url', 'bio', 'country', 'profile_image', 'time_zone', 'language_proficiencies']: - self.assertIn(field, user) + assert field in user def verify_expanded_private_user(self, user): """Verifies that fields exist on the returned user json indicating that it is expanded.""" for field in ['username', 'url', 'profile_image']: - self.assertIn(field, user) + assert field in user for field in ['bio', 'country', 'time_zone', 'language_proficiencies']: - self.assertNotIn(field, user) + assert field not in user def verify_expanded_team(self, team): """Verifies that fields exist on the returned team json indicating that it is expanded.""" for field in ['id', 'name', 'course_id', 'topic_id', 'date_created', 'description']: - self.assertIn(field, team) + assert field in team def reset_search_index(self): """Clear out the search index and reindex the teams.""" @@ -795,7 +789,7 @@ class TestListTeamsAPI(EventTestMixin, TeamAPITestCase): def test_access(self, user, status, expected_teams_count=0): teams = self.get_teams_list(user=user, expected_status=status) if status == 200: - self.assertEqual(expected_teams_count, teams['count']) + assert expected_teams_count == teams['count'] def test_missing_course_id(self): self.get_teams_list(400, no_course_id=True) @@ -805,7 +799,7 @@ class TestListTeamsAPI(EventTestMixin, TeamAPITestCase): teams = self.get_teams_list(data=data, expected_status=status, **kwargs) if names is not None and 200 <= status < 300: results = teams['results'] - self.assertEqual(sorted(names), sorted([team['name'] for team in results])) + assert sorted(names) == sorted([team['name'] for team in results]) def test_filter_invalid_course_id(self): self.verify_names({'course_id': 'no_such_course'}, 400) @@ -866,7 +860,7 @@ class TestListTeamsAPI(EventTestMixin, TeamAPITestCase): def test_page_size(self): result = self.get_teams_list(200, {'page_size': 2}) - self.assertEqual(2, result['num_pages']) + assert 2 == result['num_pages'] def test_non_member_trying_to_get_private_topic(self): """ @@ -874,7 +868,7 @@ class TestListTeamsAPI(EventTestMixin, TeamAPITestCase): a private team set, asks for information about that team set, an empty list is returned. """ result = self.get_teams_list(data={'topic_id': 'private_topic_1_id'}) - self.assertEqual([], result['results']) + assert [] == result['results'] def test_member_trying_to_get_private_topic(self): """ @@ -883,9 +877,9 @@ class TestListTeamsAPI(EventTestMixin, TeamAPITestCase): """ result = self.get_teams_list(data={'topic_id': 'private_topic_1_id'}, user='student_on_team_1_private_set_1') - self.assertEqual(1, len(result['results'])) - self.assertEqual('private_topic_1_id', result['results'][0]['topic_id']) - self.assertNotEqual([], result['results']) + assert 1 == len(result['results']) + assert 'private_topic_1_id' == result['results'][0]['topic_id'] + assert [] != result['results'] def test_course_staff_getting_information_on_private_topic(self): """ @@ -894,7 +888,7 @@ class TestListTeamsAPI(EventTestMixin, TeamAPITestCase): """ result = self.get_teams_list(data={'topic_id': 'private_topic_1_id'}, user='course_staff') - self.assertEqual(2, len(result['results'])) + assert 2 == len(result['results']) @ddt.unpack @ddt.data( @@ -914,7 +908,7 @@ class TestListTeamsAPI(EventTestMixin, TeamAPITestCase): data={'text_search': 'master'}, user=user, ) - self.assertEqual(result['count'], expected_results) + assert result['count'] == expected_results @ddt.unpack @ddt.data( @@ -943,13 +937,13 @@ class TestListTeamsAPI(EventTestMixin, TeamAPITestCase): expected_teams.add(self.team_2_in_private_teamset_1.name) if can_see_private_2_1: expected_teams.add(self.team_1_in_private_teamset_2.name) - self.assertEqual(expected_teams, teams) + assert expected_teams == teams def test_page(self): result = self.get_teams_list(200, {'page_size': 1, 'page': 3}) - self.assertEqual(3, result['num_pages']) - self.assertIsNone(result['next']) - self.assertIsNotNone(result['previous']) + assert 3 == result['num_pages'] + assert result['next'] is None + assert result['previous'] is not None def test_expand_private_user(self): # Use the default user which is already private because to year_of_birth is set @@ -1066,17 +1060,12 @@ class TestListTeamsAPI(EventTestMixin, TeamAPITestCase): teams = self.get_teams_list(data={'topic_id': self.solar_team.topic_id}, user='student_enrolled') team_names = [team['name'] for team in teams['results']] team_names.sort() - self.assertEqual(team_names, [ - self.solar_team.name, - ]) + assert team_names == [self.solar_team.name] teams = self.get_teams_list(data={'topic_id': self.solar_team.topic_id}, user='staff') team_names = [team['name'] for team in teams['results']] team_names.sort() - self.assertEqual(team_names, [ - self.solar_team.name, - self.masters_only_team.name, - ]) + assert team_names == [self.solar_team.name, self.masters_only_team.name] @ddt.ddt @@ -1101,7 +1090,7 @@ class TestCreateTeamAPI(EventTestMixin, TeamAPITestCase): if status == 200: self.verify_expected_team_id(team, 'new-team') teams = self.get_teams_list(user=user) - self.assertIn("New Team", [team['name'] for team in teams['results']]) + assert 'New Team' in [team['name'] for team in teams['results']] def _expected_team_id(self, team, expected_prefix): """ Return the team id that we'd expect given this team data and this prefix. """ @@ -1109,9 +1098,9 @@ class TestCreateTeamAPI(EventTestMixin, TeamAPITestCase): def verify_expected_team_id(self, team, expected_prefix): """ Verifies that the team id starts with the specified prefix and ends with the discussion_topic_id """ - self.assertIn('id', team) - self.assertIn('discussion_topic_id', team) - self.assertEqual(team['id'], self._expected_team_id(team, expected_prefix)) + assert 'id' in team + assert 'discussion_topic_id' in team + assert team['id'] == self._expected_team_id(team, expected_prefix) def test_naming(self): new_teams = [ @@ -1121,7 +1110,7 @@ class TestCreateTeamAPI(EventTestMixin, TeamAPITestCase): # Check that teams with the same name have unique IDs. self.verify_expected_team_id(new_teams[0], 'the-best-team') self.verify_expected_team_id(new_teams[1], 'the-best-team') - self.assertNotEqual(new_teams[0]['id'], new_teams[1]['id']) + assert new_teams[0]['id'] != new_teams[1]['id'] # Verify expected truncation behavior with names > 20 characters. self.verify_expected_team_id(new_teams[2], 'a-really-long-team-n') @@ -1161,10 +1150,8 @@ class TestCreateTeamAPI(EventTestMixin, TeamAPITestCase): ), user='student_enrolled' ) - self.assertEqual( - "You are already in a team in this teamset.", - json.loads(response.content.decode('utf-8'))["user_message"] - ) + assert 'You are already in a team in this teamset.' ==\ + json.loads(response.content.decode('utf-8'))['user_message'] @patch('lms.djangoapps.teams.views.can_user_create_team_in_topic', return_value=False) @patch('lms.djangoapps.teams.views.has_specific_teamset_access', return_value=True) @@ -1179,10 +1166,8 @@ class TestCreateTeamAPI(EventTestMixin, TeamAPITestCase): ), user='student_enrolled_not_on_team' ) - self.assertEqual( - "You can't create a team in an instructor managed topic.", - json.loads(response.content.decode('utf-8'))["user_message"] - ) + assert "You can't create a team in an instructor managed topic." ==\ + json.loads(response.content.decode('utf-8'))['user_message'] @ddt.data('staff', 'course_staff', 'community_ta') def test_privileged_create_multiple_teams(self, user): @@ -1249,26 +1234,17 @@ class TestCreateTeamAPI(EventTestMixin, TeamAPITestCase): del team['membership'] # verify that it's been set to a time today. - self.assertEqual( - parser.parse(team['last_activity_at']).date(), - datetime.utcnow().replace(tzinfo=pytz.utc).date() - ) + assert parser.parse(team['last_activity_at']).date() == datetime.utcnow().replace(tzinfo=pytz.utc).date() del team['last_activity_at'] # Verify that the creating user gets added to the team. - self.assertEqual(len(team_membership), 1) + assert len(team_membership) == 1 member = team_membership[0]['user'] - self.assertEqual(member['username'], creator) + assert member['username'] == creator - self.assertEqual(team, { - 'name': 'Fully specified team', - 'language': 'fr', - 'country': 'CA', - 'topic_id': 'topic_1', - 'course_id': str(self.test_course_1.id), - 'description': 'Another fantastic team', - 'organization_protected': False, - }) + assert team == {'name': 'Fully specified team', 'language': 'fr', 'country': 'CA', 'topic_id': 'topic_1', + 'course_id': str(self.test_course_1.id), 'description': 'Another fantastic team', + 'organization_protected': False} @ddt.data('staff', 'course_staff', 'community_ta') def test_membership_staff_creator(self, user): @@ -1280,7 +1256,7 @@ class TestCreateTeamAPI(EventTestMixin, TeamAPITestCase): description="Another fantastic team", ), user=user) - self.assertEqual(team['membership'], []) + assert team['membership'] == [] @ddt.unpack @ddt.data( @@ -1310,7 +1286,7 @@ class TestCreateTeamAPI(EventTestMixin, TeamAPITestCase): user=user ) if msg: - self.assertEqual(msg, response.json()['user_message']) + assert msg == response.json()['user_message'] @ddt.ddt @@ -1330,9 +1306,9 @@ class TestDetailTeamAPI(TeamAPITestCase): def test_access(self, user, status): team = self.get_team_detail(self.solar_team.team_id, status, user=user) if status == 200: - self.assertEqual(team['description'], self.solar_team.description) - self.assertEqual(team['discussion_topic_id'], self.solar_team.discussion_topic_id) - self.assertEqual(parser.parse(team['last_activity_at']), LAST_ACTIVITY_AT) + assert team['description'] == self.solar_team.description + assert team['discussion_topic_id'] == self.solar_team.discussion_topic_id + assert parser.parse(team['last_activity_at']) == LAST_ACTIVITY_AT def test_does_not_exist(self): self.get_team_detail('no_such_team', 404) @@ -1371,7 +1347,7 @@ class TestDetailTeamAPI(TeamAPITestCase): user=requesting_user ) if expected_response == 200: - self.assertEqual(team['name'], self.masters_only_team.name) + assert team['name'] == self.masters_only_team.name @ddt.unpack @ddt.data( @@ -1394,7 +1370,7 @@ class TestDetailTeamAPI(TeamAPITestCase): user=requesting_user ) if expected_response == 200: - self.assertEqual(team['name'], self.team_1_in_private_teamset_1.name) + assert team['name'] == self.team_1_in_private_teamset_1.name @ddt.ddt @@ -1414,12 +1390,12 @@ class TestDeleteTeamAPI(EventTestMixin, TeamAPITestCase): def test_access(self, user, status): team_list = self.get_teams_list(user='course_staff', expected_status=200) previous_count = team_list['count'] - self.assertIn(self.solar_team.team_id, [result['id'] for result in team_list.get('results')]) + assert self.solar_team.team_id in [result['id'] for result in team_list.get('results')] self.delete_team(self.solar_team.team_id, status, user=user) team_list = self.get_teams_list(user='course_staff', expected_status=200) - self.assertEqual(team_list['count'], previous_count - 1) - self.assertNotIn(self.solar_team.team_id, [result['id'] for result in team_list.get('results')]) + assert team_list['count'] == (previous_count - 1) + assert self.solar_team.team_id not in [result['id'] for result in team_list.get('results')] self.assert_event_emitted( 'edx.team.deleted', team_id=self.solar_team.team_id, @@ -1439,12 +1415,12 @@ class TestDeleteTeamAPI(EventTestMixin, TeamAPITestCase): def test_access_forbidden(self, user, status): team_list = self.get_teams_list(user='course_staff', expected_status=200) previous_count = team_list['count'] - self.assertIn(self.solar_team.team_id, [result['id'] for result in team_list.get('results')]) + assert self.solar_team.team_id in [result['id'] for result in team_list.get('results')] self.delete_team(self.solar_team.team_id, status, user=user) team_list = self.get_teams_list(user='course_staff', expected_status=200) - self.assertEqual(team_list['count'], previous_count) - self.assertIn(self.solar_team.team_id, [result['id'] for result in team_list.get('results')]) + assert team_list['count'] == previous_count + assert self.solar_team.team_id in [result['id'] for result in team_list.get('results')] @ddt.data( (None, 401), @@ -1458,7 +1434,7 @@ class TestDeleteTeamAPI(EventTestMixin, TeamAPITestCase): self.delete_team('nonexistent', 404) def test_memberships_deleted(self): - self.assertEqual(CourseTeamMembership.objects.filter(team=self.solar_team).count(), 1) + assert CourseTeamMembership.objects.filter(team=self.solar_team).count() == 1 self.delete_team(self.solar_team.team_id, 204, user='staff') self.assert_event_emitted( 'edx.team.deleted', @@ -1470,7 +1446,7 @@ class TestDeleteTeamAPI(EventTestMixin, TeamAPITestCase): remove_method='team_deleted', user_id=self.users['student_enrolled'].id ) - self.assertEqual(CourseTeamMembership.objects.filter(team=self.solar_team).count(), 0) + assert CourseTeamMembership.objects.filter(team=self.solar_team).count() == 0 @ddt.unpack @ddt.data( @@ -1534,7 +1510,7 @@ class TestUpdateTeamAPI(EventTestMixin, TeamAPITestCase): prev_name = self.solar_team.name team = self.patch_team_detail(self.solar_team.team_id, status, {'name': 'foo'}, user=user) if status == 200: - self.assertEqual(team['name'], 'foo') + assert team['name'] == 'foo' self.assert_event_emitted( 'edx.team.changed', team_id=self.solar_team.team_id, @@ -1609,7 +1585,7 @@ class TestUpdateTeamAPI(EventTestMixin, TeamAPITestCase): user=requesting_user ) if expected_status == 200: - self.assertEqual(team['name'], 'foo') + assert team['name'] == 'foo' @ddt.unpack @ddt.data( @@ -1632,7 +1608,7 @@ class TestUpdateTeamAPI(EventTestMixin, TeamAPITestCase): user=requesting_user ) if expected_status == 200: - self.assertEqual(team['name'], 'foo') + assert team['name'] == 'foo' @patch.dict(settings.FEATURES, {'ENABLE_ORA_TEAM_SUBMISSIONS': True}) @@ -1701,12 +1677,12 @@ class TestTeamAssignmentsView(TeamAPITestCase): if expected_status == 200: # I successful, I get back the assignments for a team - self.assertEqual(len(assignments), len(self.team_assignments)) + assert len(assignments) == len(self.team_assignments) # ... with the right data structure for assignment in assignments: - self.assertIn('display_name', assignment.keys()) - self.assertIn('location', assignment.keys()) + assert 'display_name' in assignment.keys() + assert 'location' in assignment.keys() def test_get_assignments_bad_team(self): # Given a bad team is supplied @@ -1746,7 +1722,7 @@ class TestListTopicsAPI(TeamAPITestCase): def test_access(self, user, status, expected_topics_count): topics = self.get_topics_list(status, {'course_id': str(self.test_course_1.id)}, user=user) if status == 200: - self.assertEqual(topics['count'], expected_topics_count) + assert topics['count'] == expected_topics_count @ddt.data('A+BOGUS+COURSE', 'A/BOGUS/COURSE') def test_invalid_course_key(self, course_id): @@ -1784,8 +1760,8 @@ class TestListTopicsAPI(TeamAPITestCase): data['order_by'] = field topics = self.get_topics_list(status, data, user='student_enrolled') if status == 200: - self.assertEqual(names, [topic['name'] for topic in topics['results']]) - self.assertEqual(topics['sort_order'], expected_ordering) + assert names == [topic['name'] for topic in topics['results']] + assert topics['sort_order'] == expected_ordering def test_order_by_team_count_secondary(self): """ @@ -1824,7 +1800,7 @@ class TestListTopicsAPI(TeamAPITestCase): }, user='student_enrolled' ) - self.assertEqual(["Wind Power", u'Sólar power'], [topic['name'] for topic in topics['results']]) + assert ['Wind Power', u'Sólar power'] == [topic['name'] for topic in topics['results']] # Coal and Nuclear are tied, so they are alphabetically sorted. topics = self.get_topics_list( @@ -1836,7 +1812,7 @@ class TestListTopicsAPI(TeamAPITestCase): }, user='student_enrolled' ) - self.assertEqual(["Coal Power", "Nuclear Power"], [topic['name'] for topic in topics['results']]) + assert ['Coal Power', 'Nuclear Power'] == [topic['name'] for topic in topics['results']] def test_pagination(self): response = self.get_topics_list( @@ -1847,15 +1823,15 @@ class TestListTopicsAPI(TeamAPITestCase): user='student_enrolled' ) - self.assertEqual(2, len(response['results'])) - self.assertIn('next', response) - self.assertIn('previous', response) - self.assertIsNone(response['previous']) - self.assertIsNotNone(response['next']) + assert 2 == len(response['results']) + assert 'next' in response + assert 'previous' in response + assert response['previous'] is None + assert response['next'] is not None def test_default_ordering(self): response = self.get_topics_list(data={'course_id': str(self.test_course_1.id)}) - self.assertEqual(response['sort_order'], 'name') + assert response['sort_order'] == 'name' def test_team_count(self): """Test that team_count is included for each topic""" @@ -1864,11 +1840,11 @@ class TestListTopicsAPI(TeamAPITestCase): user='student_enrolled' ) for topic in response['results']: - self.assertIn('team_count', topic) + assert 'team_count' in topic if topic['id'] in ('topic_0', 'topic_1', 'topic_2'): - self.assertEqual(topic['team_count'], 1) + assert topic['team_count'] == 1 else: - self.assertEqual(topic['team_count'], 0) + assert topic['team_count'] == 0 @ddt.unpack @ddt.data( @@ -1892,7 +1868,7 @@ class TestListTopicsAPI(TeamAPITestCase): private_teamsets_returned = [ topic['name'] for topic in topics['results'] if topic['type'] == 'private_managed' ] - self.assertEqual(len(private_teamsets_returned), expected_private_teamsets) + assert len(private_teamsets_returned) == expected_private_teamsets @ddt.unpack @ddt.data( @@ -1909,7 +1885,7 @@ class TestListTopicsAPI(TeamAPITestCase): user=requesting_user ) private_teamset_1 = [topic for topic in topics['results'] if topic['name'] == 'private_topic_1_name'][0] - self.assertEqual(private_teamset_1['team_count'], expected_team_count) + assert private_teamset_1['team_count'] == expected_team_count @ddt.ddt @@ -1930,7 +1906,7 @@ class TestDetailTopicAPI(TeamAPITestCase): topic = self.get_topic_detail('topic_0', self.test_course_1.id, status, user=user) if status == 200: for field in ('id', 'name', 'description'): - self.assertIn(field, topic) + assert field in topic @ddt.data('A+BOGUS+COURSE', 'A/BOGUS/COURSE') def test_invalid_course_id(self, course_id): @@ -1945,13 +1921,13 @@ class TestDetailTopicAPI(TeamAPITestCase): def test_team_count(self): """Test that team_count is included with a topic""" topic = self.get_topic_detail(topic_id='topic_0', course_id=self.test_course_1.id) - self.assertEqual(topic['team_count'], 1) + assert topic['team_count'] == 1 topic = self.get_topic_detail(topic_id='topic_1', course_id=self.test_course_1.id) - self.assertEqual(topic['team_count'], 1) + assert topic['team_count'] == 1 topic = self.get_topic_detail(topic_id='topic_2', course_id=self.test_course_1.id) - self.assertEqual(topic['team_count'], 1) + assert topic['team_count'] == 1 topic = self.get_topic_detail(topic_id='topic_3', course_id=self.test_course_1.id) - self.assertEqual(topic['team_count'], 0) + assert topic['team_count'] == 0 @ddt.unpack @ddt.data( @@ -1976,8 +1952,8 @@ class TestDetailTopicAPI(TeamAPITestCase): user=requesting_user ) if expected_status == 200: - self.assertEqual(topic['name'], 'private_topic_1_name') - self.assertEqual(topic['team_count'], expected_team_count) + assert topic['name'] == 'private_topic_1_name' + assert topic['team_count'] == expected_team_count @ddt.ddt @@ -1998,8 +1974,8 @@ class TestListMembershipAPI(TeamAPITestCase): def test_access(self, user, status): membership = self.get_membership_list(status, {'team_id': self.solar_team.team_id}, user=user) if status == 200: - self.assertEqual(membership['count'], 1) - self.assertEqual(membership['results'][0]['user']['username'], self.users['student_enrolled'].username) + assert membership['count'] == 1 + assert membership['results'][0]['user']['username'] == self.users['student_enrolled'].username @ddt.data( (None, 401, False), @@ -2016,10 +1992,10 @@ class TestListMembershipAPI(TeamAPITestCase): membership = self.get_membership_list(status, {'username': self.users['student_enrolled'].username}, user=user) if status == 200: if has_content: - self.assertEqual(membership['count'], 1) - self.assertEqual(membership['results'][0]['team']['team_id'], self.solar_team.team_id) + assert membership['count'] == 1 + assert membership['results'][0]['team']['team_id'] == self.solar_team.team_id else: - self.assertEqual(membership['count'], 0) + assert membership['count'] == 0 @ddt.data( ('student_masters', True), @@ -2042,10 +2018,10 @@ class TestListMembershipAPI(TeamAPITestCase): """ membership = self.get_membership_list(200, {'username': 'student_masters'}, user=user) if can_see_bubble_team: - self.assertEqual(membership['count'], 1) - self.assertEqual(membership['results'][0]['team']['team_id'], self.masters_only_team.team_id) + assert membership['count'] == 1 + assert membership['results'][0]['team']['team_id'] == self.masters_only_team.team_id else: - self.assertEqual(membership['count'], 0) + assert membership['count'] == 0 @ddt.unpack @ddt.data( @@ -2070,14 +2046,14 @@ class TestListMembershipAPI(TeamAPITestCase): memberships = self.get_membership_list(200, {'username': 'student_on_team_1_private_set_1'}, user=user) team_ids = [membership['team']['team_id'] for membership in memberships['results']] if can_see_private_team: - self.assertEqual(len(team_ids), 2) - self.assertIn(self.team_1_in_private_teamset_1.team_id, team_ids) - self.assertIn(self.masters_only_team.team_id, team_ids) + assert len(team_ids) == 2 + assert self.team_1_in_private_teamset_1.team_id in team_ids + assert self.masters_only_team.team_id in team_ids elif can_see_any_teams: - self.assertEqual(len(team_ids), 1) - self.assertIn(self.masters_only_team.team_id, team_ids) + assert len(team_ids) == 1 + assert self.masters_only_team.team_id in team_ids else: - self.assertEqual(len(team_ids), 0) + assert len(team_ids) == 0 @ddt.unpack @ddt.data( @@ -2104,7 +2080,7 @@ class TestListMembershipAPI(TeamAPITestCase): ) if expected_response == 200: users = [membership['user']['username'] for membership in memberships['results']] - self.assertEqual(users, ['student_on_team_1_private_set_1']) + assert users == ['student_on_team_1_private_set_1'] @ddt.data( ('student_enrolled_both_courses_other_team', 'TestX/TS101/Test_Course', 200, 'Nuclear Team'), @@ -2123,8 +2099,8 @@ class TestListMembershipAPI(TeamAPITestCase): user=user ) if status == 200: - self.assertEqual(membership['count'], 1) - self.assertEqual(membership['results'][0]['team']['team_id'], self.test_team_name_id_map[team_name].team_id) + assert membership['count'] == 1 + assert membership['results'][0]['team']['team_id'] == self.test_team_name_id_map[team_name].team_id @ddt.data( ('TestX/TS101/Test_Course', 200), @@ -2134,12 +2110,12 @@ class TestListMembershipAPI(TeamAPITestCase): def test_course_filter_with_team_id(self, course_id, status): membership = self.get_membership_list(status, {'team_id': self.solar_team.team_id, 'course_id': course_id}) if status == 200: - self.assertEqual(membership['count'], 1) - self.assertEqual(membership['results'][0]['team']['team_id'], self.solar_team.team_id) + assert membership['count'] == 1 + assert membership['results'][0]['team']['team_id'] == self.solar_team.team_id def test_nonexistent_user(self): response = self.get_membership_list(200, {'username': 'this-user-will-not-exist-&&&&#!^'}) - self.assertEqual(response['count'], 0) + assert response['count'] == 0 def test_bad_course_id(self): self.get_membership_list(404, {'course_id': 'no_such_course'}) @@ -2179,11 +2155,11 @@ class TestListMembershipAPI(TeamAPITestCase): filters['username'] = other_username result = self.get_membership_list(200, filters) - self.assertEqual(result['count'], 1 if filter_username else 2) + assert result['count'] == (1 if filter_username else 2) usernames = {enrollment['user']['username'] for enrollment in result['results']} - self.assertIn(other_username, usernames) + assert other_username in usernames if not filter_username: - self.assertIn('student_enrolled', usernames) + assert 'student_enrolled' in usernames def test_filter_teamset_team_id(self): # team_id and teamset_id are mutually exclusive @@ -2246,7 +2222,7 @@ class TestListMembershipAPI(TeamAPITestCase): ) if expected_response == 200: returned_users = {membership['user']['username'] for membership in memberships['results']} - self.assertEqual(returned_users, expected_users) + assert returned_users == expected_users @ddt.unpack @ddt.data( @@ -2280,7 +2256,7 @@ class TestListMembershipAPI(TeamAPITestCase): ) def test_access_filter_teamset__open_teamset(self, user, expected_response, expected_usernames): # topic_3 has no teams - self.assertFalse(CourseTeam.objects.filter(topic_id='topic_3').exists()) + assert not CourseTeam.objects.filter(topic_id='topic_3').exists() memberships = self.get_membership_list( expected_response, { @@ -2290,10 +2266,10 @@ class TestListMembershipAPI(TeamAPITestCase): user=user ) if expected_response == 200: - self.assertEqual(memberships['count'], 0) + assert memberships['count'] == 0 # topic_0 has teams - self.assertTrue(CourseTeam.objects.filter(topic_id='topic_0').exists()) + assert CourseTeam.objects.filter(topic_id='topic_0').exists() memberships = self.get_membership_list( expected_response, { @@ -2304,7 +2280,7 @@ class TestListMembershipAPI(TeamAPITestCase): ) if expected_response == 200: returned_users = {membership['user']['username'] for membership in memberships['results']} - self.assertEqual(returned_users, expected_usernames) + assert returned_users == expected_usernames @ddt.ddt @@ -2333,10 +2309,10 @@ class TestCreateMembershipAPI(EventTestMixin, TeamAPITestCase): user=user ) if status == 200: - self.assertEqual(membership['user']['username'], self.users['student_enrolled_not_on_team'].username) - self.assertEqual(membership['team']['team_id'], self.solar_team.team_id) + assert membership['user']['username'] == self.users['student_enrolled_not_on_team'].username + assert membership['team']['team_id'] == self.solar_team.team_id memberships = self.get_membership_list(200, {'team_id': self.solar_team.team_id}) - self.assertEqual(memberships['count'], 2) + assert memberships['count'] == 2 add_method = 'joined_from_team_view' if user == 'student_enrolled_not_on_team' else 'added_by_another_user' @@ -2351,11 +2327,11 @@ class TestCreateMembershipAPI(EventTestMixin, TeamAPITestCase): def test_no_username(self): response = self.post_create_membership(400, {'team_id': self.solar_team.team_id}) - self.assertIn('username', json.loads(response.content.decode('utf-8'))['field_errors']) + assert 'username' in json.loads(response.content.decode('utf-8'))['field_errors'] def test_no_team(self): response = self.post_create_membership(400, {'username': self.users['student_enrolled_not_on_team'].username}) - self.assertIn('team_id', json.loads(response.content.decode('utf-8'))['field_errors']) + assert 'team_id' in json.loads(response.content.decode('utf-8'))['field_errors'] @ddt.data('staff', 'student_enrolled') def test_bad_team(self, user): @@ -2408,7 +2384,7 @@ class TestCreateMembershipAPI(EventTestMixin, TeamAPITestCase): user=user ) if expected_message: - self.assertIn(expected_message, json.loads(response.content.decode('utf-8'))['developer_message']) + assert expected_message in json.loads(response.content.decode('utf-8'))['developer_message'] @ddt.unpack @ddt.data( @@ -2440,7 +2416,7 @@ class TestCreateMembershipAPI(EventTestMixin, TeamAPITestCase): self.build_membership_data('student_enrolled', self.solar_team), user=user ) - self.assertIn('already a member', json.loads(response.content.decode('utf-8'))['developer_message']) + assert 'already a member' in json.loads(response.content.decode('utf-8'))['developer_message'] def test_join_second_team_in_course(self): """ @@ -2460,7 +2436,7 @@ class TestCreateMembershipAPI(EventTestMixin, TeamAPITestCase): self.build_membership_data('student_unenrolled', self.solar_team), user=user ) - self.assertIn('not enrolled', json.loads(response.content.decode('utf-8'))['developer_message']) + assert 'not enrolled' in json.loads(response.content.decode('utf-8'))['developer_message'] def test_over_max_team_size_in_course_2(self): response = self.post_create_membership( @@ -2468,7 +2444,7 @@ class TestCreateMembershipAPI(EventTestMixin, TeamAPITestCase): self.build_membership_data('student_enrolled_other_course_not_on_team', self.another_team), user='student_enrolled_other_course_not_on_team' ) - self.assertIn('full', json.loads(response.content.decode('utf-8'))['developer_message']) + assert 'full' in json.loads(response.content.decode('utf-8'))['developer_message'] @ddt.ddt @@ -2823,7 +2799,7 @@ class TestBulkMembershipManagement(TeamAPITestCase): user='staff' ) response_text = json.loads(response.content.decode('utf-8')) - self.assertEqual(response_text['message'], '1 learners were affected.') + assert response_text['message'] == '1 learners were affected.' def test_upload_invalid_teamset(self): self.create_and_enroll_student(username='a_user') @@ -2863,12 +2839,9 @@ class TestBulkMembershipManagement(TeamAPITestCase): self.client.login(username=self.users['course_staff'].username, password=self.users['course_staff'].password) response = self.make_call(reverse('team_membership_bulk_management', args=[self.good_course_id]), 201, method='post', data={'csv': csv_file}, user='staff') - self.assertEqual( - CourseTeam.objects.filter(name='team 2', course_id=self.test_course_1.id).count(), - 1 - ) + assert CourseTeam.objects.filter(name='team 2', course_id=self.test_course_1.id).count() == 1 response_text = json.loads(response.content.decode('utf-8')) - self.assertEqual(response_text['message'], '3 learners were affected.') + assert response_text['message'] == '3 learners were affected.' def test_upload_non_existing_user(self): csv_content = 'user,mode,topic_0' + '\n' @@ -2973,7 +2946,7 @@ class TestBulkMembershipManagement(TeamAPITestCase): ) response_text = json.loads(response.content.decode('utf-8')) expected_error = 'Team team wind power cannot have Master’s track users mixed with users in other tracks.' - self.assertEqual(response_text['errors'][0], expected_error) + assert response_text['errors'][0] == expected_error def test_upload_learners_exceed_max_team_size(self): csv_content = 'user,mode,topic_0,topic_1' + '\n' @@ -2993,20 +2966,14 @@ class TestBulkMembershipManagement(TeamAPITestCase): data={'csv': csv_file}, user='staff' ) response_text = json.loads(response.content.decode('utf-8')) - self.assertEqual( - response_text['errors'][0], - 'New membership for team {} would exceed max size of {}.'.format(team1, 3) - ) + assert response_text['errors'][0] == 'New membership for team {} would exceed max size of {}.'.format(team1, 3) def test_deletion_via_upload_csv(self): # create a team membership that will be used further down self.test_create_membership_via_upload() username = 'a_user' topic_0_id = 'topic_0' - self.assertTrue(CourseTeamMembership.objects.filter( - user_id=self.users[username].id, - team__topic_id=topic_0_id - ).exists()) + assert CourseTeamMembership.objects.filter(user_id=self.users[username].id, team__topic_id=topic_0_id).exists() csv_content = 'user,mode,{},topic_1'.format(topic_0_id) + '\n' csv_content += '{},audit'.format(username) @@ -3019,10 +2986,8 @@ class TestBulkMembershipManagement(TeamAPITestCase): data={'csv': csv_file}, user='staff' ) - self.assertFalse(CourseTeamMembership.objects.filter( - user_id=self.users[username].id, - team__topic_id=topic_0_id - ).exists()) + assert not CourseTeamMembership.objects\ + .filter(user_id=self.users[username].id, team__topic_id=topic_0_id).exists() def test_reassignment_via_upload_csv(self): # create a team membership that will be used further down @@ -3031,11 +2996,8 @@ class TestBulkMembershipManagement(TeamAPITestCase): topic_0_id = 'topic_0' nuclear_team_name = 'team nuclear power' windpower_team_name = 'team wind power' - self.assertTrue(CourseTeamMembership.objects.filter( - user_id=self.users[username].id, - team__topic_id=topic_0_id, - team__name=windpower_team_name - ).exists()) + assert CourseTeamMembership.objects\ + .filter(user_id=self.users[username].id, team__topic_id=topic_0_id, team__name=windpower_team_name).exists() csv_content = 'user,mode,{}'.format(topic_0_id) + '\n' csv_content += '{0},audit,{1}'.format(username, nuclear_team_name) csv_file = SimpleUploadedFile('test_file.csv', csv_content.encode('utf8'), content_type='text/csv') @@ -3047,16 +3009,13 @@ class TestBulkMembershipManagement(TeamAPITestCase): data={'csv': csv_file}, user='staff' ) - self.assertFalse(CourseTeamMembership.objects.filter( - user_id=self.users[username].id, - team__topic_id=topic_0_id, - team__name=windpower_team_name - ).exists()) - self.assertTrue(CourseTeamMembership.objects.filter( - user_id=self.users[username].id, - team__topic_id=topic_0_id, - team__name=nuclear_team_name - ).exists()) + assert not CourseTeamMembership.objects.filter(user_id=self.users[username].id, + team__topic_id=topic_0_id, + team__name=windpower_team_name).exists() + + assert CourseTeamMembership.objects.filter(user_id=self.users[username].id, + team__topic_id=topic_0_id, + team__name=nuclear_team_name).exists() def test_upload_file_not_changed_csv(self): # create a team membership that will be used further down @@ -3064,10 +3023,7 @@ class TestBulkMembershipManagement(TeamAPITestCase): username = 'a_user' topic_0_id = 'topic_0' nuclear_team_name = 'team wind power' - self.assertEqual(len(CourseTeamMembership.objects.filter( - user_id=self.users[username].id, - team__topic_id=topic_0_id - )), 1) + assert len(CourseTeamMembership.objects.filter(user_id=self.users[username].id, team__topic_id=topic_0_id)) == 1 csv_content = 'user,mode,{}'.format(topic_0_id) + '\n' csv_content += '{0},audit,{1}'.format(username, nuclear_team_name) csv_file = SimpleUploadedFile('test_file.csv', csv_content.encode('utf8'), content_type='text/csv') @@ -3080,14 +3036,10 @@ class TestBulkMembershipManagement(TeamAPITestCase): data={'csv': csv_file}, user='staff' ) - self.assertEqual(len(CourseTeamMembership.objects.filter( - user_id=self.users[username].id, - team__name=nuclear_team_name - )), 1) - self.assertTrue(CourseTeamMembership.objects.filter( - user_id=self.users[username].id, - team__name=nuclear_team_name - ).exists()) + assert len(CourseTeamMembership.objects.filter(user_id=self.users[username].id, + team__name=nuclear_team_name)) == 1 + assert CourseTeamMembership.objects.filter(user_id=self.users[username].id, + team__name=nuclear_team_name).exists() def test_create_membership_via_upload_using_external_key(self): self.create_and_enroll_student(username='a_user', external_key='a_user_external_key') @@ -3103,7 +3055,7 @@ class TestBulkMembershipManagement(TeamAPITestCase): user='staff' ) response_text = json.loads(response.content.decode('utf-8')) - self.assertEqual(response_text['message'], '1 learners were affected.') + assert response_text['message'] == '1 learners were affected.' def test_create_membership_via_upload_using_external_key_invalid(self): self.create_and_enroll_student(username='a_user', external_key='a_user_external_key') @@ -3119,10 +3071,7 @@ class TestBulkMembershipManagement(TeamAPITestCase): user='staff' ) response_text = json.loads(response.content.decode('utf-8')) - self.assertEqual( - response_text['errors'], - ['User name/email/external key: a_user_external_key_invalid does not exist.'] - ) + assert response_text['errors'] == ['User name/email/external key: a_user_external_key_invalid does not exist.'] def test_upload_non_ascii(self): csv_content = 'user,mode,topic_0' + '\n' @@ -3139,14 +3088,8 @@ class TestBulkMembershipManagement(TeamAPITestCase): user='staff' ) team = self.users[user_name].teams.first() - self.assertEqual( - team.name, - team_name - ) - self.assertEqual( - [user.username for user in team.users.all()], - [user_name] - ) + assert team.name == team_name + assert [user.username for user in team.users.all()] == [user_name] def test_upload_assign_masters_learner_to_non_protected_team(self): """ @@ -3171,4 +3114,4 @@ class TestBulkMembershipManagement(TeamAPITestCase): expected_message = 'Team {} cannot have Master’s track users mixed with users in other tracks.'.format( team.name ) - self.assertEqual(response_text['errors'][0], expected_message) + assert response_text['errors'][0] == expected_message diff --git a/lms/djangoapps/verify_student/management/commands/tests/test_backfill_sso_verifications_for_old_account_links.py b/lms/djangoapps/verify_student/management/commands/tests/test_backfill_sso_verifications_for_old_account_links.py index f84ad100dea..57d163c6efe 100644 --- a/lms/djangoapps/verify_student/management/commands/tests/test_backfill_sso_verifications_for_old_account_links.py +++ b/lms/djangoapps/verify_student/management/commands/tests/test_backfill_sso_verifications_for_old_account_links.py @@ -3,7 +3,7 @@ Tests for management command backfill_sso_verifications_for_old_account_links """ from mock import patch - +import pytest from django.core.management import call_command from django.core.management.base import CommandError @@ -33,18 +33,18 @@ class TestBackfillSSOVerificationsCommand(TestCase): self.user1 = self.user_social_auth1.user def test_fails_without_required_param(self): - with self.assertRaises(CommandError): + with pytest.raises(CommandError): call_command('backfill_sso_verifications_for_old_account_links') def test_fails_without_named_provider_config(self): - with self.assertRaises(CommandError): + with pytest.raises(CommandError): call_command('backfill_sso_verifications_for_old_account_links', '--provider-slug', 'gatech') def test_sso_updated_single_user(self): - self.assertTrue(SSOVerification.objects.count() == 0) # lint-amnesty, pylint: disable=wrong-assert-type + assert SSOVerification.objects.count() == 0 call_command('backfill_sso_verifications_for_old_account_links', '--provider-slug', self.provider.provider_id) - self.assertTrue(SSOVerification.objects.count() > 0) # lint-amnesty, pylint: disable=wrong-assert-type - self.assertEqual(SSOVerification.objects.get().user.id, self.user1.id) + assert SSOVerification.objects.count() > 0 + assert SSOVerification.objects.get().user.id == self.user1.id def test_performance(self): # TODO @@ -55,7 +55,7 @@ class TestBackfillSSOVerificationsCommand(TestCase): def test_signal_called(self): with patch('openedx.core.djangoapps.signals.signals.LEARNER_NOW_VERIFIED.send_robust') as mock_signal: call_command('backfill_sso_verifications_for_old_account_links', '--provider-slug', self.provider.provider_id) # lint-amnesty, pylint: disable=line-too-long - self.assertEqual(mock_signal.call_count, 1) + assert mock_signal.call_count == 1 def test_fine_with_multiple_verification_records(self): """ @@ -69,6 +69,6 @@ class TestBackfillSSOVerificationsCommand(TestCase): status='approved', user=self.user1, ) - self.assertEqual(SSOVerification.objects.count(), 2) + assert SSOVerification.objects.count() == 2 call_command('backfill_sso_verifications_for_old_account_links', '--provider-slug', self.provider.provider_id) - self.assertEqual(SSOVerification.objects.count(), 2) + assert SSOVerification.objects.count() == 2 diff --git a/lms/djangoapps/verify_student/management/commands/tests/test_manual_verify_student.py b/lms/djangoapps/verify_student/management/commands/tests/test_manual_verify_student.py index d178b78f8f2..f3a1ee9229a 100644 --- a/lms/djangoapps/verify_student/management/commands/tests/test_manual_verify_student.py +++ b/lms/djangoapps/verify_student/management/commands/tests/test_manual_verify_student.py @@ -7,7 +7,7 @@ Tests for django admin commands in the verify_student module import logging import os import tempfile - +import pytest import six from django.core.management import CommandError, call_command from django.test import TestCase @@ -50,11 +50,11 @@ class TestVerifyStudentCommand(TestCase): """ Tests that the manual_verifications management command executes successfully """ - self.assertEqual(ManualVerification.objects.filter(status='approved').count(), 0) + assert ManualVerification.objects.filter(status='approved').count() == 0 call_command('manual_verifications', '--email-ids-file', self.tmp_file_path) - self.assertEqual(ManualVerification.objects.filter(status='approved').count(), 3) + assert ManualVerification.objects.filter(status='approved').count() == 3 def test_manual_verifications_created_date(self): """ @@ -113,5 +113,5 @@ class TestVerifyStudentCommand(TestCase): """ Verify command raises the CommandError for invalid file path. """ - with self.assertRaises(CommandError): + with pytest.raises(CommandError): call_command('manual_verifications', '--email-ids-file', u'invalid/email_id/file/path') diff --git a/lms/djangoapps/verify_student/management/commands/tests/test_populate_expiry_date.py b/lms/djangoapps/verify_student/management/commands/tests/test_populate_expiry_date.py index 35445b5cbca..5e4b5954a85 100644 --- a/lms/djangoapps/verify_student/management/commands/tests/test_populate_expiry_date.py +++ b/lms/djangoapps/verify_student/management/commands/tests/test_populate_expiry_date.py @@ -50,7 +50,7 @@ class TestPopulateExpiryDate(MockS3BotoMixin, TestCase): # Check that the expiry_date for approved verification is not changed when it is already present verification_expiry_date = SoftwareSecurePhotoVerification.objects.get(pk=verification.pk).expiry_date - self.assertEqual(verification_expiry_date, expiry_date) + assert verification_expiry_date == expiry_date def test_recent_approved_verification(self): """ @@ -74,7 +74,7 @@ class TestPopulateExpiryDate(MockS3BotoMixin, TestCase): # Check that the expiry_date date set for verification is not for the outdated approved verification expiry_date = SoftwareSecurePhotoVerification.objects.get(pk=outdated_verification.pk).expiry_date - self.assertIsNone(expiry_date) + assert expiry_date is None def test_approved_verification_expiry_date(self): """ @@ -102,7 +102,7 @@ class TestPopulateExpiryDate(MockS3BotoMixin, TestCase): # Confirm that expiry_date set for approved verification is correct approved_verification = SoftwareSecurePhotoVerification.objects.get(pk=approved_verification.pk) - self.assertEqual(approved_verification.expiry_date, expected_date) + assert approved_verification.expiry_date == expected_date def test_no_approved_verification_found(self): """ diff --git a/lms/djangoapps/verify_student/management/commands/tests/test_send_verification_expiry_email.py b/lms/djangoapps/verify_student/management/commands/tests/test_send_verification_expiry_email.py index 7f0e3772216..7a6440d543d 100644 --- a/lms/djangoapps/verify_student/management/commands/tests/test_send_verification_expiry_email.py +++ b/lms/djangoapps/verify_student/management/commands/tests/test_send_verification_expiry_email.py @@ -76,11 +76,11 @@ class TestSendVerificationExpiryEmail(MockS3BotoMixin, TestCase): call_command('send_verification_expiry_email') # Check that only one email is sent - self.assertEqual(len(mail.outbox), 1) + assert len(mail.outbox) == 1 # Verify that the email is not sent to the out of range verification expiry_email_date = SoftwareSecurePhotoVerification.objects.get(pk=verification.pk).expiry_email_date - self.assertIsNone(expiry_email_date) + assert expiry_email_date is None def test_expiry_email_date_range(self): """ @@ -99,7 +99,7 @@ class TestSendVerificationExpiryEmail(MockS3BotoMixin, TestCase): # Check that email is sent even if the verification is not in expiration_date range but matches # the criteria to resend email - self.assertEqual(len(mail.outbox), 1) + assert len(mail.outbox) == 1 def test_most_recent_verification(self): """ @@ -116,7 +116,7 @@ class TestSendVerificationExpiryEmail(MockS3BotoMixin, TestCase): # Check that the expiry_email_date is not set for the outdated verification expiry_email_date = SoftwareSecurePhotoVerification.objects.get(pk=outdated_verification.pk).expiry_email_date - self.assertIsNone(expiry_email_date) + assert expiry_email_date is None def test_send_verification_expiry_email(self): """ @@ -132,8 +132,8 @@ class TestSendVerificationExpiryEmail(MockS3BotoMixin, TestCase): expected_date = now() attempt = SoftwareSecurePhotoVerification.objects.get(user_id=verification.user_id) - self.assertEqual(attempt.expiry_email_date.date(), expected_date.date()) - self.assertEqual(len(mail.outbox), 1) + assert attempt.expiry_email_date.date() == expected_date.date() + assert len(mail.outbox) == 1 def test_verification_expiry_email_not_sent_valid_ssov(self): """ @@ -145,7 +145,7 @@ class TestSendVerificationExpiryEmail(MockS3BotoMixin, TestCase): SSOVerification.objects.create(user=expired_ssp_verification.user, status='approved') call_command('send_verification_expiry_email') - self.assertEqual(len(mail.outbox), 0) + assert len(mail.outbox) == 0 def test_verification_expiry_email_not_sent_valid_manual_verification(self): """ @@ -157,7 +157,7 @@ class TestSendVerificationExpiryEmail(MockS3BotoMixin, TestCase): ManualVerification.objects.create(user=expired_ssp_verification.user, status='approved') call_command('send_verification_expiry_email') - self.assertEqual(len(mail.outbox), 0) + assert len(mail.outbox) == 0 def test_email_already_sent(self): """ @@ -173,7 +173,7 @@ class TestSendVerificationExpiryEmail(MockS3BotoMixin, TestCase): call_command('send_verification_expiry_email') - self.assertEqual(len(mail.outbox), 0) + assert len(mail.outbox) == 0 def test_no_verification_found(self): """ @@ -214,7 +214,7 @@ class TestSendVerificationExpiryEmail(MockS3BotoMixin, TestCase): u"This was a dry run, no email was sent. For the actual run email would have been sent " u"to {} learner(s)".format(count) )) - self.assertEqual(len(mail.outbox), 0) + assert len(mail.outbox) == 0 def test_not_enrolled_in_verified_course(self): """ @@ -235,8 +235,8 @@ class TestSendVerificationExpiryEmail(MockS3BotoMixin, TestCase): # check that after sending the default number of emails, the expiry_email_date is set to none for a # user who is not enrolled in verified track attempt = SoftwareSecurePhotoVerification.objects.get(pk=verification.id) - self.assertEqual(len(mail.outbox), 1) - self.assertIsNone(attempt.expiry_email_date) + assert len(mail.outbox) == 1 + assert attempt.expiry_email_date is None def test_number_of_emails_sent(self): """ @@ -264,8 +264,8 @@ class TestSendVerificationExpiryEmail(MockS3BotoMixin, TestCase): break # expiry_email_date set to None means it no longer will be filtered hence no emails will be sent in future - self.assertIsNone(SoftwareSecurePhotoVerification.objects.get(pk=verification.id).expiry_email_date) - self.assertEqual(len(mail.outbox), self.default_no_of_emails) + assert SoftwareSecurePhotoVerification.objects.get(pk=verification.id).expiry_email_date is None + assert len(mail.outbox) == self.default_no_of_emails @override_settings(VERIFICATION_EXPIRY_EMAIL={'RESEND_DAYS': 15, 'DAYS_RANGE': 1, 'DEFAULT_EMAILS': 0}) def test_command_error(self): @@ -299,6 +299,6 @@ class TestSendVerificationExpiryEmail(MockS3BotoMixin, TestCase): for verification in verifications: verification.refresh_from_db() - self.assertIsNone(verifications[0].expiry_email_date) - self.assertIsNotNone(verifications[1].expiry_email_date) - self.assertEqual(mock_ace.send.call_count, 2) + assert verifications[0].expiry_email_date is None + assert verifications[1].expiry_email_date is not None + assert mock_ace.send.call_count == 2 diff --git a/lms/djangoapps/verify_student/management/commands/tests/test_update_expiration_date.py b/lms/djangoapps/verify_student/management/commands/tests/test_update_expiration_date.py index 329d8946347..be2c41c5a52 100644 --- a/lms/djangoapps/verify_student/management/commands/tests/test_update_expiration_date.py +++ b/lms/djangoapps/verify_student/management/commands/tests/test_update_expiration_date.py @@ -46,7 +46,7 @@ class TestPopulateExpiryationDate(MockS3BotoMixin, TestCase): call_command('update_expiration_date') # Check that the `expiration_date` is not changed expiration_date = SoftwareSecurePhotoVerification.objects.get(pk=verification.pk).expiration_date - self.assertEqual(expiration_date, expected_date) + assert expiration_date == expected_date def test_expiration_date_updated(self): """ @@ -64,9 +64,9 @@ class TestPopulateExpiryationDate(MockS3BotoMixin, TestCase): call_command('update_expiration_date') updated_verification = SoftwareSecurePhotoVerification.objects.get(pk=verification.pk) # Check that the `expiration_date` is updated - self.assertEqual(updated_verification.expiration_date, expected_date) + assert updated_verification.expiration_date == expected_date # Check that the `expiry_date` is set to NULL - self.assertEqual(updated_verification.expiry_date, None) + assert updated_verification.expiry_date is None def test_expiration_date_updated_multiple_records(self): """ @@ -87,9 +87,9 @@ class TestPopulateExpiryationDate(MockS3BotoMixin, TestCase): expected_date = updated_verification.created_at + timedelta( days=settings.VERIFY_STUDENT["DAYS_GOOD_FOR"]) # Check that the `expiration_date` is updated - self.assertEqual(updated_verification.expiration_date, expected_date) + assert updated_verification.expiration_date == expected_date # Check that the `expiry_date` is set to NULL - self.assertEqual(updated_verification.expiry_date, None) + assert updated_verification.expiry_date is None def test_no_approved_verification_found(self): """ diff --git a/lms/djangoapps/verify_student/management/commands/tests/test_verify_student.py b/lms/djangoapps/verify_student/management/commands/tests/test_verify_student.py index 84a902118c9..2f74127aa8e 100644 --- a/lms/djangoapps/verify_student/management/commands/tests/test_verify_student.py +++ b/lms/djangoapps/verify_student/management/commands/tests/test_verify_student.py @@ -42,8 +42,8 @@ class TestVerifyStudentCommand(MockS3BotoMixin, TestVerificationBase): self.create_upload_and_submit_attempt_for_user() # check to make sure we had two successes and two failures; otherwise we've got problems elsewhere - self.assertEqual(SoftwareSecurePhotoVerification.objects.filter(status="submitted").count(), 1) - self.assertEqual(SoftwareSecurePhotoVerification.objects.filter(status='must_retry').count(), 2) + assert SoftwareSecurePhotoVerification.objects.filter(status='submitted').count() == 1 + assert SoftwareSecurePhotoVerification.objects.filter(status='must_retry').count() == 2 with self.immediate_on_commit(): call_command('retry_failed_photo_verifications') diff --git a/lms/djangoapps/verify_student/tests/__init__.py b/lms/djangoapps/verify_student/tests/__init__.py index 0ab3ce6c2fa..ef1b27bc9f2 100644 --- a/lms/djangoapps/verify_student/tests/__init__.py +++ b/lms/djangoapps/verify_student/tests/__init__.py @@ -44,21 +44,21 @@ class TestVerificationBase(TestCase): """ # Not active before the created date before = attempt.created_at - timedelta(minutes=1) - self.assertFalse(attempt.active_at_datetime(before)) + assert not attempt.active_at_datetime(before) # Active immediately after created date after_created = attempt.created_at + timedelta(seconds=1) - self.assertTrue(attempt.active_at_datetime(after_created)) + assert attempt.active_at_datetime(after_created) # Active immediately before expiration date expiration = attempt.expiration_datetime before_expiration = expiration - timedelta(seconds=1) - self.assertTrue(attempt.active_at_datetime(before_expiration)) + assert attempt.active_at_datetime(before_expiration) # Not active after the expiration date attempt.expiration_date = now() - timedelta(days=1) attempt.save() - self.assertFalse(attempt.active_at_datetime(now())) + assert not attempt.active_at_datetime(now()) def submit_attempt(self, attempt): with self.immediate_on_commit(): diff --git a/lms/djangoapps/verify_student/tests/test_fake_software_secure.py b/lms/djangoapps/verify_student/tests/test_fake_software_secure.py index 54a61c4f73d..a4e0f7f7bc1 100644 --- a/lms/djangoapps/verify_student/tests/test_fake_software_secure.py +++ b/lms/djangoapps/verify_student/tests/test_fake_software_secure.py @@ -46,7 +46,7 @@ class SoftwareSecureFakeViewDisabledTest(SoftwareSecureFakeViewTest): '/verify_student/software-secure-fake-response' ) - self.assertEqual(response.status_code, 404) + assert response.status_code == 404 class SoftwareSecureFakeViewEnabledTest(SoftwareSecureFakeViewTest): @@ -66,7 +66,7 @@ class SoftwareSecureFakeViewEnabledTest(SoftwareSecureFakeViewTest): response = self.client.get( '/verify_student/software-secure-fake-response' ) - self.assertEqual(response.status_code, 302) + assert response.status_code == 302 def test_get_method(self): """ diff --git a/lms/djangoapps/verify_student/tests/test_integration.py b/lms/djangoapps/verify_student/tests/test_integration.py index 50ed59696b2..4595c22d440 100644 --- a/lms/djangoapps/verify_student/tests/test_integration.py +++ b/lms/djangoapps/verify_student/tests/test_integration.py @@ -57,4 +57,4 @@ class TestProfEdVerification(ModuleStoreTestCase): # For professional ed courses, expect that the student is NOT enrolled # automatically in the course. - self.assertFalse(CourseEnrollment.is_enrolled(self.user, self.course_key)) + assert not CourseEnrollment.is_enrolled(self.user, self.course_key) diff --git a/lms/djangoapps/verify_student/tests/test_models.py b/lms/djangoapps/verify_student/tests/test_models.py index 62e7432fe8a..09cdc72866e 100644 --- a/lms/djangoapps/verify_student/tests/test_models.py +++ b/lms/djangoapps/verify_student/tests/test_models.py @@ -2,7 +2,7 @@ import base64 from datetime import datetime, timedelta - +import pytest import ddt import mock import requests.exceptions @@ -110,22 +110,22 @@ class TestPhotoVerification(TestVerificationBase, MockS3BotoMixin, ModuleStoreTe """ user = UserFactory.create() attempt = SoftwareSecurePhotoVerification(user=user) - self.assertEqual(attempt.status, PhotoVerification.STATUS.created) + assert attempt.status == PhotoVerification.STATUS.created # These should all fail because we're in the wrong starting state. - self.assertRaises(VerificationException, attempt.submit) - self.assertRaises(VerificationException, attempt.approve) - self.assertRaises(VerificationException, attempt.deny) - self.assertRaises(VerificationException, attempt.mark_must_retry) - self.assertRaises(VerificationException, attempt.mark_submit) + pytest.raises(VerificationException, attempt.submit) + pytest.raises(VerificationException, attempt.approve) + pytest.raises(VerificationException, attempt.deny) + pytest.raises(VerificationException, attempt.mark_must_retry) + pytest.raises(VerificationException, attempt.mark_submit) # Now let's fill in some values so that we can pass the mark_ready() call attempt.mark_ready() - self.assertEqual(attempt.status, PhotoVerification.STATUS.ready) + assert attempt.status == PhotoVerification.STATUS.ready # ready (can't approve or deny unless it's "submitted") - self.assertRaises(VerificationException, attempt.approve) - self.assertRaises(VerificationException, attempt.deny) + pytest.raises(VerificationException, attempt.approve) + pytest.raises(VerificationException, attempt.deny) attempt.mark_must_retry() attempt.mark_submit() @@ -152,17 +152,17 @@ class TestPhotoVerification(TestVerificationBase, MockS3BotoMixin, ModuleStoreTe attempt.approve() # approved - self.assertRaises(VerificationException, attempt.submit) - self.assertRaises(VerificationException, attempt.mark_must_retry) - self.assertRaises(VerificationException, attempt.mark_submit) + pytest.raises(VerificationException, attempt.submit) + pytest.raises(VerificationException, attempt.mark_must_retry) + pytest.raises(VerificationException, attempt.mark_submit) attempt.approve() # no-op attempt.system_error("System error") # no-op, something processed it without error attempt.deny(DENY_ERROR_MSG) # denied - self.assertRaises(VerificationException, attempt.submit) - self.assertRaises(VerificationException, attempt.mark_must_retry) - self.assertRaises(VerificationException, attempt.mark_submit) + pytest.raises(VerificationException, attempt.submit) + pytest.raises(VerificationException, attempt.mark_must_retry) + pytest.raises(VerificationException, attempt.mark_submit) attempt.deny(DENY_ERROR_MSG) # no-op attempt.system_error("System error") # no-op, something processed it without error attempt.approve() @@ -183,23 +183,23 @@ class TestPhotoVerification(TestVerificationBase, MockS3BotoMixin, ModuleStoreTe user.profile.name = u"Rusty \u01B4" - self.assertEqual(u"Clyde \u01B4", attempt.name) + assert u'Clyde ƴ' == attempt.name def test_submissions(self): """Test that we set our status correctly after a submission.""" # Basic case, things go well. attempt = self.create_upload_and_submit_attempt_for_user() - self.assertEqual(attempt.status, PhotoVerification.STATUS.submitted) + assert attempt.status == PhotoVerification.STATUS.submitted # We post, but Software Secure doesn't like what we send for some reason with patch('lms.djangoapps.verify_student.tasks.requests.post', new=mock_software_secure_post_error): attempt = self.create_upload_and_submit_attempt_for_user() - self.assertEqual(attempt.status, PhotoVerification.STATUS.must_retry) + assert attempt.status == PhotoVerification.STATUS.must_retry # We try to post, but run into an error (in this case a network connection error) with patch('lms.djangoapps.verify_student.tasks.requests.post', new=mock_software_secure_post_unavailable): attempt = self.create_upload_and_submit_attempt_for_user() - self.assertEqual(attempt.status, PhotoVerification.STATUS.must_retry) + assert attempt.status == PhotoVerification.STATUS.must_retry @mock.patch.dict(settings.FEATURES, {'AUTOMATIC_VERIFY_STUDENT_IDENTITY_FOR_TESTING': True}) def test_submission_while_testing_flag_is_true(self): @@ -208,7 +208,7 @@ class TestPhotoVerification(TestVerificationBase, MockS3BotoMixin, ModuleStoreTe is enabled. """ attempt = self.create_upload_and_submit_attempt_for_user() - self.assertEqual(attempt.photo_id_key, "fake-photo-id-key") + assert attempt.photo_id_key == 'fake-photo-id-key' # pylint: disable=line-too-long def test_parse_error_msg_success(self): @@ -217,10 +217,7 @@ class TestPhotoVerification(TestVerificationBase, MockS3BotoMixin, ModuleStoreTe attempt.status = PhotoVerification.STATUS.denied attempt.error_msg = '[{"userPhotoReasons": ["Face out of view"]}, {"photoIdReasons": ["Photo hidden/No photo", "ID name not provided"]}]' parsed_error_msg = attempt.parsed_error_msg() - self.assertEqual( - sorted(parsed_error_msg), - sorted(['id_image_missing_name', 'user_image_not_clear', 'id_image_not_clear']) - ) + assert sorted(parsed_error_msg) == sorted(['id_image_missing_name', 'user_image_not_clear', 'id_image_not_clear']) @ddt.data( 'Not Provided', @@ -230,7 +227,7 @@ class TestPhotoVerification(TestVerificationBase, MockS3BotoMixin, ModuleStoreTe def test_parse_error_msg_failure(self, msg): user = UserFactory.create() attempt = SoftwareSecurePhotoVerification.objects.create(user=user, status='denied', error_msg=msg) - self.assertEqual(attempt.parsed_error_msg(), []) + assert attempt.parsed_error_msg() == [] def test_active_at_datetime(self): user = UserFactory.create() @@ -246,7 +243,7 @@ class TestPhotoVerification(TestVerificationBase, MockS3BotoMixin, ModuleStoreTe # No initial verification for the user result = SoftwareSecurePhotoVerification.get_initial_verification(user=user) - self.assertIs(result, None) + assert result is None # Make an initial verification with 'photo_id_key' attempt = SoftwareSecurePhotoVerification(user=user, photo_id_key="dummy_photo_id_key") @@ -256,7 +253,7 @@ class TestPhotoVerification(TestVerificationBase, MockS3BotoMixin, ModuleStoreTe # Check that method 'get_initial_verification' returns the correct # initial verification attempt first_result = SoftwareSecurePhotoVerification.get_initial_verification(user=user) - self.assertIsNotNone(first_result) + assert first_result is not None # Now create a second verification without 'photo_id_key' attempt = SoftwareSecurePhotoVerification(user=user) @@ -266,14 +263,14 @@ class TestPhotoVerification(TestVerificationBase, MockS3BotoMixin, ModuleStoreTe # Test method 'get_initial_verification' still returns the correct # initial verification attempt which have 'photo_id_key' set second_result = SoftwareSecurePhotoVerification.get_initial_verification(user=user) - self.assertIsNotNone(second_result) - self.assertEqual(second_result, first_result) + assert second_result is not None + assert second_result == first_result # Test method 'get_initial_verification' returns None after expiration expired_future = now() + timedelta(days=(FAKE_SETTINGS['DAYS_GOOD_FOR'] + 1)) with freeze_time(expired_future): third_result = SoftwareSecurePhotoVerification.get_initial_verification(user) - self.assertIsNone(third_result) + assert third_result is None # Test method 'get_initial_verification' returns correct attempt after system expiration, # but within earliest allowed override. @@ -281,8 +278,8 @@ class TestPhotoVerification(TestVerificationBase, MockS3BotoMixin, ModuleStoreTe earliest_allowed = now() - timedelta(days=1) with freeze_time(expired_future): fourth_result = SoftwareSecurePhotoVerification.get_initial_verification(user, earliest_allowed) - self.assertIsNotNone(fourth_result) - self.assertEqual(fourth_result, first_result) + assert fourth_result is not None + assert fourth_result == first_result def test_retire_user(self): """ @@ -301,20 +298,20 @@ class TestPhotoVerification(TestVerificationBase, MockS3BotoMixin, ModuleStoreTe attempt.approve() # Validate data before retirement - self.assertEqual(attempt.name, user.profile.name) - self.assertEqual(attempt.photo_id_image_url, 'https://example.com/test/image/img.jpg') - self.assertEqual(attempt.face_image_url, 'https://example.com/test/face/img.jpg') - self.assertEqual(attempt.photo_id_key, 'there_was_an_attempt') + assert attempt.name == user.profile.name + assert attempt.photo_id_image_url == 'https://example.com/test/image/img.jpg' + assert attempt.face_image_url == 'https://example.com/test/face/img.jpg' + assert attempt.photo_id_key == 'there_was_an_attempt' # Retire User attempt_again = SoftwareSecurePhotoVerification(user=user) - self.assertTrue(attempt_again.retire_user(user_id=user.id)) + assert attempt_again.retire_user(user_id=user.id) # Validate data after retirement - self.assertEqual(attempt_again.name, '') - self.assertEqual(attempt_again.face_image_url, '') - self.assertEqual(attempt_again.photo_id_image_url, '') - self.assertEqual(attempt_again.photo_id_key, '') + assert attempt_again.name == '' + assert attempt_again.face_image_url == '' + assert attempt_again.photo_id_image_url == '' + assert attempt_again.photo_id_key == '' def test_retire_nonuser(self): """ @@ -324,10 +321,10 @@ class TestPhotoVerification(TestVerificationBase, MockS3BotoMixin, ModuleStoreTe attempt = SoftwareSecurePhotoVerification(user=user) # User with no records in table - self.assertFalse(attempt.retire_user(user_id=user.id)) + assert not attempt.retire_user(user_id=user.id) # No user - self.assertFalse(attempt.retire_user(user_id=47)) + assert not attempt.retire_user(user_id=47) def test_get_recent_verification(self): """Test that method 'get_recent_verification' of model @@ -348,8 +345,8 @@ class TestPhotoVerification(TestVerificationBase, MockS3BotoMixin, ModuleStoreTe # Test method 'get_recent_verification' returns the most recent # verification attempt based on updated_at recent_verification = SoftwareSecurePhotoVerification.get_recent_verification(user=user) - self.assertIsNotNone(recent_verification) - self.assertEqual(recent_verification.id, attempt.id) + assert recent_verification is not None + assert recent_verification.id == attempt.id def test_no_approved_verification(self): """Test that method 'get_recent_verification' of model @@ -360,7 +357,7 @@ class TestPhotoVerification(TestVerificationBase, MockS3BotoMixin, ModuleStoreTe SoftwareSecurePhotoVerification(user=user) result = SoftwareSecurePhotoVerification.get_recent_verification(user=user) - self.assertIs(result, None) + assert result is None def test_update_expiry_email_date_for_user(self): """Test that method update_expiry_email_date_for_user of @@ -374,12 +371,12 @@ class TestPhotoVerification(TestVerificationBase, MockS3BotoMixin, ModuleStoreTe verification.status = PhotoVerification.STATUS.approved verification.save() - self.assertIsNone(verification.expiry_email_date) + assert verification.expiry_email_date is None SoftwareSecurePhotoVerification.update_expiry_email_date_for_user(user, email_config) result = SoftwareSecurePhotoVerification.get_recent_verification(user=user) - self.assertIsNotNone(result.expiry_email_date) + assert result.expiry_email_date is not None def test_expiration_date_null(self): """ @@ -391,10 +388,7 @@ class TestPhotoVerification(TestVerificationBase, MockS3BotoMixin, ModuleStoreTe verification.expiration_date = None verification.save() - self.assertEqual( - verification.expiration_datetime, - verification.created_at + timedelta(days=FAKE_SETTINGS["DAYS_GOOD_FOR"]) - ) + assert verification.expiration_datetime == (verification.created_at + timedelta(days=FAKE_SETTINGS['DAYS_GOOD_FOR'])) def test_deprecated_expiry_date(self): """ @@ -404,20 +398,14 @@ class TestPhotoVerification(TestVerificationBase, MockS3BotoMixin, ModuleStoreTe with freeze_time(now()): verification = SoftwareSecurePhotoVerification(user=user) # First, assert that expiration_date is set correctly - self.assertEqual( - verification.expiration_datetime, - now() + timedelta(days=FAKE_SETTINGS["DAYS_GOOD_FOR"]) - ) + assert verification.expiration_datetime == (now() + timedelta(days=FAKE_SETTINGS['DAYS_GOOD_FOR'])) verification.expiry_date = now() + timedelta(days=10) # Then, assert that expiration_datetime favors expiry_date's value if set - self.assertEqual( - verification.expiration_datetime, - now() + timedelta(days=10) - ) + assert verification.expiration_datetime == (now() + timedelta(days=10)) def test_get_verification_from_receipt(self): result = SoftwareSecurePhotoVerification.get_verification_from_receipt('') - self.assertIs(result, None) + assert result is None user = UserFactory.create() attempt = SoftwareSecurePhotoVerification(user=user) @@ -425,7 +413,7 @@ class TestPhotoVerification(TestVerificationBase, MockS3BotoMixin, ModuleStoreTe attempt.save() receipt_id = attempt.receipt_id result = SoftwareSecurePhotoVerification.get_verification_from_receipt(receipt_id) - self.assertIsNotNone(result) + assert result is not None class SSOVerificationTest(TestVerificationBase): diff --git a/lms/djangoapps/verify_student/tests/test_services.py b/lms/djangoapps/verify_student/tests/test_services.py index 8223032c408..f411d324dde 100644 --- a/lms/djangoapps/verify_student/tests/test_services.py +++ b/lms/djangoapps/verify_student/tests/test_services.py @@ -45,11 +45,11 @@ class TestIDVerificationService(ModuleStoreTestCase): for status in ["created", "ready", "denied", "submitted", "must_retry"]: attempt.status = status attempt.save() - self.assertFalse(IDVerificationService.user_is_verified(user), status) + assert not IDVerificationService.user_is_verified(user), status attempt.status = "approved" attempt.save() - self.assertTrue(IDVerificationService.user_is_verified(user), attempt.status) + assert IDVerificationService.user_is_verified(user), attempt.status def test_user_has_valid_or_pending(self): """ @@ -63,14 +63,14 @@ class TestIDVerificationService(ModuleStoreTestCase): for status in ["created", "ready", "denied"]: attempt.status = status attempt.save() - self.assertFalse(IDVerificationService.user_has_valid_or_pending(user), status) + assert not IDVerificationService.user_has_valid_or_pending(user), status # Any of these, and we are. Note the benefit of the doubt we're giving # -- must_retry, and submitted both count until we hear otherwise for status in ["submitted", "must_retry", "approved"]: attempt.status = status attempt.save() - self.assertTrue(IDVerificationService.user_has_valid_or_pending(user), status) + assert IDVerificationService.user_has_valid_or_pending(user), status @ddt.unpack @ddt.data( @@ -92,7 +92,7 @@ class TestIDVerificationService(ModuleStoreTestCase): mock_verification.return_value = status status = IDVerificationService.verification_status_for_user(user, enrollment_mode) - self.assertEqual(status, output) + assert status == output def test_get_verified_user_ids(self): """ @@ -114,7 +114,7 @@ class TestIDVerificationService(ModuleStoreTestCase): ])) expected_user_ids = {user_a.id, user_b.id, user_c.id} - self.assertEqual(expected_user_ids, verified_user_ids) + assert expected_user_ids == verified_user_ids def test_get_verify_location_no_course_key(self): """ @@ -122,7 +122,7 @@ class TestIDVerificationService(ModuleStoreTestCase): """ path = IDVerificationService.get_verify_location() expected_path = '{}/id-verification'.format(settings.ACCOUNT_MICROFRONTEND_URL) - self.assertEqual(path, expected_path) + assert path == expected_path def test_get_verify_location_from_course_id(self): """ @@ -131,7 +131,7 @@ class TestIDVerificationService(ModuleStoreTestCase): course = CourseFactory.create(org='Robot', number='999', display_name='Test Course') path = IDVerificationService.get_verify_location(course.id) expected_path = '{}/id-verification'.format(settings.ACCOUNT_MICROFRONTEND_URL) - self.assertEqual(path, expected_path + '?course_id=Robot/999/Test_Course') + assert path == (expected_path + '?course_id=Robot/999/Test_Course') def test_get_verify_location_from_string(self): """ @@ -139,7 +139,7 @@ class TestIDVerificationService(ModuleStoreTestCase): """ path = IDVerificationService.get_verify_location('course-v1:edX+DemoX+Demo_Course') expected_path = '{}/id-verification'.format(settings.ACCOUNT_MICROFRONTEND_URL) - self.assertEqual(path, expected_path + '?course_id=course-v1%3AedX%2BDemoX%2BDemo_Course') + assert path == (expected_path + '?course_id=course-v1%3AedX%2BDemoX%2BDemo_Course') @patch.dict(settings.VERIFY_STUDENT, FAKE_SETTINGS) diff --git a/lms/djangoapps/verify_student/tests/test_signals.py b/lms/djangoapps/verify_student/tests/test_signals.py index 516c6a363b1..aa634ec81ee 100644 --- a/lms/djangoapps/verify_student/tests/test_signals.py +++ b/lms/djangoapps/verify_student/tests/test_signals.py @@ -31,7 +31,7 @@ class VerificationDeadlineSignalTest(ModuleStoreTestCase): """ Verify the signal sets deadline to course end when no deadline exists.""" _listen_for_course_publish('store', self.course.id) - self.assertEqual(VerificationDeadline.deadline_for_course(self.course.id), self.course.end) + assert VerificationDeadline.deadline_for_course(self.course.id) == self.course.end def test_deadline(self): """ Verify deadline is set to course end date by signal when changed. """ @@ -39,7 +39,7 @@ class VerificationDeadlineSignalTest(ModuleStoreTestCase): VerificationDeadline.set_deadline(self.course.id, deadline) _listen_for_course_publish('store', self.course.id) - self.assertEqual(VerificationDeadline.deadline_for_course(self.course.id), self.course.end) + assert VerificationDeadline.deadline_for_course(self.course.id) == self.course.end def test_deadline_explicit(self): """ Verify deadline is unchanged by signal when explicitly set. """ @@ -49,8 +49,8 @@ class VerificationDeadlineSignalTest(ModuleStoreTestCase): _listen_for_course_publish('store', self.course.id) actual_deadline = VerificationDeadline.deadline_for_course(self.course.id) - self.assertNotEqual(actual_deadline, self.course.end) - self.assertEqual(actual_deadline, deadline) + assert actual_deadline != self.course.end + assert actual_deadline == deadline class RetirementSignalTest(ModuleStoreTestCase): @@ -83,7 +83,7 @@ class RetirementSignalTest(ModuleStoreTestCase): # All values for this user should now be empty string for field in ('name', 'face_image_url', 'photo_id_image_url', 'photo_id_key'): - self.assertEqual('', getattr(ver_obj, field)) + assert '' == getattr(ver_obj, field) def test_retire_success_no_entries(self): user = UserFactory() @@ -101,4 +101,4 @@ class RetirementSignalTest(ModuleStoreTestCase): # All values for this user should now be empty string for field in ('name', 'face_image_url', 'photo_id_image_url', 'photo_id_key'): - self.assertEqual('', getattr(ver_obj, field)) + assert '' == getattr(ver_obj, field) diff --git a/lms/djangoapps/verify_student/tests/test_utils.py b/lms/djangoapps/verify_student/tests/test_utils.py index 6b0a342b7d7..91e553ba594 100644 --- a/lms/djangoapps/verify_student/tests/test_utils.py +++ b/lms/djangoapps/verify_student/tests/test_utils.py @@ -42,12 +42,12 @@ class TestVerifyStudentUtils(unittest.TestCase): # No attempts in the query set, so should return None query = SoftwareSecurePhotoVerification.objects.filter(user=user) result = verification_for_datetime(now, query) - self.assertIs(result, None) + assert result is None # Should also return None if no deadline specified query = SoftwareSecurePhotoVerification.objects.filter(user=user) result = verification_for_datetime(None, query) - self.assertIs(result, None) + assert result is None # Make an attempt attempt = SoftwareSecurePhotoVerification.objects.create(user=user) @@ -56,25 +56,25 @@ class TestVerifyStudentUtils(unittest.TestCase): before = attempt.created_at - timedelta(seconds=1) query = SoftwareSecurePhotoVerification.objects.filter(user=user) result = verification_for_datetime(before, query) - self.assertIs(result, None) + assert result is None # Immediately after the created date, should get the attempt after_created = attempt.created_at + timedelta(seconds=1) query = SoftwareSecurePhotoVerification.objects.filter(user=user) result = verification_for_datetime(after_created, query) - self.assertEqual(result, attempt) + assert result == attempt # If no deadline specified, should return first available query = SoftwareSecurePhotoVerification.objects.filter(user=user) result = verification_for_datetime(None, query) - self.assertEqual(result, attempt) + assert result == attempt # Immediately before the expiration date, should get the attempt expiration = attempt.expiration_datetime + timedelta(days=settings.VERIFY_STUDENT["DAYS_GOOD_FOR"]) before_expiration = expiration - timedelta(seconds=1) query = SoftwareSecurePhotoVerification.objects.filter(user=user) result = verification_for_datetime(before_expiration, query) - self.assertEqual(result, attempt) + assert result == attempt # Immediately after the expiration date, should not get the attempt attempt.expiration_date = now - timedelta(seconds=1) @@ -82,7 +82,7 @@ class TestVerifyStudentUtils(unittest.TestCase): after = now + timedelta(days=1) query = SoftwareSecurePhotoVerification.objects.filter(user=user) result = verification_for_datetime(after, query) - self.assertIs(result, None) + assert result is None # Create a second attempt in the same window second_attempt = SoftwareSecurePhotoVerification.objects.create(user=user) @@ -91,7 +91,7 @@ class TestVerifyStudentUtils(unittest.TestCase): deadline = second_attempt.created_at + timedelta(days=1) query = SoftwareSecurePhotoVerification.objects.filter(user=user) result = verification_for_datetime(deadline, query) - self.assertEqual(result, second_attempt) + assert result == second_attempt @ddt.data( (False, False, False, None, None), @@ -141,13 +141,13 @@ class TestVerifyStudentUtils(unittest.TestCase): ) if not expected_verification: - self.assertEqual(most_recent, None) + assert most_recent is None elif expected_verification == 'photo': - self.assertEqual(most_recent, photo_verification) + assert most_recent == photo_verification elif expected_verification == 'sso': - self.assertEqual(most_recent, sso_verification) + assert most_recent == sso_verification else: - self.assertEqual(most_recent, manual_verification) + assert most_recent == manual_verification @mock.patch('lms.djangoapps.verify_student.utils.log') @mock.patch( @@ -165,4 +165,4 @@ class TestVerifyStudentUtils(unittest.TestCase): user.username, 'error' ) - self.assertTrue(attempt.status, SoftwareSecurePhotoVerification.STATUS.must_retry) + assert attempt.status, SoftwareSecurePhotoVerification.STATUS.must_retry diff --git a/lms/djangoapps/verify_student/tests/test_views.py b/lms/djangoapps/verify_student/tests/test_views.py index a5f224c22f2..88b4ab78f2a 100644 --- a/lms/djangoapps/verify_student/tests/test_views.py +++ b/lms/djangoapps/verify_student/tests/test_views.py @@ -154,7 +154,7 @@ class TestPayAndVerifyView(UrlResetMixin, ModuleStoreTestCase, XssTestMixin, Tes super(TestPayAndVerifyView, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments self.user = UserFactory.create(username=self.USERNAME, password=self.PASSWORD) result = self.client.login(username=self.USERNAME, password=self.PASSWORD) - self.assertTrue(result, msg="Could not log in") + assert result, 'Could not log in' @ddt.data( ("verified", "verify_student_start_flow"), @@ -688,7 +688,7 @@ class TestPayAndVerifyView(UrlResetMixin, ModuleStoreTestCase, XssTestMixin, Tes # Expect that the expiration date is set response = self._get_page(payment_flow, course.id) data = self._get_page_data(response) - self.assertEqual(data['verification_deadline'], six.text_type(deadline)) + assert data['verification_deadline'] == six.text_type(deadline) def test_course_mode_expired(self): deadline = now() + timedelta(days=-360) @@ -748,17 +748,17 @@ class TestPayAndVerifyView(UrlResetMixin, ModuleStoreTestCase, XssTestMixin, Tes self.assertNotContains(response, "Verification is no longer available") data = self._get_page_data(response) - self.assertEqual(data['message_key'], PayAndVerifyView.VERIFY_NOW_MSG) + assert data['message_key'] == PayAndVerifyView.VERIFY_NOW_MSG # Check that the mode selected is expired verified mode not the credit mode # because the direct enrollment to the credit mode is not allowed. - self.assertEqual(data['course_mode_slug'], "verified") + assert data['course_mode_slug'] == 'verified' # Check that the verification deadline (rather than the upgrade deadline) is displayed if verification_deadline is not None: - self.assertEqual(data["verification_deadline"], six.text_type(verification_deadline)) + assert data['verification_deadline'] == six.text_type(verification_deadline) else: - self.assertEqual(data["verification_deadline"], "") + assert data['verification_deadline'] == '' def test_course_mode_not_expired_verification_deadline_passed(self): course = self._create_course("verified") @@ -902,72 +902,64 @@ class TestPayAndVerifyView(UrlResetMixin, ModuleStoreTestCase, XssTestMixin, Tes _mock_payment_processors() response = self.client.get(url) - self.assertEqual(response.status_code, expected_status_code) + assert response.status_code == expected_status_code if assert_headers: # ensure the mock api call was made. NOTE: the following line # approximates the check - if the headers were empty it means # there was no last request. - self.assertNotEqual(httpretty.last_request().headers, {}) + assert httpretty.last_request().headers != {} return response def _assert_displayed_mode(self, response, expected_mode): """Check whether a course mode is displayed. """ response_dict = self._get_page_data(response) - self.assertEqual(response_dict['course_mode_slug'], expected_mode) + assert response_dict['course_mode_slug'] == expected_mode def _assert_steps_displayed(self, response, expected_steps, expected_current_step): """Check whether steps in the flow are displayed to the user. """ response_dict = self._get_page_data(response) - self.assertEqual(response_dict['current_step'], expected_current_step) - self.assertEqual(expected_steps, [ - step['name'] for step in - response_dict['display_steps'] - ]) + assert response_dict['current_step'] == expected_current_step + assert expected_steps == [step['name'] for step in response_dict['display_steps']] def _assert_messaging(self, response, expected_message): """Check the messaging on the page. """ response_dict = self._get_page_data(response) - self.assertEqual(response_dict['message_key'], expected_message) + assert response_dict['message_key'] == expected_message def _assert_requirements_displayed(self, response, requirements): """Check that requirements are displayed on the page. """ response_dict = self._get_page_data(response) for req, displayed in six.iteritems(response_dict['requirements']): if req in requirements: - self.assertTrue(displayed, msg=u"Expected '{req}' requirement to be displayed".format(req=req)) + assert displayed, "Expected '{req}' requirement to be displayed".format(req=req) else: - self.assertFalse(displayed, msg=u"Expected '{req}' requirement to be hidden".format(req=req)) + assert not displayed, "Expected '{req}' requirement to be displayed".format(req=req) def _assert_course_details(self, response, course_key, display_name, url): """Check the course information on the page. """ response_dict = self._get_page_data(response) - self.assertEqual(response_dict['course_key'], course_key) - self.assertEqual(response_dict['course_name'], display_name) - self.assertEqual(response_dict['courseware_url'], url) + assert response_dict['course_key'] == course_key + assert response_dict['course_name'] == display_name + assert response_dict['courseware_url'] == url def _assert_user_details(self, response, full_name): """Check the user detail information on the page. """ response_dict = self._get_page_data(response) - self.assertEqual(response_dict['full_name'], full_name) + assert response_dict['full_name'] == full_name def _assert_contribution_amount(self, response, expected_amount): """Check the pre-filled contribution amount. """ response_dict = self._get_page_data(response) - self.assertEqual(response_dict['contribution_amount'], expected_amount) + assert response_dict['contribution_amount'] == expected_amount def _get_page_data(self, response): """Retrieve the data attributes rendered on the page. """ soup = BeautifulSoup(markup=response.content, features="lxml") pay_and_verify_div = soup.find(id="pay-and-verify-container") - self.assertIsNot( - pay_and_verify_div, None, - msg=( - "Could not load pay and verify flow data. " - "Maybe this isn't the pay and verify page?" - ) - ) + assert pay_and_verify_div is not None,\ + "Could not load pay and verify flow data. Maybe this isn't the pay and verify page?" return { 'full_name': pay_and_verify_div['data-full-name'], @@ -986,7 +978,7 @@ class TestPayAndVerifyView(UrlResetMixin, ModuleStoreTestCase, XssTestMixin, Tes def _assert_upgrade_session_flag(self, is_upgrade): """Check that the session flag for attempting an upgrade is set. """ - self.assertEqual(self.client.session.get('attempting_upgrade'), is_upgrade) + assert self.client.session.get('attempting_upgrade') == is_upgrade def _assert_redirects_to_dashboard(self, response): """Check that the page redirects to the student dashboard. """ @@ -1026,7 +1018,7 @@ class TestPayAndVerifyView(UrlResetMixin, ModuleStoreTestCase, XssTestMixin, Tes self._enroll(course.id) response_dict = self._get_page_data(self._get_page(payment_flow, course.id)) - self.assertEqual(response_dict['course_name'], mode_display_name) + assert response_dict['course_name'] == mode_display_name @ddt.data("verify_student_start_flow", "verify_student_begin_flow") def test_processors_api(self, payment_flow): @@ -1042,7 +1034,7 @@ class TestPayAndVerifyView(UrlResetMixin, ModuleStoreTestCase, XssTestMixin, Tes # make the server request response = self._get_page(payment_flow, course.id, assert_headers=True) - self.assertEqual(response.status_code, 200) + assert response.status_code == 200 class CheckoutTestMixin(object): @@ -1084,20 +1076,20 @@ class CheckoutTestMixin(object): """ post_params.setdefault('processor', '') response = self.client.post(reverse('verify_student_create_order'), post_params) - self.assertEqual(response.status_code, expected_status_code) + assert response.status_code == expected_status_code if expected_status_code == 200: # ensure we called checkout at all - self.assertTrue(patched_create_order.called) + assert patched_create_order.called # ensure checkout args were correct args = self._get_checkout_args(patched_create_order) - self.assertEqual(args['user'], self.user) - self.assertEqual(args['course_key'], expected_course_key) - self.assertEqual(args['course_mode'].slug, expected_mode_slug) + assert args['user'] == self.user + assert args['course_key'] == expected_course_key + assert args['course_mode'].slug == expected_mode_slug # ensure response data was correct data = json.loads(response.content.decode('utf-8')) - self.assertEqual(set(data.keys()), PAYMENT_DATA_KEYS) + assert set(data.keys()) == PAYMENT_DATA_KEYS else: - self.assertFalse(patched_create_order.called) + assert not patched_create_order.called def test_create_order(self, patched_create_order): # Create an order @@ -1159,16 +1151,16 @@ class CheckoutTestMixin(object): # there is no 'processor' parameter in the post payload, so the response should only contain payment form data. params = {'course_id': six.text_type(self.course.id), 'contribution': 100} response = self.client.post(reverse('verify_student_create_order'), params) - self.assertEqual(response.status_code, 200) - self.assertTrue(patched_create_order.called) + assert response.status_code == 200 + assert patched_create_order.called # ensure checkout args were correct args = self._get_checkout_args(patched_create_order) - self.assertEqual(args['user'], self.user) - self.assertEqual(args['course_key'], self.course.id) - self.assertEqual(args['course_mode'].slug, 'verified') + assert args['user'] == self.user + assert args['course_key'] == self.course.id + assert args['course_mode'].slug == 'verified' # ensure response data was correct data = json.loads(response.content.decode('utf-8')) - self.assertEqual(data, {'foo': 'bar'}) + assert data == {'foo': 'bar'} @override_settings(ECOMMERCE_API_URL=TEST_API_URL) @@ -1223,16 +1215,13 @@ class TestCheckoutWithEcommerceService(ModuleStoreTestCase): ) # Verify that an audit message was logged - self.assertTrue(mock_audit_log.called) + assert mock_audit_log.called # Check the api call - self.assertEqual(json.loads(httpretty.last_request().body.decode('utf-8')), { - 'products': [{'sku': 'test-sku'}], - 'checkout': True, - 'payment_processor_name': 'test-processor', - }) + assert json.loads(httpretty.last_request().body.decode('utf-8')) ==\ + {'products': [{'sku': 'test-sku'}], 'checkout': True, 'payment_processor_name': 'test-processor'} # Check the response - self.assertEqual(actual_payment_data, expected_payment_data) + assert actual_payment_data == expected_payment_data @ddt.ddt @@ -1250,7 +1239,7 @@ class TestSubmitPhotosForVerification(MockS3BotoMixin, TestVerificationBase): super(TestSubmitPhotosForVerification, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments self.user = UserFactory.create(username=self.USERNAME, password=self.PASSWORD) result = self.client.login(username=self.USERNAME, password=self.PASSWORD) - self.assertTrue(result, msg="Could not log in") + assert result, 'Could not log in' def test_submit_photos(self): # Submit the photos @@ -1261,7 +1250,7 @@ class TestSubmitPhotosForVerification(MockS3BotoMixin, TestVerificationBase): # Verify that the attempt is created in the database attempt = SoftwareSecurePhotoVerification.objects.get(user=self.user) - self.assertEqual(attempt.status, "submitted") + assert attempt.status == 'submitted' # Verify that the user's name wasn't changed self._assert_user_name(self.user.profile.name) @@ -1328,7 +1317,7 @@ class TestSubmitPhotosForVerification(MockS3BotoMixin, TestVerificationBase): reverification_data = self._get_post_data() # Verify that the initial attempt sent the same ID photo as the reverification attempt - self.assertEqual(initial_data["PhotoIDKey"], reverification_data["PhotoIDKey"]) + assert initial_data['PhotoIDKey'] == reverification_data['PhotoIDKey'] # Submit a new face photo and photo id for verification self._submit_photos( @@ -1338,7 +1327,7 @@ class TestSubmitPhotosForVerification(MockS3BotoMixin, TestVerificationBase): two_photo_reverification_data = self._get_post_data() # Verify that the initial attempt sent a new ID photo for the reverification attempt - self.assertNotEqual(initial_data["PhotoIDKey"], two_photo_reverification_data["PhotoIDKey"]) + assert initial_data['PhotoIDKey'] != two_photo_reverification_data['PhotoIDKey'] @ddt.data('face_image', 'photo_id_image') def test_invalid_image_data(self, invalid_param): @@ -1348,7 +1337,7 @@ class TestSubmitPhotosForVerification(MockS3BotoMixin, TestVerificationBase): } params[invalid_param] = "" response = self._submit_photos(expected_status_code=400, **params) - self.assertEqual(response.content.decode('utf-8'), "Image data is not valid.") + assert response.content.decode('utf-8') == 'Image data is not valid.' def test_invalid_name(self): response = self._submit_photos( @@ -1357,7 +1346,7 @@ class TestSubmitPhotosForVerification(MockS3BotoMixin, TestVerificationBase): full_name="", expected_status_code=400 ) - self.assertEqual(response.content.decode('utf-8'), "Name must be at least 1 character long.") + assert response.content.decode('utf-8') == 'Name must be at least 1 character long.' def test_missing_required_param(self): # Missing face image parameter @@ -1365,16 +1354,14 @@ class TestSubmitPhotosForVerification(MockS3BotoMixin, TestVerificationBase): 'photo_id_image': self.IMAGE_DATA } response = self._submit_photos(expected_status_code=400, **params) - self.assertEqual(response.content.decode('utf-8'), "Missing required parameter face_image") + assert response.content.decode('utf-8') == 'Missing required parameter face_image' def test_no_photo_id_and_no_initial_verification(self): # Submit face image data, but not photo ID data. # Since the user doesn't have an initial verification attempt, this should fail response = self._submit_photos(expected_status_code=400, face_image=self.IMAGE_DATA) - self.assertEqual( - response.content.decode('utf-8'), - "Photo ID image is required if the user does not have an initial verification attempt." - ) + assert response.content.decode('utf-8') ==\ + 'Photo ID image is required if the user does not have an initial verification attempt.' # Create the initial verification attempt with some dummy # value set for field 'photo_id_key' @@ -1417,7 +1404,7 @@ class TestSubmitPhotosForVerification(MockS3BotoMixin, TestVerificationBase): with self.immediate_on_commit(): response = self.client.post(url, params) - self.assertEqual(response.status_code, expected_status_code) + assert response.status_code == expected_status_code return response @@ -1427,11 +1414,11 @@ class TestSubmitPhotosForVerification(MockS3BotoMixin, TestVerificationBase): """ if expect_email: # Verify that photo submission confirmation email was sent - self.assertEqual(len(mail.outbox), 1) - self.assertEqual('Thank you for submitting your photos!', mail.outbox[0].subject) + assert len(mail.outbox) == 1 + assert 'Thank you for submitting your photos!' == mail.outbox[0].subject else: # Verify that photo submission confirmation email was not sent - self.assertEqual(len(mail.outbox), 0) + assert len(mail.outbox) == 0 def _assert_user_name(self, full_name): """Check the user's name. @@ -1446,7 +1433,7 @@ class TestSubmitPhotosForVerification(MockS3BotoMixin, TestVerificationBase): request = RequestFactory().get('/url') request.user = self.user account_settings = get_account_settings(request)[0] - self.assertEqual(account_settings['name'], full_name) + assert account_settings['name'] == full_name def _get_post_data(self): """Retrieve POST data from the last request. """ @@ -1481,18 +1468,18 @@ class TestPhotoVerificationResultsCallback(ModuleStoreTestCase, TestVerification def _assert_verification_approved_email(self, expiration_date): """Check that a verification approved email was sent.""" - self.assertEqual(len(mail.outbox), 1) + assert len(mail.outbox) == 1 email = mail.outbox[0] - self.assertEqual(email.subject, 'Your édX ID verification was approved!') - self.assertIn('Your édX ID verification photos have been approved', email.body) - self.assertIn(expiration_date.strftime("%m/%d/%Y"), email.body) + assert email.subject == 'Your édX ID verification was approved!' + assert 'Your édX ID verification photos have been approved' in email.body + assert expiration_date.strftime("%m/%d/%Y") in email.body def _assert_verification_denied_email(self): """Check that a verification approved email was sent.""" - self.assertEqual(len(mail.outbox), 1) + assert len(mail.outbox) == 1 email = mail.outbox[0] - self.assertEqual(email.subject, 'Your édX Verification Has Been Denied') - self.assertIn('The photos you submitted for ID verification were not accepted', email.body) + assert email.subject == 'Your édX Verification Has Been Denied' + assert 'The photos you submitted for ID verification were not accepted' in email.body def test_invalid_json(self): """ @@ -1604,10 +1591,10 @@ class TestPhotoVerificationResultsCallback(ModuleStoreTestCase, TestVerification ) attempt = SoftwareSecurePhotoVerification.objects.get(receipt_id=self.receipt_id) old_verification = SoftwareSecurePhotoVerification.objects.get(pk=verification.pk) - self.assertEqual(attempt.status, u'approved') - self.assertEqual(attempt.expiration_datetime.date(), expiration_datetime.date()) - self.assertIsNone(old_verification.expiry_email_date) - self.assertEqual(response.content.decode('utf-8'), 'OK!') + assert attempt.status == u'approved' + assert attempt.expiration_datetime.date() == expiration_datetime.date() + assert old_verification.expiry_email_date is None + assert response.content.decode('utf-8') == 'OK!' self._assert_verification_approved_email(expiration_datetime.date()) @patch( @@ -1639,9 +1626,9 @@ class TestPhotoVerificationResultsCallback(ModuleStoreTestCase, TestVerification ) attempt = SoftwareSecurePhotoVerification.objects.get(receipt_id=self.receipt_id) - self.assertEqual(attempt.status, u'approved') - self.assertEqual(attempt.expiration_datetime.date(), expiration_datetime.date()) - self.assertEqual(response.content.decode('utf-8'), 'OK!') + assert attempt.status == u'approved' + assert attempt.expiration_datetime.date() == expiration_datetime.date() + assert response.content.decode('utf-8') == 'OK!' self._assert_verification_approved_email(expiration_datetime.date()) @patch( @@ -1669,10 +1656,10 @@ class TestPhotoVerificationResultsCallback(ModuleStoreTestCase, TestVerification HTTP_DATE='testdate' ) attempt = SoftwareSecurePhotoVerification.objects.get(receipt_id=self.receipt_id) - self.assertEqual(attempt.status, u'denied') - self.assertEqual(attempt.error_code, u'Your photo doesn\'t meet standards.') - self.assertEqual(attempt.error_msg, u'[{"photoIdReasons": ["Not provided"]}]') - self.assertEqual(response.content.decode('utf-8'), 'OK!') + assert attempt.status == u'denied' + assert attempt.error_code == u"Your photo doesn't meet standards." + assert attempt.error_msg == u'[{"photoIdReasons": ["Not provided"]}]' + assert response.content.decode('utf-8') == 'OK!' self._assert_verification_denied_email() @patch( @@ -1696,10 +1683,10 @@ class TestPhotoVerificationResultsCallback(ModuleStoreTestCase, TestVerification HTTP_DATE='testdate' ) attempt = SoftwareSecurePhotoVerification.objects.get(receipt_id=self.receipt_id) - self.assertEqual(attempt.status, u'must_retry') - self.assertEqual(attempt.error_code, u'You must retry the verification.') - self.assertEqual(attempt.error_msg, u'"Memory overflow"') - self.assertEqual(response.content.decode('utf-8'), 'OK!') + assert attempt.status == u'must_retry' + assert attempt.error_code == u'You must retry the verification.' + assert attempt.error_msg == u'"Memory overflow"' + assert response.content.decode('utf-8') == 'OK!' @patch( 'lms.djangoapps.verify_student.ssencrypt.has_valid_signature', @@ -1741,7 +1728,7 @@ class TestReverifyView(TestVerificationBase): super(TestReverifyView, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments self.user = UserFactory.create(username=self.USERNAME, password=self.PASSWORD) success = self.client.login(username=self.USERNAME, password=self.PASSWORD) - self.assertTrue(success, msg="Could not log in") + assert success, 'Could not log in' def test_reverify_view_can_do_initial_verification(self): """ @@ -1840,7 +1827,7 @@ class TestPhotoURLView(TestVerificationBase): self.user = AdminFactory() login_success = self.client.login(username=self.user.username, password='test') - self.assertTrue(login_success) + assert login_success self.attempt = SoftwareSecurePhotoVerification( status="submitted", user=self.user @@ -1851,35 +1838,26 @@ class TestPhotoURLView(TestVerificationBase): def test_photo_url_view_returns_data(self): url = reverse('verification_photo_urls', kwargs={'receipt_id': six.text_type(self.receipt_id)}) response = self.client.get(url) - self.assertEqual(response.status_code, 200) - self.assertEqual(response.data["EdX-ID"], self.receipt_id) - self.assertEqual( - response.data["PhotoID"], - "https://{bucket}/photo_id/{receipt_id}".format( - bucket=settings.AWS_S3_CUSTOM_DOMAIN, - receipt_id=self.receipt_id - ) - ) - self.assertEqual( - response.data["UserPhoto"], - "https://{bucket}/face/{receipt_id}".format( - bucket=settings.AWS_S3_CUSTOM_DOMAIN, - receipt_id=self.receipt_id - ) - ) + assert response.status_code == 200 + assert response.data['EdX-ID'] == self.receipt_id + assert response.data['PhotoID'] == 'https://{bucket}/photo_id/{receipt_id}'\ + .format(bucket=settings.AWS_S3_CUSTOM_DOMAIN, receipt_id=self.receipt_id) + assert response.data['UserPhoto'] == 'https://{bucket}/face/{receipt_id}'\ + .format(bucket=settings.AWS_S3_CUSTOM_DOMAIN, receipt_id=self.receipt_id) def test_photo_url_view_returns_404_if_invalid_receipt_id(self): - url = reverse('verification_photo_urls', kwargs={'receipt_id': six.text_type('00000000-0000-0000-0000-000000000000')}) # lint-amnesty, pylint: disable=line-too-long + url = reverse('verification_photo_urls', + kwargs={'receipt_id': six.text_type('00000000-0000-0000-0000-000000000000')}) response = self.client.get(url) - self.assertEqual(response.status_code, 404) + assert response.status_code == 404 def test_403_for_non_staff(self): self.user = UserFactory() login_success = self.client.login(username=self.user.username, password='test') - self.assertTrue(login_success) + assert login_success url = reverse('verification_photo_urls', kwargs={'receipt_id': six.text_type(self.receipt_id)}) response = self.client.get(url) - self.assertEqual(response.status_code, 403) + assert response.status_code == 403 @override_settings( @@ -1915,7 +1893,7 @@ class TestDecodeImageViews(MockS3BotoMixin, TestVerificationBase): super().setUp() self.user = AdminFactory() login_success = self.client.login(username=self.user.username, password='test') - self.assertTrue(login_success) + assert login_success def _mock_submit_images(self): """ @@ -1969,14 +1947,14 @@ class TestDecodeImageViews(MockS3BotoMixin, TestVerificationBase): #mock downloading and decrypting images response = self._decode_image(receipt_id, img_type) - self.assertEqual(response.status_code, 200) - self.assertEqual(response.content, base64.b64decode(self.IMAGE_DATA.split(",")[1])) + assert response.status_code == 200 + assert response.content == base64.b64decode(self.IMAGE_DATA.split(',')[1]) @ddt.data("face", "photo_id") def test_403_for_non_staff(self, img_type): self.user = UserFactory() login_success = self.client.login(username=self.user.username, password='test') - self.assertTrue(login_success) + assert login_success self._mock_submit_images() attempt = SoftwareSecurePhotoVerification.objects.get(user=self.user) @@ -1984,7 +1962,7 @@ class TestDecodeImageViews(MockS3BotoMixin, TestVerificationBase): # mock downloading and decrypting images response = self._decode_image(receipt_id, img_type) - self.assertEqual(response.status_code, 403) + assert response.status_code == 403 @override_settings( VERIFY_STUDENT={ @@ -2010,12 +1988,12 @@ class TestDecodeImageViews(MockS3BotoMixin, TestVerificationBase): # mock downloading and decrypting images response = self._decode_image(receipt_id, img_type) - self.assertEqual(response.status_code, 403) + assert response.status_code == 403 @ddt.data("face", "photo_id") def test_404_if_invalid_receipt_id(self, img_type): response = self._decode_image('00000000-0000-0000-0000-000000000000', img_type) - self.assertEqual(response.status_code, 404) + assert response.status_code == 404 @ddt.data("face", "photo_id") @patch.object(SoftwareSecurePhotoVerification, '_get_image_from_storage') @@ -2031,4 +2009,4 @@ class TestDecodeImageViews(MockS3BotoMixin, TestVerificationBase): # mock downloading and decrypting images response = self._decode_image(receipt_id, img_type) - self.assertEqual(response.status_code, 404) + assert response.status_code == 404 -- GitLab