diff --git a/src/aeros_equipment/service.py b/src/aeros_equipment/service.py index 64d9a80..315746b 100644 --- a/src/aeros_equipment/service.py +++ b/src/aeros_equipment/service.py @@ -364,6 +364,8 @@ def get_distribution_from_db(parameters: dict, is_repairable: bool = True, best_ elif distribution == "Normal": mu = parameters.get("mu", 0) sigma = parameters.get("sigma", 1) + if sigma > 1000 or sigma < 0: + sigma = 999 return "Normal", mu, sigma elif distribution == "Weibull": # Assuming Weibull parameters are available @@ -374,6 +376,8 @@ def get_distribution_from_db(parameters: dict, is_repairable: bool = True, best_ # Default to Normal mu = parameters.get("mu", 0) sigma = parameters.get("sigma", 1) + if sigma > 1000 or sigma < 0: + sigma = 999 return "Normal", mu, sigma async def update_oh_interval_offset(*, aeros_db_session, overhaul_offset, overhaul_interval, project_name): diff --git a/tests/unit/test_update_equipment_simulation.py b/tests/unit/test_update_equipment_simulation.py index c6fa078..b5b511b 100644 --- a/tests/unit/test_update_equipment_simulation.py +++ b/tests/unit/test_update_equipment_simulation.py @@ -225,3 +225,74 @@ async def test_update_equipment_for_simulation_missing_reliability(): assert eq_node["cmDisUnitCode"] == "UHour" assert eq_node["relDisUnitCode"] == "UHour" assert eq_node["ohDisUnitCode"] == "UHour" + +@pytest.mark.asyncio +async def test_update_equipment_for_simulation_sigma_constraint(): + # Mock parameters + db_session = AsyncMock() + aeros_db_session = AsyncMock() + project_name = "TestProject" + simulation_duration = 8760 + overhaul_duration = 72 + overhaul_interval = 8000 + offset = 0 + schematic_name = "TestSchematic" + + # Mock get_aeros_schematic_by_name + mock_schematic = MagicMock() + mock_schematic.id = 1 + + # Mock db_session.execute + mock_eq = MagicMock() + mock_eq.location_tag = "EQ_SIGMA" + mock_eq_result = MagicMock() + mock_eq_result.scalars.return_value.all.return_value = [mock_eq] + + mock_empty_result = MagicMock() + mock_empty_result.scalars.return_value.all.return_value = [] + + db_session.execute.side_effect = [ + mock_eq_result, # equipments + mock_empty_result, # rbd_group + mock_empty_result # non_repairable + ] + + # Mock nodes data + mock_nodes_data = [ + {"equipmentName": "EQ_SIGMA", "relDisType": "Fixed", "relDisP1": 0} + ] + + # Mock reliability data with high sigma (> 1000) + mock_reliability_data = { + "EQ_SIGMA": { + "relDisType": "Normal", + "relDisP1": 100, # mu + "relDisP2": 1500, # sigma + "cmDisType": "Fixed", + "cmDisP1": 0, + "cmDisP2": 0 + } + } + + with patch("src.aeros_equipment.service.get_aeros_schematic_by_name", return_value=mock_schematic), \ + patch("src.aeros_equipment.service.get_aeros_equipment_by_location_tag", return_value=mock_nodes_data), \ + patch("src.aeros_equipment.service.get_asset_batch", return_value=mock_reliability_data), \ + patch("src.aeros_equipment.service.update_oh_interval_offset", return_value=None), \ + patch("src.aeros_equipment.service.update_node", return_value=None) as mock_update_node: + + # Run + await update_equipment_for_simulation( + db_session=db_session, + aeros_db_session=aeros_db_session, + project_name=project_name, + simulation_duration=simulation_duration, + overhaul_duration=overhaul_duration, + overhaul_interval=overhaul_interval, + offset=offset, + schematic_name=schematic_name + ) + + # Check if sigma was constrained correctly + called_args = mock_update_node.call_args[1] + eq_node = called_args["equipment_nodes"][0] + assert eq_node["relDisP2"] == 999