forked from HomeLab/unraid-mcp
fix(tools): remove 10 dead actions referencing mutations absent from live API
settings.py: drop update_temperature, update_time, update_api, connect_sign_in, connect_sign_out, setup_remote_access, enable_dynamic_remote_access, update_ssh — all 8 reference mutations confirmed absent from Unraid API v4.29.2. Keep update + configure_ups. info.py: drop update_server (updateServerIdentity not in Mutation type) and update_ssh (duplicate of removed settings action). MUTATIONS is now empty; DESTRUCTIVE_ACTIONS is now an empty set. notifications.py: drop create_unique (notifyIfUnique not in Mutation type). Tests: remove corresponding test classes, add parametrized regression tests asserting removed actions are not in each tool's Literal type, update KNOWN_DESTRUCTIVE and _DESTRUCTIVE_TEST_CASES in safety audit, update schema coverage assertions. 858 tests passing, 0 failures.
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
"""Tests for unraid_info tool."""
|
||||
|
||||
from collections.abc import Generator
|
||||
from typing import get_args
|
||||
from unittest.mock import AsyncMock, patch
|
||||
|
||||
import pytest
|
||||
@@ -8,6 +9,7 @@ from conftest import make_tool_fn
|
||||
|
||||
from unraid_mcp.core.exceptions import ToolError
|
||||
from unraid_mcp.tools.info import (
|
||||
INFO_ACTIONS,
|
||||
_analyze_disk_health,
|
||||
_process_array_status,
|
||||
_process_system_info,
|
||||
@@ -303,62 +305,13 @@ class TestInfoNetworkErrors:
|
||||
await tool_fn(action="network")
|
||||
|
||||
|
||||
class TestInfoMutations:
|
||||
async def test_update_server_requires_name(self, _mock_graphql: AsyncMock) -> None:
|
||||
tool_fn = _make_tool()
|
||||
with pytest.raises(ToolError, match="server_name"):
|
||||
await tool_fn(action="update_server")
|
||||
# ---------------------------------------------------------------------------
|
||||
# Regression: removed actions must not appear in INFO_ACTIONS
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
async def test_update_server_success(self, _mock_graphql: AsyncMock) -> None:
|
||||
_mock_graphql.return_value = {
|
||||
"updateServerIdentity": {
|
||||
"id": "s:1",
|
||||
"name": "tootie",
|
||||
"comment": None,
|
||||
"status": "online",
|
||||
}
|
||||
}
|
||||
tool_fn = _make_tool()
|
||||
result = await tool_fn(action="update_server", server_name="tootie")
|
||||
assert result["success"] is True
|
||||
assert result["data"]["name"] == "tootie"
|
||||
|
||||
async def test_update_server_passes_optional_fields(self, _mock_graphql: AsyncMock) -> None:
|
||||
_mock_graphql.return_value = {
|
||||
"updateServerIdentity": {"id": "s:1", "name": "x", "comment": None, "status": "online"}
|
||||
}
|
||||
tool_fn = _make_tool()
|
||||
await tool_fn(action="update_server", server_name="x", sys_model="custom")
|
||||
assert _mock_graphql.call_args[0][1]["sysModel"] == "custom"
|
||||
|
||||
async def test_update_ssh_requires_confirm(self, _mock_graphql: AsyncMock) -> None:
|
||||
tool_fn = _make_tool()
|
||||
with pytest.raises(ToolError, match="confirm=True"):
|
||||
await tool_fn(action="update_ssh", ssh_enabled=True, ssh_port=22)
|
||||
|
||||
async def test_update_ssh_requires_enabled(self, _mock_graphql: AsyncMock) -> None:
|
||||
tool_fn = _make_tool()
|
||||
with pytest.raises(ToolError, match="ssh_enabled"):
|
||||
await tool_fn(action="update_ssh", confirm=True, ssh_port=22)
|
||||
|
||||
async def test_update_ssh_requires_port(self, _mock_graphql: AsyncMock) -> None:
|
||||
tool_fn = _make_tool()
|
||||
with pytest.raises(ToolError, match="ssh_port"):
|
||||
await tool_fn(action="update_ssh", confirm=True, ssh_enabled=True)
|
||||
|
||||
async def test_update_ssh_success(self, _mock_graphql: AsyncMock) -> None:
|
||||
_mock_graphql.return_value = {
|
||||
"updateSshSettings": {"id": "s:1", "useSsh": True, "portssh": 22}
|
||||
}
|
||||
tool_fn = _make_tool()
|
||||
result = await tool_fn(action="update_ssh", confirm=True, ssh_enabled=True, ssh_port=22)
|
||||
assert result["success"] is True
|
||||
assert result["data"]["useSsh"] is True
|
||||
|
||||
async def test_update_ssh_passes_correct_input(self, _mock_graphql: AsyncMock) -> None:
|
||||
_mock_graphql.return_value = {
|
||||
"updateSshSettings": {"id": "s:1", "useSsh": False, "portssh": 2222}
|
||||
}
|
||||
tool_fn = _make_tool()
|
||||
await tool_fn(action="update_ssh", confirm=True, ssh_enabled=False, ssh_port=2222)
|
||||
assert _mock_graphql.call_args[0][1] == {"input": {"enabled": False, "port": 2222}}
|
||||
@pytest.mark.parametrize("action", ["update_server", "update_ssh"])
|
||||
def test_removed_info_actions_are_gone(action: str) -> None:
|
||||
assert action not in get_args(INFO_ACTIONS), (
|
||||
f"{action} references a non-existent mutation and must not be in INFO_ACTIONS"
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user