mirror of
https://github.com/cisagov/manage.get.gov.git
synced 2025-07-22 18:56:15 +02:00
Main unit test
This commit is contained in:
parent
c98a96e990
commit
f3e1826da7
3 changed files with 146 additions and 50 deletions
|
@ -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(
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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(),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue