mirror of
https://github.com/django/django.git
synced 2025-10-31 09:41:08 +00:00
Fixed #34429 -- Allowed setting unusable passwords for users in the auth forms.
Co-authored-by: Natalia <124304+nessita@users.noreply.github.com>
This commit is contained in:
144
tests/admin_views/test_password_form.py
Normal file
144
tests/admin_views/test_password_form.py
Normal file
@@ -0,0 +1,144 @@
|
||||
from django.contrib.admin.tests import AdminSeleniumTestCase
|
||||
from django.contrib.auth.models import User
|
||||
from django.test import override_settings
|
||||
from django.urls import reverse
|
||||
|
||||
|
||||
@override_settings(ROOT_URLCONF="auth_tests.urls_admin")
|
||||
class SeleniumAuthTests(AdminSeleniumTestCase):
|
||||
available_apps = AdminSeleniumTestCase.available_apps
|
||||
|
||||
def setUp(self):
|
||||
self.superuser = User.objects.create_superuser(
|
||||
username="super",
|
||||
password="secret",
|
||||
email="super@example.com",
|
||||
)
|
||||
|
||||
def test_add_new_user(self):
|
||||
"""A user with no password can be added.
|
||||
|
||||
Enabling/disabling the usable password field shows/hides the password
|
||||
fields when adding a user.
|
||||
"""
|
||||
from selenium.common import NoSuchElementException
|
||||
from selenium.webdriver.common.by import By
|
||||
|
||||
user_add_url = reverse("auth_test_admin:auth_user_add")
|
||||
self.admin_login(username="super", password="secret")
|
||||
self.selenium.get(self.live_server_url + user_add_url)
|
||||
|
||||
pw_switch_on = self.selenium.find_element(
|
||||
By.CSS_SELECTOR, 'input[name="usable_password"][value="true"]'
|
||||
)
|
||||
pw_switch_off = self.selenium.find_element(
|
||||
By.CSS_SELECTOR, 'input[name="usable_password"][value="false"]'
|
||||
)
|
||||
password1 = self.selenium.find_element(
|
||||
By.CSS_SELECTOR, 'input[name="password1"]'
|
||||
)
|
||||
password2 = self.selenium.find_element(
|
||||
By.CSS_SELECTOR, 'input[name="password2"]'
|
||||
)
|
||||
|
||||
# Default is to set a password on user creation.
|
||||
self.assertIs(pw_switch_on.is_selected(), True)
|
||||
self.assertIs(pw_switch_off.is_selected(), False)
|
||||
|
||||
# The password fields are visible.
|
||||
self.assertIs(password1.is_displayed(), True)
|
||||
self.assertIs(password2.is_displayed(), True)
|
||||
|
||||
# Click to disable password-based authentication.
|
||||
pw_switch_off.click()
|
||||
|
||||
# Radio buttons are updated accordingly.
|
||||
self.assertIs(pw_switch_on.is_selected(), False)
|
||||
self.assertIs(pw_switch_off.is_selected(), True)
|
||||
|
||||
# The password fields are hidden.
|
||||
self.assertIs(password1.is_displayed(), False)
|
||||
self.assertIs(password2.is_displayed(), False)
|
||||
|
||||
# The warning message should not be shown.
|
||||
with self.assertRaises(NoSuchElementException):
|
||||
self.selenium.find_element(By.ID, "id_unusable_warning")
|
||||
|
||||
def test_change_password_for_existing_user(self):
|
||||
"""A user can have their password changed or unset.
|
||||
|
||||
Enabling/disabling the usable password field shows/hides the password
|
||||
fields and the warning about password lost.
|
||||
"""
|
||||
from selenium.webdriver.common.by import By
|
||||
|
||||
user = User.objects.create_user(
|
||||
username="ada", password="charles", email="ada@example.com"
|
||||
)
|
||||
user_url = reverse("auth_test_admin:auth_user_password_change", args=(user.pk,))
|
||||
self.admin_login(username="super", password="secret")
|
||||
self.selenium.get(self.live_server_url + user_url)
|
||||
|
||||
pw_switch_on = self.selenium.find_element(
|
||||
By.CSS_SELECTOR, 'input[name="usable_password"][value="true"]'
|
||||
)
|
||||
pw_switch_off = self.selenium.find_element(
|
||||
By.CSS_SELECTOR, 'input[name="usable_password"][value="false"]'
|
||||
)
|
||||
password1 = self.selenium.find_element(
|
||||
By.CSS_SELECTOR, 'input[name="password1"]'
|
||||
)
|
||||
password2 = self.selenium.find_element(
|
||||
By.CSS_SELECTOR, 'input[name="password2"]'
|
||||
)
|
||||
submit_set = self.selenium.find_element(
|
||||
By.CSS_SELECTOR, 'input[type="submit"].set-password'
|
||||
)
|
||||
submit_unset = self.selenium.find_element(
|
||||
By.CSS_SELECTOR, 'input[type="submit"].unset-password'
|
||||
)
|
||||
|
||||
# By default password-based authentication is enabled.
|
||||
self.assertIs(pw_switch_on.is_selected(), True)
|
||||
self.assertIs(pw_switch_off.is_selected(), False)
|
||||
|
||||
# The password fields are visible.
|
||||
self.assertIs(password1.is_displayed(), True)
|
||||
self.assertIs(password2.is_displayed(), True)
|
||||
|
||||
# Only the set password submit button is visible.
|
||||
self.assertIs(submit_set.is_displayed(), True)
|
||||
self.assertIs(submit_unset.is_displayed(), False)
|
||||
|
||||
# Click to disable password-based authentication.
|
||||
pw_switch_off.click()
|
||||
|
||||
# Radio buttons are updated accordingly.
|
||||
self.assertIs(pw_switch_on.is_selected(), False)
|
||||
self.assertIs(pw_switch_off.is_selected(), True)
|
||||
|
||||
# The password fields are hidden.
|
||||
self.assertIs(password1.is_displayed(), False)
|
||||
self.assertIs(password2.is_displayed(), False)
|
||||
|
||||
# Only the unset password submit button is visible.
|
||||
self.assertIs(submit_unset.is_displayed(), True)
|
||||
self.assertIs(submit_set.is_displayed(), False)
|
||||
|
||||
# The warning about password being lost is shown.
|
||||
warning = self.selenium.find_element(By.ID, "id_unusable_warning")
|
||||
self.assertIs(warning.is_displayed(), True)
|
||||
|
||||
# Click to enable password-based authentication.
|
||||
pw_switch_on.click()
|
||||
|
||||
# The warning disappears.
|
||||
self.assertIs(warning.is_displayed(), False)
|
||||
|
||||
# The password fields are shown.
|
||||
self.assertIs(password1.is_displayed(), True)
|
||||
self.assertIs(password2.is_displayed(), True)
|
||||
|
||||
# Only the set password submit button is visible.
|
||||
self.assertIs(submit_set.is_displayed(), True)
|
||||
self.assertIs(submit_unset.is_displayed(), False)
|
||||
Reference in New Issue
Block a user