1, 'door_opened' => true, 'access_method' => 'keycard', 'user_id_card' => 'EMP-1234', 'duration_seconds' => 30, 'door_location' => 'front_door', 'is_forced_entry' => false, 'metadata' => [ 'sensor_type' => 'Reed_Switch_Magnetic', 'test_case' => 'authorized_access' ] ]; $result1 = sendDoorAccessData($baseUrl, $authorizedData); echo "Response: " . json_encode($result1, JSON_PRETTY_PRINT) . "\n\n"; // Test 2: Unauthorized access (tanpa ID card) echo "⚠️ Test 2: Unauthorized Access (No ID Card)\n"; $unauthorizedData = [ 'device_id' => 1, 'door_opened' => true, 'access_method' => 'manual', 'duration_seconds' => 60, 'door_location' => 'back_door', 'is_forced_entry' => false, 'metadata' => [ 'sensor_type' => 'Reed_Switch_Magnetic', 'test_case' => 'unauthorized_access' ] ]; $result2 = sendDoorAccessData($baseUrl, $unauthorizedData); echo "Response: " . json_encode($result2, JSON_PRETTY_PRINT) . "\n\n"; // Test 3: Forced entry (CRITICAL ALERT) echo "🚨 Test 3: Forced Entry (CRITICAL ALERT)\n"; $forcedEntryData = [ 'device_id' => 1, 'door_opened' => true, 'access_method' => 'force', 'duration_seconds' => 180, 'door_location' => 'front_door', 'is_forced_entry' => true, 'metadata' => [ 'sensor_type' => 'Reed_Switch_Magnetic', 'test_case' => 'forced_entry' ] ]; $result3 = sendDoorAccessData($baseUrl, $forcedEntryData); echo "Response: " . json_encode($result3, JSON_PRETTY_PRINT) . "\n\n"; // Test 4: After hours access (luar jam kerja) echo "🌙 Test 4: After Hours Access\n"; $afterHoursData = [ 'device_id' => 1, 'door_opened' => true, 'access_method' => 'keycard', 'user_id_card' => 'EMP-5678', 'duration_seconds' => 45, 'door_location' => 'side_door', 'is_forced_entry' => false, 'metadata' => [ 'sensor_type' => 'Reed_Switch_Magnetic', 'test_case' => 'after_hours_access', 'simulated_time' => '20:30:00' // Simulasi malam hari ] ]; $result4 = sendDoorAccessData($baseUrl, $afterHoursData); echo "Response: " . json_encode($result4, JSON_PRETTY_PRINT) . "\n\n"; // Test 5: Emergency access echo "🆘 Test 5: Emergency Access\n"; $emergencyData = [ 'device_id' => 1, 'door_opened' => true, 'access_method' => 'emergency', 'duration_seconds' => 90, 'door_location' => 'main_entrance', 'is_forced_entry' => false, 'metadata' => [ 'sensor_type' => 'Reed_Switch_Magnetic', 'test_case' => 'emergency_access', 'emergency_code' => 'FIRE-001' ] ]; $result5 = sendDoorAccessData($baseUrl, $emergencyData); echo "Response: " . json_encode($result5, JSON_PRETTY_PRINT) . "\n\n"; // Test 6: Maintenance access echo "🔧 Test 6: Maintenance Access\n"; $maintenanceData = [ 'device_id' => 1, 'door_opened' => true, 'access_method' => 'maintenance', 'user_id_card' => 'MAINT-001', 'duration_seconds' => 300, 'door_location' => 'back_door', 'is_forced_entry' => false, 'metadata' => [ 'sensor_type' => 'Reed_Switch_Magnetic', 'test_case' => 'maintenance_access', 'work_order' => 'WO-2026-001' ] ]; $result6 = sendDoorAccessData($baseUrl, $maintenanceData); echo "Response: " . json_encode($result6, JSON_PRETTY_PRINT) . "\n\n"; // Test 7: Get latest door access readings echo "📋 Test 7: Get Latest Door Access Readings\n"; $readings = getLatestDoorAccessReadings($baseUrl); echo "Latest readings: " . json_encode($readings, JSON_PRETTY_PRINT) . "\n\n"; // Test 8: Get door access statistics echo "📊 Test 8: Get Door Access Statistics\n"; $stats = getDoorAccessStatistics($baseUrl); echo "Statistics: " . json_encode($stats, JSON_PRETTY_PRINT) . "\n\n"; // Test 9: Test door access notification echo "🔔 Test 9: Test Door Access Notification\n"; $notifTest = testDoorAccessNotification($baseUrl); echo "Door access notification test: " . json_encode($notifTest, JSON_PRETTY_PRINT) . "\n\n"; echo "✅ All Door Access tests completed!\n"; echo "📊 Summary:\n"; echo "- Authorized access: Should not trigger alert\n"; echo "- Unauthorized access: Should trigger medium/high priority alert\n"; echo "- Forced entry: Should trigger CRITICAL alert\n"; echo "- After hours: Should trigger high priority alert\n"; echo "- Emergency: Should be logged but may not trigger alert\n"; echo "- Maintenance: Should be logged with low priority\n"; } function sendDoorAccessData($baseUrl, $data) { $url = $baseUrl . '/door-access/data'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Content-Type: application/json', 'Accept: application/json' ]); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_TIMEOUT, 30); $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($response === false) { return ['error' => 'cURL error']; } return json_decode($response, true); } function getLatestDoorAccessReadings($baseUrl) { $url = $baseUrl . '/door-access/readings?limit=5'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_TIMEOUT, 30); $response = curl_exec($ch); curl_close($ch); return json_decode($response, true); } function getDoorAccessStatistics($baseUrl) { $url = $baseUrl . '/door-access/statistics?hours=24'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_TIMEOUT, 30); $response = curl_exec($ch); curl_close($ch); return json_decode($response, true); } function testDoorAccessNotification($baseUrl) { $url = $baseUrl . '/test-door-access-notification'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_TIMEOUT, 30); $response = curl_exec($ch); curl_close($ch); return json_decode($response, true); } // Simulasi skenario door access untuk testing function simulateDoorAccessScenarios() { echo "🎭 Door Access Simulation Scenarios\n"; echo "===================================\n\n"; // Scenario 1: Normal office access patterns echo "📊 Scenario 1: Normal Office Access Patterns\n"; $normalScenarios = [ ['time' => '08:30', 'id' => 'EMP-1234', 'method' => 'keycard', 'duration' => 25, 'location' => 'front_door', 'description' => 'Employee morning arrival'], ['time' => '12:00', 'id' => 'EMP-5678', 'method' => 'keycard', 'duration' => 15, 'location' => 'side_door', 'description' => 'Lunch break access'], ['time' => '17:30', 'id' => 'EMP-9012', 'method' => 'keycard', 'duration' => 20, 'location' => 'front_door', 'description' => 'End of day exit'] ]; foreach ($normalScenarios as $scenario) { echo "- {$scenario['description']}: {$scenario['time']}, ID: {$scenario['id']}, Duration: {$scenario['duration']}s, Location: {$scenario['location']}\n"; } echo "\n"; // Scenario 2: Suspicious access patterns echo "⚠️ Scenario 2: Suspicious Access Patterns\n"; $suspiciousScenarios = [ ['time' => '14:30', 'id' => null, 'method' => 'manual', 'duration' => 120, 'location' => 'back_door', 'description' => 'No ID card access during work hours'], ['time' => '16:45', 'id' => 'EMP-INVALID', 'method' => 'keycard', 'duration' => 200, 'location' => 'side_door', 'description' => 'Invalid ID card format'], ['time' => '11:00', 'id' => 'EMP-1234', 'method' => 'keycard', 'duration' => 300, 'location' => 'front_door', 'description' => 'Door open too long (5 minutes)'] ]; foreach ($suspiciousScenarios as $scenario) { $idInfo = $scenario['id'] ? $scenario['id'] : 'No ID'; echo "- {$scenario['description']}: {$scenario['time']}, ID: {$idInfo}, Duration: {$scenario['duration']}s, Location: {$scenario['location']} (ALERT!)\n"; } echo "\n"; // Scenario 3: Critical security breaches echo "🚨 Scenario 3: Critical Security Breaches\n"; $criticalScenarios = [ ['time' => '22:15', 'id' => null, 'method' => 'force', 'duration' => 180, 'location' => 'front_door', 'description' => 'Forced entry at night'], ['time' => '03:30', 'id' => null, 'method' => 'manual', 'duration' => 240, 'location' => 'back_door', 'description' => 'Unauthorized access early morning'], ['time' => '19:45', 'id' => 'EMP-1234', 'method' => 'keycard', 'duration' => 600, 'location' => 'side_door', 'description' => 'After hours with valid ID but suspicious duration'] ]; foreach ($criticalScenarios as $scenario) { $idInfo = $scenario['id'] ? $scenario['id'] : 'No ID'; echo "- {$scenario['description']}: {$scenario['time']}, ID: {$idInfo}, Duration: {$scenario['duration']}s, Location: {$scenario['location']} (CRITICAL ALERT!)\n"; } echo "\n"; // Scenario 4: Special access types echo "🔧 Scenario 4: Special Access Types\n"; $specialScenarios = [ ['time' => '06:00', 'id' => 'MAINT-001', 'method' => 'maintenance', 'duration' => 1800, 'location' => 'back_door', 'description' => 'Early maintenance work'], ['time' => '23:00', 'id' => null, 'method' => 'emergency', 'duration' => 60, 'location' => 'main_entrance', 'description' => 'Emergency evacuation access'], ['time' => '20:00', 'id' => 'SEC-001', 'method' => 'keycard', 'duration' => 300, 'location' => 'front_door', 'description' => 'Security guard patrol'] ]; foreach ($specialScenarios as $scenario) { $idInfo = $scenario['id'] ? $scenario['id'] : 'Emergency'; echo "- {$scenario['description']}: {$scenario['time']}, ID: {$idInfo}, Duration: {$scenario['duration']}s, Location: {$scenario['location']}\n"; } echo "\n"; } // ID Card validation test function testIdCardValidation() { echo "🆔 ID Card Validation Test\n"; echo "=========================\n\n"; $testCards = [ 'EMP-1234' => true, // Valid format 'EMP-5678' => true, // Valid format 'EMP-0001' => true, // Valid format 'INVALID' => false, // Invalid format 'EMP-12345' => false, // Too many digits 'EMP-123' => false, // Too few digits 'MAINT-001' => false, // Wrong prefix '' => false, // Empty null => false // Null ]; foreach ($testCards as $card => $expected) { $isValid = preg_match('/^EMP-\d{4}$/', $card ?? ''); $result = $isValid ? 'VALID' : 'INVALID'; $status = ($isValid == $expected) ? '✅' : '❌'; echo "{$status} ID Card: '{$card}' -> {$result}\n"; } echo "\n"; } // Jalankan test echo "🚀 Starting Door Access API Tests...\n\n"; simulateDoorAccessScenarios(); testIdCardValidation(); testDoorAccessAPI();