File: test_source_base.py

package info (click to toggle)
s-tui 1.4.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 3,336 kB
  • sloc: python: 6,159; makefile: 23
file content (170 lines) | stat: -rw-r--r-- 5,236 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
"""Tests for the Source base class and MockSource."""

from collections import OrderedDict
from unittest.mock import MagicMock

import pytest

from s_tui.sources.source import MockSource, Source


class TestSourceInit:
    def test_defaults(self):
        src = Source()
        assert src.name == ""
        assert src.measurement_unit == ""
        assert src.is_available is True
        assert src.last_measurement == []
        assert src.last_thresholds == []
        assert src.available_sensors == []
        assert src.edge_hooks == []
        assert src.alert_pallet is None

    def test_pallet_has_four_entries(self):
        src = Source()
        assert len(src.pallet) == 4


class TestSourceAccessors:
    def setup_method(self):
        self.src = Source()
        self.src.name = "TestSrc"
        self.src.measurement_unit = "MHz"
        self.src.available_sensors = ["Avg", "Core 0"]
        self.src.last_measurement = [100.0, 200.0]

    def test_get_source_name(self):
        assert self.src.get_source_name() == "TestSrc"

    def test_get_measurement_unit(self):
        assert self.src.get_measurement_unit() == "MHz"

    def test_get_is_available(self):
        assert self.src.get_is_available() is True

    def test_get_sensor_list(self):
        assert self.src.get_sensor_list() == ["Avg", "Core 0"]

    def test_get_reading_list(self):
        assert self.src.get_reading_list() == [100.0, 200.0]

    def test_get_threshold_list(self):
        self.src.last_thresholds = [80, 80]
        assert self.src.get_threshold_list() == [80, 80]

    def test_get_pallet(self):
        assert len(self.src.get_pallet()) == 4

    def test_get_alert_pallet_default_none(self):
        assert self.src.get_alert_pallet() is None


class TestSourceSummary:
    def test_get_sensors_summary(self):
        src = Source()
        src.available_sensors = ["Avg", "Core 0"]
        src.last_measurement = [25.5, 30.1]
        summary = src.get_sensors_summary()
        assert isinstance(summary, OrderedDict)
        assert summary["Avg"] == "25.5"
        assert summary["Core 0"] == "30.1"

    def test_get_summary_includes_name_and_unit(self):
        src = Source()
        src.name = "Util"
        src.measurement_unit = "%"
        src.available_sensors = ["Avg"]
        src.last_measurement = [50.0]
        summary = src.get_summary()
        assert summary["Util"] == "[%]"
        assert summary["Avg"] == "50.0"

    def test_get_sensors_summary_rounds_to_one_decimal(self):
        src = Source()
        src.available_sensors = ["S1"]
        src.last_measurement = [33.3333333]
        summary = src.get_sensors_summary()
        assert summary["S1"] == "33.3"


class TestSourceNotImplemented:
    def test_get_maximum_raises(self):
        with pytest.raises(NotImplementedError):
            Source().get_maximum()

    def test_get_top_raises(self):
        with pytest.raises(NotImplementedError):
            Source().get_top()

    def test_reset_raises(self):
        with pytest.raises(NotImplementedError):
            Source().reset()

    def test_get_edge_triggered_raises(self):
        with pytest.raises(NotImplementedError):
            Source().get_edge_triggered()


class TestSourceHooks:
    def test_add_edge_hook(self):
        src = Source()
        hook = MagicMock()
        src.add_edge_hook(hook)
        assert len(src.edge_hooks) == 1
        assert src.edge_hooks[0] is hook

    def test_add_none_hook_ignored(self):
        src = Source()
        src.add_edge_hook(None)
        assert len(src.edge_hooks) == 0

    def test_eval_hooks_invokes_when_triggered(self):
        src = Source()
        src.get_edge_triggered = MagicMock(return_value=True)
        hook = MagicMock()
        hook.is_ready.return_value = True
        src.add_edge_hook(hook)
        src.eval_hooks()
        hook.invoke.assert_called_once()

    def test_eval_hooks_skips_not_ready(self):
        src = Source()
        src.get_edge_triggered = MagicMock(return_value=True)
        hook = MagicMock()
        hook.is_ready.return_value = False
        src.add_edge_hook(hook)
        src.eval_hooks()
        hook.invoke.assert_not_called()

    def test_eval_hooks_skips_when_not_triggered(self):
        src = Source()
        src.get_edge_triggered = MagicMock(return_value=False)
        hook = MagicMock()
        hook.is_ready.return_value = True
        src.add_edge_hook(hook)
        src.eval_hooks()
        hook.invoke.assert_not_called()

    def test_update_calls_eval_hooks(self):
        src = Source()
        # Override get_edge_triggered so eval_hooks doesn't raise
        src.get_edge_triggered = MagicMock(return_value=False)
        src.eval_hooks = MagicMock()
        src.update()
        src.eval_hooks.assert_called_once()


class TestMockSource:
    def test_get_maximum(self):
        ms = MockSource()
        assert ms.get_maximum() == 20

    def test_get_summary(self):
        ms = MockSource()
        summary = ms.get_summary()
        assert "MockValue" in summary
        assert summary["MockValue"] == "5"

    def test_get_edge_triggered_raises(self):
        with pytest.raises(NotImplementedError):
            MockSource().get_edge_triggered()