diff --git a/src/registrar/tests/test_views.py b/src/registrar/tests/test_views.py index 4e5553976..f142fb966 100644 --- a/src/registrar/tests/test_views.py +++ b/src/registrar/tests/test_views.py @@ -349,6 +349,139 @@ class HomeTests(TestWithUser): # clean up 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 def test_domain_request_form_view(self): response = self.client.get("/request/", follow=True) diff --git a/src/registrar/tests/test_views_domain.py b/src/registrar/tests/test_views_domain.py index 980a1bf12..1da73087e 100644 --- a/src/registrar/tests/test_views_domain.py +++ b/src/registrar/tests/test_views_domain.py @@ -159,7 +159,6 @@ class TestDomainPermissions(TestWithDomainPermissions): "domain-dns-nameservers", "domain-org-name-address", "domain-senior-official", - "domain-your-contact-information", "domain-security-email", ]: with self.subTest(view_name=view_name): @@ -179,7 +178,6 @@ class TestDomainPermissions(TestWithDomainPermissions): "domain-dns-nameservers", "domain-org-name-address", "domain-senior-official", - "domain-your-contact-information", "domain-security-email", ]: with self.subTest(view_name=view_name): @@ -200,7 +198,6 @@ class TestDomainPermissions(TestWithDomainPermissions): "domain-dns-dnssec-dsdata", "domain-org-name-address", "domain-senior-official", - "domain-your-contact-information", "domain-security-email", ]: for domain in [ @@ -1601,16 +1598,6 @@ class TestDomainSuborganization(TestDomainOverview): 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): def test_domain_security_email_existing_security_contact(self): """Can load domain's security email page.""" diff --git a/src/registrar/views/domain_request.py b/src/registrar/views/domain_request.py index 220cfcae1..05f4e38ff 100644 --- a/src/registrar/views/domain_request.py +++ b/src/registrar/views/domain_request.py @@ -827,18 +827,16 @@ class DomainRequestDeleteView(DomainRequestPermissionDeleteView): # Get each contact object on the DomainRequest object so = domain_request.senior_official - creator = domain_request.creator other_contacts = list(domain_request.other_contacts.all()) other_contact_ids = domain_request.other_contacts.all().values_list("id", flat=True) # Check if the desired item still exists in the DB if check_db: 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) # 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) for contact, related_name in checked_contacts: