
- 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
249 lines
8.3 KiB
Python
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) |