
- 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
175 lines
6.1 KiB
Python
175 lines
6.1 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""
|
|
Tests para el modelo lims.analysis.parameter
|
|
"""
|
|
from odoo.tests import TransactionCase
|
|
from odoo.exceptions import ValidationError
|
|
|
|
|
|
class TestAnalysisParameter(TransactionCase):
|
|
"""Tests para el catálogo de parámetros de análisis"""
|
|
|
|
def setUp(self):
|
|
super().setUp()
|
|
self.Parameter = self.env['lims.analysis.parameter']
|
|
|
|
def test_create_numeric_parameter(self):
|
|
"""Test crear parámetro numérico con validaciones"""
|
|
# Crear parámetro numérico válido
|
|
param = self.Parameter.create({
|
|
'code': 'TEST001',
|
|
'name': 'Test Parameter',
|
|
'value_type': 'numeric',
|
|
'unit': 'mg/dL',
|
|
'description': 'Test numeric parameter'
|
|
})
|
|
|
|
self.assertEqual(param.code, 'TEST001')
|
|
self.assertEqual(param.value_type, 'numeric')
|
|
self.assertEqual(param.unit, 'mg/dL')
|
|
|
|
def test_numeric_parameter_requires_unit(self):
|
|
"""Test que parámetros numéricos requieren unidad"""
|
|
with self.assertRaises(ValidationError) as e:
|
|
self.Parameter.create({
|
|
'code': 'TEST002',
|
|
'name': 'Test Parameter No Unit',
|
|
'value_type': 'numeric',
|
|
# Sin unit - debe fallar
|
|
})
|
|
self.assertIn('unidad de medida', str(e.exception))
|
|
|
|
def test_create_selection_parameter(self):
|
|
"""Test crear parámetro de selección con opciones"""
|
|
param = self.Parameter.create({
|
|
'code': 'TEST003',
|
|
'name': 'Test Selection',
|
|
'value_type': 'selection',
|
|
'selection_values': 'Positivo,Negativo,Indeterminado'
|
|
})
|
|
|
|
self.assertEqual(param.value_type, 'selection')
|
|
self.assertEqual(param.selection_values, 'Positivo,Negativo,Indeterminado')
|
|
|
|
def test_selection_parameter_requires_values(self):
|
|
"""Test que parámetros de selección requieren valores"""
|
|
with self.assertRaises(ValidationError) as e:
|
|
self.Parameter.create({
|
|
'code': 'TEST004',
|
|
'name': 'Test Selection No Values',
|
|
'value_type': 'selection',
|
|
# Sin selection_values - debe fallar
|
|
})
|
|
self.assertIn('valores de selección', str(e.exception))
|
|
|
|
def test_duplicate_code_not_allowed(self):
|
|
"""Test que no se permiten códigos duplicados"""
|
|
# Crear primer parámetro
|
|
self.Parameter.create({
|
|
'code': 'DUP001',
|
|
'name': 'Original Parameter',
|
|
'value_type': 'text'
|
|
})
|
|
|
|
# Intentar crear duplicado
|
|
with self.assertRaises(ValidationError) as e:
|
|
self.Parameter.create({
|
|
'code': 'DUP001',
|
|
'name': 'Duplicate Parameter',
|
|
'value_type': 'text'
|
|
})
|
|
self.assertIn('ya existe', str(e.exception))
|
|
|
|
def test_boolean_parameter(self):
|
|
"""Test crear parámetro booleano"""
|
|
param = self.Parameter.create({
|
|
'code': 'BOOL001',
|
|
'name': 'Test Boolean',
|
|
'value_type': 'boolean',
|
|
'description': 'Boolean parameter'
|
|
})
|
|
|
|
self.assertEqual(param.value_type, 'boolean')
|
|
self.assertFalse(param.unit) # Boolean no debe tener unidad
|
|
|
|
def test_text_parameter(self):
|
|
"""Test crear parámetro de texto"""
|
|
param = self.Parameter.create({
|
|
'code': 'TEXT001',
|
|
'name': 'Test Text',
|
|
'value_type': 'text',
|
|
'description': 'Text parameter'
|
|
})
|
|
|
|
self.assertEqual(param.value_type, 'text')
|
|
self.assertFalse(param.unit) # Text no debe tener unidad
|
|
self.assertFalse(param.selection_values) # Text no debe tener valores de selección
|
|
|
|
def test_parameter_name_display(self):
|
|
"""Test nombre mostrado del parámetro"""
|
|
# Con unidad
|
|
param1 = self.Parameter.create({
|
|
'code': 'DISP001',
|
|
'name': 'Glucosa',
|
|
'value_type': 'numeric',
|
|
'unit': 'mg/dL'
|
|
})
|
|
self.assertEqual(param1.display_name, 'Glucosa (mg/dL)')
|
|
|
|
# Sin unidad
|
|
param2 = self.Parameter.create({
|
|
'code': 'DISP002',
|
|
'name': 'Cultivo',
|
|
'value_type': 'text'
|
|
})
|
|
self.assertEqual(param2.display_name, 'Cultivo')
|
|
|
|
def test_parameter_ranges_relationship(self):
|
|
"""Test relación con rangos de referencia"""
|
|
param = self.Parameter.create({
|
|
'code': 'RANGE001',
|
|
'name': 'Test with Ranges',
|
|
'value_type': 'numeric',
|
|
'unit': 'U/L'
|
|
})
|
|
|
|
# Crear rango para este parámetro
|
|
range1 = self.env['lims.parameter.range'].create({
|
|
'parameter_id': param.id,
|
|
'name': 'Adult Male',
|
|
'gender': 'male',
|
|
'age_min': 18,
|
|
'age_max': 65,
|
|
'normal_min': 10.0,
|
|
'normal_max': 50.0
|
|
})
|
|
|
|
self.assertEqual(len(param.range_ids), 1)
|
|
self.assertEqual(param.range_ids[0], range1)
|
|
|
|
def test_parameter_analysis_relationship(self):
|
|
"""Test relación con análisis a través de product.template.parameter"""
|
|
param = self.Parameter.create({
|
|
'code': 'ANAL001',
|
|
'name': 'Test Analysis Link',
|
|
'value_type': 'numeric',
|
|
'unit': 'mmol/L'
|
|
})
|
|
|
|
# Crear producto análisis
|
|
analysis = self.env['product.template'].create({
|
|
'name': 'Test Analysis',
|
|
'type': 'service',
|
|
'is_analysis': True,
|
|
'categ_id': self.env.ref('lims_management.product_category_clinical_analysis').id,
|
|
})
|
|
|
|
# Crear configuración parámetro-análisis
|
|
config = self.env['product.template.parameter'].create({
|
|
'product_tmpl_id': analysis.id,
|
|
'parameter_id': param.id,
|
|
'sequence': 10
|
|
})
|
|
|
|
self.assertEqual(len(param.analysis_config_ids), 1)
|
|
self.assertEqual(param.analysis_config_ids[0], config) |