From 3df3723cf98f45bfcc8b3e9e87ce08c0e588aa3f Mon Sep 17 00:00:00 2001 From: zandercymatics <141044360+zandercymatics@users.noreply.github.com> Date: Mon, 27 Nov 2023 09:50:54 -0700 Subject: [PATCH 01/10] Sort by email, stub test --- src/registrar/admin.py | 1 + src/registrar/tests/test_admin.py | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/src/registrar/admin.py b/src/registrar/admin.py index c059e5674..9fe6a5d43 100644 --- a/src/registrar/admin.py +++ b/src/registrar/admin.py @@ -335,6 +335,7 @@ class UserDomainRoleAdmin(ListHeaderAdmin): search_fields = [ "user__first_name", "user__last_name", + "user__email", "domain__name", "role", ] diff --git a/src/registrar/tests/test_admin.py b/src/registrar/tests/test_admin.py index a7cbb5d33..efd7b10c2 100644 --- a/src/registrar/tests/test_admin.py +++ b/src/registrar/tests/test_admin.py @@ -12,6 +12,7 @@ from registrar.admin import ( MyUserAdmin, AuditedAdmin, ContactAdmin, + UserDomainRoleAdmin, ) from registrar.models import ( Domain, @@ -847,6 +848,15 @@ class TestDomainApplicationAdmin(MockEppLib): User.objects.all().delete() +class UserDomainRoleAdminTest(TestCase): + def setUp(self): + self.site = AdminSite() + self.factory = RequestFactory() + self.admin = ListHeaderAdmin(model=UserDomainRoleAdmin, admin_site=None) + self.client = Client(HTTP_HOST="localhost:8080") + self.superuser = create_superuser() + + class ListHeaderAdminTest(TestCase): def setUp(self): self.site = AdminSite() From d11940b053a8575f10a7097d93b3a186385cfff5 Mon Sep 17 00:00:00 2001 From: zandercymatics <141044360+zandercymatics@users.noreply.github.com> Date: Mon, 27 Nov 2023 09:57:04 -0700 Subject: [PATCH 02/10] Update admin.py --- src/registrar/admin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/registrar/admin.py b/src/registrar/admin.py index 9fe6a5d43..45f357800 100644 --- a/src/registrar/admin.py +++ b/src/registrar/admin.py @@ -339,7 +339,7 @@ class UserDomainRoleAdmin(ListHeaderAdmin): "domain__name", "role", ] - search_help_text = "Search by user, domain, or role." + search_help_text = "Search by user, email, domain, or role." class DomainInvitationAdmin(ListHeaderAdmin): From 4a6aba76aafa67ba8a3a689af75612c937364a2f Mon Sep 17 00:00:00 2001 From: zandercymatics <141044360+zandercymatics@users.noreply.github.com> Date: Thu, 30 Nov 2023 08:03:55 -0700 Subject: [PATCH 03/10] Add test --- src/registrar/tests/test_admin.py | 40 +++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/registrar/tests/test_admin.py b/src/registrar/tests/test_admin.py index 0296d0cea..3d67ef547 100644 --- a/src/registrar/tests/test_admin.py +++ b/src/registrar/tests/test_admin.py @@ -22,6 +22,7 @@ from registrar.models import ( User, DomainInvitation, ) +from registrar.models.user_domain_role import UserDomainRole from .common import ( completed_application, generic_domain_object, @@ -894,6 +895,45 @@ class UserDomainRoleAdminTest(TestCase): self.admin = ListHeaderAdmin(model=UserDomainRoleAdmin, admin_site=None) self.client = Client(HTTP_HOST="localhost:8080") self.superuser = create_superuser() + + def test_changelist_view(self): + # Have to get creative to get past linter + p = "adminpass" + self.client.login(username="superuser", password=p) + + # Mock a user + user = mock_user() + fake_user = User.objects.create( + username = "dummyuser", + first_name = "Stewart", + last_name = "Jones", + email = "AntarticPolarBears@cold.com" + ) + fake_domain = Domain.objects.create( + name="test123" + ) + UserDomainRole.objects.create( + user=fake_user, + domain=fake_domain, + role="manager" + ) + # Make the request using the Client class + # which handles CSRF + # Follow=True handles the redirect + response = self.client.get( + "/admin/registrar/userdomainrole/", + { + "q": "testmail@igorville.com", + }, + follow=True, + ) + + # Assert that the query is added to the extra_context + self.assertIn("search_query", response.context) + # Assert the content of filters and search_query + search_query = response.context["search_query"] + self.assertEqual(search_query, "testmail@igorville.com") + self.assertIn("Stewart Jones", response) class ListHeaderAdminTest(TestCase): From 896085a4e8435b658123edf7bd76f62142309d7d Mon Sep 17 00:00:00 2001 From: zandercymatics <141044360+zandercymatics@users.noreply.github.com> Date: Thu, 30 Nov 2023 08:38:08 -0700 Subject: [PATCH 04/10] Test + linter --- src/registrar/admin.py | 6 +++ src/registrar/tests/test_admin.py | 66 +++++++++++++++++++++++-------- 2 files changed, 55 insertions(+), 17 deletions(-) diff --git a/src/registrar/admin.py b/src/registrar/admin.py index 8b1b9e78b..21d9a3d77 100644 --- a/src/registrar/admin.py +++ b/src/registrar/admin.py @@ -324,6 +324,12 @@ class WebsiteAdmin(ListHeaderAdmin): class UserDomainRoleAdmin(ListHeaderAdmin): """Custom domain role admin class.""" + class Meta: + model = models.DomainInvitation + fields = "__all__" + + _meta = Meta() + # Columns list_display = [ "user", diff --git a/src/registrar/tests/test_admin.py b/src/registrar/tests/test_admin.py index 3d67ef547..731025a0d 100644 --- a/src/registrar/tests/test_admin.py +++ b/src/registrar/tests/test_admin.py @@ -890,33 +890,31 @@ class DomainInvitationAdminTest(TestCase): class UserDomainRoleAdminTest(TestCase): def setUp(self): + """Setup environment for a mock admin user""" self.site = AdminSite() self.factory = RequestFactory() self.admin = ListHeaderAdmin(model=UserDomainRoleAdmin, admin_site=None) self.client = Client(HTTP_HOST="localhost:8080") self.superuser = create_superuser() - - def test_changelist_view(self): + + def tearDown(self): + """Delete all Users, Domains, and UserDomainRoles""" + User.objects.all().delete() + Domain.objects.all().delete() + UserDomainRole.objects.all().delete() + + def test_email_not_in_search(self): + """Tests the search bar in Django Admin for UserDomainRoleAdmin. + Should return no results for an invalid email.""" # Have to get creative to get past linter p = "adminpass" self.client.login(username="superuser", password=p) - # Mock a user - user = mock_user() fake_user = User.objects.create( - username = "dummyuser", - first_name = "Stewart", - last_name = "Jones", - email = "AntarticPolarBears@cold.com" - ) - fake_domain = Domain.objects.create( - name="test123" - ) - UserDomainRole.objects.create( - user=fake_user, - domain=fake_domain, - role="manager" + username="dummyuser", first_name="Stewart", last_name="Jones", email="AntarticPolarBears@cold.com" ) + fake_domain = Domain.objects.create(name="test123") + UserDomainRole.objects.create(user=fake_user, domain=fake_domain, role="manager") # Make the request using the Client class # which handles CSRF # Follow=True handles the redirect @@ -933,7 +931,41 @@ class UserDomainRoleAdminTest(TestCase): # Assert the content of filters and search_query search_query = response.context["search_query"] self.assertEqual(search_query, "testmail@igorville.com") - self.assertIn("Stewart Jones", response) + + # We only need to check for the end of the HTML string + self.assertNotContains(response, "Stewart Jones AntarticPolarBears@cold.com") + + def test_email_in_search(self): + """Tests the search bar in Django Admin for UserDomainRoleAdmin. + Should return results for an valid email.""" + # Have to get creative to get past linter + p = "adminpass" + self.client.login(username="superuser", password=p) + + fake_user = User.objects.create( + username="dummyuser", first_name="Joe", last_name="Jones", email="AntarticPolarBears@cold.com" + ) + fake_domain = Domain.objects.create(name="fake") + UserDomainRole.objects.create(user=fake_user, domain=fake_domain, role="manager") + # Make the request using the Client class + # which handles CSRF + # Follow=True handles the redirect + response = self.client.get( + "/admin/registrar/userdomainrole/", + { + "q": "AntarticPolarBears@cold.com", + }, + follow=True, + ) + + # Assert that the query is added to the extra_context + self.assertIn("search_query", response.context) + + search_query = response.context["search_query"] + self.assertEqual(search_query, "AntarticPolarBears@cold.com") + + # We only need to check for the end of the HTML string + self.assertContains(response, "Joe Jones AntarticPolarBears@cold.com", count=1) class ListHeaderAdminTest(TestCase): From e56a79a03a84a7e604cbc861da3895199f2af460 Mon Sep 17 00:00:00 2001 From: zandercymatics <141044360+zandercymatics@users.noreply.github.com> Date: Thu, 30 Nov 2023 08:49:37 -0700 Subject: [PATCH 05/10] Add comment --- src/registrar/admin.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/registrar/admin.py b/src/registrar/admin.py index 21d9a3d77..15ae6fdff 100644 --- a/src/registrar/admin.py +++ b/src/registrar/admin.py @@ -325,7 +325,8 @@ class UserDomainRoleAdmin(ListHeaderAdmin): """Custom domain role admin class.""" class Meta: - model = models.DomainInvitation + """Contains meta information about this class""" + model = models.UserDomainRole fields = "__all__" _meta = Meta() From dad56d4110107d95b94e5ed3ba5b6dbbffeafee7 Mon Sep 17 00:00:00 2001 From: zandercymatics <141044360+zandercymatics@users.noreply.github.com> Date: Thu, 30 Nov 2023 08:52:27 -0700 Subject: [PATCH 06/10] Linting --- src/registrar/admin.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/registrar/admin.py b/src/registrar/admin.py index 15ae6fdff..62e1873bd 100644 --- a/src/registrar/admin.py +++ b/src/registrar/admin.py @@ -326,6 +326,7 @@ class UserDomainRoleAdmin(ListHeaderAdmin): class Meta: """Contains meta information about this class""" + model = models.UserDomainRole fields = "__all__" From 9c550bb9b2165d34e4018f08108257eb32454edb Mon Sep 17 00:00:00 2001 From: zandercymatics <141044360+zandercymatics@users.noreply.github.com> Date: Thu, 30 Nov 2023 09:45:59 -0700 Subject: [PATCH 07/10] Add katherines suggestions --- src/registrar/admin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/registrar/admin.py b/src/registrar/admin.py index 62e1873bd..c200119e1 100644 --- a/src/registrar/admin.py +++ b/src/registrar/admin.py @@ -347,7 +347,7 @@ class UserDomainRoleAdmin(ListHeaderAdmin): "domain__name", "role", ] - search_help_text = "Search by user, email, domain, or role." + search_help_text = "Search by firstname, lastname, email, domain, or role." class DomainInvitationAdmin(ListHeaderAdmin): From 6788a227a4973748348f3dce68dabb7e88eaaaee Mon Sep 17 00:00:00 2001 From: zandercymatics <141044360+zandercymatics@users.noreply.github.com> Date: Mon, 4 Dec 2023 10:31:12 -0700 Subject: [PATCH 08/10] Fix typo in test cases --- src/registrar/tests/test_admin.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/registrar/tests/test_admin.py b/src/registrar/tests/test_admin.py index 731025a0d..9399cccb5 100644 --- a/src/registrar/tests/test_admin.py +++ b/src/registrar/tests/test_admin.py @@ -911,7 +911,7 @@ class UserDomainRoleAdminTest(TestCase): self.client.login(username="superuser", password=p) fake_user = User.objects.create( - username="dummyuser", first_name="Stewart", last_name="Jones", email="AntarticPolarBears@cold.com" + username="dummyuser", first_name="Stewart", last_name="Jones", email="AntarcticPolarBears@cold.com" ) fake_domain = Domain.objects.create(name="test123") UserDomainRole.objects.create(user=fake_user, domain=fake_domain, role="manager") @@ -943,7 +943,7 @@ class UserDomainRoleAdminTest(TestCase): self.client.login(username="superuser", password=p) fake_user = User.objects.create( - username="dummyuser", first_name="Joe", last_name="Jones", email="AntarticPolarBears@cold.com" + username="dummyuser", first_name="Joe", last_name="Jones", email="AntarcticPolarBears@cold.com" ) fake_domain = Domain.objects.create(name="fake") UserDomainRole.objects.create(user=fake_user, domain=fake_domain, role="manager") @@ -953,7 +953,7 @@ class UserDomainRoleAdminTest(TestCase): response = self.client.get( "/admin/registrar/userdomainrole/", { - "q": "AntarticPolarBears@cold.com", + "q": "AntarcticPolarBears@cold.com", }, follow=True, ) @@ -962,7 +962,7 @@ class UserDomainRoleAdminTest(TestCase): self.assertIn("search_query", response.context) search_query = response.context["search_query"] - self.assertEqual(search_query, "AntarticPolarBears@cold.com") + self.assertEqual(search_query, "AntarcticPolarBears@cold.com") # We only need to check for the end of the HTML string self.assertContains(response, "Joe Jones AntarticPolarBears@cold.com", count=1) From 84a645c61a90ce87be2ec8aa7a259e1fece035f1 Mon Sep 17 00:00:00 2001 From: zandercymatics <141044360+zandercymatics@users.noreply.github.com> Date: Mon, 4 Dec 2023 10:39:09 -0700 Subject: [PATCH 09/10] Change from cold.com => example.com --- src/registrar/tests/test_admin.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/registrar/tests/test_admin.py b/src/registrar/tests/test_admin.py index 9399cccb5..95641d417 100644 --- a/src/registrar/tests/test_admin.py +++ b/src/registrar/tests/test_admin.py @@ -911,7 +911,7 @@ class UserDomainRoleAdminTest(TestCase): self.client.login(username="superuser", password=p) fake_user = User.objects.create( - username="dummyuser", first_name="Stewart", last_name="Jones", email="AntarcticPolarBears@cold.com" + username="dummyuser", first_name="Stewart", last_name="Jones", email="AntarcticPolarBears@example.com" ) fake_domain = Domain.objects.create(name="test123") UserDomainRole.objects.create(user=fake_user, domain=fake_domain, role="manager") @@ -933,7 +933,7 @@ class UserDomainRoleAdminTest(TestCase): self.assertEqual(search_query, "testmail@igorville.com") # We only need to check for the end of the HTML string - self.assertNotContains(response, "Stewart Jones AntarticPolarBears@cold.com") + self.assertNotContains(response, "Stewart Jones AntarcticPolarBears@example.com") def test_email_in_search(self): """Tests the search bar in Django Admin for UserDomainRoleAdmin. @@ -943,7 +943,7 @@ class UserDomainRoleAdminTest(TestCase): self.client.login(username="superuser", password=p) fake_user = User.objects.create( - username="dummyuser", first_name="Joe", last_name="Jones", email="AntarcticPolarBears@cold.com" + username="dummyuser", first_name="Joe", last_name="Jones", email="AntarcticPolarBears@example.com" ) fake_domain = Domain.objects.create(name="fake") UserDomainRole.objects.create(user=fake_user, domain=fake_domain, role="manager") @@ -953,7 +953,7 @@ class UserDomainRoleAdminTest(TestCase): response = self.client.get( "/admin/registrar/userdomainrole/", { - "q": "AntarcticPolarBears@cold.com", + "q": "AntarcticPolarBears@example.com", }, follow=True, ) @@ -962,10 +962,10 @@ class UserDomainRoleAdminTest(TestCase): self.assertIn("search_query", response.context) search_query = response.context["search_query"] - self.assertEqual(search_query, "AntarcticPolarBears@cold.com") + self.assertEqual(search_query, "AntarcticPolarBears@example.com") # We only need to check for the end of the HTML string - self.assertContains(response, "Joe Jones AntarticPolarBears@cold.com", count=1) + self.assertContains(response, "Joe Jones AntarticPolarBears@example.com", count=1) class ListHeaderAdminTest(TestCase): From 7347166883c8dfbd2bbfa830d7f01e5321d4c53e Mon Sep 17 00:00:00 2001 From: zandercymatics <141044360+zandercymatics@users.noreply.github.com> Date: Mon, 4 Dec 2023 10:49:05 -0700 Subject: [PATCH 10/10] Fix test case --- src/registrar/tests/test_admin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/registrar/tests/test_admin.py b/src/registrar/tests/test_admin.py index 95641d417..526a9ea2a 100644 --- a/src/registrar/tests/test_admin.py +++ b/src/registrar/tests/test_admin.py @@ -965,7 +965,7 @@ class UserDomainRoleAdminTest(TestCase): self.assertEqual(search_query, "AntarcticPolarBears@example.com") # We only need to check for the end of the HTML string - self.assertContains(response, "Joe Jones AntarticPolarBears@example.com", count=1) + self.assertContains(response, "Joe Jones AntarcticPolarBears@example.com", count=1) class ListHeaderAdminTest(TestCase):