Day 19 — Bug Fixing, QA Testing & Final Polish
Fase: 2 — Mini Project Asset Management | Minggu: 4 | Hari: Kamis
🎯 Tujuan Hari Ini
Tim melakukan pengujian menyeluruh (QA), memperbaiki semua bug yang ditemukan, memastikan tidak ada celah validasi, dan mempersiapkan presentasi akhir besok.
📋 Task Wajib
1. QA Testing Full-Suite (09:00 – 12:00)
QA Tester memimpin sesi pengujian. Setiap anggota tim ikut serta — rotate dan coba tekan/break fitur satu orang lainnya!
Gunakan tabel test case berikut. Isi kolom Status dan Catatan:
🔵 Modul Category
| # | Test Case | Input | Expected | Status | Catatan |
|---|---|---|---|---|---|
| C01 | Tambah kategori baru | Nama: "Server & Jaringan" | Berhasil tersimpan | ||
| C02 | Tambah kategori nama duplikat | Nama: "Elektronik" (sudah ada) | Validasi error | ||
| C03 | Tambah kategori nama terlalu pendek | Nama: "A" | Validasi error (min:2) | ||
| C04 | Edit nama kategori sudah ada (milik sendiri) | Edit "Elektronik" → "Elektronik" | Tidak error (unique ignore self) | ||
| C05 | Hapus kategori yang punya aset | Pilih kategori ber-aset | Muncul pesan error, tidak terhapus | ||
| C06 | Hapus kategori tanpa aset | Kategori yang baru | Berhasil dihapus |
🟢 Modul Asset
| # | Test Case | Input | Expected | Status | Catatan |
|---|---|---|---|---|---|
| A01 | Tambah aset tanpa kategori | Kosongkan dropdown | Validasi error | ||
| A02 | Tambah aset kode duplikat | Code: "EL-001" (sudah ada) | Validasi error | ||
| A03 | Tambah aset stok negatif | Stock: -5 | Validasi error (min:0) | ||
| A04 | Tambah aset stok 0 | Stock: 0 | Berhasil, tapi tidak muncul di dropdown pinjaman | ||
| A05 | Edit aset: ganti ke kategori lain | Pilih kategori beda | Berhasil update | ||
| A06 | Hapus aset yang masih punya pinjaman aktif | Aset aktif dipinjam | Harus muncul error (karena constrained) |
🟡 Modul Peminjaman (Loan)
| # | Test Case | Input | Expected | Status | Catatan |
|---|---|---|---|---|---|
| L01 | Pinjam aset dengan stok 0 | (Tidak ada di dropdown) | Tidak bisa dipilih | ||
| L02 | Pinjam lebih dari stok tersedia | Qty: 999 untuk aset stok 2 | Validasi error stok | ||
| L03 | Tanggal kembali sebelum tanggal pinjam | Return: kemarin | Validasi error | ||
| L04 | Pinjam quantity tepat sama dengan stok | Qty = Stock | Berhasil, stok jadi 0 | ||
| L05 | Kembalikan aset | Klik konfirmasi kembalikan | Status "Dikembalikan", stok bertambah | ||
| L06 | Coba kembalikan yg sudah dikembalikan | Akses URL return lagi | Muncul pesan error | ||
| L07 | Aset yang stoknya 0 → tidak muncul di form pinjam | - | Dropdown hanya tampilkan stok > 0 |
🔴 Modul Dashboard
| # | Test Case | Expected | Status |
|---|---|---|---|
| D01 | Widget "Sedang Dipinjam" sesuai data real | Count aktual sama | |
| D02 | Widget "Terlambat" muncul merah jika ada | Warna card merah | |
| D03 | Alert terlambat muncul jika ada pinjaman lewat tanggal | Section merah tampil | |
| D04 | "Stok Menipis" tampil aset dengan stok ≤ 2 | Data akurat |
2. Perbaiki Bug yang Ditemukan
Untuk setiap bug yang ditemukan, buat Git Issue di GitHub:
Title: [BUG] - Deskripsi singkat
Body:
- Steps to reproduce: ...
- Expected behavior: ...
- Actual behavior: ...
- Screenshot: [lampirkan]Buat branch bugfix/[nama-bug] untuk setiap perbaikan, lalu PR ke main.
3. Tambahkan Fitur Kecil yang Meningkatkan UX
Implementasikan setidaknya 2 dari 4 fitur bonus berikut:
Bonus A: Flash Message Otomatis Hilang
Tambahkan di bagian bawah layouts/app.blade.php:
@stack('scripts')
<script>
// Auto-hide flash messages setelah 4 detik
setTimeout(function() {
const alerts = document.querySelectorAll('.flash-alert');
alerts.forEach(el => {
el.style.transition = 'opacity 0.5s';
el.style.opacity = '0';
setTimeout(() => el.remove(), 500);
});
}, 4000);
</script>Update partials/alert.blade.php tambahkan class flash-alert:
<div class="flash-alert" style="...">...</div>Bonus B: Konfirmasi Hapus Lebih Baik
Ganti semua onsubmit="return confirm(...)" dengan modal custom atau SweetAlert2:
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<script>
document.querySelectorAll('.btn-hapus').forEach(btn => {
btn.addEventListener('click', function(e) {
e.preventDefault();
const form = this.closest('form');
Swal.fire({
title: 'Yakin hapus?',
text: 'Tindakan ini tidak bisa dibatalkan!',
icon: 'warning',
showCancelButton: true,
confirmButtonColor: '#dc3545',
cancelButtonText: 'Batal',
confirmButtonText: 'Ya, hapus!'
}).then((result) => {
if (result.isConfirmed) form.submit();
});
});
});
</script>Bonus C: Fitur Pencarian di Halaman Asset
Tambahkan form pencarian di assets/index.blade.php:
<form method="GET" action="{{ route('assets.index') }}" style="margin-bottom:20px; display:flex; gap:10px;">
<input type="text" name="search" value="{{ request('search') }}"
placeholder="Cari nama atau kode aset..."
style="flex:1; padding:10px; border:1px solid #ddd; border-radius:6px;">
<button type="submit" style="padding:10px 20px; background:#1a1a2e; color:white; border:none; border-radius:6px; cursor:pointer;">
🔍 Cari
</button>
@if(request('search'))
<a href="{{ route('assets.index') }}" style="padding:10px; border:1px solid #ddd; border-radius:6px; text-decoration:none; color:#666;">✕ Reset</a>
@endif
</form>Update AssetController@index:
$assets = Asset::with('category')
->when(request('search'), function ($q) {
$q->where('name', 'like', '%' . request('search') . '%')
->orWhere('code', 'like', '%' . request('search') . '%');
})
->orderBy('name')
->paginate(10)->withQueryString();Bonus D: Halaman Not Found (404) Custom
Buat resources/views/errors/404.blade.php:
@extends('layouts.app')
@section('title', 'Halaman Tidak Ditemukan')
@section('content')
<div style="text-align:center; padding:80px 20px;">
<span style="font-size:80px;">🔍</span>
<h1 style="font-size:48px; color:#1a1a2e; margin:20px 0;">404</h1>
<p style="font-size:18px; color:#666; margin-bottom:30px;">Halaman yang kamu cari tidak ditemukan.</p>
<a href="/" style="background:#1a1a2e; color:white; padding:14px 30px; border-radius:8px; text-decoration:none; font-size:15px;">
🏠 Kembali ke Dashboard
</a>
</div>
@endsection4. Persiapan Presentasi Akhir
Setiap anggota tim menyiapkan:
- [ ] Slide presentasi (Google Slides / PowerPoint, max 10 slide)
- [ ] Pastikan aplikasi berjalan tanpa error di laptop masing-masing
- [ ] Siapkan data demo (kategori, aset, dan pinjaman yang realistis)
Struktur slide yang disarankan:
- Cover: Nama aplikasi, nama tim, tanggal
- Latar belakang & tujuan aplikasi
- Fitur-fitur yang sudah dibangun (screenshot)
- Demo live (tidak perlu slide)
- Tantangan teknis yang dihadapi & cara mengatasinya
- Rencana pengembangan ke depan (jika diteruskan)
- Terima kasih / Q&A
📝 Laporan ke Mentor
📌 LAPORAN HARIAN — Day 19
Nama : [Nama Lengkap]
Role : [Role Kamu]
✅ Yang saya kerjakan hari ini:
- [ ] Menjalankan seluruh test case (min. yang sesuai role)
- [ ] Mendokumentasikan semua bug di GitHub Issues
- [ ] Semua bug kritikal sudah diperbaiki
- [ ] Minimal 2 fitur bonus diimplementasikan
- [ ] Slide presentasi sudah disiapkan (minimal draft)
📊 Hasil QA:
| Modul | Total Test | PASS | FAIL | Notes |
|-------|-----------|------|------|-------|
| Category | 6 | | | |
| Asset | 6 | | | |
| Loan | 7 | | | |
| Dashboard | 4 | | | |
| **Total** | **23** | | | |
🐛 Bug yang Ditemukan & Status:
1. [nama bug] → [status: fixed/open]
2. [nama bug] → [status: fixed/open]
🎯 Kesiapan Presentasi (1-10): ___
❓ Ada hal yang masih perlu diklarifikasi mentor sebelum besok?
[Tulis pertanyaan terakhirmu]Catatan Mentor
Hari ini adalah "stress test" aplikasi. Dorong peserta untuk mencoba hal-hal ekstrim:
- Apa yang terjadi jika stok mencapai 0 setelah dipinjam semua?
- Apa yang terjadi jika ada dua orang meminjam aset yang sama secara hampir bersamaan?
- Apa yang terjadi jika user menghapus URL manua untuk mengakses ID yang tidak ada?
Setiap kasus ini adalah pembelajaran berharga tentang edge case handling di dunia nyata.