From 3af4305c7648d50881978af90ec6c1621c1dc04a Mon Sep 17 00:00:00 2001 From: geistling <34081638+geistling@users.noreply.github.com> Date: Mon, 9 Sep 2024 14:27:58 -0400 Subject: [PATCH] work on testing --- coldfront/core/project/tests/test_views.py | 44 ++++++++++++++++++++-- coldfront/core/project/views.py | 23 +++++++---- coldfront/core/test_helpers/utils.py | 2 +- coldfront/plugins/system_monitor/utils.py | 2 +- 4 files changed, 57 insertions(+), 14 deletions(-) diff --git a/coldfront/core/project/tests/test_views.py b/coldfront/core/project/tests/test_views.py index 04e0519a3..32c617d75 100644 --- a/coldfront/core/project/tests/test_views.py +++ b/coldfront/core/project/tests/test_views.py @@ -1,6 +1,6 @@ import logging -from django.test import TestCase, tag +from django.test import TestCase, tag, override_settings from django.urls import reverse from coldfront.core.test_helpers import utils @@ -12,7 +12,11 @@ ProjectStatusChoiceFactory, ProjectAttributeTypeFactory, ) -from coldfront.core.project.models import Project, ProjectUserStatusChoice +from coldfront.core.project.models import ( + Project, ProjectUser, + ProjectUserRoleChoice, + ProjectUserStatusChoice +) logging.disable(logging.CRITICAL) @@ -161,7 +165,6 @@ def test_project_attribute_create_post_required_values(self): def test_project_attribute_create_value_type_match(self): """ProjectAttributeCreate correctly flags value-type mismatch""" - self.client.force_login(self.admin_user, backend='django.contrib.auth.backends.ModelBackend') # test that value must be numeric if proj_attr_type is string @@ -351,7 +354,7 @@ def test_projectnotecreateview_access(self): self.project_access_tstbase(self.url) -class ProjectAddUsersSearchView(ProjectViewTestBase): +class ProjectAddUsersSearchViewTest(ProjectViewTestBase): """Tests for ProjectAddUsersSearchView""" def setUp(self): """set up users and project for testing""" @@ -365,6 +368,39 @@ def test_projectadduserssearchview_access(self): utils.test_user_cannot_access(self, self.proj_datamanager, self.url)# data manager cannot access utils.test_user_cannot_access(self, self.proj_allocation_user, self.url)# user cannot access +class ProjectAddUsersViewTest(ProjectViewTestBase): + """Tests for ProjectAddUsersView""" + def setUp(self): + """set up users and project for testing""" + self.url = reverse('project-add-users', kwargs={'pk': self.project.pk}) + + @override_settings(PLUGIN_LDAP=True) + def test_projectaddusers_ldapsignalfail_messages(self): + """Test the messages displayed when the add user signal fails""" + self.client.force_login(self.pi_user) + + def test_add_users_form_validation(self): + """Test that the formset and allocation form are validated correctly""" + self.client.force_login(self.proj_accessmanager) + # Prepare form data for adding a user + form_data = { + 'q': 'search_user', + 'search_by': 'username', + 'userform-TOTAL_FORMS': '1', + 'userform-INITIAL_FORMS': '0', + 'userform-MIN_NUM_FORMS': '0', + 'userform-MAX_NUM_FORMS': '1', + 'userform-0-selected': 'on', + 'userform-0-role': ProjectUserRoleChoice.objects.get(name='User').pk, + 'userform-0-username': self.nonproj_allocation_user.username, + 'allocationform-allocation': [self.proj_allocation.pk] + } + response = self.client.post(self.url, data=form_data) + self.assertEqual(response.url, reverse('project-detail', kwargs={'pk': self.project.pk})) + self.assertEqual(response.status_code, 302) + # Check that user was added + self.assertTrue(ProjectUser.objects.filter(project=self.project, user=self.nonproj_allocation_user).exists()) + class ProjectUserDetailViewTest(ProjectViewTestBase): """Tests for ProjectUserDetailView""" diff --git a/coldfront/core/project/views.py b/coldfront/core/project/views.py index f07518994..7c7ed6dba 100644 --- a/coldfront/core/project/views.py +++ b/coldfront/core/project/views.py @@ -749,15 +749,20 @@ def get_users_to_remove(self, project_obj): def get(self, request, *args, **kwargs): pk = self.kwargs.get('pk') project_obj = get_object_or_404(Project, pk=pk) - users_to_remove = self.get_users_to_remove(project_obj) + users_list = self.get_users_to_remove(project_obj) # if ldap is activated, prevent selection of users with project corresponding to primary group signal_response = project_filter_users_to_remove.send( - sender=self.__class__, users_to_remove=users_to_remove, project=project_obj + sender=self.__class__, users_to_remove=users_list, project=project_obj ) - user_categories = signal_response[0][1] - users_no_removal = user_categories[0] - users_to_remove = user_categories[1] + print('signal_response', signal_response) + if signal_response: + user_categories = signal_response[0][1] + users_no_removal = user_categories[0] + users_to_remove = user_categories[1] + else: + users_no_removal = users_list + users_to_remove = [] context = {} @@ -781,9 +786,11 @@ def post(self, request, *args, **kwargs): signal_response = project_filter_users_to_remove.send( sender=self.__class__, users_to_remove=users_to_remove, project=project_obj ) - user_categories = signal_response[0][1] - users_no_removal = user_categories[0] - users_to_remove = user_categories[1] + if signal_response: + user_categories = signal_response[0][1] + users_to_remove = user_categories[1] + else: + users_to_remove = users_to_remove formset = formset_factory(ProjectRemoveUserForm, max_num=len(users_to_remove)) formset = formset(request.POST, initial=users_to_remove, prefix='userform') diff --git a/coldfront/core/test_helpers/utils.py b/coldfront/core/test_helpers/utils.py index fe1c858c0..8ce58c733 100644 --- a/coldfront/core/test_helpers/utils.py +++ b/coldfront/core/test_helpers/utils.py @@ -1,5 +1,5 @@ """utility functions for unit and integration testing""" -from bs4 import BeautifulSoup +from beautifulsoup4 import BeautifulSoup def page_contains_for_user(test_case, user, url, text): """Check that page contains text for user""" diff --git a/coldfront/plugins/system_monitor/utils.py b/coldfront/plugins/system_monitor/utils.py index f07003b98..c4d7a50c9 100644 --- a/coldfront/plugins/system_monitor/utils.py +++ b/coldfront/plugins/system_monitor/utils.py @@ -1,7 +1,7 @@ import re import requests -from bs4 import BeautifulSoup +from beautifulsoup4 import BeautifulSoup from coldfront.core.utils.common import import_from_settings