mirror of
https://github.com/cisagov/manage.get.gov.git
synced 2025-05-19 02:49:21 +02:00
Remove submitter from deleting orphaned contacts
This commit is contained in:
parent
d0b3dd7c46
commit
2c43533441
3 changed files with 134 additions and 16 deletions
|
@ -349,6 +349,139 @@ class HomeTests(TestWithUser):
|
||||||
# clean up
|
# clean up
|
||||||
domain_request.delete()
|
domain_request.delete()
|
||||||
|
|
||||||
|
@less_console_noise_decorator
|
||||||
|
def test_home_deletes_domain_request_and_orphans(self):
|
||||||
|
"""Tests if delete for DomainRequest deletes orphaned Contact objects"""
|
||||||
|
|
||||||
|
# Create the site and contacts to delete (orphaned)
|
||||||
|
contact = Contact.objects.create(
|
||||||
|
first_name="Henry",
|
||||||
|
last_name="Mcfakerson",
|
||||||
|
)
|
||||||
|
contact_shared = Contact.objects.create(
|
||||||
|
first_name="Relative",
|
||||||
|
last_name="Aether",
|
||||||
|
)
|
||||||
|
|
||||||
|
# Create two non-orphaned contacts
|
||||||
|
contact_2 = Contact.objects.create(
|
||||||
|
first_name="Saturn",
|
||||||
|
last_name="Mars",
|
||||||
|
)
|
||||||
|
|
||||||
|
# Attach a user object to a contact (should not be deleted)
|
||||||
|
contact_user, _ = Contact.objects.get_or_create(
|
||||||
|
first_name="Hank",
|
||||||
|
last_name="McFakey",
|
||||||
|
)
|
||||||
|
|
||||||
|
site = DraftDomain.objects.create(name="igorville.gov")
|
||||||
|
domain_request = DomainRequest.objects.create(
|
||||||
|
creator=self.user,
|
||||||
|
requested_domain=site,
|
||||||
|
status=DomainRequest.DomainRequestStatus.WITHDRAWN,
|
||||||
|
senior_official=contact,
|
||||||
|
)
|
||||||
|
domain_request.other_contacts.set([contact_2])
|
||||||
|
|
||||||
|
# Create a second domain request to attach contacts to
|
||||||
|
site_2 = DraftDomain.objects.create(name="teaville.gov")
|
||||||
|
domain_request_2 = DomainRequest.objects.create(
|
||||||
|
creator=self.user,
|
||||||
|
requested_domain=site_2,
|
||||||
|
status=DomainRequest.DomainRequestStatus.STARTED,
|
||||||
|
senior_official=contact_2,
|
||||||
|
)
|
||||||
|
domain_request_2.other_contacts.set([contact_shared])
|
||||||
|
|
||||||
|
igorville = DomainRequest.objects.filter(requested_domain__name="igorville.gov")
|
||||||
|
self.assertTrue(igorville.exists())
|
||||||
|
|
||||||
|
# Trigger the delete logic
|
||||||
|
self.client.post(reverse("domain-request-delete", kwargs={"pk": domain_request.pk}))
|
||||||
|
|
||||||
|
# igorville is now deleted
|
||||||
|
igorville = DomainRequest.objects.filter(requested_domain__name="igorville.gov")
|
||||||
|
self.assertFalse(igorville.exists())
|
||||||
|
|
||||||
|
# Check if the orphaned contacts were deleted
|
||||||
|
orphan = Contact.objects.filter(id=contact.id)
|
||||||
|
self.assertFalse(orphan.exists())
|
||||||
|
orphan = Contact.objects.filter(id=contact_user.id)
|
||||||
|
self.assertFalse(orphan.exists())
|
||||||
|
|
||||||
|
try:
|
||||||
|
edge_case = Contact.objects.filter(id=contact_2.id).get()
|
||||||
|
except Contact.DoesNotExist:
|
||||||
|
self.fail("contact_2 (a non-orphaned contact) was deleted")
|
||||||
|
|
||||||
|
self.assertEqual(edge_case, contact_2)
|
||||||
|
|
||||||
|
DomainRequest.objects.all().delete()
|
||||||
|
Contact.objects.all().delete()
|
||||||
|
|
||||||
|
@less_console_noise_decorator
|
||||||
|
def test_home_deletes_domain_request_and_shared_orphans(self):
|
||||||
|
"""Test the edge case for an object that will become orphaned after a delete
|
||||||
|
(but is not an orphan at the time of deletion)"""
|
||||||
|
|
||||||
|
# Create the site and contacts to delete (orphaned)
|
||||||
|
contact = Contact.objects.create(
|
||||||
|
first_name="Henry",
|
||||||
|
last_name="Mcfakerson",
|
||||||
|
)
|
||||||
|
contact_shared = Contact.objects.create(
|
||||||
|
first_name="Relative",
|
||||||
|
last_name="Aether",
|
||||||
|
)
|
||||||
|
|
||||||
|
# Create two non-orphaned contacts
|
||||||
|
contact_2 = Contact.objects.create(
|
||||||
|
first_name="Saturn",
|
||||||
|
last_name="Mars",
|
||||||
|
)
|
||||||
|
|
||||||
|
# Attach a user object to a contact (should not be deleted)
|
||||||
|
contact_user, _ = Contact.objects.get_or_create(
|
||||||
|
first_name="Hank",
|
||||||
|
last_name="McFakey",
|
||||||
|
)
|
||||||
|
|
||||||
|
site = DraftDomain.objects.create(name="igorville.gov")
|
||||||
|
domain_request = DomainRequest.objects.create(
|
||||||
|
creator=self.user,
|
||||||
|
requested_domain=site,
|
||||||
|
status=DomainRequest.DomainRequestStatus.WITHDRAWN,
|
||||||
|
senior_official=contact,
|
||||||
|
)
|
||||||
|
domain_request.other_contacts.set([contact_2])
|
||||||
|
|
||||||
|
# Create a second domain request to attach contacts to
|
||||||
|
site_2 = DraftDomain.objects.create(name="teaville.gov")
|
||||||
|
domain_request_2 = DomainRequest.objects.create(
|
||||||
|
creator=self.user,
|
||||||
|
requested_domain=site_2,
|
||||||
|
status=DomainRequest.DomainRequestStatus.STARTED,
|
||||||
|
senior_official=contact_2,
|
||||||
|
)
|
||||||
|
domain_request_2.other_contacts.set([contact_shared])
|
||||||
|
|
||||||
|
teaville = DomainRequest.objects.filter(requested_domain__name="teaville.gov")
|
||||||
|
self.assertTrue(teaville.exists())
|
||||||
|
|
||||||
|
# Trigger the delete logic
|
||||||
|
self.client.post(reverse("domain-request-delete", kwargs={"pk": domain_request_2.pk}))
|
||||||
|
|
||||||
|
teaville = DomainRequest.objects.filter(requested_domain__name="teaville.gov")
|
||||||
|
self.assertFalse(teaville.exists())
|
||||||
|
|
||||||
|
# Check if the orphaned contact was deleted
|
||||||
|
orphan = Contact.objects.filter(id=contact_shared.id)
|
||||||
|
self.assertFalse(orphan.exists())
|
||||||
|
|
||||||
|
DomainRequest.objects.all().delete()
|
||||||
|
Contact.objects.all().delete()
|
||||||
|
|
||||||
@less_console_noise_decorator
|
@less_console_noise_decorator
|
||||||
def test_domain_request_form_view(self):
|
def test_domain_request_form_view(self):
|
||||||
response = self.client.get("/request/", follow=True)
|
response = self.client.get("/request/", follow=True)
|
||||||
|
|
|
@ -159,7 +159,6 @@ class TestDomainPermissions(TestWithDomainPermissions):
|
||||||
"domain-dns-nameservers",
|
"domain-dns-nameservers",
|
||||||
"domain-org-name-address",
|
"domain-org-name-address",
|
||||||
"domain-senior-official",
|
"domain-senior-official",
|
||||||
"domain-your-contact-information",
|
|
||||||
"domain-security-email",
|
"domain-security-email",
|
||||||
]:
|
]:
|
||||||
with self.subTest(view_name=view_name):
|
with self.subTest(view_name=view_name):
|
||||||
|
@ -179,7 +178,6 @@ class TestDomainPermissions(TestWithDomainPermissions):
|
||||||
"domain-dns-nameservers",
|
"domain-dns-nameservers",
|
||||||
"domain-org-name-address",
|
"domain-org-name-address",
|
||||||
"domain-senior-official",
|
"domain-senior-official",
|
||||||
"domain-your-contact-information",
|
|
||||||
"domain-security-email",
|
"domain-security-email",
|
||||||
]:
|
]:
|
||||||
with self.subTest(view_name=view_name):
|
with self.subTest(view_name=view_name):
|
||||||
|
@ -200,7 +198,6 @@ class TestDomainPermissions(TestWithDomainPermissions):
|
||||||
"domain-dns-dnssec-dsdata",
|
"domain-dns-dnssec-dsdata",
|
||||||
"domain-org-name-address",
|
"domain-org-name-address",
|
||||||
"domain-senior-official",
|
"domain-senior-official",
|
||||||
"domain-your-contact-information",
|
|
||||||
"domain-security-email",
|
"domain-security-email",
|
||||||
]:
|
]:
|
||||||
for domain in [
|
for domain in [
|
||||||
|
@ -1601,16 +1598,6 @@ class TestDomainSuborganization(TestDomainOverview):
|
||||||
portfolio.delete()
|
portfolio.delete()
|
||||||
|
|
||||||
|
|
||||||
class TestDomainContactInformation(TestDomainOverview):
|
|
||||||
@less_console_noise_decorator
|
|
||||||
def test_domain_your_contact_information_content(self):
|
|
||||||
"""Logged-in user's contact information appears on the page."""
|
|
||||||
self.user.first_name = "Testy"
|
|
||||||
self.user.save()
|
|
||||||
page = self.app.get(reverse("domain-your-contact-information", kwargs={"pk": self.domain.id}))
|
|
||||||
self.assertContains(page, "Testy")
|
|
||||||
|
|
||||||
|
|
||||||
class TestDomainSecurityEmail(TestDomainOverview):
|
class TestDomainSecurityEmail(TestDomainOverview):
|
||||||
def test_domain_security_email_existing_security_contact(self):
|
def test_domain_security_email_existing_security_contact(self):
|
||||||
"""Can load domain's security email page."""
|
"""Can load domain's security email page."""
|
||||||
|
|
|
@ -827,18 +827,16 @@ class DomainRequestDeleteView(DomainRequestPermissionDeleteView):
|
||||||
|
|
||||||
# Get each contact object on the DomainRequest object
|
# Get each contact object on the DomainRequest object
|
||||||
so = domain_request.senior_official
|
so = domain_request.senior_official
|
||||||
creator = domain_request.creator
|
|
||||||
other_contacts = list(domain_request.other_contacts.all())
|
other_contacts = list(domain_request.other_contacts.all())
|
||||||
other_contact_ids = domain_request.other_contacts.all().values_list("id", flat=True)
|
other_contact_ids = domain_request.other_contacts.all().values_list("id", flat=True)
|
||||||
|
|
||||||
# Check if the desired item still exists in the DB
|
# Check if the desired item still exists in the DB
|
||||||
if check_db:
|
if check_db:
|
||||||
so = self._get_contacts_by_id([so.id]).first() if so is not None else None
|
so = self._get_contacts_by_id([so.id]).first() if so is not None else None
|
||||||
creator = self._get_contacts_by_id([creator.id]).first() if creator is not None else None
|
|
||||||
other_contacts = self._get_contacts_by_id(other_contact_ids)
|
other_contacts = self._get_contacts_by_id(other_contact_ids)
|
||||||
|
|
||||||
# Pair each contact with its db related name for use in checking if it has joins
|
# Pair each contact with its db related name for use in checking if it has joins
|
||||||
checked_contacts = [(so, "senior_official"), (creator, "submitted_domain_requests")]
|
checked_contacts = [(so, "senior_official")]
|
||||||
checked_contacts.extend((contact, "contact_domain_requests") for contact in other_contacts)
|
checked_contacts.extend((contact, "contact_domain_requests") for contact in other_contacts)
|
||||||
|
|
||||||
for contact, related_name in checked_contacts:
|
for contact, related_name in checked_contacts:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue