mirror of
https://github.com/cisagov/manage.get.gov.git
synced 2025-07-29 14:06:32 +02:00
Adding in unit tests
This commit is contained in:
parent
119d3cc8fd
commit
273400c908
6 changed files with 131 additions and 64 deletions
|
@ -2888,26 +2888,11 @@ class DomainRequestAdmin(ListHeaderAdmin, ImportExportModelAdmin):
|
||||||
|
|
||||||
Returns a tuple: (obj: DomainRequest, should_proceed: bool)
|
Returns a tuple: (obj: DomainRequest, should_proceed: bool)
|
||||||
"""
|
"""
|
||||||
|
# print("$$$$ IN THE _HANDLE_STATUS_CHANGE FUNCTION")
|
||||||
should_proceed = True
|
should_proceed = True
|
||||||
error_message = None
|
error_message = None
|
||||||
|
|
||||||
print("##### original_obj.status is", original_obj.status)
|
|
||||||
print("##### obj.status is", obj.status)
|
|
||||||
domain_name = original_obj.requested_domain.name
|
domain_name = original_obj.requested_domain.name
|
||||||
|
|
||||||
# if (
|
|
||||||
# original_obj.status != models.DomainRequest.DomainRequestStatus.APPROVED
|
|
||||||
# and obj.status == models.DomainRequest.DomainRequestStatus.APPROVED
|
|
||||||
# and original_obj.requested_domain is not None
|
|
||||||
# and Domain.objects.filter(name=original_obj.requested_domain.name).exists()
|
|
||||||
# and Domain.is_pending_delete(domain_name)
|
|
||||||
# ):
|
|
||||||
# print(f"##### in the if statement - {domain_name} is not available, yay")
|
|
||||||
# # raise FSMDomainRequestError(code=FSMErrorCodes.DOMAIN_IS_PENDING_DELETE)
|
|
||||||
# error_message = FSMDomainRequestError.get_error_message(FSMErrorCodes.DOMAIN_IS_PENDING_DELETE)
|
|
||||||
# print(f"##### error_message is - {error_message}")
|
|
||||||
|
|
||||||
# Get the method that should be run given the status
|
# Get the method that should be run given the status
|
||||||
selected_method = self.get_status_method_mapping(obj)
|
selected_method = self.get_status_method_mapping(obj)
|
||||||
if selected_method is None:
|
if selected_method is None:
|
||||||
|
@ -2935,8 +2920,12 @@ class DomainRequestAdmin(ListHeaderAdmin, ImportExportModelAdmin):
|
||||||
and Domain.objects.filter(name=original_obj.requested_domain.name).exists()
|
and Domain.objects.filter(name=original_obj.requested_domain.name).exists()
|
||||||
and Domain.is_pending_delete(domain_name)
|
and Domain.is_pending_delete(domain_name)
|
||||||
):
|
):
|
||||||
# TODO: Write blurb here
|
# 1. If the domain request is not approved in previous state (original status)
|
||||||
print(f"##### in the elif statement - {domain_name} is not available, yay")
|
# 2. If the new status that's supposed to be triggered IS approved
|
||||||
|
# 3. That it's a valid domain
|
||||||
|
# 4. That the domain name already exists
|
||||||
|
# 5. AND that the domain is currently in pendingDelete state
|
||||||
|
print("$$$$ in _handle_status_change")
|
||||||
error_message = FSMDomainRequestError.get_error_message(FSMErrorCodes.DOMAIN_IS_PENDING_DELETE)
|
error_message = FSMDomainRequestError.get_error_message(FSMErrorCodes.DOMAIN_IS_PENDING_DELETE)
|
||||||
elif (
|
elif (
|
||||||
original_obj.status != models.DomainRequest.DomainRequestStatus.APPROVED
|
original_obj.status != models.DomainRequest.DomainRequestStatus.APPROVED
|
||||||
|
|
|
@ -264,38 +264,17 @@ class Domain(TimeStampedModel, DomainHelper):
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def is_pending_delete(cls, domain: str) -> bool:
|
def is_pending_delete(cls, domain: str) -> bool:
|
||||||
# TODO: Write blurb here still
|
"""Check if domain is pendingDelete state via response from registry."""
|
||||||
domain_name = domain.lower()
|
domain_name = domain.lower()
|
||||||
|
|
||||||
print("***** in is_pending_delete")
|
|
||||||
# If not avail, check registry using InfoDomain
|
|
||||||
|
|
||||||
info_req = commands.InfoDomain(domain_name)
|
info_req = commands.InfoDomain(domain_name)
|
||||||
info_response = registry.send(info_req, cleaned=True)
|
info_response = registry.send(info_req, cleaned=True)
|
||||||
|
|
||||||
print("***** MODELS/DOMAIN.PY IN TRY info_response is:", info_response)
|
|
||||||
"""
|
|
||||||
InfoDomainResult(code=1000, msg='Command completed successfully',
|
|
||||||
res_data=[InfoDomainResultData(roid='DF1364752-GOV',
|
|
||||||
statuses=[Status(state='serverTransferProhibited', description=None, lang='en')],
|
|
||||||
cl_id='gov2023-ote', cr_id='gov2023-ote', cr_date=datetime.datetime(2023, 10, 23, 17, 8, 9, tzinfo=tzlocal()),
|
|
||||||
up_id='gov2023-ote', up_date=datetime.datetime(2023, 10, 28, 17, 8, 9, tzinfo=tzlocal()),
|
|
||||||
tr_date=None, name='meoward.gov', registrant='sh8013', admins=[], nsset=None,
|
|
||||||
keyset=None, ex_date=datetime.date(2024, 10, 23), auth_info=DomainAuthInfo(pw='feedabee'))],
|
|
||||||
cl_tr_id='wup7ad#2025-03-17T22:21:39.298149', sv_tr_id='aOQBDg4fQoSMGemppS5AdQ==-73ca',
|
|
||||||
extensions=[], msg_q=None)
|
|
||||||
"""
|
|
||||||
|
|
||||||
# Ensure res_data exists and is not empty
|
# Ensure res_data exists and is not empty
|
||||||
if info_response and info_response.res_data:
|
if info_response and info_response.res_data:
|
||||||
res_data = info_response.res_data[0]
|
domain_status_state = [status.state for status in info_response.res_data[0].statuses]
|
||||||
print("***** MODELS/DOMAIN.PY IN IF Response info_response.res_data[0]:", info_response.res_data[0])
|
# Return True if in pendingDelete status, else False
|
||||||
|
return "pendingDelete" in domain_status_state
|
||||||
domain_status_state = [status.state for status in res_data.statuses]
|
|
||||||
print(f"***** Domain statuses for {domain_name} is: {domain_status_state}")
|
|
||||||
|
|
||||||
# Check for pendingDelete status
|
|
||||||
return "pendingDelete" not in domain_status_state
|
|
||||||
|
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
|
@ -1185,28 +1185,9 @@ class DomainRequest(TimeStampedModel):
|
||||||
# create the domain
|
# create the domain
|
||||||
Domain = apps.get_model("registrar.Domain")
|
Domain = apps.get_model("registrar.Domain")
|
||||||
|
|
||||||
print("##### BEFORE the Domain.available check")
|
|
||||||
print(
|
|
||||||
"##### Domain.is_pending_delete(self.requested_domain.name)",
|
|
||||||
Domain.is_pending_delete(self.requested_domain.name),
|
|
||||||
)
|
|
||||||
print("##### self.requested_domain.name is", self.requested_domain.name)
|
|
||||||
|
|
||||||
# == Check that the domain_request is valid == #
|
|
||||||
# if Domain.objects.filter(name=self.requested_domain.name).exists():
|
|
||||||
# print("##### If it already exists, we do another check")
|
|
||||||
# if Domain.is_pending_delete(self.requested_domain.name):
|
|
||||||
# print(f"***** in the if statement - {self.requested_domain.name} is not available, yay")
|
|
||||||
# raise FSMDomainRequestError(code=FSMErrorCodes.DOMAIN_IS_PENDING_DELETE)
|
|
||||||
# else:
|
|
||||||
# print("##### in the else statement")
|
|
||||||
# raise FSMDomainRequestError(code=FSMErrorCodes.APPROVE_DOMAIN_IN_USE)
|
|
||||||
|
|
||||||
if Domain.objects.filter(name=self.requested_domain.name).exists():
|
if Domain.objects.filter(name=self.requested_domain.name).exists():
|
||||||
raise FSMDomainRequestError(code=FSMErrorCodes.APPROVE_DOMAIN_IN_USE)
|
raise FSMDomainRequestError(code=FSMErrorCodes.APPROVE_DOMAIN_IN_USE)
|
||||||
|
|
||||||
print("##### AFTER the Domain.available check")
|
|
||||||
|
|
||||||
# == Create the domain and related components == #
|
# == Create the domain and related components == #
|
||||||
created_domain = Domain.objects.create(name=self.requested_domain.name)
|
created_domain = Domain.objects.create(name=self.requested_domain.name)
|
||||||
self.approved_domain = created_domain
|
self.approved_domain = created_domain
|
||||||
|
|
|
@ -1071,7 +1071,7 @@ def completed_domain_request( # noqa
|
||||||
email="testy@town.com",
|
email="testy@town.com",
|
||||||
phone="(555) 555 5555",
|
phone="(555) 555 5555",
|
||||||
)
|
)
|
||||||
domain, _ = DraftDomain.objects.get_or_create(name=name)
|
domain = DraftDomain.objects.create(name=name)
|
||||||
other, _ = Contact.objects.get_or_create(
|
other, _ = Contact.objects.get_or_create(
|
||||||
first_name="Testy",
|
first_name="Testy",
|
||||||
last_name="Tester",
|
last_name="Tester",
|
||||||
|
|
|
@ -2155,7 +2155,6 @@ class TestDomainRequestAdmin(MockEppLib):
|
||||||
|
|
||||||
Used to test errors when saving a change with an active domain, also used to test side effects
|
Used to test errors when saving a change with an active domain, also used to test side effects
|
||||||
when saving a change goes through."""
|
when saving a change goes through."""
|
||||||
|
|
||||||
with less_console_noise():
|
with less_console_noise():
|
||||||
# Create an instance of the model
|
# Create an instance of the model
|
||||||
domain_request = completed_domain_request(status=DomainRequest.DomainRequestStatus.APPROVED)
|
domain_request = completed_domain_request(status=DomainRequest.DomainRequestStatus.APPROVED)
|
||||||
|
@ -2268,6 +2267,75 @@ class TestDomainRequestAdmin(MockEppLib):
|
||||||
"Cannot approve. Requested domain is already in use.",
|
"Cannot approve. Requested domain is already in use.",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# @less_console_noise
|
||||||
|
def test_error_when_approving_domain_in_pending_delete_state(self):
|
||||||
|
"""Prevent approving a domain when another request with the same name is in pendingDelete."""
|
||||||
|
|
||||||
|
# 1. Create two domain requests with the same name
|
||||||
|
to_be_pending_delete_state_domain_request = completed_domain_request(
|
||||||
|
status=DomainRequest.DomainRequestStatus.SUBMITTED, name="meoward1.gov"
|
||||||
|
)
|
||||||
|
print("#1 to_be_pending_delete_state_domain_request is", to_be_pending_delete_state_domain_request)
|
||||||
|
|
||||||
|
to_be_in_review_to_try_to_approve_domain_request = completed_domain_request(
|
||||||
|
status=DomainRequest.DomainRequestStatus.SUBMITTED, name="meoward1.gov"
|
||||||
|
)
|
||||||
|
print(
|
||||||
|
"#1 to_be_in_review_to_try_to_approve_domain_request is", to_be_in_review_to_try_to_approve_domain_request
|
||||||
|
)
|
||||||
|
|
||||||
|
# 2. Approve to_be_pending_delete_state_domain_request
|
||||||
|
to_be_pending_delete_state_domain_request.status = DomainRequest.DomainRequestStatus.APPROVED
|
||||||
|
to_be_pending_delete_state_domain_request.save()
|
||||||
|
|
||||||
|
# # 2.5 And put it into pendingDelete state
|
||||||
|
# with patch("registrar.models.domain.Domain.is_pending_delete", return_value=True):
|
||||||
|
# to_be_pending_delete_state_domain_request.save()
|
||||||
|
|
||||||
|
|
||||||
|
# 3. Put to_be_in_review_to_try_to_approve_domain_request into in-review state
|
||||||
|
to_be_in_review_to_try_to_approve_domain_request.status = DomainRequest.DomainRequestStatus.IN_REVIEW
|
||||||
|
to_be_in_review_to_try_to_approve_domain_request.save()
|
||||||
|
|
||||||
|
# 4. Update request as a superuser
|
||||||
|
request = self.factory.post(
|
||||||
|
f"/admin/registrar/domainrequest/{to_be_in_review_to_try_to_approve_domain_request.pk}/change/"
|
||||||
|
)
|
||||||
|
request.user = self.superuser
|
||||||
|
request.session = {}
|
||||||
|
|
||||||
|
print("#4 to_be_pending_delete_state_domain_request is", to_be_pending_delete_state_domain_request)
|
||||||
|
print(
|
||||||
|
"#4 to_be_in_review_to_try_to_approve_domain_request is", to_be_in_review_to_try_to_approve_domain_request
|
||||||
|
)
|
||||||
|
|
||||||
|
# 5. Use ExitStack for combine patching like above
|
||||||
|
with ExitStack() as stack:
|
||||||
|
print("$$$$$ Do we get into the with ExitStack statement")
|
||||||
|
# Patch django.contrib.messages.error
|
||||||
|
stack.enter_context(patch.object(messages, "error"))
|
||||||
|
|
||||||
|
with patch("registrar.models.domain.Domain.is_pending_delete", return_value=True) as pending_patch:
|
||||||
|
# to_be_in_review_to_try_to_approve_domain_request.save()
|
||||||
|
print("$$$$$ inside the second with statement")
|
||||||
|
|
||||||
|
# Attempt to approve to_be_in_review_to_try_to_approve_domain_request
|
||||||
|
# (which should fail due to to_be_pending_delete_state_domain_request being in pendingDelete)
|
||||||
|
to_be_in_review_to_try_to_approve_domain_request.status = DomainRequest.DomainRequestStatus.APPROVED
|
||||||
|
print("to_be_in_review_to_try_to_approve_domain_request is ", to_be_in_review_to_try_to_approve_domain_request)
|
||||||
|
|
||||||
|
# Save the model with the patched request
|
||||||
|
self.admin.save_model(request, to_be_in_review_to_try_to_approve_domain_request, None, True)
|
||||||
|
|
||||||
|
print("$$$$ pending_patch.call_args_list is", pending_patch.call_args_list)
|
||||||
|
print("$$$$ pending_patch.called is", pending_patch.called)
|
||||||
|
|
||||||
|
# Assert that the correct error message is displayed
|
||||||
|
messages.error.assert_called_once_with(
|
||||||
|
request,
|
||||||
|
"Domain of same name is currently in pending delete state.",
|
||||||
|
)
|
||||||
|
|
||||||
@less_console_noise
|
@less_console_noise
|
||||||
def test_no_error_when_saving_to_approved_and_domain_exists(self):
|
def test_no_error_when_saving_to_approved_and_domain_exists(self):
|
||||||
"""The negative of the redundant admin check on model transition not allowed."""
|
"""The negative of the redundant admin check on model transition not allowed."""
|
||||||
|
|
|
@ -666,6 +666,56 @@ class TestDomainAvailable(MockEppLib):
|
||||||
self.assertFalse(available)
|
self.assertFalse(available)
|
||||||
patcher.stop()
|
patcher.stop()
|
||||||
|
|
||||||
|
def test_is_pending_delete(self):
|
||||||
|
"""
|
||||||
|
Scenario: Testing if a domain is in pendingDelete status from the registry
|
||||||
|
Should return True
|
||||||
|
|
||||||
|
* Mock EPP response with pendingDelete status
|
||||||
|
* Validate InfoDomain command is called
|
||||||
|
* Validate response given mock
|
||||||
|
"""
|
||||||
|
|
||||||
|
def side_effect(_request, cleaned):
|
||||||
|
mock_response = MagicMock()
|
||||||
|
mock_response.res_data = [MagicMock(statuses=[MagicMock(state="pendingDelete")])]
|
||||||
|
return mock_response
|
||||||
|
|
||||||
|
with patch("registrar.models.domain.registry.send") as mocked_send:
|
||||||
|
mocked_send.side_effect = side_effect
|
||||||
|
|
||||||
|
result = Domain.is_pending_delete("is-pending-delete.gov")
|
||||||
|
|
||||||
|
mocked_send.assert_called_once_with(commands.InfoDomain("is-pending-delete.gov"), cleaned=True)
|
||||||
|
|
||||||
|
# Assert: The result is False because of pendingDelete status
|
||||||
|
self.assertTrue(result)
|
||||||
|
|
||||||
|
def test_is_not_pending_delete(self):
|
||||||
|
"""
|
||||||
|
Scenario: Testing if a domain is NOT in pendingDelete status.
|
||||||
|
Should return False.
|
||||||
|
|
||||||
|
* Mock EPP response without pendingDelete status (isserverTransferProhibited)
|
||||||
|
* Validate response given mock
|
||||||
|
* Validate response given mock
|
||||||
|
"""
|
||||||
|
|
||||||
|
def side_effect(_request, cleaned):
|
||||||
|
mock_response = MagicMock()
|
||||||
|
mock_response.res_data = [
|
||||||
|
MagicMock(statuses=[MagicMock(state="serverTransferProhibited"), MagicMock(state="ok")])
|
||||||
|
]
|
||||||
|
return mock_response
|
||||||
|
|
||||||
|
with patch("registrar.models.domain.registry.send") as mocked_send:
|
||||||
|
mocked_send.side_effect = side_effect
|
||||||
|
|
||||||
|
result = Domain.is_pending_delete("is-not-pending.gov")
|
||||||
|
|
||||||
|
mocked_send.assert_called_once_with(commands.InfoDomain("is-not-pending.gov"), cleaned=True)
|
||||||
|
self.assertFalse(result)
|
||||||
|
|
||||||
def test_domain_available_with_invalid_error(self):
|
def test_domain_available_with_invalid_error(self):
|
||||||
"""
|
"""
|
||||||
Scenario: Testing whether an invalid domain is available
|
Scenario: Testing whether an invalid domain is available
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue