Merge branch 'main' of github.com:cisagov/manage.get.gov into es/993-restrict-withdrawing-request

This commit is contained in:
Erin 2023-12-18 20:39:47 -08:00
commit ced77016c5
No known key found for this signature in database
GPG key ID: 1CAD275313C62460
11 changed files with 150 additions and 63 deletions

View file

@ -19,7 +19,6 @@
"http://localhost:8080/register/other_contacts/", "http://localhost:8080/register/other_contacts/",
"http://localhost:8080/register/anything_else/", "http://localhost:8080/register/anything_else/",
"http://localhost:8080/register/requirements/", "http://localhost:8080/register/requirements/",
"http://localhost:8080/register/review/",
"http://localhost:8080/register/finished/" "http://localhost:8080/register/finished/"
] ]
} }

View file

@ -91,15 +91,17 @@ def available(request, domain=""):
# validate that the given domain could be a domain name and fail early if # validate that the given domain could be a domain name and fail early if
# not. # not.
if not (DraftDomain.string_could_be_domain(domain) or DraftDomain.string_could_be_domain(domain + ".gov")): 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 # a domain is available if it is NOT in the list of current domains
try: try:
if check_domain_available(domain): 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: else:
return JsonResponse({"available": False, "message": DOMAIN_API_MESSAGES["unavailable"]}) return JsonResponse(
{"available": False, "code": "unavailable", "message": DOMAIN_API_MESSAGES["unavailable"]}
)
except Exception: 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"]) @require_http_methods(["GET"])

View file

@ -29,7 +29,8 @@ class Command(BaseCommand):
self.update_success = [] self.update_success = []
self.update_skipped = [] self.update_skipped = []
self.update_failed = [] 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): def add_arguments(self, parser):
"""Add command line arguments.""" """Add command line arguments."""
@ -71,7 +72,9 @@ class Command(BaseCommand):
self.check_if_positive_int(limit_parse, "limitParse") self.check_if_positive_int(limit_parse, "limitParse")
valid_domains = Domain.objects.filter( 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") ).order_by("name")
domains_to_change_count = valid_domains.count() domains_to_change_count = valid_domains.count()
@ -134,7 +137,7 @@ class Command(BaseCommand):
==Proposed Changes== ==Proposed Changes==
Domains to change: {domains_to_change_count} 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}") logger.info(f"{TerminalColors.MAGENTA}" "Preparing to extend expiration dates..." f"{TerminalColors.ENDC}")

View file

@ -85,16 +85,29 @@
class="usa-button usa-button--outline" class="usa-button usa-button--outline"
>Save and return to manage your domains</button> >Save and return to manage your domains</button>
{% else %} {% else %}
<button <a
type="submit" href="#toggle-submit-domain-request"
class="usa-button usa-button--big dotgov-button--green" class="usa-button usa-button--big dotgov-button--green"
>Submit your domain request</button> aria-controls="toggle-submit-domain-request"
data-open-modal
>Submit your domain request</a
>
{% endif %} {% endif %}
</div> </div>
{% endblock %} {% endblock %}
</form> </form>
<div
class="usa-modal"
id="toggle-submit-domain-request"
aria-labelledby="Are you sure you want to submit a domain request?"
aria-describedby="Are you sure you want to submit a domain request?"
data-force-action
>
{% include 'includes/modal.html' with modal_heading=modal_heading|safe modal_description="Once you submit this request, you wont be able to make further edits until its reviewed by our staff. Youll only be able to withdraw your request." modal_button=modal_button|safe %}
</div>
{% block after_form_content %}{% endblock %} {% block after_form_content %}{% endblock %}
</main> </main>

View file

@ -12,7 +12,7 @@
<p>You can enter your name servers, as well as other DNS-related information, in the following sections:</p> <p>You can enter your name servers, as well as other DNS-related information, in the following sections:</p>
{% url 'domain-dns-nameservers' pk=domain.id as url %} {% url 'domain-dns-nameservers' pk=domain.id as url %}
<ul> <ul class="usa-list">
<li><a href="{{ url }}">Name servers</a></li> <li><a href="{{ url }}">Name servers</a></li>
{% url 'domain-dns-dnssec' pk=domain.id as url %} {% url 'domain-dns-dnssec' pk=domain.id as url %}

View file

