diff --git a/src/pyrecest/filters/update_diagnostics.py b/src/pyrecest/filters/update_diagnostics.py index 7d88a66a8..3a27ac82f 100644 --- a/src/pyrecest/filters/update_diagnostics.py +++ b/src/pyrecest/filters/update_diagnostics.py @@ -53,7 +53,12 @@ def __post_init__(self): "active_measurement_indices must be smaller than measurement_count" ) object.__setattr__(self, "measurement_count", measurement_count) - object.__setattr__(self, "skipped_reason", _normalize_skipped_reason(self.skipped_reason)) + skipped_reason = _normalize_skipped_reason(self.skipped_reason) + if skipped_reason is not None and indices: + raise ValueError( + "skipped diagnostics must not contain active_measurement_indices" + ) + object.__setattr__(self, "skipped_reason", skipped_reason) object.__setattr__(self, "metadata", _normalize_metadata(self.metadata)) @property @@ -114,8 +119,8 @@ def _normalize_skipped_reason(skipped_reason: str | None) -> str | None: return None if not isinstance(skipped_reason, str): raise ValueError("skipped_reason must be a string or None") - if not skipped_reason: - raise ValueError("skipped_reason must not be empty") + if not skipped_reason.strip(): + raise ValueError("skipped_reason must not be empty or whitespace-only") return skipped_reason diff --git a/tests/filters/test_update_diagnostics_skipped_reason.py b/tests/filters/test_update_diagnostics_skipped_reason.py index 48b8eee87..0a73f55d4 100644 --- a/tests/filters/test_update_diagnostics_skipped_reason.py +++ b/tests/filters/test_update_diagnostics_skipped_reason.py @@ -3,12 +3,24 @@ from pyrecest.filters.update_diagnostics import MeasurementUpdateDiagnostics -@pytest.mark.parametrize("skipped_reason", ["", 0, object()]) +@pytest.mark.parametrize("skipped_reason", ["", " ", 0, object()]) def test_skipped_reason_rejects_non_text_or_empty_values(skipped_reason): with pytest.raises(ValueError, match="skipped_reason"): MeasurementUpdateDiagnostics(skipped_reason=skipped_reason) +def test_skipped_reason_rejects_active_measurements(): + with pytest.raises( + ValueError, + match="skipped diagnostics must not contain active_measurement_indices", + ): + MeasurementUpdateDiagnostics( + active_measurement_indices=[0], + measurement_count=1, + skipped_reason="gated", + ) + + def test_skipped_constructor_accepts_non_empty_reason(): diagnostics = MeasurementUpdateDiagnostics.skipped("gated")