diff --git a/src/.pa11yci b/src/.pa11yci
index 6bb5727e0..0ab3f4dd7 100644
--- a/src/.pa11yci
+++ b/src/.pa11yci
@@ -19,7 +19,6 @@
"http://localhost:8080/register/other_contacts/",
"http://localhost:8080/register/anything_else/",
"http://localhost:8080/register/requirements/",
- "http://localhost:8080/register/review/",
"http://localhost:8080/register/finished/"
]
}
diff --git a/src/api/views.py b/src/api/views.py
index 068844919..a7dd7600a 100644
--- a/src/api/views.py
+++ b/src/api/views.py
@@ -91,15 +91,17 @@ def available(request, domain=""):
# validate that the given domain could be a domain name and fail early if
# not.
if not (DraftDomain.string_could_be_domain(domain) or DraftDomain.string_could_be_domain(domain + ".gov")):
- return JsonResponse({"available": False, "message": DOMAIN_API_MESSAGES["invalid"]})
+ return JsonResponse({"available": False, "code": "invalid", "message": DOMAIN_API_MESSAGES["invalid"]})
# a domain is available if it is NOT in the list of current domains
try:
if check_domain_available(domain):
- return JsonResponse({"available": True, "message": DOMAIN_API_MESSAGES["success"]})
+ return JsonResponse({"available": True, "code": "success", "message": DOMAIN_API_MESSAGES["success"]})
else:
- return JsonResponse({"available": False, "message": DOMAIN_API_MESSAGES["unavailable"]})
+ return JsonResponse(
+ {"available": False, "code": "unavailable", "message": DOMAIN_API_MESSAGES["unavailable"]}
+ )
except Exception:
- return JsonResponse({"available": False, "message": DOMAIN_API_MESSAGES["error"]})
+ return JsonResponse({"available": False, "code": "error", "message": DOMAIN_API_MESSAGES["error"]})
@require_http_methods(["GET"])
diff --git a/src/registrar/management/commands/extend_expiration_dates.py b/src/registrar/management/commands/extend_expiration_dates.py
index f969faa62..5e203e488 100644
--- a/src/registrar/management/commands/extend_expiration_dates.py
+++ b/src/registrar/management/commands/extend_expiration_dates.py
@@ -29,7 +29,8 @@ class Command(BaseCommand):
self.update_success = []
self.update_skipped = []
self.update_failed = []
- self.expiration_cutoff = date(2023, 11, 15)
+ self.expiration_minimum_cutoff = date(2023, 11, 15)
+ self.expiration_maximum_cutoff = date(2023, 12, 30)
def add_arguments(self, parser):
"""Add command line arguments."""
@@ -71,7 +72,9 @@ class Command(BaseCommand):
self.check_if_positive_int(limit_parse, "limitParse")
valid_domains = Domain.objects.filter(
- expiration_date__gte=self.expiration_cutoff, state=Domain.State.READY
+ expiration_date__gte=self.expiration_minimum_cutoff,
+ expiration_date__lte=self.expiration_maximum_cutoff,
+ state=Domain.State.READY,
).order_by("name")
domains_to_change_count = valid_domains.count()
@@ -134,7 +137,7 @@ class Command(BaseCommand):
==Proposed Changes==
Domains to change: {domains_to_change_count}
""",
- prompt_title="Do you wish to proceed?",
+ prompt_title="Do you wish to proceed with these changes?",
)
logger.info(f"{TerminalColors.MAGENTA}" "Preparing to extend expiration dates..." f"{TerminalColors.ENDC}")
diff --git a/src/registrar/templates/application_form.html b/src/registrar/templates/application_form.html
index db72a1fc2..cec2416fb 100644
--- a/src/registrar/templates/application_form.html
+++ b/src/registrar/templates/application_form.html
@@ -85,16 +85,29 @@
class="usa-button usa-button--outline"
>Save and return to manage your domains
{% else %}
-
+ aria-controls="toggle-submit-domain-request"
+ data-open-modal
+ >Submit your domain request
{% endif %}
{% endblock %}
+
+ {% include 'includes/modal.html' with modal_heading=modal_heading|safe modal_description="Once you submit this request, you won’t be able to make further edits until it’s reviewed by our staff. You’ll only be able to withdraw your request." modal_button=modal_button|safe %}
+
{% url 'domain-dns-dnssec' pk=domain.id as url %}
diff --git a/src/registrar/tests/common.py b/src/registrar/tests/common.py
index b89d9c464..5166e9c18 100644
--- a/src/registrar/tests/common.py
+++ b/src/registrar/tests/common.py
@@ -836,6 +836,11 @@ class MockEppLib(TestCase):
ex_date=datetime.date(2023, 2, 15),
)
+ mockMaximumRenewedDomainExpDate = fakedEppObject(
+ "fakemaximum.gov",
+ ex_date=datetime.date(2024, 12, 31),
+ )
+
mockRecentRenewedDomainExpDate = fakedEppObject(
"waterbutpurple.gov",
ex_date=datetime.date(2024, 11, 15),
@@ -949,6 +954,11 @@ class MockEppLib(TestCase):
res_data=[self.mockDnsNeededRenewedDomainExpDate],
code=ErrorCode.COMMAND_COMPLETED_SUCCESSFULLY,
)
+ elif getattr(_request, "name", None) == "fakemaximum.gov":
+ return MagicMock(
+ res_data=[self.mockMaximumRenewedDomainExpDate],
+ code=ErrorCode.COMMAND_COMPLETED_SUCCESSFULLY,
+ )
else:
return MagicMock(
res_data=[self.mockRenewedDomainExpDate],
diff --git a/src/registrar/tests/test_copy_names_from_contacts_to_users.py b/src/registrar/tests/test_copy_names_from_contacts_to_users.py
index 2690578e0..032203f4e 100644
--- a/src/registrar/tests/test_copy_names_from_contacts_to_users.py
+++ b/src/registrar/tests/test_copy_names_from_contacts_to_users.py
@@ -18,8 +18,8 @@ class TestDataUpdates(TestCase):
self.user2 = User.objects.create(username="user2")
self.user3 = User.objects.create(username="user3")
self.user4 = User.objects.create(username="user4")
- # The last user created triggers the creation of a contact and attaches itself to it. @Neil wth is going on?
- # This bs_user defuses that situation so we can test the code.
+ # The last user created triggers the creation of a contact and attaches itself to it. See signals.
+ # This bs_user defuses that situation.
self.bs_user = User.objects.create()
self.contact1 = Contact.objects.create(
diff --git a/src/registrar/tests/test_transition_domain_migrations.py b/src/registrar/tests/test_transition_domain_migrations.py
index 86fa0f603..f3fd76e88 100644
--- a/src/registrar/tests/test_transition_domain_migrations.py
+++ b/src/registrar/tests/test_transition_domain_migrations.py
@@ -52,6 +52,15 @@ class TestExtendExpirationDates(MockEppLib):
domain_name="fakeneeded.gov",
epp_expiration_date=datetime.date(2023, 11, 15),
)
+ # Create a domain with a date greater than the maximum
+ Domain.objects.get_or_create(
+ name="fakemaximum.gov", state=Domain.State.READY, expiration_date=datetime.date(2024, 12, 31)
+ )
+ TransitionDomain.objects.get_or_create(
+ username="fakemaximum@mail.com",
+ domain_name="fakemaximum.gov",
+ epp_expiration_date=datetime.date(2024, 12, 31),
+ )
def tearDown(self):
"""Deletes all DB objects related to migrations"""
@@ -114,6 +123,25 @@ class TestExtendExpirationDates(MockEppLib):
# should not be affected by the change.
self.assertEqual(current_domain.expiration_date, datetime.date(2022, 5, 25))
+ def test_extends_expiration_date_skips_maximum_date(self):
+ """
+ Tests that the extend_expiration_dates method correctly skips domains
+ with an expiration date more than a certain threshold.
+ """
+ desired_domain = Domain.objects.filter(name="fakemaximum.gov").get()
+ desired_domain.expiration_date = datetime.date(2024, 12, 31)
+
+ # Run the expiration date script
+ self.run_extend_expiration_dates()
+
+ current_domain = Domain.objects.filter(name="fakemaximum.gov").get()
+ self.assertEqual(desired_domain, current_domain)
+
+ # Explicitly test the expiration date. The extend_expiration_dates script
+ # will skip all dates less than date(2023, 11, 15), meaning that this domain
+ # should not be affected by the change.
+ self.assertEqual(current_domain.expiration_date, datetime.date(2024, 12, 31))
+
def test_extends_expiration_date_skips_non_ready(self):
"""
Tests that the extend_expiration_dates method correctly skips domains not in the state "ready"
diff --git a/src/registrar/tests/test_views.py b/src/registrar/tests/test_views.py
index 17641636e..57fa03f52 100644
--- a/src/registrar/tests/test_views.py
+++ b/src/registrar/tests/test_views.py
@@ -141,7 +141,7 @@ class DomainApplicationTests(TestWithUser, WebTest):
# 302 redirect to the first form
page = self.app.get(reverse("application:")).follow()
# submitting should get back the same page if the required field is empty
- result = page.form.submit()
+ result = page.forms[0].submit()
self.assertIn("What kind of U.S.-based government organization do you represent?", result)
def test_application_multiple_applications_exist(self):
@@ -164,6 +164,9 @@ class DomainApplicationTests(TestWithUser, WebTest):
this test work.
This test also looks for the long organization name on the summary page.
+
+ This also tests for the presence of a modal trigger and the dynamic test
+ in the modal header on the submit page.
"""
num_pages_tested = 0
# elections, type_of_work, tribal_government, no_other_contacts
@@ -178,11 +181,11 @@ class DomainApplicationTests(TestWithUser, WebTest):
session_id = self.app.cookies[settings.SESSION_COOKIE_NAME]
# ---- TYPE PAGE ----
- type_form = type_page.form
+ type_form = type_page.forms[0]
type_form["organization_type-organization_type"] = "federal"
# test next button and validate data
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
- type_result = type_page.form.submit()
+ type_result = type_form.submit()
# should see results in db
application = DomainApplication.objects.get() # there's only one
self.assertEqual(application.organization_type, "federal")
@@ -197,7 +200,7 @@ class DomainApplicationTests(TestWithUser, WebTest):
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
federal_page = type_result.follow()
- federal_form = federal_page.form
+ federal_form = federal_page.forms[0]
federal_form["organization_federal-federal_type"] = "executive"
# test next button
@@ -216,7 +219,7 @@ class DomainApplicationTests(TestWithUser, WebTest):
# Follow the redirect to the next form page
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
org_contact_page = federal_result.follow()
- org_contact_form = org_contact_page.form
+ org_contact_form = org_contact_page.forms[0]
# federal agency so we have to fill in federal_agency
org_contact_form["organization_contact-federal_agency"] = "General Services Administration"
org_contact_form["organization_contact-organization_name"] = "Testorg"
@@ -249,7 +252,7 @@ class DomainApplicationTests(TestWithUser, WebTest):
# Follow the redirect to the next form page
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
ao_page = org_contact_result.follow()
- ao_form = ao_page.form
+ ao_form = ao_page.forms[0]
ao_form["authorizing_official-first_name"] = "Testy ATO"
ao_form["authorizing_official-last_name"] = "Tester ATO"
ao_form["authorizing_official-title"] = "Chief Tester"
@@ -276,7 +279,7 @@ class DomainApplicationTests(TestWithUser, WebTest):
# Follow the redirect to the next form page
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
current_sites_page = ao_result.follow()
- current_sites_form = current_sites_page.form
+ current_sites_form = current_sites_page.forms[0]
current_sites_form["current_sites-0-website"] = "www.city.com"
# test next button
@@ -298,7 +301,7 @@ class DomainApplicationTests(TestWithUser, WebTest):
# Follow the redirect to the next form page
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
dotgov_page = current_sites_result.follow()
- dotgov_form = dotgov_page.form
+ dotgov_form = dotgov_page.forms[0]
dotgov_form["dotgov_domain-requested_domain"] = "city"
dotgov_form["dotgov_domain-0-alternative_domain"] = "city1"
@@ -318,7 +321,7 @@ class DomainApplicationTests(TestWithUser, WebTest):
# Follow the redirect to the next form page
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
purpose_page = dotgov_result.follow()
- purpose_form = purpose_page.form
+ purpose_form = purpose_page.forms[0]
purpose_form["purpose-purpose"] = "For all kinds of things."
# test next button
@@ -337,7 +340,7 @@ class DomainApplicationTests(TestWithUser, WebTest):
# Follow the redirect to the next form page
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
your_contact_page = purpose_result.follow()
- your_contact_form = your_contact_page.form
+ your_contact_form = your_contact_page.forms[0]
your_contact_form["your_contact-first_name"] = "Testy you"
your_contact_form["your_contact-last_name"] = "Tester you"
@@ -365,7 +368,7 @@ class DomainApplicationTests(TestWithUser, WebTest):
# Follow the redirect to the next form page
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
other_contacts_page = your_contact_result.follow()
- other_contacts_form = other_contacts_page.form
+ other_contacts_form = other_contacts_page.forms[0]
other_contacts_form["other_contacts-0-first_name"] = "Testy2"
other_contacts_form["other_contacts-0-last_name"] = "Tester2"
@@ -398,7 +401,7 @@ class DomainApplicationTests(TestWithUser, WebTest):
# Follow the redirect to the next form page
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
anything_else_page = other_contacts_result.follow()
- anything_else_form = anything_else_page.form
+ anything_else_form = anything_else_page.forms[0]
anything_else_form["anything_else-anything_else"] = "Nothing else."
@@ -418,7 +421,7 @@ class DomainApplicationTests(TestWithUser, WebTest):
# Follow the redirect to the next form page
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
requirements_page = anything_else_result.follow()
- requirements_form = requirements_page.form
+ requirements_form = requirements_page.forms[0]
requirements_form["requirements-is_policy_acknowledged"] = True
@@ -438,7 +441,7 @@ class DomainApplicationTests(TestWithUser, WebTest):
# Follow the redirect to the next form page
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
review_page = requirements_result.follow()
- review_form = review_page.form
+ review_form = review_page.forms[0]
# Review page contains all the previously entered data
# Let's make sure the long org name is displayed
@@ -472,6 +475,14 @@ class DomainApplicationTests(TestWithUser, WebTest):
self.assertContains(review_page, "(201) 555-5557")
self.assertContains(review_page, "Nothing else.")
+ # We can't test the modal itself as it relies on JS for init and triggering,
+ # but we can test for the existence of its trigger:
+ self.assertContains(review_page, "toggle-submit-domain-request")
+ # And the existence of the modal's data parked and ready for the js init.
+ # The next assert also tests for the passed requested domain context from
+ # the view > application_form > modal
+ self.assertContains(review_page, "You are about to submit a domain request for city.gov")
+
# final submission results in a redirect to the "finished" URL
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
with less_console_noise():
@@ -540,7 +551,7 @@ class DomainApplicationTests(TestWithUser, WebTest):
# the conditional step titles shouldn't appear initially
self.assertNotContains(type_page, self.TITLES["organization_federal"])
self.assertNotContains(type_page, self.TITLES["organization_election"])
- type_form = type_page.form
+ type_form = type_page.forms[0]
type_form["organization_type-organization_type"] = "federal"
# set the session ID before .submit()
@@ -561,9 +572,9 @@ class DomainApplicationTests(TestWithUser, WebTest):
# continuing on in the flow we need to see top-level agency on the
# contact page
- federal_page.form["organization_federal-federal_type"] = "executive"
+ federal_page.forms[0]["organization_federal-federal_type"] = "executive"
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
- federal_result = federal_page.form.submit()
+ federal_result = federal_page.forms[0].submit()
# the post request should return a redirect to the contact
# question
self.assertEqual(federal_result.status_code, 302)
@@ -586,7 +597,7 @@ class DomainApplicationTests(TestWithUser, WebTest):
# the conditional step titles shouldn't appear initially
self.assertNotContains(type_page, self.TITLES["organization_federal"])
self.assertNotContains(type_page, self.TITLES["organization_election"])
- type_form = type_page.form
+ type_form = type_page.forms[0]
type_form["organization_type-organization_type"] = "county"
# set the session ID before .submit()
@@ -606,9 +617,9 @@ class DomainApplicationTests(TestWithUser, WebTest):
# continuing on in the flow we need to NOT see top-level agency on the
# contact page
- election_page.form["organization_election-is_election_board"] = "True"
+ election_page.forms[0]["organization_election-is_election_board"] = "True"
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
- election_result = election_page.form.submit()
+ election_result = election_page.forms[0].submit()
# the post request should return a redirect to the contact
# question
self.assertEqual(election_result.status_code, 302)
@@ -626,10 +637,10 @@ class DomainApplicationTests(TestWithUser, WebTest):
# and then setting the cookie on each request.
session_id = self.app.cookies[settings.SESSION_COOKIE_NAME]
- type_form = type_page.form
+ type_form = type_page.forms[0]
type_form["organization_type-organization_type"] = "federal"
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
- type_result = type_page.form.submit()
+ type_result = type_form.submit()
# follow first redirect
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
@@ -654,15 +665,15 @@ class DomainApplicationTests(TestWithUser, WebTest):
# and then setting the cookie on each request.
session_id = self.app.cookies[settings.SESSION_COOKIE_NAME]
- type_form = type_page.form
+ type_form = type_page.forms[0]
type_form["organization_type-organization_type"] = DomainApplication.OrganizationChoices.INTERSTATE
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
- type_result = type_page.form.submit()
+ type_result = type_form.submit()
# follow first redirect
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
contact_page = type_result.follow()
- org_contact_form = contact_page.form
+ org_contact_form = contact_page.forms[0]
self.assertNotIn("federal_agency", org_contact_form.fields)
@@ -690,10 +701,10 @@ class DomainApplicationTests(TestWithUser, WebTest):
# and then setting the cookie on each request.
session_id = self.app.cookies[settings.SESSION_COOKIE_NAME]
- type_form = type_page.form
+ type_form = type_page.forms[0]
type_form["organization_type-organization_type"] = DomainApplication.OrganizationChoices.SPECIAL_DISTRICT
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
- type_result = type_page.form.submit()
+ type_result = type_page.forms[0].submit()
# follow first redirect
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
contact_page = type_result.follow()
@@ -710,7 +721,7 @@ class DomainApplicationTests(TestWithUser, WebTest):
session_id = self.app.cookies[settings.SESSION_COOKIE_NAME]
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
- result = contacts_page.form.submit()
+ result = contacts_page.forms[0].submit()
# follow first redirect
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
no_contacts_page = result.follow()
@@ -727,10 +738,10 @@ class DomainApplicationTests(TestWithUser, WebTest):
# and then setting the cookie on each request.
session_id = self.app.cookies[settings.SESSION_COOKIE_NAME]
- type_form = type_page.form
+ type_form = type_page.forms[0]
type_form["organization_type-organization_type"] = DomainApplication.OrganizationChoices.INTERSTATE
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
- type_result = type_page.form.submit()
+ type_result = type_form.submit()
# follow first redirect
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
contact_page = type_result.follow()
@@ -745,10 +756,10 @@ class DomainApplicationTests(TestWithUser, WebTest):
# 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]
- type_form = type_page.form
+ type_form = type_page.forms[0]
type_form["organization_type-organization_type"] = DomainApplication.OrganizationChoices.TRIBAL
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
- type_result = type_page.form.submit()
+ type_result = type_form.submit()
# the tribal government page comes immediately afterwards
self.assertIn("/tribal_government", type_result.headers["Location"])
# follow first redirect
@@ -767,18 +778,18 @@ class DomainApplicationTests(TestWithUser, WebTest):
session_id = self.app.cookies[settings.SESSION_COOKIE_NAME]
# ---- TYPE PAGE ----
- type_form = type_page.form
+ type_form = type_page.forms[0]
type_form["organization_type-organization_type"] = "federal"
# test next button
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
- type_result = type_page.form.submit()
+ type_result = type_form.submit()
# ---- FEDERAL BRANCH PAGE ----
# Follow the redirect to the next form page
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
federal_page = type_result.follow()
- federal_form = federal_page.form
+ federal_form = federal_page.forms[0]
federal_form["organization_federal-federal_type"] = "executive"
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
federal_result = federal_form.submit()
@@ -787,7 +798,7 @@ class DomainApplicationTests(TestWithUser, WebTest):
# Follow the redirect to the next form page
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
org_contact_page = federal_result.follow()
- org_contact_form = org_contact_page.form
+ org_contact_form = org_contact_page.forms[0]
# federal agency so we have to fill in federal_agency
org_contact_form["organization_contact-federal_agency"] = "General Services Administration"
org_contact_form["organization_contact-organization_name"] = "Testorg"
@@ -828,18 +839,18 @@ class DomainApplicationTests(TestWithUser, WebTest):
# and then setting the cookie on each request.
session_id = self.app.cookies[settings.SESSION_COOKIE_NAME]
# ---- TYPE PAGE ----
- type_form = type_page.form
+ type_form = type_page.forms[0]
type_form["organization_type-organization_type"] = "federal"
# test next button
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
- type_result = type_page.form.submit()
+ type_result = type_form.submit()
# ---- FEDERAL BRANCH PAGE ----
# Follow the redirect to the next form page
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
federal_page = type_result.follow()
- federal_form = federal_page.form
+ federal_form = federal_page.forms[0]
federal_form["organization_federal-federal_type"] = "executive"
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
federal_result = federal_form.submit()
@@ -848,7 +859,7 @@ class DomainApplicationTests(TestWithUser, WebTest):
# Follow the redirect to the next form page
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
org_contact_page = federal_result.follow()
- org_contact_form = org_contact_page.form
+ org_contact_form = org_contact_page.forms[0]
# federal agency so we have to fill in federal_agency
org_contact_form["organization_contact-federal_agency"] = "General Services Administration"
org_contact_form["organization_contact-organization_name"] = "Testorg"
@@ -870,7 +881,7 @@ class DomainApplicationTests(TestWithUser, WebTest):
# Follow the redirect to the next form page
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
ao_page = org_contact_result.follow()
- ao_form = ao_page.form
+ ao_form = ao_page.forms[0]
ao_form["authorizing_official-first_name"] = "Testy ATO"
ao_form["authorizing_official-last_name"] = "Tester ATO"
ao_form["authorizing_official-title"] = "Chief Tester"
@@ -884,7 +895,7 @@ class DomainApplicationTests(TestWithUser, WebTest):
# Follow the redirect to the next form page
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
current_sites_page = ao_result.follow()
- current_sites_form = current_sites_page.form
+ current_sites_form = current_sites_page.forms[0]
current_sites_form["current_sites-0-website"] = "www.city.com"
# test saving the page
@@ -917,7 +928,7 @@ class DomainApplicationTests(TestWithUser, WebTest):
current_sites_page = self.app.get(reverse("application:current_sites"))
session_id = self.app.cookies[settings.SESSION_COOKIE_NAME]
# fill in the form field
- current_sites_form = current_sites_page.form
+ current_sites_form = current_sites_page.forms[0]
self.assertIn("current_sites-0-website", current_sites_form.fields)
self.assertNotIn("current_sites-1-website", current_sites_form.fields)
current_sites_form["current_sites-0-website"] = "https://example.com"
@@ -926,7 +937,7 @@ class DomainApplicationTests(TestWithUser, WebTest):
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
current_sites_result = current_sites_form.submit("submit_button", value="save")
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
- current_sites_form = current_sites_result.follow().form
+ current_sites_form = current_sites_result.follow().forms[0]
# verify that there are two form fields
value = current_sites_form["current_sites-0-website"].value
@@ -1086,6 +1097,18 @@ class DomainApplicationTests(TestWithUser, WebTest):
detail_page = home_page.click("Manage", index=0)
self.assertContains(detail_page, "Federal: an agency of the U.S. government")
+ def test_submit_modal_no_domain_text_fallback(self):
+ """When user clicks on submit your domain request and the requested domain
+ is null (possible through url direct access to the review page), present
+ fallback copy in the modal's header.
+
+ NOTE: This may be a moot point if we implement a more solid pattern in the
+ future, like not a submit action at all on the review page."""
+
+ review_page = self.app.get(reverse("application:review"))
+ self.assertContains(review_page, "toggle-submit-domain-request")
+ self.assertContains(review_page, "You are about to submit an incomplete request")
+
class TestWithDomainPermissions(TestWithUser):
def setUp(self):
diff --git a/src/registrar/utility/errors.py b/src/registrar/utility/errors.py
index 9463c1387..455419236 100644
--- a/src/registrar/utility/errors.py
+++ b/src/registrar/utility/errors.py
@@ -43,11 +43,11 @@ class GenericError(Exception):
"""
_error_mapping = {
- GenericErrorCodes.CANNOT_CONTACT_REGISTRY: """
-We’re experiencing a system connection error. Please wait a few minutes
-and try again. If you continue to receive this error after a few tries,
-contact help@get.gov.
- """,
+ GenericErrorCodes.CANNOT_CONTACT_REGISTRY: (
+ "We’re experiencing a system connection error. Please wait a few minutes "
+ "and try again. If you continue to receive this error after a few tries, "
+ "contact help@get.gov."
+ ),
GenericErrorCodes.GENERIC_ERROR: ("Value entered was wrong."),
}
diff --git a/src/registrar/views/application.py b/src/registrar/views/application.py
index bb1b3aee6..0a6eb5b7b 100644
--- a/src/registrar/views/application.py
+++ b/src/registrar/views/application.py
@@ -321,12 +321,21 @@ class ApplicationWizard(ApplicationWizardPermissionView, TemplateView):
def get_context_data(self):
"""Define context for access on all wizard pages."""
+ # Build the submit button that we'll pass to the modal.
+ modal_button = '"
+ # Concatenate the modal header that we'll pass to the modal.
+ if self.application.requested_domain:
+ modal_heading = "You are about to submit a domain request for " + str(self.application.requested_domain)
+ else:
+ modal_heading = "You are about to submit an incomplete request"
return {
"form_titles": self.TITLES,
"steps": self.steps,
# Add information about which steps should be unlocked
"visited": self.storage.get("step_history", []),
"is_federal": self.application.is_federal(),
+ "modal_button": modal_button,
+ "modal_heading": modal_heading,
}
def get_step_list(self) -> list: