afancontrol/tests/test_trigger.py
2021-10-26 12:58:36 +02:00

181 lines
5.8 KiB
Python

from unittest.mock import MagicMock, call
import pytest
from afancontrol import trigger
from afancontrol.config import Actions, AlertCommands, TempName, TriggerConfig
from afancontrol.report import Report
from afancontrol.temp import TempCelsius, TempStatus
from afancontrol.trigger import PanicTrigger, ThresholdTrigger, Triggers
@pytest.fixture
def report():
return MagicMock(spec=Report)
def test_panic_on_empty_temp(report, sense_exec_shell_command):
t = PanicTrigger(
global_commands=AlertCommands(
enter_cmd="printf '@%s' enter", leave_cmd="printf '@%s' leave"
),
temp_commands={
TempName("mobo"): AlertCommands(
enter_cmd=None, leave_cmd="printf '@%s' mobo leave"
)
},
report=report,
)
with sense_exec_shell_command(trigger) as (mock_exec_shell_command, get_stdout):
with t:
assert not t.is_alerting
assert 0 == mock_exec_shell_command.call_count
t.check({TempName("mobo"): None})
assert t.is_alerting
assert mock_exec_shell_command.call_args_list == [
call("printf '@%s' enter")
]
assert ["@enter"] == get_stdout()
mock_exec_shell_command.reset_mock()
assert not t.is_alerting
assert mock_exec_shell_command.call_args_list == [
call("printf '@%s' mobo leave"),
call("printf '@%s' leave"),
]
assert ["@mobo@leave", "@leave"] == get_stdout()
def test_threshold_on_empty_temp(report):
t = ThresholdTrigger(
global_commands=AlertCommands(enter_cmd=None, leave_cmd=None),
temp_commands={TempName("mobo"): AlertCommands(enter_cmd=None, leave_cmd=None)},
report=report,
)
with t:
assert not t.is_alerting
t.check({TempName("mobo"): None})
assert not t.is_alerting
assert not t.is_alerting
@pytest.mark.parametrize("cls", [ThresholdTrigger, PanicTrigger])
def test_good_temp(cls, report):
t = cls(
global_commands=AlertCommands(enter_cmd=None, leave_cmd=None),
temp_commands=dict(mobo=AlertCommands(enter_cmd=None, leave_cmd=None)),
report=report,
)
with t:
assert not t.is_alerting
t.check(
dict(
mobo=TempStatus(
temp=TempCelsius(34.0),
min=TempCelsius(40.0),
max=TempCelsius(50.0),
panic=TempCelsius(60.0),
threshold=None,
is_panic=False,
is_threshold=False,
)
)
)
assert not t.is_alerting
@pytest.mark.parametrize("cls", [ThresholdTrigger, PanicTrigger])
def test_bad_temp(cls, report, sense_exec_shell_command):
t = cls(
global_commands=AlertCommands(
enter_cmd="printf '@%s' enter", leave_cmd="printf '@%s' leave"
),
temp_commands=dict(
mobo=AlertCommands(
enter_cmd="printf '@%s' mobo enter", leave_cmd="printf '@%s' mobo leave"
)
),
report=report,
)
with sense_exec_shell_command(trigger) as (mock_exec_shell_command, get_stdout):
with t:
assert not t.is_alerting
t.check(
dict(
mobo=TempStatus(
temp=TempCelsius(70.0),
min=TempCelsius(40.0),
max=TempCelsius(50.0),
panic=TempCelsius(60.0),
threshold=TempCelsius(55.0),
is_panic=True,
is_threshold=True,
)
)
)
assert t.is_alerting
assert mock_exec_shell_command.call_args_list == [
call("printf '@%s' mobo enter"),
call("printf '@%s' enter"),
]
assert ["@mobo@enter", "@enter"] == get_stdout()
mock_exec_shell_command.reset_mock()
t.check(
dict(
mobo=TempStatus(
temp=TempCelsius(34.0),
min=TempCelsius(40.0),
max=TempCelsius(50.0),
panic=TempCelsius(60.0),
threshold=None,
is_panic=False,
is_threshold=False,
)
)
)
assert not t.is_alerting
assert mock_exec_shell_command.call_args_list == [
call("printf '@%s' mobo leave"),
call("printf '@%s' leave"),
]
assert ["@mobo@leave", "@leave"] == get_stdout()
mock_exec_shell_command.reset_mock()
assert 0 == mock_exec_shell_command.call_count
def test_triggers_good_temp(report):
t = Triggers(
TriggerConfig(
global_commands=Actions(
panic=AlertCommands(enter_cmd=None, leave_cmd=None),
threshold=AlertCommands(enter_cmd=None, leave_cmd=None),
),
temp_commands={
TempName("mobo"): Actions(
panic=AlertCommands(enter_cmd=None, leave_cmd=None),
threshold=AlertCommands(enter_cmd=None, leave_cmd=None),
)
},
),
report=report,
)
with t:
assert not t.is_alerting
t.check(
{
TempName("mobo"): TempStatus(
temp=TempCelsius(34.0),
min=TempCelsius(40.0),
max=TempCelsius(50.0),
panic=TempCelsius(60.0),
threshold=None,
is_panic=False,
is_threshold=False,
)
}
)
assert not t.is_alerting