Fakultas Ilmu Komputer UI

Commit a2927b6b authored by Muhammad Ilham Peruzzi's avatar Muhammad Ilham Peruzzi
Browse files

Merge branch 'testinggoat/exercise9' into 'master'

Testinggoat/exercise9

See merge request !13
parents 586fb943 e9ecef94
Pipeline #26240 passed with stages
in 27 minutes and 33 seconds
......@@ -176,4 +176,14 @@ messages.add_message(
"Check your email, we've sent you a link you can use to log in."
)
```
Kedua implementasi tersebut, yaitu penggunaan message_success atau message.add_message akan memberikan output yang sama. Namun, dikarenakan mock yang dibuat terikat dengan message.success, maka mock yang dibuat akan rusak jika kita menggunakan implementasi message.add_message, sehingga mocking tersebut sangat bergantung pada bagaimana kita melakukan implementasi program tersebut (tightly coupled with the implementation).
\ No newline at end of file
Kedua implementasi tersebut, yaitu penggunaan message_success atau message.add_message akan memberikan output yang sama. Namun, dikarenakan mock yang dibuat terikat dengan message.success, maka mock yang dibuat akan rusak jika kita menggunakan implementasi message.add_message, sehingga mocking tersebut sangat bergantung pada bagaimana kita melakukan implementasi program tersebut (tightly coupled with the implementation).
# Cerita Exercise 9
## Mengapa Functional Test Subbab 20 lebih baik dari sebelumnya?
Hal tersebut dikarenakan pada subbab 20, kita menggunakan session untuk mengatur user sudah ter-autentikasi, sehingga kita tidak perlu melakukan login berulang-ulang saat melakukan test. Hal tersebut termasuk kedalam Text Fixture dimana kita melakukan 'seed' ke dalam database agar status user sudah ter-autentikasi. Selain itu, penerapan functional test pada subbab 20 juga menggunakan decorator buatan sendiri, yaitu decorator @wait yang dapat menngurangi duplikasi code pada pembuatan functional test sehingga test yang dibuat terlihat lebih rapi dan readable.
## Server-Side Debugging
Setelah melakukan instruksi pada subbab 21.1 dan 21.2, saya tidak melihat adanya error yang disebutkan pada textbook tersebut pada Log Heroku saya. Saya berkesimpulan mungkin saja environment yang saya gunakan berbeda dengan environment yang ada pada buku, sehingga error tersebut tidak muncul.
\ No newline at end of file
......@@ -8,6 +8,18 @@ import environ
from django.contrib.staticfiles.testing import StaticLiveServerTestCase
from unittest import skip
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):
......@@ -26,6 +38,7 @@ class FunctionalTest(StaticLiveServerTestCase):
def tearDown(self):
self.browser.quit()
@wait
def wait_for_row_in_list_table(self, row_text):
MAX_WAIT = 10
start_time = time.time()
......@@ -39,14 +52,25 @@ class FunctionalTest(StaticLiveServerTestCase):
if time.time() - start_time > MAX_WAIT:
raise e
time.sleep(0.5)
@wait
def wait_for(self, fn):
start_time = time.time()
MAX_WAIT = 10
while True:
try:
return fn()
except (AssertionError, WebDriverException) as e:
if time.time() - start_time > MAX_WAIT:
raise e
time.sleep(0.5)
\ No newline at end of file
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)
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
......@@ -55,4 +55,9 @@ class LoginTest(FunctionalTest):
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.assertNotIn(TEST_EMAIL, navbar.text)
def test_can_get_email_link_to_log_in(self):
​self.wait_to_be_logged_in(email=TEST_EMAIL)
self.browser.find_element_by_link_text('Log out').click()
​self.wait_to_be_logged_out(email=TEST_EMAIL) """
\ No newline at end of file
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)
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
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment