# -*- coding: utf-8 -*- from django.contrib.auth import get_user_model from django.test import tag from django.urls import reverse from django.utils.translation import ugettext from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from dav_base.tests.generic import ScreenshotTestCase TEST_USERNAME = 'root@localhost' TEST_PASSWORD = 'me||ön 21ABll' TEST_EMAIL = TEST_USERNAME @tag('screenshots', 'browser') class TestCase(ScreenshotTestCase): screenshot_prefix = 'dav_auth-' def setUp(self): super().setUp() # Need a test user self.test_username = TEST_USERNAME self.test_password = TEST_PASSWORD model = get_user_model() self.user = model.objects.create_user(username=TEST_USERNAME, password=TEST_PASSWORD, email=TEST_EMAIL) def test_screenshots(self): sequence_name = 'walkthrough' # Go to login page via login button on root page -> save plain login form c = self.selenium c.get(self.complete_url('/')) link = c.find_element(By.CSS_SELECTOR, '#login-widget a') link.click() self.wait_on_presence(c, (By.ID, 'id_username')) self.save_screenshot('empty_login_form', sequence=sequence_name) # Fill in a password -> Save dots in password field username_field = c.find_element(By.ID, 'id_username') username_field.clear() username_field.send_keys('username') password_field = c.find_element(By.ID, 'id_password') password_field.clear() password_field.send_keys(self.test_password) self.save_screenshot('filled_login_form', sequence=sequence_name) # Wrong username -> save error message username_field = c.find_element(By.ID, 'id_username') username_field.clear() username_field.send_keys(self.test_username[::-1]) password_field = c.find_element(By.ID, 'id_password') password_field.clear() password_field.send_keys(self.test_password) password_field.send_keys(Keys.RETURN) alert_button = self.wait_on_presence(c, (By.CSS_SELECTOR, 'form .alert-danger button.close')) self.save_screenshot('error_wrong_username', sequence=sequence_name) alert_button.click() # Wrong password -> save error message username_field = c.find_element(By.ID, 'id_username') username_field.clear() username_field.send_keys(self.test_username) password_field = c.find_element(By.ID, 'id_password') password_field.clear() password_field.send_keys(self.test_password[::-1]) password_field.send_keys(Keys.RETURN) alert_button = self.wait_on_presence(c, (By.CSS_SELECTOR, 'form .alert-danger button.close')) self.save_screenshot('error_wrong_password', sequence=sequence_name) alert_button.click() # Login of inactive user -> save error message self.user.is_active = False self.user.save() username_field = c.find_element(By.ID, 'id_username') username_field.clear() username_field.send_keys(self.test_username) password_field = c.find_element(By.ID, 'id_password') password_field.clear() password_field.send_keys(self.test_password) password_field.send_keys(Keys.RETURN) alert_button = self.wait_on_presence(c, (By.CSS_SELECTOR, 'form .alert-danger button.close')) self.save_screenshot('error_inactive_user', sequence=sequence_name) alert_button.click() # Reactivate test user again self.user.is_active = True self.user.save() # Login -> save success message username_field = c.find_element(By.ID, 'id_username') username_field.clear() username_field.send_keys(self.test_username) password_field = c.find_element(By.ID, 'id_password') password_field.clear() password_field.send_keys(self.test_password) password_field.send_keys(Keys.RETURN) alert_button = self.wait_on_presence(c, (By.CSS_SELECTOR, '#messages .alert-success button.close')) self.save_screenshot('login_succeed', sequence=sequence_name) alert_button.click() # Open user dropdown menu -> save menu dropdown_button = self.wait_on_presence(c, (By.ID, 'user_dropdown_button')) dropdown_button.click() self.save_screenshot('user_menu', sequence=sequence_name) # Click on 'set password' -> save set password page user_menu = c.find_element(By.CSS_SELECTOR, '#login-widget ul') link = user_menu.find_element(By.PARTIAL_LINK_TEXT, ugettext('Passwort ändern')) link.click() password_field = self.wait_on_presence(c, (By.ID, 'id_new_password')) self.save_screenshot('empty_set_password_form', sequence=sequence_name) # Fill in a password -> Save dots in password field send_mail_field = c.find_element(By.ID, 'id_send_password_mail') send_mail_field.click() password_field.clear() password_field.send_keys(self.test_password) password2_field = c.find_element(By.ID, 'id_new_password_repeat') password2_field.clear() password2_field.send_keys(self.test_password) self.save_screenshot('filled_set_password_form', sequence=sequence_name) # New passwords mismatch -> save error message password_field.clear() password_field.send_keys(self.test_password) password2_field.clear() password2_field.send_keys(self.test_password[::-1]) password2_field.send_keys(Keys.RETURN) self.wait_until_stale(c, password2_field) self.save_screenshot('error_mismatch', sequence=sequence_name) # New passwords too common and too short -> save error message password = 'abcdef' password_field = c.find_element(By.ID, 'id_new_password') password_field.clear() password_field.send_keys(password) password2_field = c.find_element(By.ID, 'id_new_password_repeat') password2_field.clear() password2_field.send_keys(password) password2_field.send_keys(Keys.RETURN) self.wait_until_stale(c, password2_field) self.save_screenshot('errors_too_common_too_short', sequence=sequence_name) # New passwords entirely_numeric -> save error message password = '9126735804' password_field = c.find_element(By.ID, 'id_new_password') password_field.clear() password_field.send_keys(password) password2_field = c.find_element(By.ID, 'id_new_password_repeat') password2_field.clear() password2_field.send_keys(password) password2_field.send_keys(Keys.RETURN) self.wait_until_stale(c, password2_field) self.save_screenshot('error_numeric', sequence=sequence_name) # New passwords too similar -> save error message password = self.test_username password_field = c.find_element(By.ID, 'id_new_password') password_field.clear() password_field.send_keys(password) password2_field = c.find_element(By.ID, 'id_new_password_repeat') password2_field.clear() password2_field.send_keys(password) password2_field.send_keys(Keys.RETURN) self.wait_until_stale(c, password2_field) self.save_screenshot('error_too_similar', sequence=sequence_name) # Change password -> save success message password = self.test_password[::-1] password_field = c.find_element(By.ID, 'id_new_password') password_field.clear() password_field.send_keys(password) password2_field = c.find_element(By.ID, 'id_new_password_repeat') password2_field.clear() password2_field.send_keys(password) password2_field.send_keys(Keys.RETURN) self.wait_until_stale(c, password2_field) self.save_screenshot('set_password_succeed', sequence=sequence_name) # Get password recreate page -> since we are logged in, it should # redirect to set password page again -> save html = c.find_element(By.TAG_NAME, 'html') c.get(self.complete_url(reverse('dav_auth:recreate_password'))) self.wait_until_stale(c, html) self.wait_on_presence(c, (By.ID, 'id_new_password')) self.save_screenshot('empty_set_password_form', sequence=sequence_name) # Click on 'logout' -> save page dropdown_button = self.wait_on_presence(c, (By.ID, 'user_dropdown_button')) dropdown_button.click() user_menu = c.find_element(By.CSS_SELECTOR, '#login-widget ul') link = user_menu.find_element(By.PARTIAL_LINK_TEXT, ugettext('Logout')) link.click() self.wait_until_stale(c, user_menu) self.save_screenshot('logout_succeed', sequence=sequence_name) # Click on 'login' to access password recreate link link = c.find_element(By.CSS_SELECTOR, '#login-widget a') link.click() self.wait_on_presence(c, (By.ID, 'id_username')) # Locate password recreate link, click it -> save password recreate form link = c.find_element(By.PARTIAL_LINK_TEXT, ugettext('Passwort vergessen')) link.click() username_field = self.wait_on_presence(c, (By.ID, 'id_username')) self.save_screenshot('empty_recreate_password_form', sequence=sequence_name) # Enter invalid username -> save result (login form, no message) username_field.send_keys(self.test_username[::-1]) username_field.send_keys(Keys.RETURN) self.wait_until_stale(c, username_field) self.save_screenshot('recreate_password_invalid_user', sequence=sequence_name) # Locate password recreate link, click it link = c.find_element(By.PARTIAL_LINK_TEXT, ugettext('Passwort vergessen')) link.click() username_field = self.wait_on_presence(c, (By.ID, 'id_username')) # Enter valid username -> save result (login page, success message) username_field.send_keys(self.test_username) username_field.send_keys(Keys.RETURN) self.wait_until_stale(c, username_field) self.save_screenshot('recreate_password_valid_user', sequence=sequence_name)