#!/usr/bin/env php endpoints_dir = __DIR__ . '/src/includes/endpoints'; echo "🔧 Inicializando validação dos endpoints...\n"; echo "📁 Diretório: {$this->endpoints_dir}\n"; echo "✅ Configuração concluída\n\n"; } /** * Executar todos os testes de validação de endpoints */ public function run_endpoint_validation() { echo "🚀 INICIANDO VALIDAÇÃO DOS ENDPOINTS\n"; echo "====================================\n\n"; // 1. VALIDAÇÃO DOS ENDPOINTS INDIVIDUAIS $this->validate_clinic_endpoints(); $this->validate_patient_endpoints(); $this->validate_doctor_endpoints(); $this->validate_appointment_endpoints(); $this->validate_encounter_endpoints(); $this->validate_prescription_endpoints(); $this->validate_bill_endpoints(); // 2. VALIDAÇÃO DA ESTRUTURA GERAL $this->validate_endpoint_structure(); // 3. VALIDAÇÃO DE SEGURANÇA $this->validate_security_features(); // 4. VALIDAÇÃO DE PERFORMANCE $this->validate_performance_features(); // Relatório final $this->generate_endpoint_report(); } /** * Validar endpoints de Clínicas */ private function validate_clinic_endpoints() { echo "🏥 1. VALIDAÇÃO - ENDPOINTS DE CLÍNICAS\n"; echo "=======================================\n"; $file = $this->endpoints_dir . '/class-clinic-endpoints.php'; if (file_exists($file)) { $content = file_get_contents($file); // Testar estrutura básica $this->run_test('Clinics - Classe definida', function() use ($content) { return strpos($content, 'class') !== false && strpos($content, 'Clinic') !== false; }); // Testar métodos CRUD esperados $crud_methods = ['get_clinics', 'get_clinic', 'create_clinic', 'update_clinic', 'delete_clinic']; foreach ($crud_methods as $method) { $this->run_test("Clinics - Método $method", function() use ($content, $method) { return strpos($content, $method) !== false; }); } // Testar validação $this->run_test('Clinics - Validação de permissões', function() use ($content) { return strpos($content, 'permission') !== false || strpos($content, 'current_user_can') !== false || strpos($content, 'authorize') !== false; }); // Testar sanitização $this->run_test('Clinics - Sanitização de dados', function() use ($content) { return strpos($content, 'sanitize') !== false || strpos($content, 'validate') !== false; }); // Testar resposta REST $this->run_test('Clinics - Resposta REST', function() use ($content) { return strpos($content, 'WP_REST_Response') !== false || strpos($content, 'rest_ensure_response') !== false; }); } else { $this->run_test('Clinics - Arquivo existe', function() { return false; }); } echo "\n"; } /** * Validar endpoints de Pacientes */ private function validate_patient_endpoints() { echo "👤 2. VALIDAÇÃO - ENDPOINTS DE PACIENTES\n"; echo "=========================================\n"; $file = $this->endpoints_dir . '/class-patient-endpoints.php'; if (file_exists($file)) { $content = file_get_contents($file); $this->run_test('Patients - Classe definida', function() use ($content) { return strpos($content, 'class') !== false && strpos($content, 'Patient') !== false; }); // Métodos específicos de pacientes $patient_methods = ['get_patients', 'get_patient', 'create_patient', 'update_patient', 'get_patient_history']; foreach ($patient_methods as $method) { $this->run_test("Patients - Método $method", function() use ($content, $method) { return strpos($content, $method) !== false; }); } // Validação de dados médicos $this->run_test('Patients - Validação dados médicos', function() use ($content) { return strpos($content, 'medical') !== false || strpos($content, 'health') !== false || strpos($content, 'patient_id') !== false; }); // Privacy e GDPR $this->run_test('Patients - Considerações de privacidade', function() use ($content) { return strpos($content, 'privacy') !== false || strpos($content, 'sensitive') !== false || strpos($content, 'authorize') !== false; }); } else { $this->run_test('Patients - Arquivo existe', function() { return false; }); } echo "\n"; } /** * Validar endpoints de Médicos */ private function validate_doctor_endpoints() { echo "👩‍⚕️ 3. VALIDAÇÃO - ENDPOINTS DE MÉDICOS\n"; echo "=========================================\n"; $file = $this->endpoints_dir . '/class-doctor-endpoints.php'; if (file_exists($file)) { $content = file_get_contents($file); $this->run_test('Doctors - Classe definida', function() use ($content) { return strpos($content, 'class') !== false && strpos($content, 'Doctor') !== false; }); // Métodos específicos de médicos $doctor_methods = ['get_doctors', 'get_doctor', 'get_doctor_schedule', 'get_doctor_patients', 'get_doctor_appointments']; foreach ($doctor_methods as $method) { $this->run_test("Doctors - Método $method", function() use ($content, $method) { return strpos($content, $method) !== false; }); } // Especialidades médicas $this->run_test('Doctors - Especialidades médicas', function() use ($content) { return strpos($content, 'speciality') !== false || strpos($content, 'specialty') !== false || strpos($content, 'qualification') !== false; }); } else { $this->run_test('Doctors - Arquivo existe', function() { return false; }); } echo "\n"; } /** * Validar endpoints de Consultas/Appointments */ private function validate_appointment_endpoints() { echo "📅 4. VALIDAÇÃO - ENDPOINTS DE CONSULTAS\n"; echo "=========================================\n"; $file = $this->endpoints_dir . '/class-appointment-endpoints.php'; if (file_exists($file)) { $content = file_get_contents($file); $this->run_test('Appointments - Classe definida', function() use ($content) { return strpos($content, 'class') !== false && strpos($content, 'Appointment') !== false; }); // Métodos de gestão de consultas $appointment_methods = ['get_appointments', 'create_appointment', 'update_appointment', 'cancel_appointment', 'reschedule_appointment']; foreach ($appointment_methods as $method) { $this->run_test("Appointments - Método $method", function() use ($content, $method) { return strpos($content, $method) !== false; }); } // Validação de horários $this->run_test('Appointments - Validação de horários', function() use ($content) { return strpos($content, 'time') !== false && (strpos($content, 'validate') !== false || strpos($content, 'schedule') !== false); }); // Status de consultas $this->run_test('Appointments - Status de consultas', function() use ($content) { return strpos($content, 'status') !== false; }); } else { $this->run_test('Appointments - Arquivo existe', function() { return false; }); } echo "\n"; } /** * Validar endpoints de Encontros/Encounters */ private function validate_encounter_endpoints() { echo "🩺 5. VALIDAÇÃO - ENDPOINTS DE ENCONTROS\n"; echo "=========================================\n"; $file = $this->endpoints_dir . '/class-encounter-endpoints.php'; if (file_exists($file)) { $content = file_get_contents($file); $this->run_test('Encounters - Classe definida', function() use ($content) { return strpos($content, 'class') !== false && strpos($content, 'Encounter') !== false; }); // Métodos médicos específicos $encounter_methods = ['get_encounters', 'create_encounter', 'update_encounter', 'add_encounter_notes']; foreach ($encounter_methods as $method) { $this->run_test("Encounters - Método $method", function() use ($content, $method) { return strpos($content, $method) !== false; }); } // Dados médicos $this->run_test('Encounters - Dados médicos', function() use ($content) { return strpos($content, 'medical') !== false || strpos($content, 'diagnosis') !== false || strpos($content, 'symptoms') !== false; }); } else { $this->run_test('Encounters - Arquivo existe', function() { return false; }); } echo "\n"; } /** * Validar endpoints de Prescrições */ private function validate_prescription_endpoints() { echo "💊 6. VALIDAÇÃO - ENDPOINTS DE PRESCRIÇÕES\n"; echo "===========================================\n"; $file = $this->endpoints_dir . '/class-prescription-endpoints.php'; if (file_exists($file)) { $content = file_get_contents($file); $this->run_test('Prescriptions - Classe definida', function() use ($content) { return strpos($content, 'class') !== false && strpos($content, 'Prescription') !== false; }); // Métodos de prescrições $prescription_methods = ['get_prescriptions', 'create_prescription', 'update_prescription', 'get_prescription_history']; foreach ($prescription_methods as $method) { $this->run_test("Prescriptions - Método $method", function() use ($content, $method) { return strpos($content, $method) !== false; }); } // Dados farmacêuticos $this->run_test('Prescriptions - Dados farmacêuticos', function() use ($content) { return strpos($content, 'medicine') !== false || strpos($content, 'dosage') !== false || strpos($content, 'frequency') !== false; }); } else { $this->run_test('Prescriptions - Arquivo existe', function() { return false; }); } echo "\n"; } /** * Validar endpoints de Faturas/Bills */ private function validate_bill_endpoints() { echo "💰 7. VALIDAÇÃO - ENDPOINTS DE FATURAS\n"; echo "=======================================\n"; $file = $this->endpoints_dir . '/class-bill-endpoints.php'; if (file_exists($file)) { $content = file_get_contents($file); $this->run_test('Bills - Classe definida', function() use ($content) { return strpos($content, 'class') !== false && strpos($content, 'Bill') !== false; }); // Métodos de faturação $bill_methods = ['get_bills', 'create_bill', 'update_bill', 'process_payment', 'generate_invoice']; foreach ($bill_methods as $method) { $this->run_test("Bills - Método $method", function() use ($content, $method) { return strpos($content, $method) !== false; }); } // Dados financeiros $this->run_test('Bills - Dados financeiros', function() use ($content) { return strpos($content, 'amount') !== false || strpos($content, 'payment') !== false || strpos($content, 'invoice') !== false; }); } else { $this->run_test('Bills - Arquivo existe', function() { return false; }); } echo "\n"; } /** * Validar estrutura geral dos endpoints */ private function validate_endpoint_structure() { echo "🏗️ 8. VALIDAÇÃO - ESTRUTURA GERAL\n"; echo "===================================\n"; // Verificar padrão de nomenclatura $endpoint_files = glob($this->endpoints_dir . '/*.php'); $this->run_test('Nomenclatura padrão dos arquivos', function() use ($endpoint_files) { foreach ($endpoint_files as $file) { $filename = basename($file); if (!preg_match('/^class-[\w-]+-endpoints\.php$/', $filename)) { return false; } } return true; }); // Verificar se todos têm namespace ou estrutura similar $namespace_count = 0; $class_count = 0; foreach ($endpoint_files as $file) { $content = file_get_contents($file); if (strpos($content, 'namespace') !== false) $namespace_count++; if (strpos($content, 'class') !== false) $class_count++; } $this->run_test('Estrutura consistente de classes', function() use ($class_count, $endpoint_files) { return $class_count >= count($endpoint_files) * 0.8; // 80% dos arquivos têm classes }); echo "\n"; } /** * Validar recursos de segurança */ private function validate_security_features() { echo "🔒 9. VALIDAÇÃO - RECURSOS DE SEGURANÇA\n"; echo "========================================\n"; $endpoint_files = glob($this->endpoints_dir . '/*.php'); $security_features = [ 'authorization' => 0, 'sanitization' => 0, 'validation' => 0, 'nonce_check' => 0 ]; foreach ($endpoint_files as $file) { $content = file_get_contents($file); if (strpos($content, 'current_user_can') !== false || strpos($content, 'permission') !== false || strpos($content, 'authorize') !== false) { $security_features['authorization']++; } if (strpos($content, 'sanitize') !== false) { $security_features['sanitization']++; } if (strpos($content, 'validate') !== false) { $security_features['validation']++; } if (strpos($content, 'nonce') !== false) { $security_features['nonce_check']++; } } $total_files = count($endpoint_files); foreach ($security_features as $feature => $count) { $this->run_test("Recurso $feature presente", function() use ($count, $total_files) { return $count >= ($total_files * 0.5); // 50% dos endpoints têm o recurso }); } echo "\n"; } /** * Validar recursos de performance */ private function validate_performance_features() { echo "⚡ 10. VALIDAÇÃO - RECURSOS DE PERFORMANCE\n"; echo "==========================================\n"; $endpoint_files = glob($this->endpoints_dir . '/*.php'); $performance_features = [ 'cache' => 0, 'pagination' => 0, 'query_optimization' => 0 ]; foreach ($endpoint_files as $file) { $content = file_get_contents($file); if (strpos($content, 'cache') !== false) { $performance_features['cache']++; } if (strpos($content, 'page') !== false && (strpos($content, 'limit') !== false || strpos($content, 'offset') !== false)) { $performance_features['pagination']++; } if (strpos($content, 'prepare') !== false || strpos($content, 'get_results') !== false) { $performance_features['query_optimization']++; } } $total_files = count($endpoint_files); foreach ($performance_features as $feature => $count) { $this->run_test("Performance - $feature implementado", function() use ($count, $total_files) { return $count >= ($total_files * 0.3); // 30% dos endpoints têm o recurso }); } echo "\n"; } /** * Executar um teste individual */ private function run_test($name, $callback) { $this->total_tests++; try { $result = $callback(); if ($result) { echo "✅ $name\n"; $this->passed_tests++; $this->results[] = ['name' => $name, 'status' => 'PASS']; } else { echo "❌ $name\n"; $this->failed_tests++; $this->results[] = ['name' => $name, 'status' => 'FAIL']; } } catch (Exception $e) { echo "💥 $name - ERROR: " . $e->getMessage() . "\n"; $this->failed_tests++; $this->results[] = ['name' => $name, 'status' => 'ERROR', 'error' => $e->getMessage()]; } } /** * Gerar relatório de validação dos endpoints */ private function generate_endpoint_report() { echo "\n🎯 RELATÓRIO DE VALIDAÇÃO DOS ENDPOINTS\n"; echo "========================================\n\n"; echo "📊 ESTATÍSTICAS GERAIS:\n"; echo " Total de testes: {$this->total_tests}\n"; echo " Testes aprovados: {$this->passed_tests}\n"; echo " Testes reprovados: {$this->failed_tests}\n"; $success_rate = round(($this->passed_tests / $this->total_tests) * 100, 2); echo " Taxa de sucesso: {$success_rate}%\n\n"; // Classificação por funcionalidade $categories = [ 'Clínicas' => 0, 'Pacientes' => 0, 'Médicos' => 0, 'Consultas' => 0, 'Encontros' => 0, 'Prescrições' => 0, 'Faturas' => 0, 'Estrutura' => 0, 'Segurança' => 0, 'Performance' => 0 ]; foreach ($this->results as $result) { foreach ($categories as $category => $count) { if (strpos($result['name'], $category) !== false || strpos($result['name'], strtolower($category)) !== false) { if ($result['status'] === 'PASS') { $categories[$category]++; } break; } } } echo "📈 PERFORMANCE POR CATEGORIA:\n"; foreach ($categories as $category => $passed) { $icon = $passed >= 5 ? '🟢' : ($passed >= 3 ? '🟡' : '🔴'); echo " $icon $category: $passed testes aprovados\n"; } echo "\n"; if ($success_rate >= 90) { echo "🏆 EXCELENTE! Endpoints estão bem estruturados e prontos para uso.\n"; } elseif ($success_rate >= 75) { echo "👍 BOM! Endpoints têm boa estrutura, pequenos ajustes necessários.\n"; } elseif ($success_rate >= 60) { echo "⚠️ REGULAR! Endpoints precisam de melhorias importantes.\n"; } else { echo "🚨 CRÍTICO! Endpoints precisam de refatoração significativa.\n"; } echo "\n🔧 PRINCIPAIS RECOMENDAÇÕES:\n"; $failed_count = array_count_values(array_column($this->results, 'status'))['FAIL'] ?? 0; if ($failed_count > 0) { echo " 1. 🔐 Implementar validação de segurança em todos os endpoints\n"; echo " 2. 📊 Adicionar paginação nos endpoints de listagem\n"; echo " 3. ⚡ Implementar cache para melhorar performance\n"; echo " 4. 🧪 Criar testes unitários para cada endpoint\n"; echo " 5. 📝 Documentar contratos de API (OpenAPI/Swagger)\n"; } else { echo " ✨ Endpoints estão bem estruturados!\n"; echo " 📱 Próximo passo: Testes de integração com aplicações frontend\n"; } echo "\n📋 ENDPOINTS ESPECÍFICOS PARA REVISÃO:\n"; $failed_endpoints = []; foreach ($this->results as $result) { if ($result['status'] !== 'PASS') { $endpoint = explode(' - ', $result['name'])[0]; $failed_endpoints[$endpoint] = ($failed_endpoints[$endpoint] ?? 0) + 1; } } if (empty($failed_endpoints)) { echo " ✅ Todos os endpoints passaram na validação!\n"; } else { foreach ($failed_endpoints as $endpoint => $count) { echo " 🔸 $endpoint: $count problemas encontrados\n"; } } echo "\n📅 Validação executada em: " . date('Y-m-d H:i:s') . "\n"; echo "🏥 Care API Endpoint Validator - Descomplicar®\n"; } } // Executar validação dos endpoints $endpoint_validator = new CareAPIEndpointValidator(); $endpoint_validator->run_endpoint_validation();