Fakultas Ilmu Komputer UI

Commit 399b51f4 authored by Farah Alhaniy Efendi's avatar Farah Alhaniy Efendi
Browse files

Merge branch 'master' into 'uas-take-home'

# Conflicts:
#   lists/models.py
parents 15cec15d b54083de
Pipeline #28288 failed with stages
in 1 minute and 59 seconds
......@@ -32,6 +32,9 @@ uas-take-home branch
- Mocks Can Leave You Tightly Coupled
- Exercise 9 :
- Perbedaan implementasi functional test fitur login
- Exercise 10 :
- Data migration
- Populated data
## Exercise 3
**Proses test isolation**
......@@ -190,7 +193,7 @@ Dengan implementasi di **accounts/views.py** seperti berikut ini
Dengan implementasi tersebut, test tanpa mock terpenuhi sedangkan test dengan mock gagal terpenuhi. Dalam kata lain, dengan mock kita harus memiliki detil implementasi yang sesuai pada views, walaupun sebenarnya hasilnya sama sama benar.
## Exercise 8
## Exercise 9
### Perbedaan implementasi functional test fitur login
Pada bab 20.1 kita ingin menggunakan functional authentication system agar dapat mengidentifikasikan user dan memperlihatkan list yang sudah mereka buat. Maka dari itu kita membuat FT untuk logged-in user sehingga daripada melakukan seluruh prosedur dari tahap login yang memakan waktu, kita dapat melewati bagian login email (karena sudah logged in).
......@@ -238,3 +241,53 @@ Untuk bagian 21.2, pada logs di heroku bisa dilihat bahwa ada error SMTPSenderRe
2019-11-26T09:15:03.956712+00:00 app[web.1]: smtplib.SMTPSenderRefused: (530, b'5.5.1 Authentication Required. Learn more at\n5.5.1 https://support.google.com/mail/?p=WantAuthError m6sm4766481qke.80 - gsmtp', 'noreply@superlists')
2019-11-26T09:15:03.957480+00:00 app[web.1]: 10.69.117.24 - - [26/Nov/2019:09:15:03 +0000] "POST /accounts/send_login_email HTTP/1.1" 500 86865 "http://pmpl-farah.herokuapp.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"
```
## Exercise 10
### Mengapa dilakukan migrasi data?
Ketika dilakukan modifikasi pada file models, kita dapat merubah database skema yang ada. Hal tersebut bisa menjadi masalah ketika data yang sudah ada menjadi tidak sesuai dengan skema yang baru. "Data migrations" adalah sebuah tipe migrasi yang memodifikasi data dalam database daripada merubah skema yang ada.
Pada exercise 10, saya membuat sebuat data migrations yang akan berjalan sebelum saya mengaplikasikan integrity constraint (untuk menghilangkan duplikasi).
Saya menambahkan constraints unik pada models dan melakukan makemigrations. Lalu saya menambahkan fungsi dibawah ini dalam file migration yang baru saja dibuat, **0005_remove_duplicates.py**, untuk merubah existing data.
```python
def find_dupes(apps, schema_editor):
List = apps.get_model("lists", "List")
for list_ in List.objects.all():
items = list_.item_set.all()
texts = set()
for ix, item in enumerate(items):
if item.text in texts:
item.text = '{} ({})'.format(item.text, ix)
item.save()
texts.add(item.text)
```
### Simulation : Populate Data
Pada exercise ini, dilakukan populate data. Saya menggunakan data migrations untuk populate data sebanyak 100 data. Dengan membuat file migration baru dan menambahkan fungsi berikut ini.
```python
from django.db import migrations
def dump_data(apps, schema_editor):
List = apps.get_model("lists", "List")
Item = apps.get_model("lists", "Item")
for i in range(10):
_list = List.objects.create()
for j in range(10):
data = Item.objects.create(text='dump-data-' + str(j), list=_list)
class Migration(migrations.Migration):
dependencies = [
('lists', '0006_unique_together'),
]
operations = [
migrations.RunPython(dump_data),
]
```
Fungsi diatas yang akan membuat dump data nya berupa 10 list yang tiap list nya memiliki 10 item.
\ No newline at end of file
# Generated by Django 2.2.5 on 2019-12-09 07:27
from django.db import migrations
def find_dupes(apps, schema_editor):
List = apps.get_model("lists", "List")
for list_ in List.objects.all():
items = list_.item_set.all()
texts = set()
for ix, item in enumerate(items):
if item.text in texts:
item.text = '{} ({})'.format(item.text, ix)
item.save()
texts.add(item.text)
class Migration(migrations.Migration):
dependencies = [
('lists', '0004_item_list'),
]
operations = [
]
# Generated by Django 2.2.5 on 2019-12-09 07:28
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('lists', '0005_remove_duplicates'),
]
operations = [
migrations.AlterModelOptions(
name='item',
options={'ordering': ('id',)},
),
migrations.AlterUniqueTogether(
name='item',
unique_together={('list', 'text')},
),
]
# Generated by Django 2.2.5 on 2019-12-09 09:27
from django.db import migrations
def dump_data(apps, schema_editor):
List = apps.get_model("lists", "List")
Item = apps.get_model("lists", "Item")
for i in range(10):
_list = List.objects.create()
for j in range(10):
data = Item.objects.create(text='dump-data-' + str(j), list=_list)
class Migration(migrations.Migration):
dependencies = [
('lists', '0006_unique_together'),
]
operations = [
migrations.RunPython(dump_data),
]
......@@ -6,4 +6,8 @@ class List(models.Model):
class Item(models.Model):
text = models.TextField(default='')
list = models.ForeignKey(List, default=None, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
\ No newline at end of file
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
ordering = ('id',)
unique_together = ('list', 'text')
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