import re import time from django.core import mail from django.test import LiveServerTestCase from django.test.utils import override_settings from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By from PyRIGS.tests.base import create_browser from RIGS import models # Functional Tests class UserRegistrationTest(LiveServerTestCase): def setUp(self): self.browser = create_browser() self.browser.implicitly_wait(5) # Set implicit wait session wide def tearDown(self): self.browser.quit() @override_settings(DEBUG=True) def test_registration(self): # Navigate to the registration page self.browser.get(self.live_server_url + "/user/register/") title_text = self.browser.find_element(By.TAG_NAME, "h3").text self.assertIn("User Registration", title_text) # Check the form invites correctly username = self.browser.find_element(By.ID, "id_username") self.assertEqual(username.get_attribute("placeholder"), "Username") email = self.browser.find_element(By.ID, "id_email") self.assertEqual(email.get_attribute("placeholder"), "E-mail") # If this is correct we don't need to test it later self.assertEqual(email.get_attribute("type"), "email") password1 = self.browser.find_element(By.ID, "id_password1") self.assertEqual(password1.get_attribute("placeholder"), "Password") self.assertEqual(password1.get_attribute("type"), "password") password2 = self.browser.find_element(By.ID, "id_password2") self.assertEqual(password2.get_attribute("placeholder"), "Password confirmation") self.assertEqual(password2.get_attribute("type"), "password") first_name = self.browser.find_element(By.ID, "id_first_name") self.assertEqual(first_name.get_attribute("placeholder"), "First name") last_name = self.browser.find_element(By.ID, "id_last_name") self.assertEqual(last_name.get_attribute("placeholder"), "Last name") initials = self.browser.find_element(By.ID, "id_initials") self.assertEqual(initials.get_attribute("placeholder"), "Initials") # No longer required for new users # phone = self.browser.find_element(By.ID, 'id_phone') # self.assertEqual(phone.get_attribute('placeholder'), 'Phone') # Fill the form out incorrectly username.send_keys("TestUsername") email.send_keys("test@example.com") password1.send_keys("correcthorsebatterystaple") # deliberate mistake password2.send_keys("correcthorsebatterystapleerror") first_name.send_keys("John") last_name.send_keys("Smith") initials.send_keys("JS") # phone.send_keys('0123456789') time.sleep(1) self.browser.switch_to.frame(self.browser.find_element(By.TAG_NAME, "iframe")) self.browser.find_element(By.ID, "anchor").click() self.browser.switch_to.default_content() time.sleep(3) # Submit incorrect form submit = self.browser.find_element(By.XPATH, "//input[@type='submit']") submit.click() time.sleep(2) # Restablish error fields password1 = self.browser.find_element(By.ID, "id_password1") password2 = self.browser.find_element(By.ID, "id_password2") # Read what the error is alert = self.browser.find_element(By.CSS_SELECTOR, ".alert-danger").text # TODO Use regex matching to handle smart/unsmart quotes... self.assertIn("password fields didn", alert) # Passwords should be empty self.assertEqual(password1.get_attribute("value"), "") self.assertEqual(password2.get_attribute("value"), "") # Correct error password1.send_keys("correcthorsebatterystaple") password2.send_keys("correcthorsebatterystaple") # Submit again password2.send_keys(Keys.ENTER) # Check we have a success message alert = self.browser.find_element(By.CSS_SELECTOR, ".alert-success").text self.assertIn("register", alert) self.assertIn("email", alert) # Check Email self.assertEqual(len(mail.outbox), 1) email = mail.outbox[0] self.assertIn('John Smith "JS" activation required', email.subject) urls = re.findall(r"http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+", email.body) self.assertEqual(len(urls), 1) mail.outbox = [] # empty this for later # Follow link self.browser.get(urls[0]) # go to the first link # Complete registration title_text = self.browser.find_element(By.TAG_NAME, "h2").text self.assertIn("Complete", title_text) # Test login self.browser.get(self.live_server_url + "/user/login") username = self.browser.find_element(By.ID, "id_username") self.assertEqual(username.get_attribute("placeholder"), "Username") password = self.browser.find_element(By.ID, "id_password") self.assertEqual(password.get_attribute("placeholder"), "Password") self.assertEqual(password.get_attribute("type"), "password") # Expected to fail as not approved username.send_keys("TestUsername") password.send_keys("correcthorsebatterystaple") password.send_keys(Keys.ENTER) # Test approval profileObject = models.Profile.objects.all()[0] self.assertFalse(profileObject.is_approved) # Read what the error is alert = self.browser.find_element(By.CSS_SELECTOR, "div.alert-danger").text self.assertIn("approved", alert) # Approve the user so we can proceed profileObject.is_approved = True profileObject.save() # Retry login self.browser.get(self.live_server_url + "/user/login") username = self.browser.find_element(By.ID, "id_username") username.send_keys("TestUsername") password = self.browser.find_element(By.ID, "id_password") password.send_keys("correcthorsebatterystaple") password.send_keys(Keys.ENTER) time.sleep(2) # Check we are logged in udd = self.browser.find_element(By.CLASS_NAME, "navbar").text self.assertIn("Hi John", udd) # Check all the data actually got saved self.assertEqual(profileObject.username, "TestUsername") self.assertEqual(profileObject.first_name, "John") self.assertEqual(profileObject.last_name, "Smith") self.assertEqual(profileObject.initials, "JS") # self.assertEqual(profileObject.phone, '0123456789') self.assertEqual(profileObject.email, "test@example.com") # All is well