@ -836,6 +836,11 @@ class MockEppLib(TestCase):
ex_date=datetime.date(2023, 2, 15), ex_date=datetime.date(2023, 2, 15),
) )
mockMaximumRenewedDomainExpDate = fakedEppObject(
"fakemaximum.gov",
ex_date=datetime.date(2024, 12, 31),
)
mockRecentRenewedDomainExpDate = fakedEppObject( mockRecentRenewedDomainExpDate = fakedEppObject(
"waterbutpurple.gov", "waterbutpurple.gov",
ex_date=datetime.date(2024, 11, 15), ex_date=datetime.date(2024, 11, 15),
@ -949,6 +954,11 @@ class MockEppLib(TestCase):
res_data=[self.mockDnsNeededRenewedDomainExpDate], res_data=[self.mockDnsNeededRenewedDomainExpDate],
code=ErrorCode.COMMAND_COMPLETED_SUCCESSFULLY, code=ErrorCode.COMMAND_COMPLETED_SUCCESSFULLY,
) )
elif getattr(_request, "name", None) == "fakemaximum.gov":
return MagicMock(
res_data=[self.mockMaximumRenewedDomainExpDate],
code=ErrorCode.COMMAND_COMPLETED_SUCCESSFULLY,
)
else: else:
return MagicMock( return MagicMock(
res_data=[self.mockRenewedDomainExpDate], res_data=[self.mockRenewedDomainExpDate],

View file

@ -18,8 +18,8 @@ class TestDataUpdates(TestCase):
self.user2 = User.objects.create(username="user2") self.user2 = User.objects.create(username="user2")
self.user3 = User.objects.create(username="user3") self.user3 = User.objects.create(username="user3")
self.user4 = User.objects.create(username="user4") 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? # The last user created triggers the creation of a contact and attaches itself to it. See signals.
# This bs_user defuses that situation so we can test the code. # This bs_user defuses that situation.
self.bs_user = User.objects.create() self.bs_user = User.objects.create()
self.contact1 = Contact.objects.create( self.contact1 = Contact.objects.create(

View file

@ -52,6 +52,15 @@ class TestExtendExpirationDates(MockEppLib):
domain_name="fakeneeded.gov", domain_name="fakeneeded.gov",
epp_expiration_date=datetime.date(2023, 11, 15), 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): def tearDown(self):
"""Deletes all DB objects related to migrations""" """Deletes all DB objects related to migrations"""
@ -114,6 +123,25 @@ class TestExtendExpirationDates(MockEppLib):
# should not be affected by the change. # should not be affected by the change.
self.assertEqual(current_domain.expiration_date, datetime.date(2022, 5, 25)) 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): def test_extends_expiration_date_skips_non_ready(self):
""" """
Tests that the extend_expiration_dates method correctly skips domains not in the state "ready" Tests that the extend_expiration_dates method correctly skips domains not in the state "ready"

View file

@ -141,7 +141,7 @@ class DomainApplicationTests(TestWithUser, WebTest):
# 302 redirect to the first form # 302 redirect to the first form
page = self.app.get(reverse("application:")).follow() page = self.app.get(reverse("application:")).follow()
# submitting should get back the same page if the required field is empty # 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) self.assertIn("What kind of U.S.-based government organization do you represent?", result)
def test_application_multiple_applications_exist(self): def test_application_multiple_applications_exist(self):
@ -164,6 +164,9 @@ class DomainApplicationTests(TestWithUser, WebTest):
this test work. this test work.
This test also looks for the long organization name on the summary page. 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 num_pages_tested = 0
# elections, type_of_work, tribal_government, no_other_contacts # 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] session_id = self.app.cookies[settings.SESSION_COOKIE_NAME]
# ---- TYPE PAGE ---- # ---- TYPE PAGE ----
type_form = type_page.form type_form = type_page.forms[0]
type_form["organization_type-organization_type"] = "federal" type_form["organization_type-organization_type"] = "federal"
# test next button and validate data # test next button and validate data
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) 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 # should see results in db
application = DomainApplication.objects.get() # there's only one application = DomainApplication.objects.get() # there's only one
self.assertEqual(application.organization_type, "federal") self.assertEqual(application.organization_type, "federal")
@ -197,7 +200,7 @@ class DomainApplicationTests(TestWithUser, WebTest):
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
federal_page = type_result.follow() federal_page = type_result.follow()
federal_form = federal_page.form federal_form = federal_page.forms[0]
federal_form["organization_federal-federal_type"] = "executive" federal_form["organization_federal-federal_type"] = "executive"
# test next button # test next button
@ -216,7 +219,7 @@ class DomainApplicationTests(TestWithUser, WebTest):
# Follow the redirect to the next form page # Follow the redirect to the next form page
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
org_contact_page = federal_result.follow() 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 # 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-federal_agency"] = "General Services Administration"
org_contact_form["organization_contact-organization_name"] = "Testorg" org_contact_form["organization_contact-organization_name"] = "Testorg"
@ -249,7 +252,7 @@ class DomainApplicationTests(TestWithUser, WebTest):
# Follow the redirect to the next form page # Follow the redirect to the next form page
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
ao_page = org_contact_result.follow() 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-first_name"] = "Testy ATO"
ao_form["authorizing_official-last_name"] = "Tester ATO" ao_form["authorizing_official-last_name"] = "Tester ATO"
ao_form["authorizing_official-title"] = "Chief Tester" ao_form["authorizing_official-title"] = "Chief Tester"
@ -276,7 +279,7 @@ class DomainApplicationTests(TestWithUser, WebTest):
# Follow the redirect to the next form page # Follow the redirect to the next form page
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
current_sites_page = ao_result.follow() 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" current_sites_form["current_sites-0-website"] = "www.city.com"
# test next button # test next button
@ -298,7 +301,7 @@ class DomainApplicationTests(TestWithUser, WebTest):
# Follow the redirect to the next form page # Follow the redirect to the next form page
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
dotgov_page = current_sites_result.follow() 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-requested_domain"] = "city"
dotgov_form["dotgov_domain-0-alternative_domain"] = "city1" dotgov_form["dotgov_domain-0-alternative_domain"] = "city1"
@ -318,7 +321,7 @@ class DomainApplicationTests(TestWithUser, WebTest):
# Follow the redirect to the next form page # Follow the redirect to the next form page
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
purpose_page = dotgov_result.follow() 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." purpose_form["purpose-purpose"] = "For all kinds of things."
# test next button # test next button
@ -337,7 +340,7 @@ class DomainApplicationTests(TestWithUser, WebTest):
# Follow the redirect to the next form page # Follow the redirect to the next form page
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
your_contact_page = purpose_result.follow() 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-first_name"] = "Testy you"
your_contact_form["your_contact-last_name"] = "Tester 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 # Follow the redirect to the next form page
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
other_contacts_page = your_contact_result.follow() 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-first_name"] = "Testy2"
other_contacts_form["other_contacts-0-last_name"] = "Tester2" 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 # Follow the redirect to the next form page
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
anything_else_page = other_contacts_result.follow() 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." 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 # Follow the redirect to the next form page
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
requirements_page = anything_else_result.follow() requirements_page = anything_else_result.follow()
requirements_form = requirements_page.form requirements_form = requirements_page.forms[0]
requirements_form["requirements-is_policy_acknowledged"] = True requirements_form["requirements-is_policy_acknowledged"] = True
@ -438,7 +441,7 @@ class DomainApplicationTests(TestWithUser, WebTest):
# Follow the redirect to the next form page # Follow the redirect to the next form page
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
review_page = requirements_result.follow() review_page = requirements_result.follow()
review_form = review_page.form review_form = review_page.forms[0]
# Review page contains all the previously entered data # Review page contains all the previously entered data
# Let's make sure the long org name is displayed # 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, "(201) 555-5557")
self.assertContains(review_page, "Nothing else.") 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 # final submission results in a redirect to the "finished" URL
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
with less_console_noise(): with less_console_noise():
@ -540,7 +551,7 @@ class DomainApplicationTests(TestWithUser, WebTest):
# the conditional step titles shouldn't appear initially # the conditional step titles shouldn't appear initially
self.assertNotContains(type_page, self.TITLES["organization_federal"]) self.assertNotContains(type_page, self.TITLES["organization_federal"])
self.assertNotContains(type_page, self.TITLES["organization_election"]) 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" type_form["organization_type-organization_type"] = "federal"
# set the session ID before .submit() # 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 # continuing on in the flow we need to see top-level agency on the
# contact page # 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) 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 # the post request should return a redirect to the contact
# question # question
self.assertEqual(federal_result.status_code, 302) self.assertEqual(federal_result.status_code, 302)
@ -586,7 +597,7 @@ class DomainApplicationTests(TestWithUser, WebTest):
# the conditional step titles shouldn't appear initially # the conditional step titles shouldn't appear initially
self.assertNotContains(type_page, self.TITLES["organization_federal"]) self.assertNotContains(type_page, self.TITLES["organization_federal"])
self.assertNotContains(type_page, self.TITLES["organization_election"]) 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" type_form["organization_type-organization_type"] = "county"
# set the session ID before .submit() # 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 # continuing on in the flow we need to NOT see top-level agency on the
# contact page # 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) 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 # the post request should return a redirect to the contact
# question # question
self.assertEqual(election_result.status_code, 302) self.assertEqual(election_result.status_code, 302)
@ -626,10 +637,10 @@ class DomainApplicationTests(TestWithUser, WebTest):
# and then setting the cookie on each request. # and then setting the cookie on each request.
session_id = self.app.cookies[settings.SESSION_COOKIE_NAME] 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" type_form["organization_type-organization_type"] = "federal"
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
type_result = type_page.form.submit() type_result = type_form.submit()
# follow first redirect # follow first redirect
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) 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. # and then setting the cookie on each request.
session_id = self.app.cookies[settings.SESSION_COOKIE_NAME] 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 type_form["organization_type-organization_type"] = DomainApplication.OrganizationChoices.INTERSTATE
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
type_result = type_page.form.submit() type_result = type_form.submit()
# follow first redirect # follow first redirect
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
contact_page = type_result.follow() 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) self.assertNotIn("federal_agency", org_contact_form.fields)
@ -690,10 +701,10 @@ class DomainApplicationTests(TestWithUser, WebTest):
# and then setting the cookie on each request. # and then setting the cookie on each request.
session_id = self.app.cookies[settings.SESSION_COOKIE_NAME] 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 type_form["organization_type-organization_type"] = DomainApplication.OrganizationChoices.SPECIAL_DISTRICT
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) 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 # follow first redirect
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
contact_page = type_result.follow() contact_page = type_result.follow()
@ -710,7 +721,7 @@ class DomainApplicationTests(TestWithUser, WebTest):
session_id = self.app.cookies[settings.SESSION_COOKIE_NAME] session_id = self.app.cookies[settings.SESSION_COOKIE_NAME]
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
result = contacts_page.form.submit() result = contacts_page.forms[0].submit()
# follow first redirect # follow first redirect
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
no_contacts_page = result.follow() no_contacts_page = result.follow()
@ -727,10 +738,10 @@ class DomainApplicationTests(TestWithUser, WebTest):
# and then setting the cookie on each request. # and then setting the cookie on each request.
session_id = self.app.cookies[settings.SESSION_COOKIE_NAME] 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 type_form["organization_type-organization_type"] = DomainApplication.OrganizationChoices.INTERSTATE
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
type_result = type_page.form.submit() type_result = type_form.submit()
# follow first redirect # follow first redirect
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
contact_page = type_result.follow() 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 # of a "session". We are going to do it manually, saving the session ID here
# and then setting the cookie on each request. # and then setting the cookie on each request.
session_id = self.app.cookies[settings.SESSION_COOKIE_NAME] 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 type_form["organization_type-organization_type"] = DomainApplication.OrganizationChoices.TRIBAL
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) 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 # the tribal government page comes immediately afterwards
self.assertIn("/tribal_government", type_result.headers["Location"]) self.assertIn("/tribal_government", type_result.headers["Location"])
# follow first redirect # follow first redirect
@ -767,18 +778,18 @@ class DomainApplicationTests(TestWithUser, WebTest):
session_id = self.app.cookies[settings.SESSION_COOKIE_NAME] session_id = self.app.cookies[settings.SESSION_COOKIE_NAME]
# ---- TYPE PAGE ---- # ---- TYPE PAGE ----
type_form = type_page.form type_form = type_page.forms[0]
type_form["organization_type-organization_type"] = "federal" type_form["organization_type-organization_type"] = "federal"
# test next button # test next button
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
type_result = type_page.form.submit() type_result = type_form.submit()
# ---- FEDERAL BRANCH PAGE ---- # ---- FEDERAL BRANCH PAGE ----
# Follow the redirect to the next form page # Follow the redirect to the next form page
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
federal_page = type_result.follow() federal_page = type_result.follow()
federal_form = federal_page.form federal_form = federal_page.forms[0]
federal_form["organization_federal-federal_type"] = "executive" federal_form["organization_federal-federal_type"] = "executive"
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
federal_result = federal_form.submit() federal_result = federal_form.submit()
@ -787,7 +798,7 @@ class DomainApplicationTests(TestWithUser, WebTest):
# Follow the redirect to the next form page # Follow the redirect to the next form page
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
org_contact_page = federal_result.follow() 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 # 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-federal_agency"] = "General Services Administration"
org_contact_form["organization_contact-organization_name"] = "Testorg" org_contact_form["organization_contact-organization_name"] = "Testorg"
@ -828,18 +839,18 @@ class DomainApplicationTests(TestWithUser, WebTest):
# and then setting the cookie on each request. # and then setting the cookie on each request.
session_id = self.app.cookies[settings.SESSION_COOKIE_NAME] session_id = self.app.cookies[settings.SESSION_COOKIE_NAME]
# ---- TYPE PAGE ---- # ---- TYPE PAGE ----
type_form = type_page.form type_form = type_page.forms[0]
type_form["organization_type-organization_type"] = "federal" type_form["organization_type-organization_type"] = "federal"
# test next button # test next button
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
type_result = type_page.form.submit() type_result = type_form.submit()
# ---- FEDERAL BRANCH PAGE ---- # ---- FEDERAL BRANCH PAGE ----
# Follow the redirect to the next form page # Follow the redirect to the next form page
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
federal_page = type_result.follow() federal_page = type_result.follow()
federal_form = federal_page.form federal_form = federal_page.forms[0]
federal_form["organization_federal-federal_type"] = "executive" federal_form["organization_federal-federal_type"] = "executive"
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
federal_result = federal_form.submit() federal_result = federal_form.submit()
@ -848,7 +859,7 @@ class DomainApplicationTests(TestWithUser, WebTest):
# Follow the redirect to the next form page # Follow the redirect to the next form page
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
org_contact_page = federal_result.follow() 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 # 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-federal_agency"] = "General Services Administration"
org_contact_form["organization_contact-organization_name"] = "Testorg" org_contact_form["organization_contact-organization_name"] = "Testorg"
@ -870,7 +881,7 @@ class DomainApplicationTests(TestWithUser, WebTest):
# Follow the redirect to the next form page # Follow the redirect to the next form page
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
ao_page = org_contact_result.follow() 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-first_name"] = "Testy ATO"
ao_form["authorizing_official-last_name"] = "Tester ATO" ao_form["authorizing_official-last_name"] = "Tester ATO"
ao_form["authorizing_official-title"] = "Chief Tester" ao_form["authorizing_official-title"] = "Chief Tester"
@ -884,7 +895,7 @@ class DomainApplicationTests(TestWithUser, WebTest):
# Follow the redirect to the next form page # Follow the redirect to the next form page
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
current_sites_page = ao_result.follow() 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" current_sites_form["current_sites-0-website"] = "www.city.com"
# test saving the page # test saving the page
@ -917,7 +928,7 @@ class DomainApplicationTests(TestWithUser, WebTest):
current_sites_page = self.app.get(reverse("application:current_sites")) current_sites_page = self.app.get(reverse("application:current_sites"))
session_id = self.app.cookies[settings.SESSION_COOKIE_NAME] session_id = self.app.cookies[settings.SESSION_COOKIE_NAME]
# fill in the form field # 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.assertIn("current_sites-0-website", current_sites_form.fields)
self.assertNotIn("current_sites-1-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" 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) self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
current_sites_result = current_sites_form.submit("submit_button", value="save") current_sites_result = current_sites_form.submit("submit_button", value="save")
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) 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 # verify that there are two form fields
value = current_sites_form["current_sites-0-website"].value 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) detail_page = home_page.click("Manage", index=0)
self.assertContains(detail_page, "Federal: an agency of the U.S. government") 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): class TestWithDomainPermissions(TestWithUser):
def setUp(self): def setUp(self):

