"""Tests de Alarm (instancia activa).""" from __future__ import annotations from datetime import UTC, datetime, timedelta import pytest from pydantic import ValidationError from vmssailor.core import Alarm from vmssailor.core.enums import AlarmPriority, AlarmState def _now() -> datetime: return datetime.now(UTC) def test_alarm_active_basic() -> None: a = Alarm( id="alm_1", tag_id="ME_PORT.OIL_PRESS", alarm_config_id="ME_PORT.OIL_PRESS.LOW", priority=AlarmPriority.EMERGENCY, state=AlarmState.ACTIVE, timestamp_active=_now(), message="Oil pressure low", ) assert a.state == AlarmState.ACTIVE assert a.timestamp_ack is None def test_alarm_ack_requires_timestamp_ack() -> None: with pytest.raises(ValidationError): Alarm( id="a", tag_id="t", alarm_config_id="t.low", priority=AlarmPriority.HIGH, state=AlarmState.ACK, timestamp_active=_now(), # timestamp_ack faltante ) def test_alarm_cleared_requires_timestamp_cleared() -> None: with pytest.raises(ValidationError): Alarm( id="a", tag_id="t", alarm_config_id="t.low", priority=AlarmPriority.HIGH, state=AlarmState.CLEARED, timestamp_active=_now(), ) def test_alarm_ack_timestamp_must_be_after_active() -> None: t0 = _now() with pytest.raises(ValidationError): Alarm( id="a", tag_id="t", alarm_config_id="t.low", priority=AlarmPriority.HIGH, state=AlarmState.ACK, timestamp_active=t0, timestamp_ack=t0 - timedelta(seconds=1), acknowledged_by="op1", ) def test_alarm_acknowledged_by_without_ts_inconsistent() -> None: with pytest.raises(ValidationError): Alarm( id="a", tag_id="t", alarm_config_id="t.low", priority=AlarmPriority.HIGH, state=AlarmState.ACTIVE, timestamp_active=_now(), acknowledged_by="op1", )