diff --git a/tests/e2e/test_coord.py b/tests/e2e/test_coord.py index fc510b4..86d05eb 100644 --- a/tests/e2e/test_coord.py +++ b/tests/e2e/test_coord.py @@ -3,6 +3,8 @@ import numpy as np import pytest +pytestmark = [pytest.mark.unit] + from gps_denied.testing.coord import ecef_to_wgs84, euler_to_quaternion # --- ECEF → WGS84 --- diff --git a/tests/e2e/test_dataset_base.py b/tests/e2e/test_dataset_base.py index 4eb7132..784e191 100644 --- a/tests/e2e/test_dataset_base.py +++ b/tests/e2e/test_dataset_base.py @@ -2,6 +2,8 @@ import pytest +pytestmark = [pytest.mark.unit] + from gps_denied.testing.datasets.base import ( DatasetAdapter, DatasetCapabilities, diff --git a/tests/e2e/test_download.py b/tests/e2e/test_download.py index 3c32d70..8445eb8 100644 --- a/tests/e2e/test_download.py +++ b/tests/e2e/test_download.py @@ -3,6 +3,10 @@ import hashlib from pathlib import Path +import pytest + +pytestmark = [pytest.mark.unit] + from gps_denied.testing.download import ( DATASET_REGISTRY, DatasetSpec, diff --git a/tests/e2e/test_euroc.py b/tests/e2e/test_euroc.py index 23f8b69..4d479e7 100644 --- a/tests/e2e/test_euroc.py +++ b/tests/e2e/test_euroc.py @@ -13,6 +13,8 @@ from pathlib import Path import pytest +pytestmark = [pytest.mark.e2e] + from gps_denied.testing.datasets.euroc import EuRoCAdapter from gps_denied.testing.harness import E2EHarness from gps_denied.testing.metrics import absolute_trajectory_error diff --git a/tests/e2e/test_euroc_adapter.py b/tests/e2e/test_euroc_adapter.py index 55e3189..b4cc33b 100644 --- a/tests/e2e/test_euroc_adapter.py +++ b/tests/e2e/test_euroc_adapter.py @@ -4,6 +4,8 @@ from pathlib import Path import pytest +pytestmark = [pytest.mark.unit] + from gps_denied.testing.datasets.base import ( DatasetNotAvailableError, PlatformClass, diff --git a/tests/e2e/test_euroc_mh_all.py b/tests/e2e/test_euroc_mh_all.py index fa73822..3a095a8 100644 --- a/tests/e2e/test_euroc_mh_all.py +++ b/tests/e2e/test_euroc_mh_all.py @@ -17,6 +17,8 @@ from pathlib import Path import pytest +pytestmark = [pytest.mark.e2e] + from gps_denied.testing.datasets.euroc import EuRoCAdapter from gps_denied.testing.harness import E2EHarness from gps_denied.testing.metrics import absolute_trajectory_error diff --git a/tests/e2e/test_euroc_vo_only.py b/tests/e2e/test_euroc_vo_only.py index 957fb33..480333c 100644 --- a/tests/e2e/test_euroc_vo_only.py +++ b/tests/e2e/test_euroc_vo_only.py @@ -20,6 +20,8 @@ import cv2 import numpy as np import pytest +pytestmark = [pytest.mark.e2e] + from gps_denied.core.vo import ORBVisualOdometry from gps_denied.schemas import CameraParameters from gps_denied.testing.datasets.euroc import EuRoCAdapter diff --git a/tests/e2e/test_harness_smoke.py b/tests/e2e/test_harness_smoke.py index 1eb5396..3e5637b 100644 --- a/tests/e2e/test_harness_smoke.py +++ b/tests/e2e/test_harness_smoke.py @@ -7,6 +7,8 @@ Correctness of VO on synthetic is out of scope — that's unit-test territory. import pytest +pytestmark = [pytest.mark.integration] + from gps_denied.testing.datasets.synthetic import SyntheticAdapter from gps_denied.testing.harness import E2EHarness, HarnessResult diff --git a/tests/e2e/test_mars_lvig.py b/tests/e2e/test_mars_lvig.py index 0da90d2..a78ea98 100644 --- a/tests/e2e/test_mars_lvig.py +++ b/tests/e2e/test_mars_lvig.py @@ -4,6 +4,8 @@ from pathlib import Path import pytest +pytestmark = [pytest.mark.e2e] + from gps_denied.testing.datasets.mars_lvig import MARSLVIGAdapter from gps_denied.testing.harness import E2EHarness diff --git a/tests/e2e/test_mars_lvig_adapter.py b/tests/e2e/test_mars_lvig_adapter.py index 040f248..706d718 100644 --- a/tests/e2e/test_mars_lvig_adapter.py +++ b/tests/e2e/test_mars_lvig_adapter.py @@ -4,6 +4,8 @@ from pathlib import Path import pytest +pytestmark = [pytest.mark.unit] + from gps_denied.testing.datasets.base import ( DatasetNotAvailableError, PlatformClass, diff --git a/tests/e2e/test_metrics.py b/tests/e2e/test_metrics.py index 3405c02..158cd74 100644 --- a/tests/e2e/test_metrics.py +++ b/tests/e2e/test_metrics.py @@ -3,6 +3,8 @@ import numpy as np import pytest +pytestmark = [pytest.mark.unit] + from gps_denied.testing.metrics import ( absolute_trajectory_error, relative_pose_error, diff --git a/tests/e2e/test_synthetic_adapter.py b/tests/e2e/test_synthetic_adapter.py index 1f65a5b..33feb33 100644 --- a/tests/e2e/test_synthetic_adapter.py +++ b/tests/e2e/test_synthetic_adapter.py @@ -1,8 +1,11 @@ """SyntheticAdapter produces a deterministic straight-line trajectory.""" import numpy as np +import pytest from gps_denied.testing.datasets.base import PlatformClass + +pytestmark = [pytest.mark.unit] from gps_denied.testing.datasets.synthetic import SyntheticAdapter diff --git a/tests/e2e/test_vpair.py b/tests/e2e/test_vpair.py index 052b51a..7c74c43 100644 --- a/tests/e2e/test_vpair.py +++ b/tests/e2e/test_vpair.py @@ -8,6 +8,8 @@ from pathlib import Path import pytest +pytestmark = [pytest.mark.e2e] + from gps_denied.testing.datasets.vpair import VPAIRAdapter from gps_denied.testing.harness import E2EHarness from gps_denied.testing.metrics import absolute_trajectory_error diff --git a/tests/e2e/test_vpair_adapter.py b/tests/e2e/test_vpair_adapter.py index a8e2e93..8c59eea 100644 --- a/tests/e2e/test_vpair_adapter.py +++ b/tests/e2e/test_vpair_adapter.py @@ -10,6 +10,8 @@ from pathlib import Path import numpy as np import pytest +pytestmark = [pytest.mark.unit] + from gps_denied.testing.datasets.base import ( DatasetNotAvailableError, PlatformClass, diff --git a/tests/test_acceptance.py b/tests/test_acceptance.py index 1c72704..1a66404 100644 --- a/tests/test_acceptance.py +++ b/tests/test_acceptance.py @@ -13,6 +13,8 @@ from unittest.mock import AsyncMock, MagicMock import numpy as np import pytest +pytestmark = [pytest.mark.integration] + from gps_denied.core.chunk_manager import RouteChunkManager from gps_denied.core.gpr import GlobalPlaceRecognition from gps_denied.core.graph import FactorGraphOptimizer diff --git a/tests/test_accuracy.py b/tests/test_accuracy.py index efe1055..4ca8d64 100644 --- a/tests/test_accuracy.py +++ b/tests/test_accuracy.py @@ -22,6 +22,8 @@ import time import numpy as np import pytest +pytestmark = [pytest.mark.integration] + from gps_denied.core.benchmark import ( AccuracyBenchmark, BenchmarkResult, diff --git a/tests/test_api_flights.py b/tests/test_api_flights.py index 8fd0c7f..1e4789f 100644 --- a/tests/test_api_flights.py +++ b/tests/test_api_flights.py @@ -3,6 +3,9 @@ import json import pytest + +pytestmark = [pytest.mark.integration] + from httpx import ASGITransport, AsyncClient from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine diff --git a/tests/test_chunk_manager.py b/tests/test_chunk_manager.py index 6e0a1e4..12d19bb 100644 --- a/tests/test_chunk_manager.py +++ b/tests/test_chunk_manager.py @@ -3,6 +3,8 @@ import numpy as np import pytest +pytestmark = [pytest.mark.unit] + from gps_denied.core.chunk_manager import RouteChunkManager from gps_denied.core.graph import FactorGraphOptimizer from gps_denied.schemas.chunk import ChunkStatus diff --git a/tests/test_coordinates.py b/tests/test_coordinates.py index 3a4fe86..9a231b3 100644 --- a/tests/test_coordinates.py +++ b/tests/test_coordinates.py @@ -3,6 +3,8 @@ import numpy as np import pytest +pytestmark = [pytest.mark.unit] + from gps_denied.core.coordinates import ( CoordinateTransformer, OriginNotSetError, diff --git a/tests/test_database.py b/tests/test_database.py index 2a8d38c..c9a173c 100644 --- a/tests/test_database.py +++ b/tests/test_database.py @@ -1,6 +1,9 @@ """Tests for the database layer — CRUD, cascade, transactions.""" import pytest + +pytestmark = [pytest.mark.integration] + from sqlalchemy import event from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine diff --git a/tests/test_eskf.py b/tests/test_eskf.py index 626b6c4..4eb473f 100644 --- a/tests/test_eskf.py +++ b/tests/test_eskf.py @@ -3,6 +3,8 @@ import numpy as np import pytest +pytestmark = [pytest.mark.unit] + from gps_denied.core.coordinates import CoordinateTransformer from gps_denied.core.eskf import ESKF from gps_denied.schemas import GPSPoint diff --git a/tests/test_gpr.py b/tests/test_gpr.py index ba1e411..34ae31d 100644 --- a/tests/test_gpr.py +++ b/tests/test_gpr.py @@ -3,6 +3,8 @@ import numpy as np import pytest +pytestmark = [pytest.mark.unit] + from gps_denied.core.gpr import GlobalPlaceRecognition from gps_denied.core.models import ModelManager from gps_denied.schemas.gpr import TileCandidate diff --git a/tests/test_gps_input_encoding.py b/tests/test_gps_input_encoding.py index ac24d8b..8bd8d6b 100644 --- a/tests/test_gps_input_encoding.py +++ b/tests/test_gps_input_encoding.py @@ -17,6 +17,8 @@ import time import numpy as np import pytest +pytestmark = [pytest.mark.blackbox] + from gps_denied.core.mavlink import _confidence_to_fix_type, _eskf_to_gps_input from gps_denied.schemas import GPSPoint from gps_denied.schemas.eskf import ConfidenceTier, ESKFState diff --git a/tests/test_graph.py b/tests/test_graph.py index 6d3fccd..43f112f 100644 --- a/tests/test_graph.py +++ b/tests/test_graph.py @@ -3,6 +3,8 @@ import numpy as np import pytest +pytestmark = [pytest.mark.unit] + from gps_denied.core.graph import FactorGraphOptimizer from gps_denied.schemas import GPSPoint from gps_denied.schemas.graph import FactorGraphConfig diff --git a/tests/test_health.py b/tests/test_health.py index 61524bf..d696082 100644 --- a/tests/test_health.py +++ b/tests/test_health.py @@ -1,6 +1,9 @@ """Tests for the health endpoint.""" import pytest + +pytestmark = [pytest.mark.integration] + from httpx import ASGITransport, AsyncClient from gps_denied.app import app diff --git a/tests/test_mavlink.py b/tests/test_mavlink.py index 3bbd21d..8d0d5a6 100644 --- a/tests/test_mavlink.py +++ b/tests/test_mavlink.py @@ -14,6 +14,8 @@ import time import numpy as np import pytest +pytestmark = [pytest.mark.unit] + from gps_denied.core.mavlink import ( MAVLinkBridge, MockMAVConnection, diff --git a/tests/test_metric.py b/tests/test_metric.py index 1ed1f90..ccaf0c2 100644 --- a/tests/test_metric.py +++ b/tests/test_metric.py @@ -3,6 +3,8 @@ import numpy as np import pytest +pytestmark = [pytest.mark.unit] + from gps_denied.core.metric import MetricRefinement from gps_denied.core.models import ModelManager from gps_denied.schemas import GPSPoint diff --git a/tests/test_models.py b/tests/test_models.py index a927442..8f81832 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -1,9 +1,12 @@ """Tests for Model Manager (F16).""" import numpy as np +import pytest from gps_denied.core.models import ModelManager +pytestmark = [pytest.mark.unit] + def test_load_and_get_model(): manager = ModelManager() diff --git a/tests/test_pipeline.py b/tests/test_pipeline.py index 4142bbf..90a56fd 100644 --- a/tests/test_pipeline.py +++ b/tests/test_pipeline.py @@ -5,6 +5,8 @@ import cv2 import numpy as np import pytest +pytestmark = [pytest.mark.unit] + from gps_denied.core.pipeline import ImageInputPipeline, QueueFullError from gps_denied.schemas.image import ImageBatch diff --git a/tests/test_processor_full.py b/tests/test_processor_full.py index 369afc6..c53ca77 100644 --- a/tests/test_processor_full.py +++ b/tests/test_processor_full.py @@ -5,6 +5,8 @@ from unittest.mock import AsyncMock, MagicMock import numpy as np import pytest +pytestmark = [pytest.mark.integration] + from gps_denied.core.chunk_manager import RouteChunkManager from gps_denied.core.gpr import GlobalPlaceRecognition from gps_denied.core.graph import FactorGraphOptimizer diff --git a/tests/test_processor_pipe.py b/tests/test_processor_pipe.py index bc9e45d..8feeb33 100644 --- a/tests/test_processor_pipe.py +++ b/tests/test_processor_pipe.py @@ -14,6 +14,8 @@ from unittest.mock import AsyncMock, MagicMock import numpy as np import pytest +pytestmark = [pytest.mark.integration] + from gps_denied.core.coordinates import CoordinateTransformer from gps_denied.core.processor import FlightProcessor, TrackingState from gps_denied.core.rotation import ImageRotationManager diff --git a/tests/test_recovery.py b/tests/test_recovery.py index 80224ae..66adb56 100644 --- a/tests/test_recovery.py +++ b/tests/test_recovery.py @@ -3,6 +3,8 @@ import numpy as np import pytest +pytestmark = [pytest.mark.unit] + from gps_denied.core.chunk_manager import RouteChunkManager from gps_denied.core.gpr import GlobalPlaceRecognition from gps_denied.core.graph import FactorGraphOptimizer diff --git a/tests/test_rotation.py b/tests/test_rotation.py index a62df91..92531dc 100644 --- a/tests/test_rotation.py +++ b/tests/test_rotation.py @@ -5,6 +5,8 @@ from datetime import datetime, timezone import numpy as np import pytest +pytestmark = [pytest.mark.unit] + from gps_denied.core.rotation import IImageMatcher, ImageRotationManager from gps_denied.schemas import GPSPoint from gps_denied.schemas.rotation import RotationResult diff --git a/tests/test_satellite.py b/tests/test_satellite.py index 2ca0bf7..923716e 100644 --- a/tests/test_satellite.py +++ b/tests/test_satellite.py @@ -3,6 +3,8 @@ import numpy as np import pytest +pytestmark = [pytest.mark.unit] + from gps_denied.core.satellite import SatelliteDataManager from gps_denied.schemas import GPSPoint from gps_denied.utils import mercator diff --git a/tests/test_schemas.py b/tests/test_schemas.py index c2654d1..f70c24f 100644 --- a/tests/test_schemas.py +++ b/tests/test_schemas.py @@ -3,6 +3,9 @@ from datetime import datetime, timezone import pytest + +pytestmark = [pytest.mark.unit] + from pydantic import ValidationError from gps_denied.config import get_settings diff --git a/tests/test_sitl_integration.py b/tests/test_sitl_integration.py index d6c387e..7cd8dc0 100644 --- a/tests/test_sitl_integration.py +++ b/tests/test_sitl_integration.py @@ -42,10 +42,10 @@ SITL_PORT = int(os.environ.get("ARDUPILOT_SITL_PORT", "5762")) _SITL_AVAILABLE = bool(SITL_HOST) -pytestmark = pytest.mark.skipif( +pytestmark = [pytest.mark.sitl, pytest.mark.skipif( not _SITL_AVAILABLE, reason="SITL integration tests require ARDUPILOT_SITL_HOST env var", -) +)] # --------------------------------------------------------------------------- # Helpers diff --git a/tests/test_vo.py b/tests/test_vo.py index 9c7dabd..bd7a61a 100644 --- a/tests/test_vo.py +++ b/tests/test_vo.py @@ -3,6 +3,8 @@ import numpy as np import pytest +pytestmark = [pytest.mark.unit] + from gps_denied.core.models import ModelManager from gps_denied.core.vo import ( CuVSLAMVisualOdometry,