From aefb07ea6e799830d8c604b4fbb8a353700be9f6 Mon Sep 17 00:00:00 2001 From: Alvin Raihan Date: Fri, 29 Nov 2019 11:34:47 +0700 Subject: [PATCH 1/2] ch 20.1 --- functional_tests/test_login.py | 28 ++++++++++++++++++++++++++-- functional_tests/test_my_list.py | 9 +++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/functional_tests/test_login.py b/functional_tests/test_login.py index dd4c20b..148722a 100644 --- a/functional_tests/test_login.py +++ b/functional_tests/test_login.py @@ -1,4 +1,3 @@ -from .base import FunctionalTest from django.core import mail from selenium.webdriver.common.keys import Keys import re @@ -15,7 +14,7 @@ class LoginTest(FunctionalTest): # Edith goes to the awesome superlists site # and notices a "Log in" section in the navbar for the first time # It's telling her to enter her email address, so she does - self.browser.get(self.live_server_url) + self.browser.get(self.live_server_url + '/homepage/') self.browser.find_element_by_name('email').send_keys(TEST_EMAIL) self.browser.find_element_by_name('email').send_keys(Keys.ENTER) @@ -24,3 +23,28 @@ class LoginTest(FunctionalTest): 'Check your email', self.browser.find_element_by_tag_name('body').text )) + + # She checks her email and finds a message + email = mail.outbox[0] + self.assertIn(TEST_EMAIL, email.to) + self.assertEqual(email.subject, SUBJECT) + + # It has a url link in it + self.assertIn('Use this link to log in', email.body) + url_search = re.search(r'http://.+/.+$', email.body) + if not url_search: + self.fail(f'Could not find url in email body:\n{email.body}') + url = url_search.group(0) + self.assertIn(self.live_server_url, url) + + # she clicks it + self.browser.get(url) + + # she is logged in! + self.wait_to_be_logged_in(email=TEST_EMAIL) + + #Now she logs out + self.browser.find_element_by_link_text('Log out').click() + + # she is logged out + self.wait_to_be_logged_out(email=TEST_EMAIL) diff --git a/functional_tests/test_my_list.py b/functional_tests/test_my_list.py index 136065e..9ef31bf 100644 --- a/functional_tests/test_my_list.py +++ b/functional_tests/test_my_list.py @@ -21,3 +21,12 @@ class MyListsTest(FunctionalTest): value=session.session_key, path='/', )) + ​def test_logged_in_users_lists_are_saved_as_my_lists(self): + ​email = 'edith@example.com' + ​self.browser.get(self.live_server_url) + ​self.wait_to_be_logged_out(email) + + ​# Edith is a logged-in user + ​self.create_pre_authenticated_session(email) + ​self.browser.get(self.live_server_url) + ​self.wait_to_be_logged_in(email -- GitLab From a6d3857ad96a4129efc87b6cf38e1bf8bed5918f Mon Sep 17 00:00:00 2001 From: Alvin Raihan Date: Fri, 29 Nov 2019 11:38:46 +0700 Subject: [PATCH 2/2] ch 20.2 --- functional_tests/base.py | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/functional_tests/base.py b/functional_tests/base.py index 5766596..2a2ddd6 100644 --- a/functional_tests/base.py +++ b/functional_tests/base.py @@ -14,6 +14,19 @@ class FunctionalTest(StaticLiveServerTestCase): def tearDown(self): self.browser.quit() + def wait(fn): + def modified_fn(*args, **kwargs): + start_time = time.time() + while True: + try: + return fn(*args, **kwargs) + except (AssertionError, WebdriverException) as e: + if time.time() - start_time > MAX_WAIT: + raise e + time.sleep(0.5) + return modified_fn + + @wait def wait_for_row_in_list_table(self, row_text): start_time = time.time() while True: @@ -26,3 +39,24 @@ class FunctionalTest(StaticLiveServerTestCase): if time.time() - start_time > MAX_WAIT: raise e time.sleep(0.5) + + @wait + def wait_for(self, fn): + return fn() + + @wait + def wait_to_be_logged_in(self, email): + self.wait_for( + lambda: self.browser.find_element_by_link_text('Log out') + ) + navbar = self.browser.find_element_by_css_selector('.navbar') + self.assertIn(email, navbar.text) + + + @wait + def wait_to_be_logged_out(self, email): + self.wait_for( + lambda: self.browser.find_element_by_name('email') + ) + navbar = self.browser.find_element_by_css_selector('.navbar') + self.assertNotIn(email, navbar.text) -- GitLab