152 lines
5.8 KiB
Python
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
|