clinical_laboratory/test/test_parameters_simple.py
Luis Ernesto Portillo Zaldivar aaa1204490 feat(#51): Task 12 completada - Tests automatizados para catálogo de parámetros
- Creados 4 archivos de test completos con cobertura total
- test_analysis_parameter.py: Tests del modelo de parámetros
- test_parameter_range.py: Tests de rangos de referencia
- test_result_parameter_integration.py: Tests de integración
- test_auto_result_generation.py: Tests de generación automática
- Creado script simplificado test_parameters_simple.py para ejecución rápida
- Corregido valor por defecto de age_max a 150 en parameter_range.py
- Documentación completa en README.md
2025-07-15 14:08:33 -06:00

221 lines
7.8 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Script simplificado para probar el catálogo de parámetros
"""
import odoo
import logging
_logger = logging.getLogger(__name__)
def test_parameter_catalog(cr):
"""Prueba el funcionamiento del catálogo de parámetros"""
env = odoo.api.Environment(cr, odoo.SUPERUSER_ID, {})
# Limpiar parámetros de test anteriores
test_params = env['lims.analysis.parameter'].search([
('code', 'like', 'TEST_%')
])
if test_params:
print(f"Limpiando {len(test_params)} parámetros de test anteriores...")
test_params.unlink()
print("\n" + "="*60)
print("TEST: CATÁLOGO DE PARÁMETROS")
print("="*60 + "\n")
# Test 1: Crear parámetro numérico
print("1. Creando parámetro numérico...")
try:
param_numeric = env['lims.analysis.parameter'].create({
'code': 'TEST_NUM_001',
'name': 'Test Numérico',
'value_type': 'numeric',
'unit': 'mg/dL',
'description': 'Parámetro de prueba numérico'
})
print(f" ✓ Parámetro creado: {param_numeric.name} ({param_numeric.code})")
except Exception as e:
print(f" ✗ Error: {e}")
return False
# Test 2: Validación - parámetro numérico sin unidad
print("\n2. Validando requerimiento de unidad...")
try:
env['lims.analysis.parameter'].create({
'code': 'TEST_NUM_002',
'name': 'Test Sin Unidad',
'value_type': 'numeric',
# Sin unit - debe fallar
})
print(" ✗ Error: Se permitió crear parámetro numérico sin unidad")
return False
except Exception as e:
if 'unidad de medida' in str(e):
print(" ✓ Validación correcta: Se requiere unidad para parámetros numéricos")
else:
print(f" ✗ Error inesperado: {e}")
return False
# Test 3: Crear parámetro de selección
print("\n3. Creando parámetro de selección...")
try:
param_selection = env['lims.analysis.parameter'].create({
'code': 'TEST_SEL_001',
'name': 'Test Selección',
'value_type': 'selection',
'selection_values': 'Positivo,Negativo,Indeterminado'
})
print(f" ✓ Parámetro de selección creado con valores: {param_selection.selection_values}")
except Exception as e:
print(f" ✗ Error: {e}")
return False
# Test 4: Crear rango de referencia
print("\n4. Creando rangos de referencia...")
try:
range_general = env['lims.parameter.range'].create({
'parameter_id': param_numeric.id,
'name': 'Rango General',
'normal_min': 70.0,
'normal_max': 100.0,
'critical_min': 50.0,
'critical_max': 200.0
})
print(f" ✓ Rango general creado: {range_general.normal_min} - {range_general.normal_max}")
range_male = env['lims.parameter.range'].create({
'parameter_id': param_numeric.id,
'name': 'Hombre Adulto',
'gender': 'male',
'age_min': 18,
'age_max': 65,
'normal_min': 75.0,
'normal_max': 105.0
})
print(f" ✓ Rango específico creado: Hombre {range_male.age_min}-{range_male.age_max} años")
except Exception as e:
print(f" ✗ Error: {e}")
return False
# Test 5: Configurar parámetro en análisis
print("\n5. Configurando parámetros en análisis...")
try:
# Obtener un análisis existente
analysis = env['product.template'].search([
('is_analysis', '=', True)
], limit=1)
if not analysis:
print(" ⚠️ No se encontraron análisis para configurar")
else:
config = env['product.template.parameter'].create({
'product_tmpl_id': analysis.id,
'parameter_id': param_numeric.id,
'sequence': 999
})
print(f" ✓ Parámetro configurado en análisis: {analysis.name}")
except Exception as e:
print(f" ✗ Error: {e}")
return False
# Test 6: Generación automática de resultados
print("\n6. Probando generación automática de resultados...")
try:
# Buscar una prueba existente
test = env['lims.test'].search([
('state', '=', 'draft')
], limit=1)
if test and analysis:
# Cambiar el producto de la prueba para trigger la regeneración
original_product = test.product_id
test.product_id = analysis.product_variant_id.id
# Verificar que se generó el resultado
result = test.result_ids.filtered(lambda r: r.parameter_id == param_numeric)
if result:
print(f" ✓ Resultado generado automáticamente para parámetro: {param_numeric.name}")
else:
print(" ⚠️ No se generó resultado automático")
# Restaurar producto original
test.product_id = original_product.id
else:
print(" ⚠️ No se encontraron pruebas en borrador para probar")
except Exception as e:
print(f" ✗ Error: {e}")
return False
# Test 7: Verificar datos demo cargados
print("\n7. Verificando datos demo del catálogo...")
try:
param_count = env['lims.analysis.parameter'].search_count([])
range_count = env['lims.parameter.range'].search_count([])
config_count = env['product.template.parameter'].search_count([])
print(f" - Parámetros totales: {param_count}")
print(f" - Rangos de referencia: {range_count}")
print(f" - Configuraciones parámetro-análisis: {config_count}")
# Verificar algunos parámetros específicos
hemoglobin = env.ref('lims_management.param_hemoglobin', raise_if_not_found=False)
if hemoglobin:
print(f" ✓ Parámetro demo encontrado: {hemoglobin.display_name}")
print(f" - Rangos asociados: {len(hemoglobin.range_ids)}")
except Exception as e:
print(f" ✗ Error: {e}")
return False
# Test 8: Buscar rango aplicable
print("\n8. Probando búsqueda de rango aplicable...")
try:
# Crear paciente de prueba
patient = env['res.partner'].create({
'name': 'Paciente Test Rango',
'is_patient': True,
'gender': 'male',
'birthdate_date': '1990-01-01' # 34 años aprox
})
# Buscar rango aplicable
Range = env['lims.parameter.range']
applicable = Range._find_applicable_range(
param_numeric.id,
gender='male',
age=34,
is_pregnant=False
)
if applicable:
print(f" ✓ Rango aplicable encontrado: {applicable.name}")
print(f" - Valores normales: {applicable.normal_min} - {applicable.normal_max}")
else:
print(" ⚠️ No se encontró rango aplicable")
# Limpiar
patient.unlink()
except Exception as e:
print(f" ✗ Error: {e}")
return False
print("\n" + "="*60)
print("✅ TODOS LOS TESTS PASARON EXITOSAMENTE")
print("="*60)
return True
if __name__ == '__main__':
db_name = 'lims_demo'
registry = odoo.registry(db_name)
with registry.cursor() as cr:
try:
success = test_parameter_catalog(cr)
if not success:
print("\n⚠️ ALGUNOS TESTS FALLARON")
except Exception as e:
print(f"\n✗ Error crítico: {e}")
import traceback
traceback.print_exc()