Fakultas Ilmu Komputer UI

Commit c59bb733 authored by Yumna Pratista Tastaftian's avatar Yumna Pratista Tastaftian
Browse files

Merge branch 'testinggoat/ex8' into 'master'

Testinggoat/ex8

See merge request !8
parents efa00ed2 02842153
Pipeline #26090 passed with stages
in 5 minutes and 52 seconds
This diff is collapsed.
# 1606836976-practice # 1606836976-practice
HEROKU LINK : www.homepageyumna.herokuapp.com HEROKU LINK : www.homepageyumna.herokuapp.com
1. Exercise 3 - Lab 6 (obey the testing goat) 1. Exercise 3 - Lab 6 (obey the testing goat)
Proses test isolation yang dilakukan : Proses test isolation yang dilakukan :
* Pada exercise ini saya mengimplementasikan isolation test terutama pada functional test agar saat menjalankan test tersebut tidak mempengaruhi database aslinya. * Pada exercise ini saya mengimplementasikan isolation test terutama pada functional test agar saat menjalankan test tersebut tidak mempengaruhi database aslinya.
* Hal ini dilakukan dengan cara mengimplementasikan LiveServerTestCase pada functional_test. * Hal ini dilakukan dengan cara mengimplementasikan LiveServerTestCase pada functional_test.
* Berikut ini adalah yang dilakukan oleh LiveServerTestCase : * Berikut ini adalah yang dilakukan oleh LiveServerTestCase :
1. Memiliki atribut live_server_url, yaitu url yang akan dikunjungi saat menjalankan functional_test 1. Memiliki atribut live_server_url, yaitu url yang akan dikunjungi saat menjalankan functional_test
2. Menggunakan selenium dalam membuka web dengan url live_server_url 2. Menggunakan selenium dalam membuka web dengan url live_server_url
3. LiveServerTestCase akan membangun Django Server sehingga bisa membuka dan mengakses database yang terisolasi dari web aslinya 3. LiveServerTestCase akan membangun Django Server sehingga bisa membuka dan mengakses database yang terisolasi dari web aslinya
4. selenium akan membuka django server tersebut, melakukan fungsi sesuai dengan yang dispesifikasi pada functional_test dan menutupnya kembali setelah fungsi tersebut selesai di jalankan 4. selenium akan membuka django server tersebut, melakukan fungsi sesuai dengan yang dispesifikasi pada functional_test dan menutupnya kembali setelah fungsi tersebut selesai di jalankan
* Perbedaan desain lama dan desain baru dari program yang dibentuk * Perbedaan desain lama dan desain baru dari program yang dibentuk
1. Yang paling dominan dalam perubahan ini adalah implementasi dari LiveTesterTestCase 1. Yang paling dominan dalam perubahan ini adalah implementasi dari LiveTesterTestCase
2. Yang berbeda dari desain lama adalah pemanggilan dan pengaksesan seleniumnya pada functional_test, dimana pada desain yang lama selenium memanggil web real dari web ini sehingga saat functional test berjalan pun web sebenernya juga berubah. 2. Yang berbeda dari desain lama adalah pemanggilan dan pengaksesan seleniumnya pada functional_test, dimana pada desain yang lama selenium memanggil web real dari web ini sehingga saat functional test berjalan pun web sebenernya juga berubah.
3. Untuk yang desain baru, disini dipanggil live_server_url pada saat menjalankan functional_test yang nantinya akan membentuk Django Server sendiri sehingga tidak menggunakan database dan web asli dari url yang sebenarnya. 3. Untuk yang desain baru, disini dipanggil live_server_url pada saat menjalankan functional_test yang nantinya akan membentuk Django Server sendiri sehingga tidak menggunakan database dan web asli dari url yang sebenarnya.
4. time_sleep yang digunakan pun dirubah 4. time_sleep yang digunakan pun dirubah
3. Exercise 5 3. Exercise 5
* Proses refactoring : * Proses refactoring :
Refactoring sangat dibutuhkan dalam segala medan pemrograman, sesuai dengan teori yang ada dari buku, maka dengan bentuk TDD kita boleh membuat test passed terlebih dahulu saja, namun nantinya tetap harus direfactor untuk menjaga clean code. Refactoring sangat dibutuhkan dalam segala medan pemrograman, sesuai dengan teori yang ada dari buku, maka dengan bentuk TDD kita boleh membuat test passed terlebih dahulu saja, namun nantinya tetap harus direfactor untuk menjaga clean code.
Contoh yang ada pada exercise ini adalah dimana ada beberapa test yang ditulis berkali-kali sehingga program pun menjalankannya lebih dari sekali, sehingga hal tersebut harus dikurangi dengan cara menghapusnya agar hanya dijalankan sebanyak sekali. Contoh yang ada pada exercise ini adalah dimana ada beberapa test yang ditulis berkali-kali sehingga program pun menjalankannya lebih dari sekali, sehingga hal tersebut harus dikurangi dengan cara menghapusnya agar hanya dijalankan sebanyak sekali.
* Proses managing test/test organization : * Proses managing test/test organization :
Managing test/test organization ini diperlukan untuk merapihkan dan memiliki tujuan untuk meningkatkan clean code, serta kita juga dapat lebih mudah dalam memilih test apa saja yang mau dijalankan karena setiap file test akan mengurus test pada dirinya sendiri saja. Managing test/test organization ini diperlukan untuk merapihkan dan memiliki tujuan untuk meningkatkan clean code, serta kita juga dapat lebih mudah dalam memilih test apa saja yang mau dijalankan karena setiap file test akan mengurus test pada dirinya sendiri saja.
from django.contrib import admin from django.contrib import admin
# Register your models here. # Register your models here.
from django.apps import AppConfig from django.apps import AppConfig
class AccountsConfig(AppConfig): class AccountsConfig(AppConfig):
name = 'accounts' name = 'accounts'
import sys import sys
from accounts.models import ListUser, Token from accounts.models import Token, User
class PasswordlessAuthenticationBackend(object): class PasswordlessAuthenticationBackend(object):
def authenticate(self,request, uid): def authenticate(self, request, uid):
print('uid', uid, file=sys.stderr) print(uid + " authenticate")
if not Token.objects.filter(uid=uid).exists(): try:
print('no token found', file=sys.stderr) print(uid + " USER EXISTS")
return None token = Token.objects.get(uid=uid)
token = Token.objects.get(uid=uid) return User.objects.get(email=token.email)
print('got token', file=sys.stderr) except User.DoesNotExist:
try: print(uid + " USER NOT EXISTS")
user = ListUser.objects.get(email=token.email) return User.objects.create(email=token.email)
print('got user', file=sys.stderr) except Token.DoesNotExist:
return user print(uid + " TOKEN NOT EXISTS")
except ListUser.DoesNotExist: return None
print('new user', file=sys.stderr)
return ListUser.objects.create(email=token.email) def get_user(self, email):
try:
return User.objects.get(email=email)
def get_user(self, email): except User.DoesNotExist:
return ListUser.objects.get(email=email) return None
\ No newline at end of file
# Generated by Django 2.2.1 on 2019-11-14 06:15 # Generated by Django 2.2.1 on 2019-11-14 06:15
from django.db import migrations, models from django.db import migrations, models
import uuid import uuid
class Migration(migrations.Migration): class Migration(migrations.Migration):
initial = True initial = True
dependencies = [ dependencies = [
] ]
operations = [ operations = [
migrations.CreateModel( migrations.CreateModel(
name='User', name='User',
fields=[ fields=[
('email', models.EmailField(max_length=254, primary_key=True, serialize=False)), ('email', models.EmailField(max_length=254, primary_key=True, serialize=False)),
], ],
), ),
migrations.CreateModel( migrations.CreateModel(
name='Token', name='Token',
fields=[ fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('email', models.EmailField(max_length=254)), ('email', models.EmailField(max_length=254)),
('uid', models.CharField(default=uuid.uuid4, max_length=40)), ('uid', models.CharField(default=uuid.uuid4, max_length=40)),
], ],
), ),
] ]
from django.db import models from django.db import models
import uuid import uuid
from django.contrib import auth
class User(models.Model):
email = models.EmailField(primary_key = True) auth.signals.user_logged_in.disconnect(auth.models.update_last_login)
REQUIRED_FIELDS = [] class User(models.Model):
USERNAME_FIELD = 'email' email = models.EmailField(primary_key = True)
is_anonymous = False
is_authenticated = True REQUIRED_FIELDS = []
USERNAME_FIELD = 'email'
class Token(models.Model): is_anonymous = False
email = models.EmailField() is_authenticated = True
uid = models.CharField(max_length = 40, default=uuid.uuid4)
class Token(models.Model):
email = models.EmailField()
uid = models.CharField(max_length = 40, default=uuid.uuid4)
Supports Markdown
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