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