Files
gps-denied-onboard/test_02_1_01_flight_waypoint_management.py
T
Denys Zaitsev d7e1066c60 Initial commit
2026-04-03 23:25:54 +03:00

111 lines
4.7 KiB
Python

import pytest
pytest.skip("Obsolete test file replaced by component-specific unit tests", allow_module_level=True)
from unittest.mock import Mock, MagicMock
from f02_1_flight_lifecycle_manager import FlightLifecycleManager, Flight, GPSPoint, CameraParameters, Waypoint
@pytest.fixture
def mock_deps():
return {
"flight_database": Mock(),
"satellite_data_manager": Mock(),
"coordinate_transformer": Mock()
}
@pytest.fixture
def manager(mock_deps):
return FlightLifecycleManager(mock_deps)
@pytest.fixture
def flight_data():
return {
"flight_name": "Test Mission 01",
"start_gps": {"lat": 48.1, "lon": 37.1},
"altitude_m": 400.0,
"camera_params": {"focal_length_mm": 25.0, "sensor_width_mm": 36.0, "resolution": {"width": 640, "height": 480}},
"geofences": {"polygons": []}
}
class TestFlightWaypointManagement:
def test_create_flight_valid_data(self, manager, mock_deps, flight_data):
flight_id = manager.create_flight(flight_data)
assert flight_id is not None
assert isinstance(flight_id, str)
# Verify dependencies were called
mock_deps["flight_database"].insert_flight.assert_called_once()
mock_deps["coordinate_transformer"].set_enu_origin.assert_called_once()
mock_deps["satellite_data_manager"].prefetch_route_corridor.assert_called_once()
def test_create_flight_invalid_geofence(self, manager, flight_data):
# Add an invalid geofence structure
flight_data["geofences"] = Mock(polygons=[Mock(north_west=None)])
with pytest.raises(ValueError, match="Invalid geofence"):
manager.create_flight(flight_data)
def test_get_flight_returns_none_if_missing(self, manager, mock_deps):
mock_deps["flight_database"].get_flight_by_id.return_value = None
flight = manager.get_flight("missing_id")
assert flight is None
def test_delete_flight_removes_from_db(self, manager, mock_deps):
manager.delete_flight("test_flight_1")
mock_deps["flight_database"].delete_flight.assert_called_with("test_flight_1")
# Should also clear cache
mock_deps["satellite_data_manager"].clear_flight_cache.assert_called_with("test_flight_1")
def test_update_flight_status(self, manager, mock_deps):
mock_flight = Mock()
mock_deps["flight_database"].get_flight_by_id.return_value = mock_flight
success = manager.update_flight_status("test_flight_1", "processing")
assert success is True
assert mock_flight.state == "processing"
mock_deps["flight_database"].update_flight.assert_called_once_with(mock_flight)
def test_validate_waypoint(self, manager):
# Valid
wp_valid = Waypoint(waypoint_id="1", gps=GPSPoint(lat=45.0, lon=30.0), sequence=1)
assert manager.validate_waypoint(wp_valid).valid is True
# Invalid Lat
wp_invalid = Waypoint(waypoint_id="2", gps=GPSPoint(lat=95.0, lon=30.0), sequence=2)
res = manager.validate_waypoint(wp_invalid)
assert res.valid is False
assert "out of bounds" in res.reason
def test_validate_geofence(self, manager):
# Empty valid
assert manager.validate_geofence(Mock(polygons=[])).valid is True
# Invalid polygon (missing corners)
res = manager.validate_geofence(Mock(polygons=[Mock(north_west=None, south_east=None)]))
assert res.valid is False
assert "Invalid polygon" in res.reason
def test_validate_flight_continuity(self, manager):
# Placeholder logic currently returns True
res = manager.validate_flight_continuity([])
assert res.valid is True
def test_waypoint_update_validates_first(self, manager, mock_deps):
wp_invalid = Waypoint(waypoint_id="1", gps=GPSPoint(lat=100.0, lon=0.0), sequence=1)
success = manager.update_waypoint("flight_1", "1", wp_invalid)
assert success is False
mock_deps["flight_database"].update_waypoint.assert_not_called()
wp_valid = Waypoint(waypoint_id="1", gps=GPSPoint(lat=48.0, lon=37.0), sequence=1)
manager.update_waypoint("flight_1", "1", wp_valid)
mock_deps["flight_database"].update_waypoint.assert_called_once()
def test_batch_update_waypoints(self, manager, mock_deps):
wp_valid = Waypoint(waypoint_id="1", gps=GPSPoint(lat=48.0, lon=37.0), sequence=1)
mock_batch_result = Mock(updated_count=1, failed_ids=[])
mock_deps["flight_database"].batch_update_waypoints.return_value = mock_batch_result
res = manager.batch_update_waypoints("flight_1", [wp_valid])
assert res == mock_batch_result
mock_deps["flight_database"].batch_update_waypoints.assert_called_once()