From 995a464ba2f9bcbb9071b9920db0c4ab41443fd1 Mon Sep 17 00:00:00 2001 From: Julian Stirling Date: Tue, 28 Oct 2025 21:02:26 +0000 Subject: [PATCH] Rearrange Picamera tests to start using server context manager. --- .../picamera2/cam_test_utils/__init__.py | 36 +++++++++++++++++++ .../picamera2/test_exposure_time_drift.py | 27 ++------------ 2 files changed, 38 insertions(+), 25 deletions(-) create mode 100644 hardware-specific-tests/picamera2/cam_test_utils/__init__.py diff --git a/hardware-specific-tests/picamera2/cam_test_utils/__init__.py b/hardware-specific-tests/picamera2/cam_test_utils/__init__.py new file mode 100644 index 00000000..1dae1517 --- /dev/null +++ b/hardware-specific-tests/picamera2/cam_test_utils/__init__.py @@ -0,0 +1,36 @@ +"""Utilities to help with testing the camera.""" + +from typing import Optional +import tempfile + +from contextlib import contextmanager + +from fastapi.testclient import TestClient + +from labthings_fastapi.server import ThingServer +from labthings_fastapi.client import ThingClient + +from openflexure_microscope_server.things.camera.picamera import StreamingPiCamera2 + + +@contextmanager +def camera_test_client(settings_folder: Optional[str] = None): + """Yield a camera ThingClient on a camera server. + + This is a context manager not a pytest fixture as it needs to be created + multiple times in some tests. + """ + # Create a temp dir, if the setting folder is set it isn't really needed + # but doesn't add much overhead. + with tempfile.TemporaryDirectory() as tmpdir: + if settings_folder is None: + settings_folder = tmpdir + cam = StreamingPiCamera2() + server = ThingServer(settings_folder=settings_folder) + server.add_thing(cam, "/camera/") + + with TestClient(server.app) as test_client: + client = ThingClient.from_url("/camera/", client=test_client) + yield client + del server + del cam diff --git a/hardware-specific-tests/picamera2/test_exposure_time_drift.py b/hardware-specific-tests/picamera2/test_exposure_time_drift.py index 75700436..792aa861 100644 --- a/hardware-specific-tests/picamera2/test_exposure_time_drift.py +++ b/hardware-specific-tests/picamera2/test_exposure_time_drift.py @@ -4,20 +4,15 @@ This can get very tedious. Recommend running pytest with -s option to monitor progress. """ -from typing import Optional, Any +from typing import Any import logging import time import tempfile import os import json -from contextlib import contextmanager -from fastapi.testclient import TestClient -from labthings_fastapi.server import ThingServer -from labthings_fastapi.client import ThingClient - -from openflexure_microscope_server.things.camera.picamera import StreamingPiCamera2 +from .cam_test_utils import camera_test_client logging.basicConfig(level=logging.DEBUG) @@ -29,24 +24,6 @@ logging.basicConfig(level=logging.DEBUG) EXPOSURE_TOL = 30 -@contextmanager -def camera_test_client(settings_folder: Optional[str] = None): - """Yield a camera ThingClient on a camera server. - - This is a context manager not a pytest fixture as it needs to be created - multiple times in some tests. - """ - cam = StreamingPiCamera2() - server = ThingServer(settings_folder=settings_folder) - server.add_thing(cam, "/camera/") - - with TestClient(server.app) as test_client: - client = ThingClient.from_url("/camera/", client=test_client) - yield client - del server - del cam - - def _test_exposure_time_drift(desired_time: int) -> None: """Capture 10 full res images and check that the exposure time remains constant.