From 15f25626c8a86257d0765ccdb2966d0035b3173a Mon Sep 17 00:00:00 2001 From: Rahmania Astrid Mochtar <rahmania.astrid@ui.ac.id> Date: Thu, 28 Nov 2019 11:49:38 +0700 Subject: [PATCH 1/3] test_my_lists: precreate sessions, move login checks into base --- functional_tests/base.py | 15 ++++++++++++++ functional_tests/test_login.py | 22 +++++++------------- functional_tests/test_my_lists.py | 34 +++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 15 deletions(-) create mode 100644 functional_tests/test_my_lists.py diff --git a/functional_tests/base.py b/functional_tests/base.py index 75199f9..67dfec5 100644 --- a/functional_tests/base.py +++ b/functional_tests/base.py @@ -34,3 +34,18 @@ class FunctionalTest(StaticLiveServerTestCase): if time.time() - start_time > MAX_WAIT: raise e time.sleep(0.5) + + 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) + + + 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) \ No newline at end of file diff --git a/functional_tests/test_login.py b/functional_tests/test_login.py index dd431d6..6a894a2 100644 --- a/functional_tests/test_login.py +++ b/functional_tests/test_login.py @@ -41,18 +41,10 @@ class LoginTest(FunctionalTest): self.browser.get(url) # she is logged in! - # self.wait_for( - # lambda: self.browser.find_element_by_link_text('Log out') - # ) - # navbar = self.browser.find_element_by_css_selector('.navbar') - # self.assertIn(TEST_EMAIL, navbar.text) - - # # Now she logs out - # self.browser.find_element_by_link_text('Log out').click() - - # # She is logged out - # self.wait_for( - # lambda: self.browser.find_element_by_name('email') - # ) - # navbar = self.browser.find_element_by_css_selector('.navbar') - # self.assertNotIn(TEST_EMAIL, navbar.text) \ No newline at end of file + 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) \ No newline at end of file diff --git a/functional_tests/test_my_lists.py b/functional_tests/test_my_lists.py new file mode 100644 index 0000000..ac4beea --- /dev/null +++ b/functional_tests/test_my_lists.py @@ -0,0 +1,34 @@ +from django.conf import settings +from django.contrib.auth import BACKEND_SESSION_KEY, SESSION_KEY, get_user_model +from django.contrib.sessions.backends.db import SessionStore +from .base import FunctionalTest + +User = get_user_model() + + +class MyListsTest(FunctionalTest): + + def create_pre_authenticated_session(self, email): + user = User.objects.create(email=email) + session = SessionStore() + session[SESSION_KEY] = user.pk + session[BACKEND_SESSION_KEY] = settings.AUTHENTICATION_BACKENDS[0] + session.save() + ## to set a cookie we need to first visit the domain. + ## 404 pages load the quickest! + self.browser.get(self.live_server_url + "/404_no_such_url/") + self.browser.add_cookie(dict( + name=settings.SESSION_COOKIE_NAME, + 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) \ No newline at end of file -- GitLab From f70e5ad51beb244d879937daafe5fd83cdb54393 Mon Sep 17 00:00:00 2001 From: Rahmania Astrid Mochtar <rahmania.astrid@ui.ac.id> Date: Thu, 28 Nov 2019 12:08:15 +0700 Subject: [PATCH 2/3] used wait decorator --- functional_tests/base.py | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/functional_tests/base.py b/functional_tests/base.py index 67dfec5..fff8144 100644 --- a/functional_tests/base.py +++ b/functional_tests/base.py @@ -10,6 +10,17 @@ import time MAX_WAIT = 10 +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 class FunctionalTest(StaticLiveServerTestCase): def setUp(self): @@ -25,27 +36,26 @@ class FunctionalTest(StaticLiveServerTestCase): def tearDown(self): self.browser.quit() + @wait def wait_for(self, fn): - start_time = time.time() - while True: - try: - return fn() - except (AssertionError, WebDriverException) as e: - if time.time() - start_time > MAX_WAIT: - raise e - time.sleep(0.5) + return fn() + @wait + def wait_for_row_in_list_table(self, row_text): + table = self.browser.find_element_by_id('id_list_table') + rows = table.find_elements_by_tag_name('tr') + self.assertIn(row_text, [row.text for row in rows]) + + + @wait def wait_to_be_logged_in(self, email): - self.wait_for( - lambda: self.browser.find_element_by_link_text('Log out') - ) + 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') - ) + self.browser.find_element_by_name('email') navbar = self.browser.find_element_by_css_selector('.navbar') self.assertNotIn(email, navbar.text) \ No newline at end of file -- GitLab From e4b657d859635ed39aba1ead064f8abf47b03b77 Mon Sep 17 00:00:00 2001 From: Rahmania Astrid Mochtar <rahmania.astrid@ui.ac.id> Date: Thu, 28 Nov 2019 15:36:57 +0700 Subject: [PATCH 3/3] add readme ex9 --- README.md | 8 +++++++- functional_tests/base.py | 27 +++++++++++++-------------- functional_tests/test_login.py | 10 +++++----- 3 files changed, 25 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 28ab6e8..a75633b 100644 --- a/README.md +++ b/README.md @@ -235,4 +235,10 @@ Implementasinya: messages.SUCCESS, "Check your email, we've sent you a link you can use to log in." ``` -Dalam test nonmock akan pass, namun dalam test mock akan fail. Ini terjadi karena object yang di-mock adalah `accounts.views.messages` dan yang digunakan untuk assert adalah `messages.success`. Sementara dalam implementasi digunakan `messages.add_messages`. Sehingga meskipun hasil yang didapatkan sama, test yang dijalankan akan terus fail. \ No newline at end of file +Dalam test nonmock akan pass, namun dalam test mock akan fail. Ini terjadi karena object yang di-mock adalah `accounts.views.messages` dan yang digunakan untuk assert adalah `messages.success`. Sementara dalam implementasi digunakan `messages.add_messages`. Sehingga meskipun hasil yang didapatkan sama, test yang dijalankan akan terus fail. + +## Exercise 9 + +### Perbandingan Functional Test Login 20.1 vs 18.3 + +Functional test login pada 20.1 lebih baik dari 18.3 karena terdapat separation of concerns. Di setiap FT diperlukan user yang sudah logged-in. Daripada di setiap FT terdapat process login yang berulang, lebih baik jika step tersebut dapat di-skip. \ No newline at end of file diff --git a/functional_tests/base.py b/functional_tests/base.py index fff8144..9ed1681 100644 --- a/functional_tests/base.py +++ b/functional_tests/base.py @@ -10,17 +10,7 @@ import time MAX_WAIT = 10 -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 + class FunctionalTest(StaticLiveServerTestCase): def setUp(self): @@ -36,6 +26,18 @@ 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(self, fn): return fn() @@ -50,9 +52,6 @@ class FunctionalTest(StaticLiveServerTestCase): @wait def wait_to_be_logged_in(self, email): 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): diff --git a/functional_tests/test_login.py b/functional_tests/test_login.py index 6a894a2..e7a52e4 100644 --- a/functional_tests/test_login.py +++ b/functional_tests/test_login.py @@ -41,10 +41,10 @@ class LoginTest(FunctionalTest): self.browser.get(url) # she is logged in! - self.wait_to_be_logged_in(email=TEST_EMAIL) + # self.wait_to_be_logged_in(email=TEST_EMAIL) - # Now she logs out - self.browser.find_element_by_link_text('Log out').click() + # # 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) \ No newline at end of file + # # She is logged out + # self.wait_to_be_logged_out(email=TEST_EMAIL) \ No newline at end of file -- GitLab