-
-
Notifications
You must be signed in to change notification settings - Fork 37.4k
Expand file tree
/
Copy pathconftest.py
More file actions
203 lines (172 loc) · 5.86 KB
/
conftest.py
File metadata and controls
203 lines (172 loc) · 5.86 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
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
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
"""Common fixtures for the ProxmoxVE tests."""
from collections.abc import Generator
from unittest.mock import AsyncMock, MagicMock, patch
import pytest
from homeassistant.components.proxmoxve.const import (
CONF_AUTH_METHOD,
CONF_CONTAINERS,
CONF_NODE,
CONF_NODES,
CONF_REALM,
CONF_TOKEN_ID,
CONF_TOKEN_SECRET,
CONF_VMS,
DOMAIN,
)
from homeassistant.const import (
CONF_HOST,
CONF_PASSWORD,
CONF_PORT,
CONF_TOKEN,
CONF_USERNAME,
CONF_VERIFY_SSL,
)
from . import MERGED_PERMISSIONS
from tests.common import (
MockConfigEntry,
load_json_array_fixture,
load_json_object_fixture,
)
MOCK_TEST_CONFIG_BASE = {
CONF_AUTH_METHOD: "pam",
CONF_HOST: "127.0.0.1",
CONF_PORT: 8006,
CONF_REALM: "pam",
CONF_USERNAME: "test_user@pam",
CONF_VERIFY_SSL: True,
CONF_TOKEN: False,
CONF_NODES: [
{
CONF_NODE: "pve1",
CONF_VMS: [100, 101],
CONF_CONTAINERS: [200, 201],
},
],
}
MOCK_TEST_CONFIG = {
**MOCK_TEST_CONFIG_BASE,
CONF_PASSWORD: "test_password",
}
MOCK_TEST_TOKEN_CONFIG = {
**MOCK_TEST_CONFIG_BASE,
CONF_TOKEN: True,
CONF_TOKEN_ID: "test_token_id",
CONF_TOKEN_SECRET: "test_token_secret",
}
MOCK_TEST_OTHER_CONFIG = {
**MOCK_TEST_CONFIG,
CONF_AUTH_METHOD: "other",
CONF_REALM: "test_realm",
CONF_USERNAME: "test_user@test_realm",
}
MOCK_TEST_TOKEN_OTHER_CONFIG = {
**MOCK_TEST_CONFIG_BASE,
CONF_TOKEN: True,
CONF_TOKEN_ID: "test_token_id",
CONF_TOKEN_SECRET: "test_token_secret",
CONF_AUTH_METHOD: "other",
CONF_REALM: "test_realm",
CONF_USERNAME: "test_user@test_realm",
}
@pytest.fixture
def mock_setup_entry() -> Generator[AsyncMock]:
"""Override async_setup_entry."""
with patch(
"homeassistant.components.proxmoxve.async_setup_entry",
return_value=True,
) as mock_setup:
yield mock_setup
@pytest.fixture
def mock_proxmox_client():
"""Mock Proxmox client with dynamic exception injection support."""
with (
patch(
"homeassistant.components.proxmoxve.coordinator.ProxmoxAPI", autospec=True
) as mock_api,
patch(
"homeassistant.components.proxmoxve.config_flow.ProxmoxAPI"
) as mock_api_cf,
):
mock_instance = MagicMock()
mock_api.return_value = mock_instance
mock_api_cf.return_value = mock_instance
mock_instance._mock_api = mock_api
mock_instance._mock_api_cf = mock_api_cf
mock_instance.access.ticket.post.return_value = load_json_object_fixture(
"access_ticket.json", DOMAIN
)
# Default privileges as defined
mock_instance.access.permissions.get.return_value = MERGED_PERMISSIONS
# Make a separate mock for the qemu and lxc endpoints
node_mock = MagicMock()
qemu_list = load_json_array_fixture("nodes/qemu.json", DOMAIN)
lxc_list = load_json_array_fixture("nodes/lxc.json", DOMAIN)
node_mock.qemu.get.return_value = qemu_list
node_mock.lxc.get.return_value = lxc_list
node_mock.storage.get.return_value = load_json_array_fixture(
"nodes/storage.json", DOMAIN
)
node_mock.tasks.get.return_value = load_json_array_fixture(
"nodes/tasks.json", DOMAIN
)
qemu_by_vmid = {vm["vmid"]: vm for vm in qemu_list}
lxc_by_vmid = {vm["vmid"]: vm for vm in lxc_list}
# Cache resource mocks by vmid so callers (e.g. button tests) can
# inspect specific call counts after pressing a button.
qemu_mocks: dict[int, MagicMock] = {}
lxc_mocks: dict[int, MagicMock] = {}
def _qemu_resource(vmid: int) -> MagicMock:
"""Return a cached mock resource for a QEMU VM."""
if vmid not in qemu_mocks:
resource = MagicMock()
vm = qemu_by_vmid[vmid]
resource.status.current.get.return_value = {
"name": vm["name"],
"status": vm["status"],
}
qemu_mocks[vmid] = resource
return qemu_mocks[vmid]
def _lxc_resource(vmid: int) -> MagicMock:
"""Return a cached mock resource for an LXC container."""
if vmid not in lxc_mocks:
resource = MagicMock()
ct = lxc_by_vmid[vmid]
resource.status.current.get.return_value = {
"name": ct["name"],
"status": ct["status"],
}
lxc_mocks[vmid] = resource
return lxc_mocks[vmid]
node_mock.qemu.side_effect = _qemu_resource
node_mock.lxc.side_effect = _lxc_resource
mock_instance._qemu_mocks = qemu_mocks
mock_instance._lxc_mocks = lxc_mocks
nodes_mock = MagicMock()
all_nodes = load_json_array_fixture("nodes/nodes.json", DOMAIN)
# Filter to only pve1 to match MOCK_TEST_CONFIG
nodes_mock.get.return_value = [n for n in all_nodes if n["node"] == "pve1"]
nodes_mock.__getitem__.side_effect = lambda key: node_mock
nodes_mock.return_value = node_mock
mock_instance.nodes = nodes_mock
mock_instance._node_mock = node_mock
mock_instance._nodes_mock = nodes_mock
mock_instance._all_nodes = all_nodes
yield mock_instance
@pytest.fixture
def mock_config_entry() -> MockConfigEntry:
"""Mock a config entry."""
return MockConfigEntry(
domain=DOMAIN,
title="ProxmoxVE test",
data=MOCK_TEST_CONFIG,
entry_id="1234",
)
@pytest.fixture
def mock_config_entry_token_other() -> MockConfigEntry:
"""Mock a config entry with token authentication on different realm."""
return MockConfigEntry(
domain=DOMAIN,
title="ProxmoxVE test",
data=MOCK_TEST_TOKEN_OTHER_CONFIG,
entry_id="1234",
)