class RemoveUserFromProjectTests(TestCase): def setUp(self) -> None: self.number_of_reports = 6 self.project = ProjectFactory(name="Test project") self.user = UserFactory() self.project.members.add(self.user) self._generate_user_reports() def test_that_removing_user_from_project_should_not_delete_user_reports_made_for_project( self): user_reports = Report.objects.filter(author=self.user, project=self.project) self.assertIn(self.user, self.project.members.all()) self._check_number_of_reports(user_reports) self.project.members.remove(self.user) self.project.refresh_from_db() self.assertNotIn(self.user, self.project.members.all()) self._check_number_of_reports(user_reports) def _generate_user_reports(self): for _report_number in range(self.number_of_reports): ReportFactory(author=self.user, project=self.project) def _check_number_of_reports(self, user_reports): self.assertEqual(user_reports.count(), self.number_of_reports) self.assertEqual(Report.objects.all().count(), self.number_of_reports)
class ProjectUpdateViewTestCase(ProjectBaseTests): def setUp(self): super().setUp() self.project = ProjectFactory() self.url = reverse("custom-project-update", kwargs={"pk": self.project.pk}) self.data = { "name": "New Example Project Name", "start_date": self.project.start_date, "managers": [self.user.pk], "members": [self.user.pk], } def test_project_update_view_should_display_update_template(self): response = self.client.get(self.url) self.assertEqual(response.status_code, 200) self.assertContains(response, self.project.name) self.assertTemplateUsed(response, ProjectUpdateView.template_name) def test_project_update_view_should_return_404_status_code_on_get_if_project_does_not_exist( self): response = self.client.get( reverse("custom-project-update", kwargs={"pk": self.project.pk + 1})) self.assertEqual(response.status_code, 404) def test_project_create_view_should_exclude_inactive_users_from_members_field( self): inactive_user = UserFactory(is_active=False) response = self.client.get(self.url) form = response.context_data["form"] self.assertTrue(inactive_user not in form.fields["members"].queryset) def test_project_update_view_should_update_project_on_post(self): response = self.client.post(self.url, self.data) self.assertEqual(response.status_code, 302) self.project.refresh_from_db() self.assertEqual(self.project.name, self.data["name"]) def test_project_update_view_should_update_project_on_post_if_data_is_invalid( self): del self.data["name"] response = self.client.post(self.url, self.data) self.assertEqual(response.status_code, 200) self.project.refresh_from_db() self.assertFormError(response, "form", "name", "This field is required.") def test_project_update_view_should_not_update_managers_if_user_is_manager( self): assert self.project.managers.count() == 0 user_manager = UserFactory(user_type=CustomUser.UserType.MANAGER.name) self.client.force_login(user=user_manager) self.data["managers"] = [self.user.pk, user_manager.pk] response = self.client.post(self.url, self.data) self.assertEqual(response.status_code, 404) self.project.refresh_from_db() self.assertEqual(self.project.managers.count(), 0) def test_project_update_view_should_display_all_aggregated_managers_on_get( self): self.project.managers.add(self.user) other_manager = ManagerUserFactory() response = self.client.get(self.url) self.assertEqual(response.status_code, 200) self.assertIn(self.user, response.context_data["form"].initial["managers"]) self.assertNotIn(other_manager, response.context_data["form"].initial["managers"]) self.assertContains(response, self.user) self.assertContains(response, other_manager)