From 4a06a94f4619fd8fa1d785d4bbe701cd1215cb21 Mon Sep 17 00:00:00 2001 From: Rachid Mrad Date: Wed, 2 Oct 2024 21:37:36 -0400 Subject: [PATCH] admin redundant test --- src/registrar/admin.py | 10 +++++ src/registrar/tests/test_admin_request.py | 52 +++++++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/src/registrar/admin.py b/src/registrar/admin.py index dcd7bee99..939f2056d 100644 --- a/src/registrar/admin.py +++ b/src/registrar/admin.py @@ -2022,6 +2022,16 @@ class DomainRequestAdmin(ListHeaderAdmin, ImportExportModelAdmin): # duplicated in the model and the error is raised from the model. # This avoids an ugly Django error screen. error_message = "This action is not permitted. The domain is already active." + elif ( + original_obj.status != models.DomainRequest.DomainRequestStatus.APPROVED + and obj.status == models.DomainRequest.DomainRequestStatus.APPROVED + and Domain.objects.filter(name=original_obj.requested_domain.name).exists() + ): + # REDUNDANT CHECK: + # This action (approving a request when the domain exists) + # would still not go through even without this check as the rules are + # duplicated in the model and the error is raised from the model. + error_message = FSMDomainRequestError.get_error_message(FSMErrorCodes.APPROVE_DOMAIN_IN_USE) elif obj.status == models.DomainRequest.DomainRequestStatus.REJECTED and not obj.rejection_reason: # This condition should never be triggered. # The opposite of this condition is acceptable (rejected -> other status and rejection_reason) diff --git a/src/registrar/tests/test_admin_request.py b/src/registrar/tests/test_admin_request.py index a9b073472..56cfb3473 100644 --- a/src/registrar/tests/test_admin_request.py +++ b/src/registrar/tests/test_admin_request.py @@ -1846,6 +1846,58 @@ class TestDomainRequestAdmin(MockEppLib): def test_side_effects_when_saving_approved_to_ineligible(self): self.trigger_saving_approved_to_another_state(False, DomainRequest.DomainRequestStatus.INELIGIBLE) + @less_console_noise + def test_error_when_saving_to_approved_and_domain_exists(self): + """Redundant admin check on model transition not allowed.""" + Domain.objects.create(name="wabbitseason.gov") + + new_request = completed_domain_request( + status=DomainRequest.DomainRequestStatus.SUBMITTED, name="wabbitseason.gov" + ) + + # Create a request object with a superuser + request = self.factory.post("/admin/registrar/domainrequest/{}/change/".format(new_request.pk)) + request.user = self.superuser + + request.session = {} + + # Use ExitStack to combine patch contexts + with ExitStack() as stack: + # Patch Domain.is_active and django.contrib.messages.error simultaneously + stack.enter_context(patch.object(messages, "error")) + + new_request.status = DomainRequest.DomainRequestStatus.APPROVED + + self.admin.save_model(request, new_request, None, True) + + messages.error.assert_called_once_with( + request, + "Cannot approve. Requested domain is already in use.", + ) + + @less_console_noise + def test_no_error_when_saving_to_approved_and_domain_exists(self): + """The negative of the redundant admin check on model transition not allowed.""" + new_request = completed_domain_request(status=DomainRequest.DomainRequestStatus.SUBMITTED) + + # Create a request object with a superuser + request = self.factory.post("/admin/registrar/domainrequest/{}/change/".format(new_request.pk)) + request.user = self.superuser + + request.session = {} + + # Use ExitStack to combine patch contexts + with ExitStack() as stack: + # Patch Domain.is_active and django.contrib.messages.error simultaneously + stack.enter_context(patch.object(messages, "error")) + + new_request.status = DomainRequest.DomainRequestStatus.APPROVED + + self.admin.save_model(request, new_request, None, True) + + # Assert that the error message was never called + messages.error.assert_not_called() + def test_has_correct_filters(self): """ This test verifies that DomainRequestAdmin has the correct filters set up.