CalejoControl/tests/unit/test_emergency_stop.py

152 lines
5.8 KiB
Python

"""
Unit tests for EmergencyStopManager.
"""
import pytest
from unittest.mock import Mock, AsyncMock
from src.core.emergency_stop import EmergencyStopManager
class TestEmergencyStopManager:
"""Test cases for EmergencyStopManager."""
def setup_method(self):
"""Set up test fixtures."""
self.mock_db_client = Mock()
self.mock_db_client.execute = Mock()
self.emergency_stop_manager = EmergencyStopManager(self.mock_db_client)
def test_emergency_stop_pump(self):
"""Test emergency stop for a specific pump."""
# Act
result = self.emergency_stop_manager.emergency_stop_pump(
station_id='STATION_001',
pump_id='PUMP_001',
reason='Test emergency stop',
user_id='test_user'
)
# Assert
assert result is True
assert self.emergency_stop_manager.is_emergency_stop_active('STATION_001', 'PUMP_001') is True
assert self.mock_db_client.execute.called
def test_emergency_stop_station(self):
"""Test emergency stop for all pumps in a station."""
# Act
result = self.emergency_stop_manager.emergency_stop_station(
station_id='STATION_001',
reason='Test station stop',
user_id='test_user'
)
# Assert
assert result is True
assert self.emergency_stop_manager.is_emergency_stop_active('STATION_001', 'PUMP_001') is True
assert self.emergency_stop_manager.is_emergency_stop_active('STATION_001', 'PUMP_002') is True
assert self.mock_db_client.execute.called
def test_emergency_stop_system(self):
"""Test system-wide emergency stop."""
# Act
result = self.emergency_stop_manager.emergency_stop_system(
reason='Test system stop',
user_id='test_user'
)
# Assert
assert result is True
assert self.emergency_stop_manager.is_emergency_stop_active('STATION_001', 'PUMP_001') is True
assert self.emergency_stop_manager.is_emergency_stop_active('STATION_002', 'PUMP_001') is True
assert self.mock_db_client.execute.called
def test_clear_emergency_stop_pump(self):
"""Test clearing emergency stop for a specific pump."""
# Arrange
self.emergency_stop_manager.emergency_stop_pump('STATION_001', 'PUMP_001')
# Act
result = self.emergency_stop_manager.clear_emergency_stop_pump(
station_id='STATION_001',
pump_id='PUMP_001',
reason='Test clearance',
user_id='test_user'
)
# Assert
assert result is True
assert self.emergency_stop_manager.is_emergency_stop_active('STATION_001', 'PUMP_001') is False
assert self.mock_db_client.execute.call_count == 2 # Stop + clearance
def test_clear_emergency_stop_station(self):
"""Test clearing emergency stop for a station."""
# Arrange
self.emergency_stop_manager.emergency_stop_station('STATION_001')
# Act
result = self.emergency_stop_manager.clear_emergency_stop_station(
station_id='STATION_001',
reason='Test clearance',
user_id='test_user'
)
# Assert
assert result is True
assert self.emergency_stop_manager.is_emergency_stop_active('STATION_001', 'PUMP_001') is False
assert self.mock_db_client.execute.call_count == 2 # Stop + clearance
def test_clear_emergency_stop_system(self):
"""Test clearing system-wide emergency stop."""
# Arrange
self.emergency_stop_manager.emergency_stop_system()
# Act
result = self.emergency_stop_manager.clear_emergency_stop_system(
reason='Test clearance',
user_id='test_user'
)
# Assert
assert result is True
assert self.emergency_stop_manager.is_emergency_stop_active('STATION_001', 'PUMP_001') is False
assert self.mock_db_client.execute.call_count == 2 # Stop + clearance
def test_clear_nonexistent_emergency_stop(self):
"""Test clearing emergency stop that doesn't exist."""
# Act
result = self.emergency_stop_manager.clear_emergency_stop_pump('STATION_001', 'PUMP_001')
# Assert
assert result is False
assert self.mock_db_client.execute.call_count == 0
def test_emergency_stop_priority(self):
"""Test that system stop overrides station and pump stops."""
# Arrange
self.emergency_stop_manager.emergency_stop_pump('STATION_001', 'PUMP_001')
self.emergency_stop_manager.emergency_stop_station('STATION_002')
# Act
self.emergency_stop_manager.emergency_stop_system()
# Assert
assert self.emergency_stop_manager.is_emergency_stop_active('STATION_001', 'PUMP_001') is True
assert self.emergency_stop_manager.is_emergency_stop_active('STATION_002', 'PUMP_001') is True
assert self.emergency_stop_manager.is_emergency_stop_active('STATION_003', 'PUMP_001') is True
def test_get_emergency_stop_status(self):
"""Test getting emergency stop status."""
# Arrange
self.emergency_stop_manager.emergency_stop_pump('STATION_001', 'PUMP_001')
self.emergency_stop_manager.emergency_stop_station('STATION_002')
self.emergency_stop_manager.emergency_stop_system()
# Act
status = self.emergency_stop_manager.get_emergency_stop_status()
# Assert
assert status['system_emergency_stop'] is True
assert 'STATION_002' in status['emergency_stop_stations']
assert {'station_id': 'STATION_001', 'pump_id': 'PUMP_001'} in status['emergency_stop_pumps']
assert status['total_active_stops'] == 3 # system + station + pump