From f3e1826da7b40b2999bac1cb61b4557fd0c18dab Mon Sep 17 00:00:00 2001 From: zandercymatics <141044360+zandercymatics@users.noreply.github.com> Date: Tue, 19 Nov 2024 14:22:20 -0700 Subject: [PATCH] Main unit test --- src/registrar/tests/common.py | 128 ++++++++++++++------- src/registrar/tests/test_reports.py | 66 +++++++++-- src/registrar/utility/model_annotations.py | 2 +- 3 files changed, 146 insertions(+), 50 deletions(-) diff --git a/src/registrar/tests/common.py b/src/registrar/tests/common.py index 2528df2c9..6a5bbdd78 100644 --- a/src/registrar/tests/common.py +++ b/src/registrar/tests/common.py @@ -1,9 +1,7 @@ import os import logging - from contextlib import contextmanager import random -import boto3_mocking # type: ignore from string import ascii_uppercase import uuid from django.test import TestCase @@ -533,7 +531,6 @@ class AuditedAdminMockData: class MockDb(TestCase): @classmethod - @boto3_mocking.patching @less_console_noise_decorator def sharedSetUp(cls): cls.mock_client_class = MagicMock() @@ -567,7 +564,9 @@ class MockDb(TestCase): cls.federal_agency_1, _ = FederalAgency.objects.get_or_create(agency="World War I Centennial Commission") cls.federal_agency_2, _ = FederalAgency.objects.get_or_create(agency="Armed Forces Retirement Home") - cls.portfolio_1, _ = Portfolio.objects.get_or_create(creator=cls.custom_superuser, federal_agency=cls.federal_agency_1) + cls.portfolio_1, _ = Portfolio.objects.get_or_create( + creator=cls.custom_superuser, federal_agency=cls.federal_agency_1 + ) current_date = get_time_aware_date(datetime(2024, 4, 2)) # Create start and end dates using timedelta @@ -624,7 +623,10 @@ class MockDb(TestCase): portfolio=cls.portfolio_1, ) cls.domain_information_2, _ = DomainInformation.objects.get_or_create( - creator=cls.user, domain=cls.domain_2, generic_org_type="interstate", is_election_board=True, + creator=cls.user, + domain=cls.domain_2, + generic_org_type="interstate", + is_election_board=True, portfolio=cls.portfolio_1, ) cls.domain_information_3, _ = DomainInformation.objects.get_or_create( @@ -728,6 +730,12 @@ class MockDb(TestCase): status=DomainInvitation.DomainInvitationStatus.RETRIEVED, ) + _, created = DomainInvitation.objects.get_or_create( + email=cls.meoward_user.email, + domain=cls.domain_11, + status=DomainInvitation.DomainInvitationStatus.RETRIEVED, + ) + _, created = DomainInvitation.objects.get_or_create( email="woofwardthethird@rocks.com", domain=cls.domain_1, @@ -742,48 +750,84 @@ class MockDb(TestCase): email="squeaker@rocks.com", domain=cls.domain_10, status=DomainInvitation.DomainInvitationStatus.INVITED ) - # Add portfolio invitations + retrieve - with boto3_mocking.clients.handler_for("sesv2", cls.mock_client_class): - portfolio_invitation_1, _ = PortfolioInvitation.objects.get_or_create( - email=cls.meoward_user.email, - portfolio=cls.portfolio_1, - roles=[UserPortfolioRoleChoices.ORGANIZATION_MEMBER], - additional_permissions=[UserPortfolioPermissionChoices.EDIT_MEMBERS] - ) + cls.portfolio_invitation_1, _ = PortfolioInvitation.objects.get_or_create( + email=cls.meoward_user.email, + portfolio=cls.portfolio_1, + roles=[UserPortfolioRoleChoices.ORGANIZATION_MEMBER], + additional_permissions=[UserPortfolioPermissionChoices.EDIT_MEMBERS], + ) - portfolio_invitation_2, _ = PortfolioInvitation.objects.get_or_create( - email=cls.lebowski_user.email, portfolio=cls.portfolio_1, - roles=[UserPortfolioRoleChoices.ORGANIZATION_MEMBER], - additional_permissions=[UserPortfolioPermissionChoices.VIEW_MEMBERS] - ) + cls.portfolio_invitation_2, _ = PortfolioInvitation.objects.get_or_create( + email=cls.lebowski_user.email, + portfolio=cls.portfolio_1, + roles=[UserPortfolioRoleChoices.ORGANIZATION_MEMBER], + additional_permissions=[UserPortfolioPermissionChoices.VIEW_MEMBERS], + ) - portfolio_invitation_3, _ = PortfolioInvitation.objects.get_or_create( - email=cls.tired_user.email, portfolio=cls.portfolio_1, - roles=[UserPortfolioRoleChoices.ORGANIZATION_MEMBER], - additional_permissions=[UserPortfolioPermissionChoices.VIEW_ALL_REQUESTS] - ) + cls.portfolio_invitation_3, _ = PortfolioInvitation.objects.get_or_create( + email=cls.tired_user.email, + portfolio=cls.portfolio_1, + roles=[UserPortfolioRoleChoices.ORGANIZATION_MEMBER], + additional_permissions=[UserPortfolioPermissionChoices.VIEW_ALL_REQUESTS], + ) - portfolio_invitation_4, _ = PortfolioInvitation.objects.get_or_create( - email=cls.custom_superuser.email, portfolio=cls.portfolio_1, - roles=[UserPortfolioRoleChoices.ORGANIZATION_ADMIN], - additional_permissions=[ - UserPortfolioPermissionChoices.VIEW_MEMBERS, - UserPortfolioPermissionChoices.EDIT_MEMBERS, - UserPortfolioPermissionChoices.VIEW_ALL_REQUESTS, - UserPortfolioPermissionChoices.EDIT_REQUESTS - ] - ) + cls.portfolio_invitation_4, _ = PortfolioInvitation.objects.get_or_create( + email=cls.custom_superuser.email, + portfolio=cls.portfolio_1, + roles=[UserPortfolioRoleChoices.ORGANIZATION_ADMIN], + additional_permissions=[ + UserPortfolioPermissionChoices.VIEW_MEMBERS, + UserPortfolioPermissionChoices.EDIT_MEMBERS, + UserPortfolioPermissionChoices.VIEW_ALL_REQUESTS, + UserPortfolioPermissionChoices.EDIT_REQUESTS, + ], + ) - portfolio_invitation_5, _ = PortfolioInvitation.objects.get_or_create( - email=cls.custom_staffuser.email, portfolio=cls.portfolio_1, - roles=[UserPortfolioRoleChoices.ORGANIZATION_ADMIN] - ) + cls.portfolio_invitation_5, _ = PortfolioInvitation.objects.get_or_create( + email=cls.custom_staffuser.email, + portfolio=cls.portfolio_1, + roles=[UserPortfolioRoleChoices.ORGANIZATION_ADMIN], + ) - portfolio_invitation_1.retrieve() - portfolio_invitation_2.retrieve() - portfolio_invitation_3.retrieve() - portfolio_invitation_4.retrieve() - portfolio_invitation_5.retrieve() + # Add some invitations that we never retireve + PortfolioInvitation.objects.get_or_create( + email="nonexistentmember_1@igorville.gov", + portfolio=cls.portfolio_1, + roles=[UserPortfolioRoleChoices.ORGANIZATION_MEMBER], + additional_permissions=[UserPortfolioPermissionChoices.EDIT_MEMBERS], + ) + + PortfolioInvitation.objects.get_or_create( + email="nonexistentmember_2@igorville.gov", + portfolio=cls.portfolio_1, + roles=[UserPortfolioRoleChoices.ORGANIZATION_MEMBER], + additional_permissions=[UserPortfolioPermissionChoices.VIEW_MEMBERS], + ) + + PortfolioInvitation.objects.get_or_create( + email="nonexistentmember_3@igorville.gov", + portfolio=cls.portfolio_1, + roles=[UserPortfolioRoleChoices.ORGANIZATION_MEMBER], + additional_permissions=[UserPortfolioPermissionChoices.VIEW_ALL_REQUESTS], + ) + + PortfolioInvitation.objects.get_or_create( + email="nonexistentmember_4@igorville.gov", + portfolio=cls.portfolio_1, + roles=[UserPortfolioRoleChoices.ORGANIZATION_ADMIN], + additional_permissions=[ + UserPortfolioPermissionChoices.VIEW_MEMBERS, + UserPortfolioPermissionChoices.EDIT_MEMBERS, + UserPortfolioPermissionChoices.VIEW_ALL_REQUESTS, + UserPortfolioPermissionChoices.EDIT_REQUESTS, + ], + ) + + PortfolioInvitation.objects.get_or_create( + email="nonexistentmember_5@igorville.gov", + portfolio=cls.portfolio_1, + roles=[UserPortfolioRoleChoices.ORGANIZATION_ADMIN], + ) with less_console_noise(): cls.domain_request_1 = completed_domain_request( diff --git a/src/registrar/tests/test_reports.py b/src/registrar/tests/test_reports.py index d16937985..99f4daabf 100644 --- a/src/registrar/tests/test_reports.py +++ b/src/registrar/tests/test_reports.py @@ -5,6 +5,8 @@ from registrar.models import ( DomainRequest, Domain, UserDomainRole, + PortfolioInvitation, + User, ) from registrar.models import Portfolio, DraftDomain from registrar.models.user_portfolio_permission import UserPortfolioPermission @@ -48,6 +50,11 @@ from .common import ( from .common import GenericTestHelper from waffle.testutils import override_flag +from datetime import datetime +from django.contrib.admin.models import LogEntry, ADDITION +from django.contrib.contenttypes.models import ContentType +from django.utils import timezone +from waffle.testutils import override_flag class CsvReportsTest(MockDbForSharedTests): """Tests to determine if we are uploading our reports correctly.""" @@ -808,6 +815,47 @@ class MemberExportTest(MockDbForIndividualTests, MockEppLib): @less_console_noise_decorator def test_member_export(self): """Tests the member export report""" + content_type = ContentType.objects.get_for_model(PortfolioInvitation) + LogEntry.objects.create( + user=self.lebowski_user, + content_type=content_type, + object_id=self.portfolio_invitation_1.id, + object_repr=str(self.portfolio_invitation_1), + action_flag=ADDITION, + change_message="Created invitation", + action_time=timezone.make_aware(datetime(2023, 4, 12)) + ) + + # Create log entries for each remaining invitation. + # Exclude meoward and tired_user (to test null dates, etc). + for invitation in PortfolioInvitation.objects.exclude( + id__in=[self.portfolio_invitation_1.id, self.portfolio_invitation_3.id] + ): + LogEntry.objects.create( + user=self.custom_staffuser, + content_type=content_type, + object_id=invitation.id, + object_repr=str(invitation), + action_flag=ADDITION, + change_message="Created invitation", + action_time=timezone.make_aware(datetime(2024, 1, 15)) + ) + # Set last_login for some users + active_date = timezone.make_aware(datetime(2024, 2, 1)) + User.objects.filter( + id__in=[ + self.custom_superuser.id, + self.custom_staffuser.id + ] + ).update(last_login=active_date) + # Retrieve invitations + with boto3_mocking.clients.handler_for("sesv2", self.mock_client_class): + self.meoward_user.check_portfolio_invitations_on_login() + self.lebowski_user.check_portfolio_invitations_on_login() + self.tired_user.check_portfolio_invitations_on_login() + self.custom_superuser.check_portfolio_invitations_on_login() + self.custom_staffuser.check_portfolio_invitations_on_login() + # Create a request and add the user to the request request = self.factory.get("/") request.user = self.user @@ -824,18 +872,22 @@ class MemberExportTest(MockDbForIndividualTests, MockEppLib): csv_file.seek(0) # Read the content into a variable csv_content = csv_file.read() - print("what is the csv content?") - print(csv_content) expected_content = ( # Header "Email,Organization admin,Invited by,Invitation date,Last active,Domain requests," "Member management,Domain management,Number of domains,Domains\n" # Content - "meoward@rocks.com,False,Unknown,Unknown,Invited,None,Manager,False,0,\n" - "big_lebowski@dude.co,False,Unknown,Unknown,Invited,None,Viewer,False,0,\n" - "tired_sleepy@igorville.gov,False,Unknown,Unknown,Invited,Viewer,None,False,0,\n" - "icy_superuser@igorville.gov,True,Unknown,Unknown,Invited,Viewer Requester,Manager,False,0,\n" - "cozy_staffuser@igorville.gov,True,Unknown,Unknown,Invited,Viewer Requester,None,False,0,\n" + "meoward@rocks.com,False,big_lebowski@dude.co,2023-04-12,Invalid date,None," + "Manager,True,2,\"adomain2.gov,cdomain1.gov\"\n" + "big_lebowski@dude.co,False,help@get.gov,2024-01-15,Invalid date,None,Viewer,True,1,cdomain1.gov\n" + "tired_sleepy@igorville.gov,False,System,Unknown,Invalid date,Viewer,None,False,0,\n" + "icy_superuser@igorville.gov,True,help@get.gov,2024-01-15,2024-02-01,Viewer Requester,Manager,False,0,\n" + "cozy_staffuser@igorville.gov,True,help@get.gov,2024-01-15,2024-02-01,Viewer Requester,None,False,0,\n" + "nonexistentmember_1@igorville.gov,False,help@get.gov,2024-01-15,Invited,None,Manager,False,0,\n" + "nonexistentmember_2@igorville.gov,False,help@get.gov,2024-01-15,Invited,None,Viewer,False,0,\n" + "nonexistentmember_3@igorville.gov,False,help@get.gov,2024-01-15,Invited,Viewer,None,False,0,\n" + "nonexistentmember_4@igorville.gov,True,help@get.gov,2024-01-15,Invited,Viewer Requester,Manager,False,0,\n" + "nonexistentmember_5@igorville.gov,True,help@get.gov,2024-01-15,Invited,Viewer Requester,None,False,0,\n" ) # Normalize line endings and remove commas, # spaces and leading/trailing whitespace diff --git a/src/registrar/utility/model_annotations.py b/src/registrar/utility/model_annotations.py index 1fda52b25..5d6dc1294 100644 --- a/src/registrar/utility/model_annotations.py +++ b/src/registrar/utility/model_annotations.py @@ -420,7 +420,7 @@ class PortfolioInvitationModelAnnotation(BaseModelAnnotation): .order_by("action_time") .values("display_email")[:1] ), - Value("Unknown"), + Value("System"), output_field=CharField(), )