Minggu Terakhir Sprint 1

Pada minggu terakhir, pengembangan aplikasi sudah memasuki tahap penyempurnaan untuk Sprint pertama. Pada tahap ini, tetap dilakukan pengembangan berdasarkan Test-Drive Development. Pada Sprint pertama ini, saya bertugas untuk menyelesaikan salah satu User Story yaitu

Sebagai admin fakultas, saya dapat mengajukan berkas — berkas CYD

Lebih lengkapnya, saya melakukan beberapa hal seperti berikut ini.

Penambahan Exception Handling

Exception Handling menjadi cukup penting. Terkadang ada beberapa kasus yang perlu dicakup dalam kode. Misalnya pada kasus User Story ini, beberapa kasus yang cukup penting untuk diperhatikan diantaranya adalah.

  1. Calon Yang Diusulkan tidak terdaftar dalam database
  2. Aplikasi Calon Yang Diusulkan sudah terdaftar aktif, sehingga tidak dapat mengajukan untuk CYD yang sama

Exception seperti diatas ditangani pada level front-end, artinya ketika error tersebut muncul, aplikasi akan menampilkan pesan kepada pengguna UI-LIPSY. Contohnya dapat dilihat dibawah ini.

Error ketika NIP Staf tidak ditemukan

Exception handling ini dilakukan pada file views, yang pertama kali menerima request untuk terkait URL dan isi dari POST arguments.

try:
CYD = models.CalonYangDiusulkan.objects.get(nip=NIP)
except ObjectDoesNotExist:
return render(req, 'app/fakultas/upload.html',
{"user": {"role": "Fakultas"}, 'error': 'NIP {0} tidak ditemukan'.format(NIP)})
try:
models.Application.objects.get(cyd=CYD)
return render(req, 'app/fakultas/upload.html', {"user": {"role": "Fakultas"},
'error': 'Aplikasi dengan NIP {0} sudah dikumpulkan'.format(
NIP)})
except ObjectDoesNotExist:
pass
try:
fab.fakultas_upload(nip=NIP, file=FILE, recc_type=TYPE)
return render(req, 'app/fakultas/upload.html', {"user": {"role": "Fakultas"},
'success': 'Berhasil mengajukan berkas untuk NIP {0}'.format(
NIP)})
except fab.LevelExceededException as e:
return render(req, 'app/fakultas/upload.html', {"user": {"role": "Fakultas"}, 'error': e})
return render(req, 'app/fakultas/upload.html', {"user": {"role": "Fakultas"}})

pada kode tersebut ditampilkan bagaimana hasil render dari request jika kejadian atau kesalahan yang telah disebutkan sebelumnya terjadi

Penambahan Testcase yang Memiliki Cakupan lebih Luas

Selain penanganan dari sisi Front-End, saya juga memperbaharui file test yang ada. Pembaharuan ini meliputi pemanggilan fungsi pada controller yang yang tidak proper atau lazim untuk dilakukan.

fab.fakultas_upload(nip="123456789123456789", file=None, recc_type=1)
fab.fakultas_upload(nip="123456789123456789", file=None, recc_type=2)
try:
fab.fakultas_upload(nip="123456789123456789", file=None, recc_type=3)
except fab.LevelExceededException:
pass
fab.fakultas_upload(nip="123456789123456780", file=None, recc_type=1)
fab.fakultas_upload(nip="123456789123456780", file=None, recc_type=2)
try:
fab.fakultas_upload(nip="123456789123456780", file=None, recc_type=3)
except fab.LevelExceededException:
pass
fab.fakultas_upload(nip="123456789123456781", file=None, recc_type=1)
try:
fab.fakultas_upload(nip="123456789123456781", file=None, recc_type=2)
except fab.LevelExceededException:
pass
try:
fab.fakultas_upload(nip="123456789123456782", file=None, recc_type=2)
except fab.LevelExceededException:
pass

Pada test diatas terdapat pemanggilan fungsi fab.fakultas_upload(nip=”123456789123456780", file=None, recc_type=3)

Pemanggilan fungsi dengan parameter tersebut diharapkan tidak terjadi. Karena kami memiliki konvensi bahwa hanya terdapat recc_type yaitu 1 dan 2. Hal ini sudah ditangani oleh User Interface yang hanya menyediakan dua pilihan tersebut. Akan tetapi diperlukan penanganan terhadap pemanggilan fungsi yang tak lazim yang mungkin dilakukan oleh orang jahil, dan memastikannya tidak merusak sistem informasi UI-LIPSY.

Penyempurnaan Aplikasi terhadap TestCase

Berkaitan dengan pembaharuan test case pada bagian sebelumnya. Kali ini saya juga harus memperbaharui implementasi kode dari setiap views dan controller yang terkait. Pembaharuan Testcase lebih banyak mengarah kepada fungsi fakultas_upload pada bagian berikut ini.

 dest_level = None
if (CYD.current_level.name == "Staff Ahli") :
if (str(recc_type) == "1") :
dest_level = models.Level.objects.get(name="Lektor")
elif (str(recc_type) == "2") :
dest_level = models.Level.objects.get(name="Lektor Kepala")
else :
raise LevelExceededException('Error tidak bisa loncat {0} dari {1}'.format(recc_type, CYD.current_level.name))
elif (CYD.current_level.name == "Lektor") :
if (str(recc_type) == "1"):
dest_level = models.Level.objects.get(name="Lektor Kepala")
elif (str(recc_type) == "2"):
dest_level = models.Level.objects.get(name="Guru Besar")
else :
raise LevelExceededException('Error tidak bisa loncat {0} dari {1}'.format(recc_type, CYD.current_level.name))
elif (CYD.current_level.name == "Lektor Kepala") :
if (str(recc_type) == "1") :
dest_level = models.Level.objects.get(name="Guru Besar")
else :
raise LevelExceededException('Error tidak bisa loncat {0} dari {1}'.format(recc_type, CYD.current_level.name))
else :
raise LevelExceededException('{0} tidak bisa melakukan kenaikan jabatan'.format(CYD.current_level.name) )

Oleh karena test case berisikan simulasi terjadi nya kasus — kasus dibawah ini.

  1. Bila sudah mencapai jabatan Lektor Kepala tidak dimungkinkan adanya kenaikan jabatan loncat
  2. Bila sudah mencapai jabatan Guru Besar tidak mungkin adanya kenaikan apapun

Implementasi dari fungsi fakultas_upload menjadi diperbaharui seperti diatas. Kode kali ini sudah ditambahkan fitur untuk menangangi error apabila kedua kasus terjadi atau ada recc_type bukan bernilai 1 atau 2 dengan kata lain tipe kenaikan jabatan diluar dari kenaikan reguler dan kenaikan loncat.