# 🧪 Testing Guide - GPS Absensi Guru

## 📱 Flow Penggunaan

### Skenario 1: User di Dalam Radius ✅

1. Guru buka halaman absensi (`/simaju/absensi-guru/create`)
2. Klik tombol **"Absen Masuk Sekarang"**
3. Modal kamera terbuka
4. Browser meminta izin akses **Kamera** dan **Lokasi** → Allow
5. System mendeteksi GPS → Menghitung jarak
6. ✅ **Jarak dalam radius** → Tombol capture enabled
7. Guru ambil foto selfie
8. System kirim foto + GPS ke server
9. Server validasi ulang GPS
10. ✅ Absensi berhasil tersimpan

### Skenario 2: User di Luar Radius ❌

1. Guru buka halaman absensi
2. Klik tombol **"Absen Masuk Sekarang"**
3. Modal kamera terbuka
4. Browser meminta izin akses → Allow
5. System mendeteksi GPS → Menghitung jarak
6. ❌ **Jarak melebihi radius** (contoh: 500 meter)
7. Muncul error message:
   ```
   ⚠️ Anda berada diluar radius sekolah!
   Jarak: 500 meter (Maksimal: 100m)
   
   Silakan datang ke sekolah untuk melakukan absensi.
   ```
8. Tombol capture di-disable (tidak bisa diklik)
9. Guru tidak bisa melanjutkan absensi

### Skenario 3: GPS Tidak Aktif ❌

1. Guru buka halaman absensi
2. GPS/Lokasi tidak aktif di perangkat
3. Klik tombol absen
4. System tidak bisa mendapatkan lokasi
5. Muncul error:
   ```
   ❌ Lokasi tidak tersedia.
   
   Pastikan GPS/Lokasi aktif di perangkat Anda.
   ```
6. Tombol capture di-disable
7. Guru harus aktifkan GPS dulu

### Skenario 4: Izin GPS Ditolak ❌

1. Guru klik tombol absen
2. Browser minta izin lokasi → **Block/Deny**
3. Muncul error:
   ```
   ❌ Izin GPS ditolak.
   
   Silakan izinkan akses lokasi di browser Anda.
   ```
4. Tombol capture di-disable
5. Guru harus refresh dan allow izin GPS

---

## 🔒 Validasi Ganda (Frontend + Backend)

### Frontend Validation (JavaScript)
**Tujuan:** User Experience - Mencegah user mengambil foto jika GPS invalid

**Proses:**
1. Deteksi GPS saat modal dibuka
2. Hitung jarak real-time
3. Disable tombol jika diluar radius
4. Tampilkan error message yang jelas

**Keuntungan:**
- Feedback instant tanpa perlu kirim ke server
- Hemat bandwidth
- User experience lebih baik

### Backend Validation (PHP)
**Tujuan:** Security - Pastikan data yang masuk valid meski frontend di-bypass

**Proses:**
1. Terima request dengan foto + GPS
2. Validasi GPS tidak kosong
3. Ambil koordinat sekolah dari database
4. Hitung ulang jarak menggunakan Haversine
5. Reject jika diluar radius

**Keuntungan:**
- Tidak bisa di-bypass dengan developer tools
- Data tetap aman meski JavaScript dimatikan
- Logging untuk audit trail

---

## 🧪 Test Cases

### Test Case 1: GPS Normal - Dalam Radius ✅
**Steps:**
1. Set koordinat sekolah: `-5.30134, 122.29880`
2. Set radius: `100` meter
3. Login sebagai guru
4. Akses `/simaju/absensi-guru/create`
5. Klik "Absen Masuk Sekarang"
6. Allow kamera dan lokasi
7. Pastikan GPS terdeteksi dalam radius
8. Ambil foto dan submit

**Expected:**
- ✅ GPS validated
- ✅ Tombol capture enabled
- ✅ Foto berhasil dikirim
- ✅ Absensi tersimpan dengan koordinat

