--- ๐Ÿงช TESTING GUIDE 1๏ธโƒฃ STATE MANAGEMENT REFACTORING A. Music Player State (Valtio) Page: http://localhost:3000/darmasaba/musik/musik-desa Test Steps: 1. Buka halaman musik desa 2. Klik lagu untuk memutar 3. Test tombol play/pause 4. Test next/previous 5. Test volume control 6. Test shuffle/repeat 7. Refresh page - state harus tetap ada Expected Result: - โœ… Musik bisa diputar - โœ… Semua kontrol berfungsi - โœ… State reactive (UI update otomatis) - โœ… Tidak ada error di console Console Check: 1 // Buka browser console, ketik: 2 window.publicMusicState 3 // Harus bisa akses state langsung --- B. Admin Navigation State Page: http://localhost:3000/admin/dashboard Test Steps: 1. Login ke admin panel 2. Test toggle sidebar (collapse/expand) 3. Test mobile menu (hamburger menu) 4. Test hover menu items 5. Test search functionality 6. Navigate antar module Expected Result: - โœ… Sidebar bisa collapse/expand - โœ… Mobile menu berfungsi - โœ… Menu hover responsive - โœ… State persist saat navigate --- 2๏ธโƒฃ SECURITY FIXES A. OTP via POST (Not GET) - CRITICAL โš ๏ธ Page: http://localhost:3000/admin/login Test Steps: 1. Buka halaman login admin 2. Masukkan nomor WhatsApp valid 3. Klik "Kirim Kode OTP" 4. Check Network tab di browser DevTools Network Tab Check: 1 โŒ BEFORE (Insecure): 2 Request URL: https://wa.wibudev.com/code?nom=08123456789&text=Kode OTP: 123456 3 Method: GET 4 5 โœ… AFTER (Secure): 6 Request URL: https://wa.wibudev.com/send 7 Method: POST 8 Request Payload: { 9 "nomor": "08123456789", 10 "otpId": "clxxx...", 11 "message": "Website Desa Darmasaba..." 12 } Expected Result: - โœ… Request ke WhatsApp menggunakan POST - โœ… OTP TIDAK terlihat di URL - โœ… OTP hanya ada di message body - โœ… Dapat OTP via WhatsApp Browser History Check: - Buka browser history - Cari URL dengan "wa.wibudev.com" - โœ… TIDAK BOLEH ADA OTP di URL --- B. Session Password Enforcement File: .env.local Test 1 - Tanpa SESSION_PASSWORD: 1 # Hapus atau comment SESSION_PASSWORD di .env.local 2 # SESSION_PASSWORD="" Restart server: 1 bun run dev Expected Result: - โŒ Server GAGAL start - โœ… Error message: "SESSION_PASSWORD environment variable is required" --- Test 2 - Password Pendek (< 32 chars): 1 # Password terlalu pendek 2 SESSION_PASSWORD="short" Restart server: 1 bun run dev Expected Result: - โŒ Server GAGAL start - โœ… Error message: "SESSION_PASSWORD must be at least 32 characters long" --- Test 3 - Password Valid (โ‰ฅ 32 chars): 1 # Generate password kuat (min 32 chars) 2 SESSION_PASSWORD="this-is-a-very-secure-password-with-more-than-32-characters" Restart server: 1 bun run dev Expected Result: - โœ… Server BERHASIL start - โœ… Tidak ada error - โœ… Bisa login ke admin panel --- C. Input Validation (Zod) Page: http://localhost:3000/admin/desa/berita/list-berita/create Test 1 - Judul Pendek (< 5 chars): 1 Judul: "abc" โŒ Expected: - โœ… Error: "Judul minimal 5 karakter" --- Test 2 - Judul Terlalu Panjang (> 255 chars): 1 Judul: "abc..." (300 chars) โŒ Expected: - โœ… Error: "Judul maksimal 255 karakter" --- Test 3 - Deskripsi Pendek (< 10 chars): 1 Judul: "Judul Valid" โœ… 2 Deskripsi: "abc" โŒ Expected: - โœ… Error: "Deskripsi minimal 10 karakter" --- Test 4 - Konten Pendek (< 50 chars): 1 Judul: "Judul Valid" โœ… 2 Deskripsi: "Deskripsi yang cukup panjang" โœ… 3 Konten: "abc" โŒ Expected: - โœ… Error: "Konten minimal 50 karakter" --- Test 5 - YouTube URL Invalid: 1 Link Video: "https://youtube.com" โŒ Expected: - โœ… Error: "Format URL YouTube tidak valid" --- Test 6 - XSS Attempt: 1 Konten: "Content yang valid..." โŒ Expected: - โœ… Script tag dihapus - โœ… Content tersimpan tanpa