diff --git a/src/.pa11yci b/src/.pa11yci index 2d211acd4..f93601af9 100644 --- a/src/.pa11yci +++ b/src/.pa11yci @@ -3,14 +3,6 @@ "http://app:8080/", "http://app:8080/health/", "http://app:8080/whoami/", - "http://app:8080/register/", - { - "url": "http://app:8080/register/", - "actions": [ - "check field #id_About\\ your\\ organization-organization_type_0", - "click element #main-content > div > div.grid-col-9 > form > button", - "wait for path to be /register/Your%20organization's%20contact%20information/" - ] - } + "http://app:8080/register/" ] } diff --git a/src/Pipfile b/src/Pipfile index 2fc0ef500..adb28782e 100644 --- a/src/Pipfile +++ b/src/Pipfile @@ -27,3 +27,4 @@ flake8 = "*" mypy = "*" types-requests = "*" django-stubs = "*" +django-webtest = "*" diff --git a/src/Pipfile.lock b/src/Pipfile.lock index c667e6af8..84a6222cb 100644 --- a/src/Pipfile.lock +++ b/src/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "18eca71dc94b2fc658f01376fdf3518111de64db7acce87831e44b3a1803310f" + "sha256": "432db57cc28dd745dd6f514c642501a6c5de2a87d9bbe0a953be5bfd4f119d7d" }, "pipfile-spec": 6, "requires": {}, @@ -350,68 +350,67 @@ }, "psycopg2-binary": { "hashes": [ - "sha256:02cde837df012fa5d579b9cf4bc8e1feb460f38d61f7a4ab4a919d55a9f6eeef", - "sha256:044b6ab68613de7ea1e63856627deea091bfea09dea5ab4f050b13250fd18cab", - "sha256:0a9465f0aa36480c8e7614991cbe8ca8aa16b0517c5398a49648ce345e446c19", - "sha256:0d8e0c9eec79fe1ae66691e06e3cc714da6fbd77981209bf32fa823c03dbaff8", - "sha256:0eae72190be519bf2629062eab7ac8d4ceec5bd132953cefa1596584d86964fe", - "sha256:15e0ac0ed8a85f6049e836e95ddee627766561c85be8d23f4b3edb6ddbaa7310", - "sha256:161dc52a617f0bb610a87d391cb2e77fe65b89ebfbd752f4f3217dde701ea196", - "sha256:181ac372a5a5308b4076933601a9b5f0cd139b389b0aa5e164786a2abbcdb978", - "sha256:1c22c59ab7d9dc110d409445f111f58556bf699b0548f3fc5176684a29c629c4", - "sha256:226f11be577b70a57f4910c0ee28591d4d9fcb3d455e966267179156ae2e0c41", - "sha256:24d627ed69e754c48dd142a914124858c600b4108c92546eb0ba822e63c0c6e2", - "sha256:2535f44b00f26f6af0e949c825e6aecb9adcb56c965c17af5b97137fb69f00c0", - "sha256:25e0517ad7ee3c5c3c69dbe3c1d95504c811e42f452b39a3505d0763b1f6caa0", - "sha256:2903bf90b1e6bfc9bbfc94a1db0b50ffa9830a0ca4c042fbc38d93890c02ce08", - "sha256:2f1ded23d17af0d738e7e78087f0b88a53228887845b1989b03af4dfd3fef703", - "sha256:30200b07779446760813eef06098ec6d084131e4365b4e023eb43100de758b11", - "sha256:33ac8b4754e6b6b21f3ee180da169d8526d91aee9408ec1fc573c16ab32b0207", - "sha256:34fd249275faa782c3a2016e86ac2330636ac58d731a1580e7d686e3976b9536", - "sha256:44f5dc9b4384bafca8429759ce76c8960ffc2b583fcad9e5dfb3e5f4894269e4", - "sha256:451550e0bb5889bbabbf92575a6d6eafced941cc28c86be6ae4667f81bf32d67", - "sha256:52383e932e6de5595963f9178cf2af7b9e1f3daacf5135b9c0e21aabbc5bf7c4", - "sha256:55137faec669c4277c5687c6ce7c1fbc4dece0e2f14256ee808f4a652f0a2170", - "sha256:576b9dfbcd154a0e8b5d9dae6316d037450e64a3b31df87dec71d88e2a2d5e5f", - "sha256:59a3010d566a48b919490a982f6807f68842686941dc12d568e129d9cd7703d6", - "sha256:61c6a258469c66412ae8358a0501df6ccb3bb48aa9c43b56624571ff9767f91d", - "sha256:63edc507f8cbfbb5903adb75bad8a99f9798981c854df9119dbebab2ec3ee0e1", - "sha256:65d5f4e70a2d3fbaa1349236968792611088f3f2dccead36c1626e1d183cc327", - "sha256:6a1618260a112a9c93504511f0b6254b4402a8c41b7130dc6d4c9e39aff3aa0c", - "sha256:704f1fcdc5b606b70563ea696c69bda90caee3a2f45ffc9cee60a901b394a79f", - "sha256:7751b11cd7f6b952b4b5ec5b93b5be9ce20faba786c18c25c354f5d8717a173c", - "sha256:7ad9d032dc1a31a86ca7b059f43554a049a2bfda8fe32d1492ad25f6686aff03", - "sha256:7b01d07006a0ac2216921b69a220b9f0974345d0b1b36efaeabdc7550b1cc4f8", - "sha256:7b47643c45e7619788c081d42e1d9d98c7c8a4933010a9967d097cc3c4c29f41", - "sha256:80ed219ce6cb21a5b53ead0edf5b56b6d23de4cb95389ac606f47670474f4816", - "sha256:82df4a8600999c4c0cb7d6614df1bbdb3c74732f63e79f78487893ffbed3d083", - "sha256:8660112e9127a019969a23c878e1b4a419e8a6427f9a9050c19830f152628c8a", - "sha256:89a86c2b35460700d04b4d6461153ab39ee85af5a5385acac9563a8310e6320a", - "sha256:8d7bc25729bb6d96b44f49ad78fde0e27a1a867cb205322b7e5f5b49e04d6f1f", - "sha256:97e4f3d9b17d12e7c00cb1c29c0040044135cd5146838da4274615dbe0baae78", - "sha256:a431deb6ffdfa551f7400b3a94fa4b964837e67f49e3c37aa26d90dc75970816", - "sha256:a6a2d3d75d8698dee492f4af7ad07606d0734e581edf9e2ce2f74b6fce90f42e", - "sha256:ae5b41dbf7731b838021923edfbe3b5ccdec84d92d5795f5229c0d08d32509d9", - "sha256:aff258af03dda9a990960a53759d10c3a9b936837c71fe2f3b581acd356b9121", - "sha256:b216a15e13f6e763db40ac3beb74b588650bc030d10a78fde182b88d273b82b5", - "sha256:b23b25b1243576b952689966205ef7d4285688068b966a1ca0e620bcb390d483", - "sha256:b896637091cde69d170a89253dde9aee814b25ca204b7e213fd0a6462e666638", - "sha256:d5f27b1d1b56470385faa2b2636fcb823e7ac5b5b734e0aa76b14637c66eb3b7", - "sha256:d6ba33f39436191ece7ea2b3d0b4dff00af71acd5c6e6f1d6b7563aa7286e9f2", - "sha256:d6c5e1df6f427d7a82606cf8f07cf3ba9fb3f366804b01e65f1f00f8df6b54f1", - "sha256:e02f77b620ad6b36564fe41980865436912e21a3b1138cdde175cf24afde1bc5", - "sha256:e72491d72870c3cb2f0d6f4174485533caec0e9ed7e717e2859b7cc7ff2ae1c4", - "sha256:ea8d5cd689fa7225d81ae0a049ba03e0165f4ed9ca083b19a405be9ad0b36845", - "sha256:eb5341fc7c53fdd95ac2415be77b1de854ab266488cff71174ebb007baf0e675", - "sha256:edf0a66ce9517365c7dcfed597894d8dd1f27b59e550b77a089054101435213b", - "sha256:f225784812b2b57d340f2eb0d2cebef989dcc82c288f5553e28ee9767c7c8344", - "sha256:f5fbb3b325c65010e04af206a9243e2df8606736c510c7f268aca6a93e5294a9", - "sha256:f78cafa25731e0b5aa16fe20bea1abf643d4e853f6bfb8a64421b06b878e2b88", - "sha256:fb639a0e65dce4a9cccbcbdd8ddd0c8c6ab10bca317b827a5c52ac3c3a4ad60a", - "sha256:ffb2f288f577a748cc23c65a818290755a4c2da1f87a40d7055b61a096d31e20" + "sha256:00475004e5ed3e3bf5e056d66e5dcdf41a0dc62efcd57997acd9135c40a08a50", + "sha256:01ad49d68dd8c5362e4bfb4158f2896dc6e0c02e87b8a3770fc003459f1a4425", + "sha256:024030b13bdcbd53d8a93891a2cf07719715724fc9fee40243f3bd78b4264b8f", + "sha256:043a9fd45a03858ff72364b4b75090679bd875ee44df9c0613dc862ca6b98460", + "sha256:05b3d479425e047c848b9782cd7aac9c6727ce23181eb9647baf64ffdfc3da41", + "sha256:0775d6252ccb22b15da3b5d7adbbf8cfe284916b14b6dc0ff503a23edb01ee85", + "sha256:1e491e6489a6cb1d079df8eaa15957c277fdedb102b6a68cfbf40c4994412fd0", + "sha256:212757ffcecb3e1a5338d4e6761bf9c04f750e7d027117e74aa3cd8a75bb6fbd", + "sha256:215d6bf7e66732a514f47614f828d8c0aaac9a648c46a831955cb103473c7147", + "sha256:25382c7d174c679ce6927c16b6fbb68b10e56ee44b1acb40671e02d29f2fce7c", + "sha256:2d964eb24c8b021623df1c93c626671420c6efadbdb8655cb2bd5e0c6fa422ba", + "sha256:2ec46ed947801652c9643e0b1dc334cfb2781232e375ba97312c2fc256597632", + "sha256:2ef892cabdccefe577088a79580301f09f2a713eb239f4f9f62b2b29cafb0577", + "sha256:33e632d0885b95a8b97165899006c40e9ecdc634a529dca7b991eb7de4ece41c", + "sha256:3520d7af1ebc838cc6084a3281145d5cd5bdd43fdef139e6db5af01b92596cb7", + "sha256:422e3d43b47ac20141bc84b3d342eead8d8099a62881a501e97d15f6addabfe9", + "sha256:46512486be6fbceef51d7660dec017394ba3e170299d1dc30928cbedebbf103a", + "sha256:46850a640df62ae940e34a163f72e26aca1f88e2da79148e1862faaac985c302", + "sha256:56b2957a145f816726b109ee3d4e6822c23f919a7d91af5a94593723ed667835", + "sha256:5c6527c8efa5226a9e787507652dd5ba97b62d29b53c371a85cd13f957fe4d42", + "sha256:5cbc554ba47ecca8cd3396ddaca85e1ecfe3e48dd57dc5e415e59551affe568e", + "sha256:5d28ecdf191db558d0c07d0f16524ee9d67896edf2b7990eea800abeb23ebd61", + "sha256:5fc447058d083b8c6ac076fc26b446d44f0145308465d745fba93a28c14c9e32", + "sha256:63e318dbe52709ed10d516a356f22a635e07a2e34c68145484ed96a19b0c4c68", + "sha256:68d81a2fe184030aa0c5c11e518292e15d342a667184d91e30644c9d533e53e1", + "sha256:6e63814ec71db9bdb42905c925639f319c80e7909fb76c3b84edc79dadef8d60", + "sha256:6f8a9bcab7b6db2e3dbf65b214dfc795b4c6b3bb3af922901b6a67f7cb47d5f8", + "sha256:70831e03bd53702c941da1a1ad36c17d825a24fbb26857b40913d58df82ec18b", + "sha256:74eddec4537ab1f701a1647214734bc52cee2794df748f6ae5908e00771f180a", + "sha256:7cf1d44e710ca3a9ce952bda2855830fe9f9017ed6259e01fcd71ea6287565f5", + "sha256:7d07f552d1e412f4b4e64ce386d4c777a41da3b33f7098b6219012ba534fb2c2", + "sha256:7d88db096fa19d94f433420eaaf9f3c45382da2dd014b93e4bf3215639047c16", + "sha256:7ee3095d02d6f38bd7d9a5358fcc9ea78fcdb7176921528dd709cc63f40184f5", + "sha256:902844f9c4fb19b17dfa84d9e2ca053d4a4ba265723d62ea5c9c26b38e0aa1e6", + "sha256:95076399ec3b27a8f7fa1cc9a83417b1c920d55cf7a97f718a94efbb96c7f503", + "sha256:9c38d3869238e9d3409239bc05bc27d6b7c99c2a460ea337d2814b35fb4fea1b", + "sha256:9e32cedc389bcb76d9f24ea8a012b3cb8385ee362ea437e1d012ffaed106c17d", + "sha256:9ffdc51001136b699f9563b1c74cc1f8c07f66ef7219beb6417a4c8aaa896c28", + "sha256:a0adef094c49f242122bb145c3c8af442070dc0e4312db17e49058c1702606d4", + "sha256:a7e518a0911c50f60313cb9e74a169a65b5d293770db4770ebf004245f24b5c5", + "sha256:af0516e1711995cb08dc19bbd05bec7dbdebf4185f68870595156718d237df3e", + "sha256:b911dfb727e247340d36ae20c4b9259e4a64013ab9888ccb3cbba69b77fd9636", + "sha256:b9a794cef1d9c1772b94a72eec6da144c18e18041d294a9ab47669bc77a80c1d", + "sha256:b9c33d4aef08dfecbd1736ceab8b7b3c4358bf10a0121483e5cd60d3d308cc64", + "sha256:b9d38a4656e4e715d637abdf7296e98d6267df0cc0a8e9a016f8ba07e4aa3eeb", + "sha256:bcda1c84a1c533c528356da5490d464a139b6e84eb77cc0b432e38c5c6dd7882", + "sha256:c15ba5982c177bc4b23a7940c7e4394197e2d6a424a2d282e7c236b66da6d896", + "sha256:c5254cbd4f4855e11cebf678c1a848a3042d455a22a4ce61349c36aafd4c2267", + "sha256:c5682a45df7d9642eff590abc73157c887a68f016df0a8ad722dcc0f888f56d7", + "sha256:c5e65c6ac0ae4bf5bef1667029f81010b6017795dcb817ba5c7b8a8d61fab76f", + "sha256:d4c7b3a31502184e856df1f7bbb2c3735a05a8ce0ade34c5277e1577738a5c91", + "sha256:d892bfa1d023c3781a3cab8dd5af76b626c483484d782e8bd047c180db590e4c", + "sha256:dbc332beaf8492b5731229a881807cd7b91b50dbbbaf7fe2faf46942eda64a24", + "sha256:dc85b3777068ed30aff8242be2813038a929f2084f69e43ef869daddae50f6ee", + "sha256:e59137cdb970249ae60be2a49774c6dfb015bd0403f05af1fe61862e9626642d", + "sha256:e67b3c26e9b6d37b370c83aa790bbc121775c57bfb096c2e77eacca25fd0233b", + "sha256:e72c91bda9880f097c8aa3601a2c0de6c708763ba8128006151f496ca9065935", + "sha256:f95b8aca2703d6a30249f83f4fe6a9abf2e627aa892a5caaab2267d56be7ab69" ], "index": "pypi", - "version": "==2.9.4" + "version": "==2.9.5" }, "pycparser": { "hashes": [ @@ -553,6 +552,14 @@ "index": "pypi", "version": "==1.7.4" }, + "beautifulsoup4": { + "hashes": [ + "sha256:58d5c3d29f5a36ffeb94f02f0d786cd53014cf9b3b3951d42e0080d8a9498d30", + "sha256:ad9aa55b65ef2808eb405f46cf74df7fcb7044d5cbc26487f96eb2ef2e436693" + ], + "markers": "python_version >= '3.6'", + "version": "==4.11.1" + }, "black": { "hashes": [ "sha256:14ff67aec0a47c424bc99b71005202045dc09270da44a27848d534600ac64fc7", @@ -593,7 +600,7 @@ "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e", "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==8.1.3" }, "django": { @@ -628,6 +635,14 @@ "markers": "python_version >= '3.6'", "version": "==0.5.0" }, + "django-webtest": { + "hashes": [ + "sha256:c8c32041791cdae468e443097c432c67cf17cad339e1ab88b01a6c4841ee4c74", + "sha256:ef075e98b38fe3836dc533c2924d3e37c6bb3483008c40567115518a0303b1af" + ], + "index": "pypi", + "version": "==1.9.10" + }, "flake8": { "hashes": [ "sha256:6fbe320aad8d6b95cec8b8e47bc933004678dc63095be98528b7bdd2a9f510db", @@ -649,7 +664,7 @@ "sha256:41eea0deec2deea139b459ac03656f0dd28fc4a3387240ec1d3c259a2c47850f", "sha256:cc36bfc4a3f913e66805a28e84703e419d9c264c1077e537b54f0e1af85dbefd" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==3.1.29" }, "mccabe": { @@ -710,7 +725,7 @@ "sha256:46846318467efc4556ccfd27816e004270a9eeeeb4d062ce5e6fc7a87c573f93", "sha256:7ace6161b621d31e7902eb6b5ae148d12cfd23f4a249b9ffb6b9fee12084323d" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==0.10.1" }, "pbr": { @@ -726,7 +741,7 @@ "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788", "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==2.5.2" }, "pycodestyle": { @@ -807,6 +822,14 @@ "markers": "python_version >= '3.6'", "version": "==5.0.0" }, + "soupsieve": { + "hashes": [ + "sha256:3b2503d3c7084a42b1ebd08116e5f81aadfaea95863628c80a3b774a11b7c759", + "sha256:fc53893b3da2c33de295667a0e19f078c14bf86544af307354de5fcf12a3f30d" + ], + "markers": "python_version >= '3.6'", + "version": "==2.3.2.post1" + }, "sqlparse": { "hashes": [ "sha256:0323c0ec29cd52bceabc1b4d9d579e311f3e4961b98d174201d5622a23b85e34", @@ -828,7 +851,7 @@ "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" ], - "markers": "python_full_version < '3.11.0a7'", + "markers": "python_full_version >= '3.7.0'", "version": "==2.0.1" }, "types-pytz": { @@ -867,6 +890,30 @@ ], "markers": "python_version >= '3.7'", "version": "==4.4.0" + }, + "waitress": { + "hashes": [ + "sha256:7500c9625927c8ec60f54377d590f67b30c8e70ef4b8894214ac6e4cad233d2a", + "sha256:780a4082c5fbc0fde6a2fcfe5e26e6efc1e8f425730863c04085769781f51eba" + ], + "markers": "python_full_version >= '3.7.0'", + "version": "==2.1.2" + }, + "webob": { + "hashes": [ + "sha256:73aae30359291c14fa3b956f8b5ca31960e420c28c1bec002547fb04928cf89b", + "sha256:b64ef5141be559cfade448f044fa45c2260351edcb6a8ef6b7e00c7dcef0c323" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.8.7" + }, + "webtest": { + "hashes": [ + "sha256:2a001a9efa40d2a7e5d9cd8d1527c75f41814eb6afce2c3d207402547b1e5ead", + "sha256:54bd969725838d9861a9fa27f8d971f79d275d94ae255f5c501f53bb6d9929eb" + ], + "markers": "python_version >= '3.6' and python_version < '4'", + "version": "==3.0.0" } } } diff --git a/src/registrar/config/urls.py b/src/registrar/config/urls.py index 7d4439636..a8b185070 100644 --- a/src/registrar/config/urls.py +++ b/src/registrar/config/urls.py @@ -6,7 +6,7 @@ For more information see: from django.conf import settings from django.contrib import admin -from django.urls import include, path, re_path +from django.urls import include, path from django.views.generic import RedirectView from registrar.views import health, index, profile, whoami @@ -25,7 +25,7 @@ urlpatterns = [ path("edit_profile/", profile.edit_profile, name="edit-profile"), path("openid/", include("djangooidc.urls")), path("register/", application_wizard, name="application"), - re_path(r"^register/(?P.+)/$", application_wizard, name=APPLICATION_URL_NAME), + path("register//", application_wizard, name=APPLICATION_URL_NAME), ] if not settings.DEBUG: diff --git a/src/registrar/forms/application_wizard.py b/src/registrar/forms/application_wizard.py index 6a8ddcb3d..329cfd5e5 100644 --- a/src/registrar/forms/application_wizard.py +++ b/src/registrar/forms/application_wizard.py @@ -4,6 +4,8 @@ import logging from django import forms +from django.contrib.auth.mixins import LoginRequiredMixin + from formtools.wizard.views import NamedUrlSessionWizardView # type: ignore @@ -64,7 +66,16 @@ TEMPLATES = { } -class ApplicationWizard(NamedUrlSessionWizardView): +class ApplicationWizard(LoginRequiredMixin, NamedUrlSessionWizardView): + + """Multi-page form ("wizard") for new domain applications. + + This sets up a sequence of forms that gather information for new + domain applications. Each form in the sequence has its own URL and + the progress through the form is stored in the Django session (thus + "NamedUrlSessionWizardView"). + """ + form_list = FORMS def get_template_names(self): diff --git a/src/registrar/templates/application_contact.html b/src/registrar/templates/application_contact.html index eacb5bf65..d27dfe803 100644 --- a/src/registrar/templates/application_contact.html +++ b/src/registrar/templates/application_contact.html @@ -9,7 +9,7 @@

What is the name and mailing address of your organization?

-

Enter the name of the organization your represent. Your organization might be part +

Enter the name of the organization your represent. Your organization might be part of a larger entity. If so, enter information about your part of the larger entity.

All fields are required unless they are marked optional.

@@ -19,7 +19,7 @@ of a larger entity. If so, enter information about your part of the larger entit {% csrf_token %} {{ wizard.form.organization_name|add_label_class:"usa-label" }} - {{ wizard.form.organization_name|add_class:"usa-input" }} + {{ wizard.form.organization_name|add_class:"usa-input"|attr:"aria-describedby:instructions" }}
{{ wizard.form.street_address|add_label_class:"usa-label" }} @@ -29,7 +29,7 @@ of a larger entity. If so, enter information about your part of the larger entit {% if wizard.steps.prev %} {% endif %} - + {% endblock %} diff --git a/src/registrar/templates/application_organization.html b/src/registrar/templates/application_organization.html index 066462781..e03bf5a17 100644 --- a/src/registrar/templates/application_organization.html +++ b/src/registrar/templates/application_organization.html @@ -19,7 +19,7 @@ {{ wizard.form.organization_type|add_class:"usa-radio" }}
- + {% endblock %} diff --git a/src/registrar/tests/common.py b/src/registrar/tests/common.py index 2d6a89fef..3c885b948 100644 --- a/src/registrar/tests/common.py +++ b/src/registrar/tests/common.py @@ -14,7 +14,7 @@ class MockUserLogin: args = { UserModel.USERNAME_FIELD: username, } - user = UserModel.objects.get_or_create(**args) + user, _ = UserModel.objects.get_or_create(**args) user.is_staff = True user.is_superuser = True user.save() diff --git a/src/registrar/tests/test_views.py b/src/registrar/tests/test_views.py index b124cad5a..7372ae5d9 100644 --- a/src/registrar/tests/test_views.py +++ b/src/registrar/tests/test_views.py @@ -1,6 +1,9 @@ from django.test import Client, TestCase +from django.urls import reverse from django.contrib.auth import get_user_model +from django_webtest import WebTest # type: ignore + class TestViews(TestCase): def setUp(self): @@ -22,8 +25,14 @@ class TestViews(TestCase): self.assertEqual(response.status_code, 302) self.assertIn("?next=/whoami/", response.headers["Location"]) + def test_application_form_not_logged_in(self): + """Application form not accessible without a logged-in user.""" + response = self.client.get("/register/") + self.assertEqual(response.status_code, 302) + self.assertIn("/login?next=/register/", response.headers["Location"]) -class LoggedInTests(TestCase): + +class TestWithUser(TestCase): def setUp(self): username = "test_user" first_name = "First" @@ -32,6 +41,14 @@ class LoggedInTests(TestCase): self.user = get_user_model().objects.create( username=username, first_name=first_name, last_name=last_name, email=email ) + + def tearDown(self): + self.user.delete() + + +class LoggedInTests(TestWithUser): + def setUp(self): + super().setUp() self.client.force_login(self.user) def test_whoami_page(self): @@ -44,3 +61,36 @@ class LoggedInTests(TestCase): def test_edit_profile(self): response = self.client.get("/edit_profile/") self.assertContains(response, "Display Name") + + def test_application_form_view(self): + response = self.client.get("/register/", follow=True) + self.assertContains(response, "About your organization") + + +class FormTests(TestWithUser, WebTest): + + """Webtests for forms to test filling and submitting.""" + + # Doesn't work with CSRF checking + # hypothesis is that CSRF_USE_SESSIONS is incompatible with WebTest + csrf_checks = False + + def setUp(self): + super().setUp() + self.app.set_user(self.user.username) + + def test_application_form_empty_submit(self): + # 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() + self.assertIn("About your organization", result) + + def test_application_form_organization(self): + # 302 redirect to the first form + page = self.app.get(reverse("application")).follow() + form = page.form + form["About your organization-organization_type"] = "Federal" + result = page.form.submit().follow() + # Got the next form page + self.assertIn("contact information", result)