mirror of
https://github.com/azaion/gps-denied-onboard.git
synced 2026-04-22 07:06:38 +00:00
111 lines
4.7 KiB
Python
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() |