### Test Case 2: GPS Normal - Luar Radius ❌
**Steps:**
1. Set koordinat sekolah: `-5.30134, 122.29880`
2. Set radius: `10` meter (sangat kecil untuk testing)
3. Login sebagai guru dari lokasi jauh
4. Klik "Absen Masuk Sekarang"
5. Allow kamera dan lokasi

**Expected:**
- ❌ Error message muncul
- ❌ Tombol capture disabled
- ❌ Tidak bisa ambil foto
- ❌ Absensi tidak bisa dilanjutkan

### Test Case 3: GPS Dimatikan ❌
**Steps:**
1. Matikan GPS/Lokasi di smartphone
2. Login sebagai guru
3. Klik "Absen Masuk Sekarang"
4. Allow kamera (GPS akan gagal)

**Expected:**
- ❌ Error: "Lokasi tidak tersedia"
- ❌ Tombol capture disabled

### Test Case 4: Izin GPS Ditolak ❌
**Steps:**
1. Login sebagai guru
2. Klik "Absen Masuk Sekarang"
3. **Block** izin lokasi

**Expected:**
- ❌ Error: "Izin GPS ditolak"
- ❌ Tombol capture disabled

### Test Case 5: Backend Validation
**Steps:**
1. Gunakan Postman/cURL untuk bypass frontend
2. Kirim request ke `/simaju/api/absensi-guru/check-in`
3. Kirim koordinat palsu diluar radius

**Expected:**
- ❌ Server reject dengan status 400
- ❌ Message: "Anda diluar radius sekolah..."

---

## 🐛 Troubleshooting

### Problem 1: GPS Tidak Terdeteksi
**Penyebab:**
- GPS/Lokasi tidak aktif
- Browser tidak support Geolocation API
- Koneksi GPS lemah

**Solusi:**
1. Pastikan GPS aktif di perangkat
2. Gunakan browser modern (Chrome/Firefox/Safari)
3. Coba di area terbuka untuk sinyal GPS lebih baik
4. Refresh halaman dan coba lagi

### Problem 2: Selalu "Diluar Radius" Padahal di Sekolah
**Penyebab:**
- Koordinat sekolah salah
- Radius terlalu kecil
- GPS accuracy rendah

**Solusi:**
1. Cek koordinat sekolah di pengaturan
2. Verifikasi dengan Google Maps
3. Naikkan radius menjadi 100-200 meter
4. Tunggu beberapa detik untuk GPS accuracy meningkat

### Problem 3: Error "Izin GPS Ditolak"
**Penyebab:**
- User block izin lokasi
- Browser settings block lokasi

**Solusi:**
1. Klik icon lock/info di address bar browser
2. Reset permissions untuk situs
3. Refresh halaman
4. Allow saat diminta izin lagi

### Problem 4: Akurasi GPS Tidak Tepat
**Penyebab:**
- Sinyal GPS lemah (di dalam gedung)
- Weather conditions
- Device GPS quality

**Solusi:**
1. Pindah ke dekat jendela atau area terbuka
2. Tunggu beberapa detik untuk GPS lock
3. Gunakan smartphone dengan GPS berkualitas
4. Naikkan radius validasi jika perlu

---

## 📊 Database Schema

**Tabel: `absensi_gurus`**
```sql
lat_masuk    DECIMAL(10,8)  -- Latitude saat absen masuk
lng_masuk    DECIMAL(11,8)  -- Longitude saat absen masuk
lat_pulang   DECIMAL(10,8)  -- Latitude saat absen pulang
lng_pulang   DECIMAL(11,8)  -- Longitude saat absen pulang
```

**Tabel: `pengaturans`**
```sql
latitude     DECIMAL(10,8)  -- Koordinat sekolah (lintang)
longitude    DECIMAL(11,8)  -- Koordinat sekolah (bujur)
radius       INTEGER        -- Radius validasi dalam meter
```

---

**Testing Guide dibuat:** 7 Agustus 2026  
**Versi:** 1.0
