$httpCode, 'body' => $response, 'error' => $curlError ]; } // Function to check response format function checkResponse($result, $endpointName) { if (!empty($result['error'])) { echo " ✗ $endpointName: CURL Error - {$result['error']}\n"; return false; } $responseData = json_decode($result['body'], true); if (json_last_error() !== JSON_ERROR_NONE) { echo " ✗ $endpointName: Invalid JSON - " . json_last_error_msg() . "\n"; echo " Response: " . substr($result['body'], 0, 100) . "...\n"; return false; } if (isset($responseData['status'])) { echo " ✓ $endpointName: OK (Status: {$responseData['status']})\n"; return true; } else { echo " ✗ $endpointName: Missing 'status' field\n"; return false; } } $token = null; $testCount = 0; $passCount = 0; $failCount = 0; // ============================================ // AUTHENTICATION // ============================================ echo "=== AUTHENTICATION ===\n\n"; // 1. Daftar $testCount++; echo "$testCount. Testing daftar...\n"; $result = makeRequest("$baseUrl/timo/daftar", 'POST', [ 'nama' => 'Test User', 'username' => 'testuser' . time(), 'email' => 'test' . time() . '@test.com', 'no_hp' => '081234567890', 'password' => 'test123' ]); if (checkResponse($result, 'Daftar')) $passCount++; else $failCount++; echo "\n"; // 2. Login $testCount++; echo "$testCount. Testing login...\n"; $result = makeRequest("$baseUrl/timo/login", 'POST', [ 'username' => $username, 'password' => $password ]); $responseData = json_decode($result['body'], true); if (checkResponse($result, 'Login')) { $passCount++; if (isset($responseData['user']['id_pengguna_timo'])) { $token = $responseData['user']['id_pengguna_timo']; echo " Token: $token\n"; } } else { $failCount++; } echo "\n"; if (empty($token)) { echo "⚠ WARNING: Login gagal, beberapa test akan di-skip\n\n"; } // 3. Login Token $testCount++; echo "$testCount. Testing login_token...\n"; if (!empty($token)) { $result = makeRequest("$baseUrl/timo/login_token", 'POST', [ 'token' => $token, 'password' => md5($password) ]); if (checkResponse($result, 'Login Token')) $passCount++; else $failCount++; } else { echo " ⚠ Skip: Token tidak tersedia\n"; $failCount++; } echo "\n"; // 4. Update Akun $testCount++; echo "$testCount. Testing update_akun...\n"; if (!empty($token)) { $result = makeRequest("$baseUrl/timo/update_akun", 'POST', [ 'token' => $token, 'nama' => 'Eksan Updated', 'email' => 'eksan@test.com', 'hp' => '081234567890' ]); if (checkResponse($result, 'Update Akun')) $passCount++; else $failCount++; } else { echo " ⚠ Skip: Token tidak tersedia\n"; $failCount++; } echo "\n"; // 5. Update Password $testCount++; echo "$testCount. Testing update_password...\n"; if (!empty($token)) { $result = makeRequest("$baseUrl/timo/update_password", 'POST', [ 'token' => $token, 'passlama' => $password, 'passbaru' => $password ]); if (checkResponse($result, 'Update Password')) $passCount++; else $failCount++; } else { echo " ⚠ Skip: Token tidak tersedia\n"; $failCount++; } echo "\n"; // ============================================ // SL MANAGEMENT // ============================================ echo "=== SL MANAGEMENT ===\n\n"; // 6. Cek SL $testCount++; echo "$testCount. Testing cek_sl...\n"; if (!empty($token)) { $result = makeRequest("$baseUrl/timo/cek_sl", 'POST', [ 'token' => $token, 'no_sl' => $no_sl ]); if (checkResponse($result, 'Cek SL')) $passCount++; else $failCount++; } else { echo " ⚠ Skip: Token tidak tersedia\n"; $failCount++; } echo "\n"; // 7. Confirm SL $testCount++; echo "$testCount. Testing confirm_sl...\n"; if (!empty($token)) { $result = makeRequest("$baseUrl/timo/confirm_sl", 'POST', [ 'token' => $token, 'no_sl' => $no_sl ]); if (checkResponse($result, 'Confirm SL')) $passCount++; else $failCount++; } else { echo " ⚠ Skip: Token tidak tersedia\n"; $failCount++; } echo "\n"; // 8. Hapus SL $testCount++; echo "$testCount. Testing hapus_sl...\n"; if (!empty($token)) { $result = makeRequest("$baseUrl/timo/hapus_sl", 'POST', [ 'token' => $token, 'no_sl' => $no_sl ]); if (checkResponse($result, 'Hapus SL')) $passCount++; else $failCount++; } else { echo " ⚠ Skip: Token tidak tersedia\n"; $failCount++; } echo "\n"; // ============================================ // TAGIHAN // ============================================ echo "=== TAGIHAN ===\n\n"; // 9. History Tagihan $testCount++; echo "$testCount. Testing history tagihan...\n"; $result = makeRequest("$baseUrl/timo/history/$no_sl/202401"); if (checkResponse($result, 'History Tagihan')) $passCount++; else $failCount++; echo "\n"; // 10. Tagihan $testCount++; echo "$testCount. Testing tagihan...\n"; $result = makeRequest("$baseUrl/timo/tagihan/$no_sl"); if (checkResponse($result, 'Tagihan')) $passCount++; else $failCount++; echo "\n"; // ============================================ // PEMBAYARAN // ============================================ echo "=== PEMBAYARAN ===\n\n"; // 11. Request Pembayaran $testCount++; echo "$testCount. Testing request_pembayaran...\n"; if (!empty($token)) { $result = makeRequest("$baseUrl/timo/request_pembayaran", 'POST', [ 'token' => $token, 'no_sl' => $no_sl, 'nama_bank' => 'BCA', 'no_rek' => '1234567890' ]); if (checkResponse($result, 'Request Pembayaran')) $passCount++; else $failCount++; } else { echo " ⚠ Skip: Token tidak tersedia\n"; $failCount++; } echo "\n"; // 12. Cek Pembayaran $testCount++; echo "$testCount. Testing cek_pembayaran...\n"; if (!empty($token)) { $result = makeRequest("$baseUrl/timo/cek_pembayaran", 'POST', [ 'token' => $token, 'no_sl' => $no_sl ]); if (checkResponse($result, 'Cek Pembayaran')) $passCount++; else $failCount++; } else { echo " ⚠ Skip: Token tidak tersedia\n"; $failCount++; } echo "\n"; // 13. Cek Transfer $testCount++; echo "$testCount. Testing cek_transfer...\n"; if (!empty($token)) { $result = makeRequest("$baseUrl/timo/cek_transfer", 'POST', [ 'token' => $token, 'no_rek' => '#TIMO123' ]); if (checkResponse($result, 'Cek Transfer')) $passCount++; else $failCount++; } else { echo " ⚠ Skip: Token tidak tersedia\n"; $failCount++; } echo "\n"; // 14. Batal Pembayaran $testCount++; echo "$testCount. Testing batal_pembayaran...\n"; if (!empty($token)) { $result = makeRequest("$baseUrl/timo/batal_pembayaran", 'POST', [ 'token' => $token, 'no_rek' => '#TIMO123' ]); if (checkResponse($result, 'Batal Pembayaran')) $passCount++; else $failCount++; } else { echo " ⚠ Skip: Token tidak tersedia\n"; $failCount++; } echo "\n"; // 15. Confirm Pembayaran $testCount++; echo "$testCount. Testing confirm_pembayaran...\n"; if (!empty($token)) { $result = makeRequest("$baseUrl/timo/confirm_pembayaran", 'POST', [ 'token' => $token, 'no_rek' => '#TIMO123' ]); if (checkResponse($result, 'Confirm Pembayaran')) $passCount++; else $failCount++; } else { echo " ⚠ Skip: Token tidak tersedia\n"; $failCount++; } echo "\n"; // 16. History Bayar $testCount++; echo "$testCount. Testing history_bayar...\n"; if (!empty($token)) { $result = makeRequest("$baseUrl/timo/history_bayar", 'POST', [ 'token' => $token ]); if (checkResponse($result, 'History Bayar')) $passCount++; else $failCount++; } else { echo " ⚠ Skip: Token tidak tersedia\n"; $failCount++; } echo "\n"; // ============================================ // LAPORAN // ============================================ echo "=== LAPORAN ===\n\n"; // 17. Jenis Laporan $testCount++; echo "$testCount. Testing jenis_laporan...\n"; $result = makeRequest("$baseUrl/timo/jenis_laporan", 'POST', []); if (checkResponse($result, 'Jenis Laporan')) $passCount++; else $failCount++; echo "\n"; // 18. History Gangguan $testCount++; echo "$testCount. Testing history_gangguan...\n"; if (!empty($token)) { $result = makeRequest("$baseUrl/timo/history_gangguan", 'POST', [ 'token' => $token ]); if (checkResponse($result, 'History Gangguan')) $passCount++; else $failCount++; } else { echo " ⚠ Skip: Token tidak tersedia\n"; $failCount++; } echo "\n"; // ============================================ // WIPAY // ============================================ echo "=== WIPAY ===\n\n"; // 19. Cek WIPAY $testCount++; echo "$testCount. Testing cek_wipay...\n"; if (!empty($token)) { $result = makeRequest("$baseUrl/timo/cek_wipay", 'POST', [ 'token' => $token ]); if (checkResponse($result, 'Cek WIPAY')) $passCount++; else $failCount++; } else { echo " ⚠ Skip: Token tidak tersedia\n"; $failCount++; } echo "\n"; // ============================================ // RESET PASSWORD // ============================================ echo "=== RESET PASSWORD ===\n\n"; // 20. Buat Kode Reset $testCount++; echo "$testCount. Testing buat_kode (reset password)...\n"; $result = makeRequest("$baseUrl/timo/buat_kode", 'POST', [ 'email' => 'eksan@test.com' ]); if (checkResponse($result, 'Buat Kode Reset')) $passCount++; else $failCount++; echo "\n"; // 21. Cek Kode Reset $testCount++; echo "$testCount. Testing cek_kode (reset password)...\n"; $result = makeRequest("$baseUrl/timo/cek_kode", 'POST', [ 'email' => 'eksan@test.com', 'kode' => '123456' ]); if (checkResponse($result, 'Cek Kode Reset')) $passCount++; else $failCount++; echo "\n"; // 22. Reset Password $testCount++; echo "$testCount. Testing reset_kode (reset password)...\n"; $result = makeRequest("$baseUrl/timo/reset_kode", 'POST', [ 'email' => 'eksan@test.com', 'kode' => '123456', 'password_baru' => 'newpass123' ]); if (checkResponse($result, 'Reset Password')) $passCount++; else $failCount++; echo "\n"; // ============================================ // UPLOAD // ============================================ echo "=== UPLOAD ===\n\n"; // 23. Upload Catat Meter $testCount++; echo "$testCount. Testing upload_catat_meter...\n"; if (!empty($token)) { // Base64 dummy image $dummyImage = base64_encode('dummy image data'); $result = makeRequest("$baseUrl/timo/upload_catat_meter", 'POST', [ 'token' => $token, 'no_sl' => $no_sl, 'nama_photo' => 'test.jpg', 'photo' => $dummyImage, 'angka' => '12345' ]); if (checkResponse($result, 'Upload Catat Meter')) $passCount++; else $failCount++; } else { echo " ⚠ Skip: Token tidak tersedia\n"; $failCount++; } echo "\n"; // 24. Upload PP $testCount++; echo "$testCount. Testing upload_pp...\n"; if (!empty($token)) { $dummyImage = base64_encode('dummy image data'); $result = makeRequest("$baseUrl/timo/upload_pp", 'POST', [ 'token' => $token, 'nama_photo' => 'profile.jpg', 'photo' => $dummyImage ]); if (checkResponse($result, 'Upload PP')) $passCount++; else $failCount++; } else { echo " ⚠ Skip: Token tidak tersedia\n"; $failCount++; } echo "\n"; // 25. Hapus PP $testCount++; echo "$testCount. Testing hapus_pp...\n"; if (!empty($token)) { $result = makeRequest("$baseUrl/timo/hapus_pp", 'POST', [ 'token' => $token ]); if (checkResponse($result, 'Hapus PP')) $passCount++; else $failCount++; } else { echo " ⚠ Skip: Token tidak tersedia\n"; $failCount++; } echo "\n"; // 26. Upload Gangguan $testCount++; echo "$testCount. Testing upload_gangguan...\n"; if (!empty($token)) { $dummyImage = base64_encode('dummy image data'); $result = makeRequest("$baseUrl/timo/upload_gangguan", 'POST', [ 'token' => $token, 'gangguan' => '1', 'no_sl' => $no_sl, 'nama_photo' => 'gangguan.jpg', 'photo' => $dummyImage, 'feedback' => 'Test gangguan', 'lokasi' => 'Test location' ]); if (checkResponse($result, 'Upload Gangguan')) $passCount++; else $failCount++; } else { echo " ⚠ Skip: Token tidak tersedia\n"; $failCount++; } echo "\n"; // 27. Upload Pasang Baru $testCount++; echo "$testCount. Testing upload_pasang_baru...\n"; if (!empty($token)) { $dummyImage = base64_encode('dummy image data'); $result = makeRequest("$baseUrl/timo/upload_pasang_baru", 'POST', [ 'token' => $token, 'nama' => 'Test User', 'no_hp' => '081234567890', 'alamat' => 'Test Address', 'nama_photo' => 'ktp.jpg', 'photo' => $dummyImage ]); if (checkResponse($result, 'Upload Pasang Baru')) $passCount++; else $failCount++; } else { echo " ⚠ Skip: Token tidak tersedia\n"; $failCount++; } echo "\n"; // 28. Upload Bukti Transfer $testCount++; echo "$testCount. Testing upload_bukti_transfer...\n"; if (!empty($token)) { $dummyImage = base64_encode('dummy image data'); $result = makeRequest("$baseUrl/timo/upload_bukti_transfer", 'POST', [ 'token' => $token, 'id_pasang_baru' => '1', 'nama_photo' => 'bukti.jpg', 'photo' => $dummyImage ]); if (checkResponse($result, 'Upload Bukti Transfer')) $passCount++; else $failCount++; } else { echo " ⚠ Skip: Token tidak tersedia\n"; $failCount++; } echo "\n"; // 29. Upload Baca Mandiri $testCount++; echo "$testCount. Testing upload_baca_mandiri...\n"; if (!empty($token)) { $dummyImage = base64_encode('dummy image data'); $result = makeRequest("$baseUrl/timo/upload_baca_mandiri", 'POST', [ 'token' => $token, 'no_sl' => $no_sl, 'nama_photo' => 'baca_mandiri.jpg', 'photo' => $dummyImage, 'angka' => '12345' ]); if (checkResponse($result, 'Upload Baca Mandiri')) $passCount++; else $failCount++; } else { echo " ⚠ Skip: Token tidak tersedia\n"; $failCount++; } echo "\n"; // ============================================ // LAINNYA // ============================================ echo "=== LAINNYA ===\n\n"; // 30. Promo $testCount++; echo "$testCount. Testing promo...\n"; $result = makeRequest("$baseUrl/timo/promo", 'POST', []); if (checkResponse($result, 'Promo')) $passCount++; else $failCount++; echo "\n"; // 31. Riwayat Pasang $testCount++; echo "$testCount. Testing riwayat_pasang...\n"; if (!empty($token)) { $result = makeRequest("$baseUrl/timo/riwayat_pasang", 'POST', [ 'token' => $token ]); if (checkResponse($result, 'Riwayat Pasang')) $passCount++; else $failCount++; } else { echo " ⚠ Skip: Token tidak tersedia\n"; $failCount++; } echo "\n"; // 32. Jadwal Catat Meter $testCount++; echo "$testCount. Testing jadwal_catat_meter...\n"; if (!empty($token)) { $result = makeRequest("$baseUrl/timo/jadwal_catat_meter", 'POST', [ 'token' => $token ]); if (checkResponse($result, 'Jadwal Catat Meter')) $passCount++; else $failCount++; } else { echo " ⚠ Skip: Token tidak tersedia\n"; $failCount++; } echo "\n"; // 33. Request Order Baca Mandiri $testCount++; echo "$testCount. Testing request_order_baca_mandiri...\n"; if (!empty($token)) { $result = makeRequest("$baseUrl/timo/request_order_baca_mandiri", 'POST', [ 'token' => $token, 'no_sl' => $no_sl ]); if (checkResponse($result, 'Request Order Baca Mandiri')) $passCount++; else $failCount++; } else { echo " ⚠ Skip: Token tidak tersedia\n"; $failCount++; } echo "\n"; // ============================================ // SUMMARY // ============================================ echo "==========================================\n"; echo " TEST SUMMARY\n"; echo "==========================================\n"; echo "Total Tests: $testCount\n"; echo "Passed: $passCount\n"; echo "Failed: $failCount\n"; echo "Success Rate: " . round(($passCount / $testCount) * 100, 2) . "%\n"; echo "==========================================\n\n"; if ($failCount > 0) { echo "⚠ Beberapa test gagal. Periksa:\n"; echo " 1. Server API berjalan di $baseUrl\n"; echo " 2. Database connection berfungsi\n"; echo " 3. Data user '$username' ada di database\n"; echo " 4. Nomor SL '$no_sl' valid\n"; echo "\n"; } echo "Note: Beberapa endpoint mungkin gagal karena:\n"; echo " - Data tidak tersedia di database\n"; echo " - Validasi data yang ketat\n"; echo " - External API tidak tersedia\n"; echo "\n";