Main unit test

This commit is contained in:
zandercymatics 2024-11-19 14:22:20 -07:00
parent c98a96e990
commit f3e1826da7
No known key found for this signature in database
GPG key ID: FF4636ABEC9682B7
3 changed files with 146 additions and 50 deletions

View file

@ -1,9 +1,7 @@
import os import os
import logging import logging
from contextlib import contextmanager from contextlib import contextmanager
import random import random
import boto3_mocking # type: ignore
from string import ascii_uppercase from string import ascii_uppercase
import uuid import uuid
from django.test import TestCase from django.test import TestCase
@ -533,7 +531,6 @@ class AuditedAdminMockData:
class MockDb(TestCase): class MockDb(TestCase):
@classmethod @classmethod
@boto3_mocking.patching
@less_console_noise_decorator @less_console_noise_decorator
def sharedSetUp(cls): def sharedSetUp(cls):
cls.mock_client_class = MagicMock() 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_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.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)) current_date = get_time_aware_date(datetime(2024, 4, 2))
# Create start and end dates using timedelta # Create start and end dates using timedelta
@ -624,7 +623,10 @@ class MockDb(TestCase):
portfolio=cls.portfolio_1, portfolio=cls.portfolio_1,
) )
cls.domain_information_2, _ = DomainInformation.objects.get_or_create( 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, portfolio=cls.portfolio_1,
) )
cls.domain_information_3, _ = DomainInformation.objects.get_or_create( cls.domain_information_3, _ = DomainInformation.objects.get_or_create(
@ -728,6 +730,12 @@ class MockDb(TestCase):
status=DomainInvitation.DomainInvitationStatus.RETRIEVED, 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( _, created = DomainInvitation.objects.get_or_create(
email="woofwardthethird@rocks.com", email="woofwardthethird@rocks.com",
domain=cls.domain_1, domain=cls.domain_1,
@ -742,48 +750,84 @@ class MockDb(TestCase):
email="squeaker@rocks.com", domain=cls.domain_10, status=DomainInvitation.DomainInvitationStatus.INVITED email="squeaker@rocks.com", domain=cls.domain_10, status=DomainInvitation.DomainInvitationStatus.INVITED
) )
# Add portfolio invitations + retrieve cls.portfolio_invitation_1, _ = PortfolioInvitation.objects.get_or_create(
with boto3_mocking.clients.handler_for("sesv2", cls.mock_client_class): email=cls.meoward_user.email,
portfolio_invitation_1, _ = PortfolioInvitation.objects.get_or_create( portfolio=cls.portfolio_1,
email=cls.meoward_user.email, roles=[UserPortfolioRoleChoices.ORGANIZATION_MEMBER],
portfolio=cls.portfolio_1, additional_permissions=[UserPortfolioPermissionChoices.EDIT_MEMBERS],
roles=[UserPortfolioRoleChoices.ORGANIZATION_MEMBER], )
additional_permissions=[UserPortfolioPermissionChoices.EDIT_MEMBERS]
)
portfolio_invitation_2, _ = PortfolioInvitation.objects.get_or_create( cls.portfolio_invitation_2, _ = PortfolioInvitation.objects.get_or_create(
email=cls.lebowski_user.email, portfolio=cls.portfolio_1, email=cls.lebowski_user.email,
roles=[UserPortfolioRoleChoices.ORGANIZATION_MEMBER], portfolio=cls.portfolio_1,
additional_permissions=[UserPortfolioPermissionChoices.VIEW_MEMBERS] roles=[UserPortfolioRoleChoices.ORGANIZATION_MEMBER],
) additional_permissions=[UserPortfolioPermissionChoices.VIEW_MEMBERS],
)
portfolio_invitation_3, _ = PortfolioInvitation.objects.get_or_create( cls.portfolio_invitation_3, _ = PortfolioInvitation.objects.get_or_create(
email=cls.tired_user.email, portfolio=cls.portfolio_1, email=cls.tired_user.email,
roles=[UserPortfolioRoleChoices.ORGANIZATION_MEMBER], portfolio=cls.portfolio_1,
additional_permissions=[UserPortfolioPermissionChoices.VIEW_ALL_REQUESTS] roles=[UserPortfolioRoleChoices.ORGANIZATION_MEMBER],
) additional_permissions=[UserPortfolioPermissionChoices.VIEW_ALL_REQUESTS],
)
portfolio_invitation_4, _ = PortfolioInvitation.objects.get_or_create( cls.portfolio_invitation_4, _ = PortfolioInvitation.objects.get_or_create(
email=cls.custom_superuser.email, portfolio=cls.portfolio_1, email=cls.custom_superuser.email,
roles=[UserPortfolioRoleChoices.ORGANIZATION_ADMIN], portfolio=cls.portfolio_1,
additional_permissions=[ roles=[UserPortfolioRoleChoices.ORGANIZATION_ADMIN],
UserPortfolioPermissionChoices.VIEW_MEMBERS, additional_permissions=[
UserPortfolioPermissionChoices.EDIT_MEMBERS, UserPortfolioPermissionChoices.VIEW_MEMBERS,
UserPortfolioPermissionChoices.VIEW_ALL_REQUESTS, UserPortfolioPermissionChoices.EDIT_MEMBERS,
UserPortfolioPermissionChoices.EDIT_REQUESTS UserPortfolioPermissionChoices.VIEW_ALL_REQUESTS,
] UserPortfolioPermissionChoices.EDIT_REQUESTS,
) ],
)
portfolio_invitation_5, _ = PortfolioInvitation.objects.get_or_create( cls.portfolio_invitation_5, _ = PortfolioInvitation.objects.get_or_create(
email=cls.custom_staffuser.email, portfolio=cls.portfolio_1, email=cls.custom_staffuser.email,
roles=[UserPortfolioRoleChoices.ORGANIZATION_ADMIN] portfolio=cls.portfolio_1,
) roles=[UserPortfolioRoleChoices.ORGANIZATION_ADMIN],
)
portfolio_invitation_1.retrieve() # Add some invitations that we never retireve
portfolio_invitation_2.retrieve() PortfolioInvitation.objects.get_or_create(
portfolio_invitation_3.retrieve() email="nonexistentmember_1@igorville.gov",
portfolio_invitation_4.retrieve() portfolio=cls.portfolio_1,
portfolio_invitation_5.retrieve() 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(): with less_console_noise():
cls.domain_request_1 = completed_domain_request( cls.domain_request_1 = completed_domain_request(

View file

@ -5,6 +5,8 @@ from registrar.models import (
DomainRequest, DomainRequest,
Domain, Domain,
UserDomainRole, UserDomainRole,
PortfolioInvitation,
User,
) )
from registrar.models import Portfolio, DraftDomain from registrar.models import Portfolio, DraftDomain
from registrar.models.user_portfolio_permission import UserPortfolioPermission from registrar.models.user_portfolio_permission import UserPortfolioPermission
@ -48,6 +50,11 @@ from .common import (
from .common import GenericTestHelper from .common import GenericTestHelper
from waffle.testutils import override_flag 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): class CsvReportsTest(MockDbForSharedTests):
"""Tests to determine if we are uploading our reports correctly.""" """Tests to determine if we are uploading our reports correctly."""
@ -808,6 +815,47 @@ class MemberExportTest(MockDbForIndividualTests, MockEppLib):
@less_console_noise_decorator @less_console_noise_decorator
def test_member_export(self): def test_member_export(self):
"""Tests the member export report""" """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 # Create a request and add the user to the request
request = self.factory.get("/") request = self.factory.get("/")
request.user = self.user request.user = self.user
@ -824,18 +872,22 @@ class MemberExportTest(MockDbForIndividualTests, MockEppLib):
csv_file.seek(0) csv_file.seek(0)
# Read the content into a variable # Read the content into a variable
csv_content = csv_file.read() csv_content = csv_file.read()
print("what is the csv content?")
print(csv_content)
expected_content = ( expected_content = (
# Header # Header
"Email,Organization admin,Invited by,Invitation date,Last active,Domain requests," "Email,Organization admin,Invited by,Invitation date,Last active,Domain requests,"
"Member management,Domain management,Number of domains,Domains\n" "Member management,Domain management,Number of domains,Domains\n"
# Content # Content
"meoward@rocks.com,False,Unknown,Unknown,Invited,None,Manager,False,0,\n" "meoward@rocks.com,False,big_lebowski@dude.co,2023-04-12,Invalid date,None,"
"big_lebowski@dude.co,False,Unknown,Unknown,Invited,None,Viewer,False,0,\n" "Manager,True,2,\"adomain2.gov,cdomain1.gov\"\n"
"tired_sleepy@igorville.gov,False,Unknown,Unknown,Invited,Viewer,None,False,0,\n" "big_lebowski@dude.co,False,help@get.gov,2024-01-15,Invalid date,None,Viewer,True,1,cdomain1.gov\n"
"icy_superuser@igorville.gov,True,Unknown,Unknown,Invited,Viewer Requester,Manager,False,0,\n" "tired_sleepy@igorville.gov,False,System,Unknown,Invalid date,Viewer,None,False,0,\n"
"cozy_staffuser@igorville.gov,True,Unknown,Unknown,Invited,Viewer Requester,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, # Normalize line endings and remove commas,
# spaces and leading/trailing whitespace # spaces and leading/trailing whitespace

View file

@ -420,7 +420,7 @@ class PortfolioInvitationModelAnnotation(BaseModelAnnotation):
.order_by("action_time") .order_by("action_time")
.values("display_email")[:1] .values("display_email")[:1]
), ),
Value("Unknown"), Value("System"),
output_field=CharField(), output_field=CharField(),
) )