diff --git a/src/registrar/tests/test_views.py b/src/registrar/tests/test_views.py index 1c215ec05..59a4ab700 100644 --- a/src/registrar/tests/test_views.py +++ b/src/registrar/tests/test_views.py @@ -10,6 +10,10 @@ from .common import MockEppLib, completed_application # type: ignore from django_webtest import WebTest # type: ignore import boto3_mocking # type: ignore +from registrar.utility.errors import ( + NameserverError, + NameserverErrorCodes, +) from registrar.models import ( DomainApplication, @@ -1393,20 +1397,165 @@ class TestDomainNameservers(TestDomainOverview): ) self.assertContains(page, "DNS name servers") - @skip("Broken by adding registry connection fix in ticket 848") - def test_domain_nameservers_form(self): + def test_domain_nameservers_form_submit_one_nameserver(self): """Can change domain's nameservers. Uses self.app WebTest because we need to interact with forms. """ + # initial nameservers page has one server with two ips nameservers_page = self.app.get( reverse("domain-dns-nameservers", kwargs={"pk": self.domain.id}) ) session_id = self.app.cookies[settings.SESSION_COOKIE_NAME] self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) + # attempt to submit the form with only one nameserver, should error + # regarding required fields with less_console_noise(): # swallow log warning message result = nameservers_page.form.submit() - # form submission was a post, response should be a redirect + # form submission was a post with an error, response should be a 200 + # error text appears twice, once at the top of the page, once around + # the required field. form requires a minimum of 2 name servers + self.assertContains(result, "This field is required.", count=2, status_code=200) + + def test_domain_nameservers_form_submit_subdomain_missing_ip(self): + """Can change domain's nameservers. + + Uses self.app WebTest because we need to interact with forms. + """ + # initial nameservers page has one server with two ips + nameservers_page = self.app.get( + reverse("domain-dns-nameservers", kwargs={"pk": self.domain.id}) + ) + session_id = self.app.cookies[settings.SESSION_COOKIE_NAME] + self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) + # attempt to submit the form without two hosts, both subdomains, + # only one has ips + nameservers_page.form["form-1-server"] = "ns2.igorville.gov" + with less_console_noise(): # swallow log warning message + result = nameservers_page.form.submit() + # form submission was a post with an error, response should be a 200 + # error text appears twice, once at the top of the page, once around + # the required field. subdomain missing an ip + self.assertContains( + result, + str(NameserverError(code=NameserverErrorCodes.MISSING_IP)), + count=2, + status_code=200 + ) + + def test_domain_nameservers_form_submit_missing_host(self): + """Can change domain's nameservers. + + Uses self.app WebTest because we need to interact with forms. + """ + # initial nameservers page has one server with two ips + nameservers_page = self.app.get( + reverse("domain-dns-nameservers", kwargs={"pk": self.domain.id}) + ) + session_id = self.app.cookies[settings.SESSION_COOKIE_NAME] + self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) + # attempt to submit the form without two hosts, both subdomains, + # only one has ips + nameservers_page.form["form-1-ip"] = "127.0.0.1" + with less_console_noise(): # swallow log warning message + result = nameservers_page.form.submit() + # form submission was a post with an error, response should be a 200 + # error text appears twice, once at the top of the page, once around + # the required field. nameserver has ip but missing host + self.assertContains( + result, + str(NameserverError(code=NameserverErrorCodes.MISSING_HOST)), + count=2, + status_code=200 + ) + + def test_domain_nameservers_form_submit_glue_record_not_allowed(self): + """Can change domain's nameservers. + + Uses self.app WebTest because we need to interact with forms. + """ + nameserver1 = "ns1.igorville.gov" + nameserver2 = "ns2.igorville.com" + valid_ip = "127.0.0.1" + # initial nameservers page has one server with two ips + nameservers_page = self.app.get( + reverse("domain-dns-nameservers", kwargs={"pk": self.domain.id}) + ) + session_id = self.app.cookies[settings.SESSION_COOKIE_NAME] + self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) + # attempt to submit the form without two hosts, both subdomains, + # only one has ips + nameservers_page.form["form-0-server"] = nameserver1 + nameservers_page.form["form-1-server"] = nameserver2 + nameservers_page.form["form-1-ip"] = valid_ip + with less_console_noise(): # swallow log warning message + result = nameservers_page.form.submit() + # form submission was a post with an error, response should be a 200 + # error text appears twice, once at the top of the page, once around + # the required field. nameserver has ip but missing host + self.assertContains( + result, + str(NameserverError( + code=NameserverErrorCodes.GLUE_RECORD_NOT_ALLOWED + )), + count=2, + status_code=200 + ) + + def test_domain_nameservers_form_submit_invalid_ip(self): + """Can change domain's nameservers. + + Uses self.app WebTest because we need to interact with forms. + """ + nameserver = "ns2.igorville.gov" + invalid_ip = "123" + # initial nameservers page has one server with two ips + nameservers_page = self.app.get( + reverse("domain-dns-nameservers", kwargs={"pk": self.domain.id}) + ) + session_id = self.app.cookies[settings.SESSION_COOKIE_NAME] + self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) + # attempt to submit the form without two hosts, both subdomains, + # only one has ips + nameservers_page.form["form-1-server"] = nameserver + nameservers_page.form["form-1-ip"] = invalid_ip + with less_console_noise(): # swallow log warning message + result = nameservers_page.form.submit() + # form submission was a post with an error, response should be a 200 + # error text appears twice, once at the top of the page, once around + # the required field. nameserver has ip but missing host + self.assertContains( + result, + str(NameserverError( + code=NameserverErrorCodes.INVALID_IP, + nameserver=nameserver + )), + count=2, + status_code=200 + ) + + def test_domain_nameservers_form_submits_successfully(self): + """Can change domain's nameservers. + + Uses self.app WebTest because we need to interact with forms. + """ + nameserver1 = "ns1.igorville.gov" + nameserver2 = "ns2.igorville.gov" + invalid_ip = "127.0.0.1" + # initial nameservers page has one server with two ips + nameservers_page = self.app.get( + reverse("domain-dns-nameservers", kwargs={"pk": self.domain.id}) + ) + session_id = self.app.cookies[settings.SESSION_COOKIE_NAME] + self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) + # attempt to submit the form without two hosts, both subdomains, + # only one has ips + nameservers_page.form["form-0-server"] = nameserver1 + nameservers_page.form["form-1-server"] = nameserver2 + nameservers_page.form["form-1-ip"] = invalid_ip + with less_console_noise(): # swallow log warning message + result = nameservers_page.form.submit() + # form submission was a successful post, response should be a 302 self.assertEqual(result.status_code, 302) self.assertEqual( result["Location"], @@ -1416,7 +1565,29 @@ class TestDomainNameservers(TestDomainOverview): page = result.follow() self.assertContains(page, "The name servers for this domain have been updated") - @skip("Broken by adding registry connection fix in ticket 848") + # self.assertContains(result, "This field is required.", count=2, status_code=200) + # add a second name server, which is a subdomain, but don't + # submit the required ip + # nameservers_page.form["form-1-server"] = "ns1.igorville.gov" + # with less_console_noise(): # swallow log warning message + # result = nameservers_page.form.submit() + # # form submission was a post with an error, response should be a 200 + # self.assertContains( + # result, + # str(NameserverError(code=NameserverErrorCodes.MISSING_IP)), + # count=2, + # status_code=200 + # ) + # form submission was a post, response should be a redirect + # self.assertEqual(result.status_code, 302) + # self.assertEqual( + # result["Location"], + # reverse("domain-dns-nameservers", kwargs={"pk": self.domain.id}), + # ) + # self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id) + # page = result.follow() + # self.assertContains(page, "The name servers for this domain have been updated") + def test_domain_nameservers_form_invalid(self): """Can change domain's nameservers. @@ -1433,9 +1604,9 @@ class TestDomainNameservers(TestDomainOverview): with less_console_noise(): # swallow logged warning message result = nameservers_page.form.submit() # form submission was a post with an error, response should be a 200 - # error text appears twice, once at the top of the page, once around - # the field. - self.assertContains(result, "This field is required", count=2, status_code=200) + # error text appears four times, twice at the top of the page, + # once around each required field. + self.assertContains(result, "This field is required", count=4, status_code=200) class TestDomainAuthorizingOfficial(TestDomainOverview):