QA Requirements & Test Basis
| Atribut | Nilai |
|---|
| Versi | 1.0 |
| Status | Ready for QA |
| Baseline code | linkzy@7615cb7a + working tree 18 Agustus 2026 |
| Tanggal baseline | 18 Agustus 2026 |
| Pemilik | Product, QA, dan Engineering |
| Produk | Linkzy Wedding & Commerce Platform |
Jika build yang diuji lebih baru daripada baseline di atas, catat commit/build pada test run dan lakukan impact analysis untuk perubahan setelah baseline.
1. Tujuanโ
Dokumen ini mendefinisikan persyaratan pengujian minimum sebelum perubahan Linkzy dapat dirilis. Pengujian harus membuktikan bahwa alur utama berfungsi, data antar-organisasi tetap terisolasi, subscription diterapkan dengan benar, dan tidak ada regresi pada fitur wedding maupun commerce yang sudah tersedia.
Dokumen ini berisi requirement dan acceptance criteria. Langkah test case yang sangat rinci boleh dikelola pada test-management tool, tetapi wajib mempertahankan ID requirement dari dokumen ini agar hasil pengujian dapat ditelusuri.
2. Ruang lingkupโ
Modul yang wajib diuji:
- autentikasi, otorisasi, dan tenant isolation;
- pricing, checkout, payment, subscription, dan free trial 7 hari;
- admin user dan daftar subscription/payment;
- Wedding Event, guest, RSVP, QR, dan reception check-in;
- Wedding Website dan invitation editor;
- LED Welcome Display;
- souvenir/voucher dan reports;
- WhatsApp Cloud API;
- keamanan input, upload, dan custom HTML;
- responsivitas, kompatibilitas browser, aksesibilitas dasar, dan performa.
Integrasi provider eksternal seperti payment gateway dan Meta WhatsApp diuji menggunakan sandbox/test account. Pengujian transaksi produksi berada di luar cakupan kecuali ada persetujuan tertulis.
Data minimumโ
Sediakan sekurangnya:
- dua organisasi berbeda; salah satunya memiliki organizer, staf organizer, dan freelance;
- satu user tanpa subscription;
- satu free trial aktif, satu trial yang berakhir hari ini, dan satu trial kedaluwarsa;
- subscription aktif, dibatalkan namun masih dalam periode aktif, expired, dan payment gagal;
- satu Wedding Event draft dan satu published;
- guest Regular, VIP, dan VVIP, termasuk guest tanpa nomor WhatsApp;
- invitation dengan blok RSVP, Custom HTML, dan dekorasi;
- inventori souvenir dengan stok cukup, stok terakhir, dan stok habis;
- koneksi WhatsApp sandbox/test dengan minimal satu template approved.
4. Entry dan exit criteriaโ
Entry criteriaโ
- Acceptance criteria fitur telah disetujui.
- Build berhasil dan dapat dijalankan pada environment target.
- Migration dan seeder berhasil tanpa intervensi manual.
- Environment serta integrasi sandbox tersedia.
- Tidak ada bug blocker yang membuat alur pengujian tidak dapat dimulai.
Exit criteriaโ
- Seluruh test berprioritas P0 dan P1 lulus.
- Tidak ada defect severity Blocker atau Critical yang masih terbuka.
- Defect Major yang diterima sebagai known issue memiliki persetujuan Product dan Engineering.
- Regression, tenant-isolation, dan subscription-expiry test lulus.
- Bukti hasil test tersedia dan requirement traceability diperbarui.
- Production smoke test lulus setelah deployment.
5. Prioritas dan severityโ
| Level | Arti |
|---|
| P0 | Alur kritis; wajib diuji pada setiap release |
| P1 | Fitur utama; wajib lulus sebelum release |
| P2 | Fitur pendukung dan edge case |
| P3 | Penyempurnaan visual atau risiko rendah |
| Severity | Contoh |
|---|
| Blocker | Aplikasi tidak dapat dibuka atau QA tidak dapat melanjutkan test |
| Critical | Bypass subscription, kebocoran tenant, kehilangan data, payment ganda, atau remote code execution |
| Major | Alur utama gagal tanpa workaround yang layak |
| Minor | Masalah non-kritis dengan workaround |
| Trivial | Copy, spacing, atau cosmetic issue |
6. Functional test requirementsโ
A. Autentikasi, role, dan tenantโ
| ID | Requirement / skenario | Hasil yang diharapkan | Prioritas |
|---|
| QA-AUTH-001 | Login menggunakan kredensial valid | User masuk dan diarahkan ke dashboard yang sesuai role | P0 |
| QA-AUTH-002 | Login dengan password salah atau akun tidak tersedia | Login ditolak dengan pesan aman tanpa membocorkan keberadaan akun | P1 |
| QA-AUTH-003 | Token/session tidak valid atau kedaluwarsa | API menolak request dan UI mengarahkan user untuk login ulang | P0 |
| QA-AUTH-004 | Freelance membuka route/API konfigurasi atau mengirim mutation selain operasional hari-H | Akses ditolak dengan 403; data tidak berubah | P0 |
| QA-AUTH-005 | Superadmin membuka daftar user, subscription, dan payment | Data lintas organisasi tampil; organizer hanya melihat user organisasinya sendiri | P0 |
| QA-AUTH-006 | User organisasi A meminta event/guest/report organisasi B melalui ID langsung | Request ditolak atau menghasilkan not found; tidak ada data tenant B yang bocor | P0 |
| QA-AUTH-007 | Dua organisasi menggunakan Contact dengan email/telepon sama | Record dan aktivitas wedding tetap terisolasi per organisasi | P0 |
| QA-AUTH-008 | Logout lalu gunakan kembali halaman atau token lama | Session tidak dapat dipakai untuk operasi terproteksi | P1 |
| QA-AUTH-009 | Staf mencoba membuat, mengubah, atau menghapus Wedding Event | Semua operasi ditolak 403, sementara daftar/detail event tetap dapat dibaca | P0 |
| QA-AUTH-010 | Staf atau freelance memanggil endpoint DELETE apa pun secara langsung | Request ditolak 403 oleh backend dan tombol hapus tidak tampil | P0 |
| QA-AUTH-011 | Freelance melakukan check-in dan penyerahan souvenir | Kedua aksi operasional berhasil dan tercatat pada tenant/event yang benar | P0 |
| QA-AUTH-012 | Staf/freelance melihat kehadiran dan formasi meja | Data dapat dibaca tanpa memperoleh akses edit yang tidak diizinkan | P1 |
| QA-AUTH-013 | Organizer membuat akun staf dan freelance | Akun menggunakan tenant organizer yang sama dan dapat login sesuai role | P0 |
B. Pricing, checkout, free trial, dan subscriptionโ
| ID | Requirement / skenario | Hasil yang diharapkan | Prioritas |
|---|
| QA-SUB-001 | Navigasi dari landing page ke pricing | Pricing terbuka sebagai halaman tersendiri, bukan section landing page | P1 |
| QA-SUB-002 | Pilih paket dari pricing | Checkout menerima paket yang benar, menampilkan harga dan ringkasan yang konsisten | P0 |
| QA-SUB-003 | Checkout dengan input wajib kosong/tidak valid | Submit ditolak dan validasi tampil pada field terkait | P1 |
| QA-SUB-004 | Payment sukses dari provider/sandbox | Payment tercatat sekali dan subscription aktif dengan periode yang benar | P0 |
| QA-SUB-005 | Callback/webhook payment sukses dikirim berulang | Proses idempotent; tidak ada payment atau periode subscription ganda | P0 |
| QA-SUB-006 | Payment pending, gagal, atau dibatalkan | Status akurat dan akses berbayar tidak diberikan sebelum payment valid | P0 |
| QA-SUB-007 | User baru mengaktifkan free trial | Trial aktif tepat 7 hari berdasarkan waktu server | P0 |
| QA-SUB-008 | User mencoba mengaktifkan trial kedua | Trial kedua ditolak; periode trial tidak diperpanjang | P0 |
| QA-SUB-009 | Trial masih aktif sebelum ends_at | Fitur sesuai paket trial dapat diakses | P0 |
| QA-SUB-010 | Waktu mencapai atau melewati ends_at | Akses fitur subscription ditolak dan user diarahkan ke halaman subscription expired/pricing | P0 |
| QA-SUB-011 | Subscription aktif berakhir | Setelah waktu server melewati expiry, akses langsung melalui UI maupun API ditolak | P0 |
| QA-SUB-012 | Mengubah jam browser agar trial terlihat aktif | Keputusan akses tetap mengikuti waktu backend/server | P0 |
| QA-SUB-013 | User tanpa record subscription | Tidak terjadi panic/500; sistem memperlakukan user sebagai tidak memiliki akses aktif | P0 |
| QA-SUB-014 | Subscription diperpanjang setelah expired | Akses kembali aktif tanpa menghilangkan data milik user | P1 |
C. Admin user, subscription, dan paymentโ
| ID | Requirement / skenario | Hasil yang diharapkan | Prioritas |
|---|
| QA-ADM-001 | Jalankan seeder pada database kosong | Organizer, staf, freelance, dan superadmin dibuat sesuai spesifikasi serta dapat login | P0 |
| QA-ADM-002 | Seeder dijalankan ulang | Seeder idempotent dan tidak membuat akun/payment duplikat | P1 |
| QA-ADM-003 | Buka daftar user | Loading, empty state, data state, pagination/filter bila tersedia, dan error state tampil benar | P1 |
| QA-ADM-004 | Buka daftar subscription/payment | User, paket, nominal, status, dan tanggal terhubung dengan record yang benar | P1 |
| QA-ADM-005 | Staf atau freelance membuka URL manajemen user/superadmin secara langsung | Route dan API tetap ditolak | P0 |
| QA-ADM-006 | Data memiliki field kosong atau relasi sudah dihapus | Halaman tidak crash dan menampilkan fallback yang aman | P2 |
| QA-ADM-007 | Buka /dashboard/settings sebagai user tenant aktif | GET /api/settings/admin mengembalikan 200, bukan Tenant context missing | P0 |
| QA-ADM-008 | Ubah Nama EO / Wedding Organizer dan unggah foto profil | Data tersimpan per tenant dan langsung tampil di bagian atas sidebar seluruh anggota tim | P1 |
| QA-ADM-009 | Unggah file non-gambar atau gambar lebih dari 3 MB | Upload ditolak dengan pesan validasi dan profil lama tetap digunakan | P1 |
| QA-ADM-010 | Freelance mencoba mengubah profil organisasi melalui UI atau API | Form bersifat read-only dan mutation API ditolak 403 | P0 |
D. Wedding Event dan guestโ
| ID | Requirement / skenario | Hasil yang diharapkan | Prioritas |
|---|
| QA-GST-001 | Membuat, mengubah, draft, dan publish Wedding Event | Status serta data tersimpan dan reload menampilkan nilai terbaru | P0 |
| QA-GST-002 | Menambah guest manual | Guest terhubung ke event dan organisasi yang benar | P0 |
| QA-GST-003 | Import .xlsx valid | Semua baris valid diimport dan ringkasan imported/skipped akurat | P1 |
| QA-GST-004 | Import berisi satu baris invalid | Seluruh transaksi dibatalkan dan nomor baris bermasalah ditampilkan | P1 |
| QA-GST-005 | Import file salah, lebih dari 10 MB, atau lebih dari 10.000 baris | File ditolak tanpa partial import | P1 |
| QA-GST-006 | Hapus guest dari /dashboard/guests lalu konfirmasi | Guest terhapus dari event aktif, daftar diperbarui, dan dialog mencegah penghapusan tidak sengaja | P0 |
| QA-GST-007 | Batalkan dialog hapus guest | Tidak ada perubahan data | P1 |
| QA-GST-008 | Hapus guest yang memiliki relasi operasional | Sistem mengikuti aturan backend: ditolak secara aman atau relasi ditangani tanpa orphan/corrupt data | P1 |
| QA-GST-009 | Buka WhatsApp click-to-chat | URL, nomor, encoding, dan variabel template sesuai guest; status opened tercatat | P1 |
| QA-GST-010 | Lihat, copy, dan download QR guest | Kode/PNG mewakili invitation_code yang sama dengan check-in | P1 |
| QA-GST-011 | Buat tamu dengan kategori Keluarga/Teman/custom dan level Regular/VIP/VVIP/VVVIP | Kategori relasi dan level tersimpan sebagai field terpisah serta tampil pada kolom yang benar | P1 |
| QA-GST-012 | Filter tabel berdasarkan kategori dan level | Hanya kombinasi guest yang sesuai ditampilkan; pencarian tetap dapat digabungkan dengan filter | P1 |
| QA-GST-013 | Edit nama, kontak, kategori, level, meja, sesi, dan kuantitas guest | Perubahan tervalidasi, tampil setelah reload, dan tidak mengubah invitation code maupun riwayat operasional | P0 |
E. Wedding Website dan invitation editorโ
| ID | Requirement / skenario | Hasil yang diharapkan | Prioritas |
|---|
| QA-EDT-001 | Buka /dashboard/editor/:slug | Editor memuat ID, slug, blok, pengaturan, dan status halaman yang benar | P0 |
| QA-EDT-002 | Klik Simpan & Publish pada draft | Satu operasi menyimpan perubahan dan mengubah status menjadi published | P0 |
| QA-EDT-003 | Klik tombol simpan berulang dengan cepat | Hanya satu proses aktif; tidak ada data lama yang menimpa data baru | P0 |
| QA-EDT-004 | Klik Lihat Live | Perubahan disimpan/publish lalu tab baru membuka /{slug} pada origin yang benar | P0 |
| QA-EDT-005 | Preview halaman wedding | URL tidak mengandung /dashboard/editor/undefined/ dan tidak menggunakan ID/slug kosong | P0 |
| QA-EDT-006 | Save gagal karena API/network | Toast error tampil, preview tidak menuju halaman palsu, dan perubahan tetap ditandai belum tersimpan | P1 |
| QA-EDT-007 | Save berhasil tetapi thumbnail gagal | Konten utama tetap tersimpan; kegagalan thumbnail tidak menggagalkan publish | P1 |
| QA-EDT-008 | Toggle header dan Powered by Linkzy.id | Preview editor dan halaman publik mengikuti pengaturan setelah save/reload | P1 |
| QA-EDT-009 | Pilih bahasa Indonesia/English | Seluruh copy RSVP dan copy halaman yang didukung berubah konsisten setelah save/reload | P1 |
| QA-EDT-010 | Tambah, urutkan, edit, undo/redo, dan hapus blok | State kanvas, panel aktif, serta hasil publik konsisten | P1 |
| QA-EDT-011 | Upload background, musik, dan gambar valid | Media tersimpan, dapat dimuat dari storage, dan tampil setelah reload | P1 |
| QA-EDT-012 | Upload file tidak didukung atau melebihi batas | Upload ditolak dengan pesan yang jelas dan tanpa file orphan | P1 |
| QA-EDT-013 | Layout editor pada halaman target | Padding dashboard yang tidak diperlukan tidak muncul khusus pada editor | P2 |
F. Custom HTML securityโ
| ID | Requirement / skenario | Hasil yang diharapkan | Prioritas |
|---|
| QA-HTML-001 | Masukkan <script>alert(1)</script> | Script dibuang dan tidak pernah dieksekusi di editor maupun halaman publik | P0 |
| QA-HTML-002 | Masukkan event handler seperti onerror, onclick, atau onload | Semua event handler dihapus | P0 |
| QA-HTML-003 | Masukkan javascript:, data:text/html, iframe, object, embed, form, atau meta refresh | Payload berbahaya diblokir/dibersihkan | P0 |
| QA-HTML-004 | Kirim payload berbahaya langsung ke API tanpa melalui frontend | Sanitasi backend tetap melindungi data tersimpan dan respons publik | P0 |
| QA-HTML-005 | Masukkan HTML aman yang didukung | Struktur dan teks aman tetap dirender sesuai allowlist | P1 |
| QA-HTML-006 | Uji payload encoded, nested, mixed-case, dan malformed | Sanitizer tidak dapat dilewati dan aplikasi tidak crash | P0 |
| QA-HTML-007 | Buka ulang konten lama yang sebelumnya berbahaya | Konten tidak mengeksekusi script saat render atau edit | P0 |
G. Dekorasi weddingโ
| ID | Requirement / skenario | Hasil yang diharapkan | Prioritas |
|---|
| QA-DEC-001 | Tambah blok Dekorasi Wedding | Placeholder tampil dan blok dapat dipilih/dihapus | P1 |
| QA-DEC-002 | Upload PNG/JPEG/WebP dekorasi | Gambar tampil di editor dan halaman publik setelah save/reload | P1 |
| QA-DEC-003 | Atur width, top/right/bottom/left | Posisi dan ukuran mengikuti nilai px, %, atau vw yang valid | P1 |
| QA-DEC-004 | Pilih absolute dan fixed | Absolute mengikuti container halaman; fixed mengikuti viewport | P1 |
| QA-DEC-005 | Atur rotation, opacity, dan z-index | Dekorasi dirender sesuai nilai tanpa menghalangi interaksi halaman | P1 |
| QA-DEC-006 | Pilih fade, slide, zoom, atau floating | Animasi berjalan sesuai pilihan dan durasi | P2 |
| QA-DEC-007 | Aktifkan scroll trigger | Animasi mulai ketika dekorasi masuk viewport dan tidak menghasilkan layout shift besar | P1 |
| QA-DEC-008 | Pilih Tanpa animasi | Dekorasi langsung terlihat tanpa transisi tersembunyi | P1 |
| QA-DEC-009 | Hapus dekorasi | Blok dan media storage terkait dibersihkan sesuai aturan delete | P2 |
| QA-DEC-010 | Uji dekorasi pada mobile dan desktop | Dekorasi tidak menutup form/tombol penting dan tetap tidak menangkap pointer event | P1 |
H. RSVP dan reception check-inโ
| ID | Requirement / skenario | Hasil yang diharapkan | Prioritas |
|---|
| QA-RSVP-001 | Submit RSVP hadir dengan field valid | RSVP tersimpan pada event/tenant yang benar dan konfirmasi tampil | P0 |
| QA-RSVP-002 | Submit RSVP tidak hadir | Status, jumlah hadir, dan pesan tersimpan sesuai aturan | P1 |
| QA-RSVP-003 | Submit tanpa nama atau attendance | Validasi tampil dan API tidak membuat record invalid | P1 |
| QA-RSVP-004 | Submit ke slug/event tidak valid atau tidak terhubung | API memberi respons aman 4xx, bukan panic/500 | P0 |
| QA-RSVP-005 | Poll latest check-in ketika tidak ada record baru | Endpoint mengembalikan 204 tanpa panic; logging record not found tidak dianggap server error | P0 |
| QA-RSVP-006 | Scan QR valid melalui scanner dan kamera | Keduanya menemukan Event Guest yang sama | P0 |
| QA-RSVP-007 | Scan QR yang sama dua kali pada event yang sama | Hanya check-in pertama diterima; percobaan berikutnya menampilkan informasi duplikat | P0 |
| QA-RSVP-008 | Dua device check-in guest yang sama secara bersamaan | Server menerima satu transaksi saja dan data tetap konsisten | P0 |
| QA-RSVP-009 | QR dari event atau tenant lain | Check-in ditolak tanpa membocorkan detail guest lain | P0 |
| QA-RSVP-010 | Mode offline: download, check-in, reconnect, sync | Operasi tersinkron tanpa duplikasi diam-diam dan konflik dapat ditangani | P0 |
| QA-RSVP-011 | Walk-in dan koreksi check-in | Data tersimpan; koreksi memerlukan alasan dan tercatat pada audit | P1 |
I. LED Welcome Displayโ
| ID | Requirement / skenario | Hasil yang diharapkan | Prioritas |
|---|
| QA-LED-001 | Buka editor LED untuk event aktif | Settings event yang benar dimuat tanpa bercampur dengan event lain | P1 |
| QA-LED-002 | Edit judul, subtitle, greeting, font, warna, background, dan durasi | Preview berubah dan nilai bertahan setelah save/reload | P1 |
| QA-LED-003 | Pilih tema LED | Seluruh token tampilan tema diterapkan dan masih dapat dikustomisasi | P1 |
| QA-LED-004 | Tambah/simpan tema custom sesuai fitur yang tersedia | Tema dapat digunakan kembali tanpa mengubah tenant lain | P1 |
| QA-LED-005 | Successful check-in diterima display | Nama/greeting guest tampil, efek berjalan, lalu kembali ke idle state | P0 |
| QA-LED-006 | Pilih audience VIP/VVIP/VVVIP dan lakukan check-in setiap level | Hanya level yang aktif tampil; Regular dan level yang dinonaktifkan tidak mengganggu display | P0 |
| QA-LED-007 | Media guest atau background tidak tersedia | Safe fallback tampil tanpa broken screen | P1 |
| QA-LED-008 | Reduced-motion atau sound dimatikan | Animasi/suara mengikuti preferensi dan tidak aktif kembali sendiri | P1 |
| QA-LED-009 | Display kehilangan koneksi lalu reconnect | UI tetap stabil dan event baru kembali diterima tanpa replay ganda | P1 |
| QA-LED-010 | Atur label, teks, dan pesan berbeda untuk VIP/VVIP/VVVIP | Konten yang benar dipilih berdasarkan level guest dan bertahan setelah save/reload | P1 |
| QA-LED-011 | Preview setiap level dari editor | Preview menggunakan konten level terpilih tanpa membuat record check-in | P1 |
| QA-LED-012 | VIP check-in diikuti Regular sebelum polling berikutnya | VIP tetap ditampilkan; check-in Regular tidak menutupi event prioritas | P0 |
J. Souvenir, reports, dan exportโ
| ID | Requirement / skenario | Hasil yang diharapkan | Prioritas |
|---|
| QA-OPS-001 | Buat item dan adjustment stok dengan alasan | Stok serta riwayat berubah secara atomik | P1 |
| QA-OPS-002 | Pickup voucher valid selama stok tersedia | Pickup sukses dan stok berkurang sekali tanpa pembatas allowance per tamu | P0 |
| QA-OPS-003 | Pickup melebihi stok atau item nonaktif | Transaksi ditolak tanpa perubahan parsial | P0 |
| QA-OPS-004 | Request pickup dengan client_operation_id yang sama dikirim ulang | Hanya satu pickup tercatat | P0 |
| QA-OPS-005 | Reversal pickup | Reversal hanya sekali, membutuhkan alasan, dan mengembalikan stok | P1 |
| QA-OPS-006 | Buka report tanpa filter dan dengan rentang tanggal inklusif | KPI serta grafik berasal dari data event dan periode yang benar | P1 |
| QA-OPS-007 | Bandingkan report dengan data guest/check-in/souvenir | Angka summary dan breakdown konsisten | P1 |
| QA-OPS-008 | Export CSV | File berisi UTF-8 BOM, dapat dibuka di Excel, dan sama dengan filter aktif | P1 |
| QA-OPS-009 | Minta report event tenant lain | Akses ditolak tanpa data bocor | P0 |
K. WhatsApp Cloud APIโ
| ID | Requirement / skenario | Hasil yang diharapkan | Prioritas |
|---|
| QA-WA-001 | Simpan WABA ID, Phone Number ID, dan token valid | Meta berhasil diverifikasi dan token tidak pernah dikembalikan ke browser | P0 |
| QA-WA-002 | Token atau Phone Number ID invalid | Koneksi ditolak dengan error aman; secret tidak tampil pada log/UI | P0 |
| QA-WA-003 | Sinkronisasi template | Hanya template milik organisasi terkait yang tersimpan dan approved template dapat dipilih | P1 |
| QA-WA-004 | Kirim test template valid | Provider message ID tersimpan dan status awal benar | P1 |
| QA-WA-005 | Webhook verify token salah | Request ditolak 403 | P0 |
| QA-WA-006 | Webhook signature salah | Request ditolak 401 tanpa mengubah status message | P0 |
| QA-WA-007 | Webhook signed valid untuk sent/delivered/read/failed | Status diperbarui idempotently sesuai message ID | P1 |
| QA-WA-008 | Organisasi A meminta koneksi/template/history organisasi B | Akses ditolak dan secret/data tidak bocor | P0 |
7. Non-functional requirementsโ
Securityโ
- Seluruh route private dan API diuji tanpa token, dengan token expired, role salah, tenant salah, serta object ID hasil manipulasi.
- Password, token Meta, encryption key, payment secret, dan data sensitif tidak boleh muncul pada respons API, HTML, browser storage yang tidak semestinya, screenshot, atau application log.
- File upload harus memvalidasi MIME type, ekstensi, ukuran, nama file, dan hasil decode gambar di backend.
- Input diuji terhadap XSS, SQL injection, path traversal, mass assignment, oversized payload, dan malformed JSON.
- Endpoint mutation yang dapat dikirim ulang harus mempunyai proteksi transaksi/idempotensi sesuai risikonya.
- Rate limiting/brute-force protection diuji pada login dan public submission apabila telah dikonfigurasi.
| ID | Requirement | Hasil yang diharapkan |
|---|
| QA-NFR-001 | Save editor pada koneksi normal | Respons penyimpanan utama tidak menunggu proses thumbnail selesai |
| QA-NFR-002 | Guest list/import hingga batas yang didukung | UI tetap usable dan API selesai tanpa memory spike/error |
| QA-NFR-003 | Poll latest check-in tanpa data selama 15 menit | Tidak ada panic, memory leak, atau lonjakan error log |
| QA-NFR-004 | Dua operator melakukan mutation stok/check-in bersamaan | Konsistensi database terjaga |
| QA-NFR-005 | Provider/storage/network timeout | UI berhenti loading, memberi feedback, dan aman untuk retry |
Browser, device, dan responsiveโ
Minimum regression matrix:
- Chrome desktop versi stabil terbaru;
- Firefox desktop versi stabil terbaru;
- Safari desktop versi stabil terbaru;
- Edge desktop versi stabil terbaru;
- Safari iOS versi mayor terbaru;
- Chrome Android versi stabil terbaru;
- viewport mobile 375 px, tablet 768 px, dan desktop 1440 px.
Alur P0 harus diuji pada Chrome desktop dan satu perangkat mobile. Editor dan LED Display minimal diuji pada Chrome desktop; halaman publik/RSVP wajib diuji pada desktop dan mobile.
Accessibility baselineโ
- Seluruh form memiliki label dan error yang dapat dipahami.
- Aksi utama dapat digunakan dengan keyboard dan fokus terlihat.
- Dialog mempertahankan focus trap dan dapat ditutup dengan benar.
- Tombol ikon mempunyai accessible name.
- Kontras teks/tombol utama memenuhi WCAG AA sejauh theme mengizinkan.
- Reduced-motion dihormati terutama pada invitation dan LED display.
8. Regression suite wajibโ
Jalankan pada setiap release candidate:
- Login admin dan user biasa.
- Validasi role dan cross-tenant access.
- Trial aktif, trial expired, subscription aktif, dan subscription expired.
- Pricing โ checkout โ payment sandbox โ subscription aktif.
- Buat/edit/publish invitation dan buka halaman live.
- Klik save/live secara cepat untuk memverifikasi tidak ada race condition.
- Custom HTML XSS suite.
- Submit RSVP public.
- Tambah dan hapus guest.
- Check-in normal, duplicate, simultaneous, dan polling tanpa data.
- LED menerima check-in dan kembali ke idle state.
- Pickup souvenir dan idempotent retry.
- Buka report dan export CSV.
- WhatsApp connection/template/message smoke test pada sandbox.
9. Bukti pengujian dan defectโ
Setiap hasil test minimal menyertakan:
- requirement ID;
- status
PASS, FAIL, BLOCKED, atau NOT RUN;
- build/commit dan environment;
- persona serta data uji;
- expected result dan actual result;
- screenshot/video/log/network response bila relevan;
- defect ID untuk hasil gagal.
Format judul defect:
[Severity] [Module] Ringkasan masalah
Isi defect harus mempunyai langkah reproduksi, expected result, actual result, frekuensi, environment, akun/persona, bukti, serta dugaan dampak tenant/data/payment bila ada.
10. Release sign-offโ
Release dinyatakan siap jika QA mengisi ringkasan berikut:
| Item | Nilai |
|---|
| Build / commit | |
| Environment | |
| Total test | |
| Passed / Failed / Blocked | |
| P0 dan P1 pass rate | |
| Open defects per severity | |
| Known issues yang disetujui | |
| QA sign-off | |
| Product sign-off | |
| Engineering sign-off | |