clinical_laboratory/lims_management/tests/test_parameter_range.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

249 lines
8.3 KiB
Python

# -*- coding: utf-8 -*-
"""
Tests para el modelo lims.parameter.range
"""
from odoo.tests import TransactionCase
from odoo.exceptions import ValidationError
class TestParameterRange(TransactionCase):
"""Tests para rangos de referencia de parámetros"""
def setUp(self):
super().setUp()
self.Range = self.env['lims.parameter.range']
self.Parameter = self.env['lims.analysis.parameter']
# Crear parámetro de prueba
self.test_param = self.Parameter.create({
'code': 'HGB_TEST',
'name': 'Hemoglobina Test',
'value_type': 'numeric',
'unit': 'g/dL'
})
def test_create_basic_range(self):
"""Test crear rango básico"""
range_obj = self.Range.create({
'parameter_id': self.test_param.id,
'name': 'Adulto General',
'normal_min': 12.0,
'normal_max': 16.0
})
self.assertEqual(range_obj.parameter_id, self.test_param)
self.assertEqual(range_obj.normal_min, 12.0)
self.assertEqual(range_obj.normal_max, 16.0)
self.assertFalse(range_obj.gender) # Sin género específico
def test_range_validation_min_max(self):
"""Test validación que min < max"""
with self.assertRaises(ValidationError) as e:
self.Range.create({
'parameter_id': self.test_param.id,
'name': 'Rango Inválido',
'normal_min': 20.0,
'normal_max': 10.0 # Max menor que min
})
self.assertIn('menor o igual', str(e.exception))
def test_range_validation_age(self):
"""Test validación de rangos de edad"""
with self.assertRaises(ValidationError) as e:
self.Range.create({
'parameter_id': self.test_param.id,
'name': 'Rango Edad Inválida',
'age_min': 65,
'age_max': 18, # Max menor que min
'normal_min': 12.0,
'normal_max': 16.0
})
self.assertIn('edad', str(e.exception))
def test_critical_values_validation(self):
"""Test validación de valores críticos"""
# Crítico min debe ser menor que normal min
with self.assertRaises(ValidationError) as e:
self.Range.create({
'parameter_id': self.test_param.id,
'name': 'Crítico Inválido',
'normal_min': 12.0,
'normal_max': 16.0,
'critical_min': 13.0 # Mayor que normal_min
})
self.assertIn('crítico mínimo', str(e.exception))
# Crítico max debe ser mayor que normal max
with self.assertRaises(ValidationError) as e:
self.Range.create({
'parameter_id': self.test_param.id,
'name': 'Crítico Inválido 2',
'normal_min': 12.0,
'normal_max': 16.0,
'critical_max': 15.0 # Menor que normal_max
})
self.assertIn('crítico máximo', str(e.exception))
def test_gender_specific_ranges(self):
"""Test rangos específicos por género"""
# Rango para hombres
male_range = self.Range.create({
'parameter_id': self.test_param.id,
'name': 'Hombre Adulto',
'gender': 'male',
'age_min': 18,
'age_max': 65,
'normal_min': 14.0,
'normal_max': 18.0
})
# Rango para mujeres
female_range = self.Range.create({
'parameter_id': self.test_param.id,
'name': 'Mujer Adulta',
'gender': 'female',
'age_min': 18,
'age_max': 65,
'normal_min': 12.0,
'normal_max': 16.0
})
self.assertEqual(male_range.gender, 'male')
self.assertEqual(female_range.gender, 'female')
def test_pregnancy_specific_range(self):
"""Test rangos para embarazadas"""
pregnancy_range = self.Range.create({
'parameter_id': self.test_param.id,
'name': 'Embarazada',
'gender': 'female',
'pregnant': True,
'age_min': 15,
'age_max': 50,
'normal_min': 11.0,
'normal_max': 14.0
})
self.assertTrue(pregnancy_range.pregnant)
self.assertEqual(pregnancy_range.gender, 'female')
def test_find_applicable_range(self):
"""Test encontrar rango aplicable según características del paciente"""
# Crear varios rangos
general_range = self.Range.create({
'parameter_id': self.test_param.id,
'name': 'General',
'normal_min': 12.0,
'normal_max': 16.0
})
male_adult_range = self.Range.create({
'parameter_id': self.test_param.id,
'name': 'Hombre Adulto',
'gender': 'male',
'age_min': 18,
'age_max': 65,
'normal_min': 14.0,
'normal_max': 18.0
})
child_range = self.Range.create({
'parameter_id': self.test_param.id,
'name': 'Niño',
'age_max': 12,
'normal_min': 11.0,
'normal_max': 14.0
})
pregnant_range = self.Range.create({
'parameter_id': self.test_param.id,
'name': 'Embarazada',
'gender': 'female',
'pregnant': True,
'normal_min': 11.0,
'normal_max': 14.0
})
# Test para hombre adulto de 30 años
applicable = self.Range._find_applicable_range(
self.test_param.id,
gender='male',
age=30,
is_pregnant=False
)
self.assertEqual(applicable, male_adult_range)
# Test para niño de 8 años
applicable = self.Range._find_applicable_range(
self.test_param.id,
gender='male',
age=8,
is_pregnant=False
)
self.assertEqual(applicable, child_range)
# Test para mujer embarazada
applicable = self.Range._find_applicable_range(
self.test_param.id,
gender='female',
age=28,
is_pregnant=True
)
self.assertEqual(applicable, pregnant_range)
# Test para caso sin rango específico (mujer no embarazada)
applicable = self.Range._find_applicable_range(
self.test_param.id,
gender='female',
age=35,
is_pregnant=False
)
self.assertEqual(applicable, general_range) # Debe devolver el rango general
def test_range_overlap_allowed(self):
"""Test que se permiten rangos superpuestos"""
# Rango 1: 0-18 años
range1 = self.Range.create({
'parameter_id': self.test_param.id,
'name': 'Pediátrico',
'age_max': 18,
'normal_min': 11.0,
'normal_max': 15.0
})
# Rango 2: 12-65 años (se superpone con rango 1)
range2 = self.Range.create({
'parameter_id': self.test_param.id,
'name': 'Adolescente-Adulto',
'age_min': 12,
'age_max': 65,
'normal_min': 12.0,
'normal_max': 16.0
})
# Ambos rangos deben existir sin error
self.assertTrue(range1.exists())
self.assertTrue(range2.exists())
def test_range_description_compute(self):
"""Test generación automática de descripción"""
# Rango con todas las características
full_range = self.Range.create({
'parameter_id': self.test_param.id,
'name': 'Completo',
'gender': 'female',
'age_min': 18,
'age_max': 45,
'pregnant': True,
'normal_min': 11.0,
'normal_max': 14.0,
'critical_min': 8.0,
'critical_max': 20.0
})
description = full_range.description
self.assertIn('Mujer', description)
self.assertIn('18-45 años', description)
self.assertIn('Embarazada', description)
self.assertIn('11.0 - 14.0', description)
self.assertIn('Críticos', description)