-
Notifications
You must be signed in to change notification settings - Fork 86
Expand file tree
/
Copy pathtest_tray.py
More file actions
128 lines (97 loc) · 3.72 KB
/
Copy pathtest_tray.py
File metadata and controls
128 lines (97 loc) · 3.72 KB
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
"""Test tray menu behavior."""
from __future__ import annotations
from pathlib import Path
import pytest
from tapmap.tray import create_tray_icon
_ICON_PATH = Path(__file__).resolve().parent.parent / "src" / "tapmap" / "assets" / "tapmap.ico"
@pytest.fixture(autouse=True, scope="module")
def _use_pystray_dummy_backend():
"""Use pystray's display-independent backend for tray unit tests."""
with pytest.MonkeyPatch.context() as mp:
mp.setenv("PYSTRAY_BACKEND", "dummy")
yield
def test_create_tray_icon_menu_is_open_separator_quit() -> None:
"""Create the tray menu with Open, separator, and Quit."""
icon = create_tray_icon(
icon_path=_ICON_PATH,
tooltip="TapMap",
on_open=lambda: None,
on_quit=lambda: None,
)
assert icon is not None
items = list(icon.menu)
assert [item.text for item in items] == ["Open TapMap", "- - - -", "Quit TapMap"]
def test_create_tray_icon_open_item_is_the_default_action() -> None:
"""Use Open TapMap as the default tray action."""
icon = create_tray_icon(
icon_path=_ICON_PATH,
tooltip="TapMap",
on_open=lambda: None,
on_quit=lambda: None,
)
assert icon is not None
open_item = next(item for item in icon.menu if item.text == "Open TapMap")
assert open_item.default is True
def test_create_tray_icon_open_item_calls_on_open() -> None:
"""Call the open callback from Open TapMap."""
calls: list[str] = []
icon = create_tray_icon(
icon_path=_ICON_PATH,
tooltip="TapMap",
on_open=lambda: calls.append("open"),
on_quit=lambda: None,
)
assert icon is not None
open_item = next(item for item in icon.menu if item.text == "Open TapMap")
open_item(icon)
assert calls == ["open"]
def test_create_tray_icon_quit_item_calls_on_quit() -> None:
"""Call the quit callback from Quit TapMap."""
calls: list[str] = []
icon = create_tray_icon(
icon_path=_ICON_PATH,
tooltip="TapMap",
on_open=lambda: None,
on_quit=lambda: calls.append("quit"),
)
assert icon is not None
quit_item = next(item for item in icon.menu if item.text == "Quit TapMap")
quit_item(icon)
assert calls == ["quit"]
def test_create_tray_icon_returns_none_when_icon_file_is_missing(tmp_path: Path) -> None:
"""Return no tray icon when tray creation fails."""
icon = create_tray_icon(
icon_path=tmp_path / "does-not-exist.ico",
tooltip="TapMap",
on_open=lambda: None,
on_quit=lambda: None,
)
assert icon is None
def test_create_tray_icon_returns_none_when_creation_raises_value_error(monkeypatch) -> None:
"""Return None when tray icon creation raises ValueError."""
import pystray
def _raise(*args, **kwargs):
"""Simulate the pystray/AppIndicator ValueError failure."""
raise ValueError("Namespace AppIndicator3 not available")
monkeypatch.setattr(pystray, "Icon", _raise)
icon = create_tray_icon(
icon_path=_ICON_PATH,
tooltip="TapMap",
on_open=lambda: None,
on_quit=lambda: None,
)
assert icon is None
def test_create_tray_icon_returns_none_when_creation_raises_assertion_error(monkeypatch) -> None:
"""Return None when tray icon creation raises AssertionError."""
import pystray
def _raise(*args, **kwargs):
"""Simulate a PyGObject override-loading failure."""
raise AssertionError("unix_signal_add_full was set deprecated but wasn't added to __all__")
monkeypatch.setattr(pystray, "Icon", _raise)
icon = create_tray_icon(
icon_path=_ICON_PATH,
tooltip="TapMap",
on_open=lambda: None,
on_quit=lambda: None,
)
assert icon is None