View file

@ -43,11 +43,11 @@ class GenericError(Exception):
""" """
_error_mapping = { _error_mapping = {
GenericErrorCodes.CANNOT_CONTACT_REGISTRY: """ GenericErrorCodes.CANNOT_CONTACT_REGISTRY: (
Were experiencing a system connection error. Please wait a few minutes "Were experiencing a system connection error. Please wait a few minutes "
and try again. If you continue to receive this error after a few tries, "and try again. If you continue to receive this error after a few tries, "
contact help@get.gov. "contact help@get.gov."
""", ),
GenericErrorCodes.GENERIC_ERROR: ("Value entered was wrong."), GenericErrorCodes.GENERIC_ERROR: ("Value entered was wrong."),
} }

View file

@ -321,12 +321,21 @@ class ApplicationWizard(ApplicationWizardPermissionView, TemplateView):
def get_context_data(self): def get_context_data(self):
"""Define context for access on all wizard pages.""" """Define context for access on all wizard pages."""
# Build the submit button that we'll pass to the modal.
modal_button = '<button type="submit" ' 'class="usa-button" ' ">Submit request</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 { return {
"form_titles": self.TITLES, "form_titles": self.TITLES,
"steps": self.steps, "steps": self.steps,
# Add information about which steps should be unlocked # Add information about which steps should be unlocked
"visited": self.storage.get("step_history", []), "visited": self.storage.get("step_history", []),
"is_federal": self.application.is_federal(), "is_federal": self.application.is_federal(),
"modal_button": modal_button,
"modal_heading": modal_heading,
} }
def get_step_list(self) -> list: def get_step_list(self) -> list: