Fix DELETE getter in form's clean, add test_delete_other_contact_does_not_allow_zero_contacts, cleanup

This commit is contained in:
Rachid Mrad 2024-01-09 13:03:23 -05:00
parent eb7498b28e
commit f2b12e01d0
No known key found for this signature in database
GPG key ID: EF38E4CEC4A8F3CF
3 changed files with 111 additions and 22 deletions

View file

@ -672,7 +672,7 @@ class OtherContactsForm(RegistrarForm):
deletion by formset to be considered valid even though certain required fields have deletion by formset to be considered valid even though certain required fields have
not passed field validation not passed field validation
""" """
if self.form_data_marked_for_deletion or self.cleaned_data["DELETE"]: if self.form_data_marked_for_deletion or self.cleaned_data.get("DELETE"):
# clear any errors raised by the form fields # clear any errors raised by the form fields
# (before this clean() method is run, each field # (before this clean() method is run, each field
# performs its own clean, which could result in # performs its own clean, which could result in

View file

@ -1086,8 +1086,8 @@ class DomainApplicationTests(TestWithUser, WebTest):
This formset uses the DJANGO DELETE widget. We'll test that by setting 2 contacts on an application, This formset uses the DJANGO DELETE widget. We'll test that by setting 2 contacts on an application,
loading the form and marking one contact up for deletion.""" loading the form and marking one contact up for deletion."""
# Populate the database with a domain application that # Populate the database with a domain application that
# has 1 "other contact" assigned to it # has 2 "other contact" assigned to it
# We'll do it from scratch so we can reuse the other contact # We'll do it from scratch so we can reuse the other contact
ao, _ = Contact.objects.get_or_create( ao, _ = Contact.objects.get_or_create(
first_name="Testy", first_name="Testy",
@ -1164,9 +1164,81 @@ class DomainApplicationTests(TestWithUser, WebTest):
application = DomainApplication.objects.get() application = DomainApplication.objects.get()
self.assertEqual(application.other_contacts.count(), 1) self.assertEqual(application.other_contacts.count(), 1)
self.assertEqual(application.other_contacts.first().first_name, "Testy3") self.assertEqual(application.other_contacts.first().first_name, "Testy3")
def test_delete_other_contact_does_not_allow_zero_contacts(self):
"""Delete Other Contact does not allow submission with zero contacts."""
# Populate the database with a domain application that
# has 1 "other contact" assigned to it
# We'll do it from scratch so we can reuse the other contact
ao, _ = Contact.objects.get_or_create(
first_name="Testy",
last_name="Tester",
title="Chief Tester",
email="testy@town.com",
phone="(201) 555 5555",
)
you, _ = Contact.objects.get_or_create(
first_name="Testy you",
last_name="Tester you",
title="Admin Tester",
email="testy-admin@town.com",
phone="(201) 555 5556",
)
other, _ = Contact.objects.get_or_create(
first_name="Testy2",
last_name="Tester2",
title="Another Tester",
email="testy2@town.com",
phone="(201) 555 5557",
)
application, _ = DomainApplication.objects.get_or_create(
organization_type="federal",
federal_type="executive",
purpose="Purpose of the site",
anything_else="No",
is_policy_acknowledged=True,
organization_name="Testorg",
address_line1="address 1",
state_territory="NY",
zipcode="10002",
authorizing_official=ao,
submitter=you,
creator=self.user,
status="started",
)
application.other_contacts.add(other)
# prime the form by visiting /edit
self.app.get(reverse("edit-application", kwargs={"id": application.pk}))
# django-webtest does not handle cookie-based sessions well because it keeps
# resetting the session key on each new request, thus destroying the concept
# of a "session". We are going to do it manually, saving the session ID here
# and then setting the cookie on each request.
session_id = self.app.cookies[settings.SESSION_COOKIE_NAME]
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
other_contacts_page = self.app.get(reverse("application:other_contacts"))
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
other_contacts_form = other_contacts_page.forms[0]
# Minimal check to ensure the form is loaded
self.assertEqual(other_contacts_form["other_contacts-0-first_name"].value, "Testy2")
# Mark the first dude for deletion
other_contacts_form.set("other_contacts-0-DELETE", "on")
# Submit the form
other_contacts_form.submit()
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
# Verify that the contact was not deleted
application = DomainApplication.objects.get()
self.assertEqual(application.other_contacts.count(), 1)
self.assertEqual(application.other_contacts.first().first_name, "Testy2")
def test_delete_other_contact_sets_visible_empty_form_as_required_after_failed_submit(self): def test_delete_other_contact_sets_visible_empty_form_as_required_after_failed_submit(self):
"""When you """When you:
1. add an empty contact, 1. add an empty contact,
2. delete existing contacts, 2. delete existing contacts,
3. then submit, 3. then submit,
@ -1227,26 +1299,47 @@ class DomainApplicationTests(TestWithUser, WebTest):
other_contacts_form = other_contacts_page.forms[0] other_contacts_form = other_contacts_page.forms[0]
# other_contacts_form["other_contacts-has_other_contacts"] = "True"
# other_contacts_form.set("other_contacts-0-first_name", "")
# other_contacts_page = other_contacts_page.forms[0].submit()
# self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
# Print the content to inspect the HTML
# print(other_contacts_page.content.decode('utf-8'))
# other_contacts_form = other_contacts_page.forms[0]
# Access the "Add another contact" button and click it
# other_contacts_page = other_contacts_page.click('#add-form', index=0)
# Minimal check to ensure the form is loaded # Minimal check to ensure the form is loaded
self.assertEqual(other_contacts_form["other_contacts-0-first_name"].value, "Testy2") self.assertEqual(other_contacts_form["other_contacts-0-first_name"].value, "Testy2")
# # Create an instance of the formset # Get the formset from the response context
# formset = OtherContactsFormSet() formset = other_contacts_page.context['forms'][1] # Replace with the actual context variable name
# # Check that there is initially one form in the formset
# self.assertEqual(len(formset.forms), 1)
# # Simulate adding a form by increasing the 'extra' parameter
# formset.extra += 2
# formset = OtherContactsFormSet()
# # Check that there are now two forms in the formset # Check the initial number of forms in the formset
# self.assertEqual(len(formset.forms), 2) initial_form_count = formset.total_form_count()
print(f'initial_form_count {initial_form_count}')
# # # Mark the first dude for deletion # Add a new form to the formset data
# # other_contacts_form.set("other_contacts-0-DELETE", "on") formset_data = formset.management_form.initial
formset_data['TOTAL_FORMS'] = initial_form_count + 1 # Increase the total form count
print(f"initial_form_count {formset_data['TOTAL_FORMS']}")
formset.extra = 1
other_contacts_form_0 = formset[0]
other_contacts_form_1 = formset[1]
print(other_contacts_page.content.decode('utf-8'))
other_contacts_form_1.set("other_contacts-1-first_name", "Rachid")
# self.assertEqual(other_contacts_form["other_contacts-1-first_name"].value, "")
# # # Submit the form # # # Submit the form
# # other_contacts_form.submit() # # other_contacts_form.submit()

View file

@ -370,10 +370,6 @@ class ApplicationWizard(ApplicationWizardPermissionView, TemplateView):
def post(self, request, *args, **kwargs) -> HttpResponse: def post(self, request, *args, **kwargs) -> HttpResponse:
"""This method handles POST requests.""" """This method handles POST requests."""
# Log the keys and values of request.POST
for key, value in request.POST.items():
logger.info("Key: %s, Value: %s", key, value)
# which button did the user press? # which button did the user press?
button: str = request.POST.get("submit_button", "") button: str = request.POST.get("submit_button", "")