Reformat with black

This commit is contained in:
Pim van Pelt
2025-08-03 11:03:38 +02:00
parent 81c7f9c9bd
commit c1d70cd9b6
8 changed files with 239 additions and 209 deletions

View File

@@ -17,16 +17,12 @@ def run_tests(args=None):
"""Run pytest with optional arguments""" """Run pytest with optional arguments"""
# Use python3 explicitly for compatibility # Use python3 explicitly for compatibility
cmd = ["python3", "-m", "pytest"] cmd = ["python3", "-m", "pytest"]
if args: if args:
cmd.extend(args) cmd.extend(args)
else: else:
cmd.extend([ cmd.extend(["tests/", "-v", "--tb=short"])
"tests/",
"-v",
"--tb=short"
])
try: try:
result = subprocess.run(cmd, check=True) result = subprocess.run(cmd, check=True)
return result.returncode return result.returncode
@@ -45,10 +41,10 @@ def main():
args = sys.argv[1:] args = sys.argv[1:]
else: else:
args = None args = None
exit_code = run_tests(args) exit_code = run_tests(args)
sys.exit(exit_code) sys.exit(exit_code)
if __name__ == "__main__": if __name__ == "__main__":
main() main()

View File

@@ -1 +1 @@
# Test package for kumacli # Test package for kumacli

View File

@@ -2,8 +2,9 @@
import sys import sys
import os import os
# Add the src directory to Python path # Add the src directory to Python path
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'src')) sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "src"))
import pytest import pytest
from unittest.mock import Mock, MagicMock from unittest.mock import Mock, MagicMock
@@ -28,7 +29,7 @@ def mock_monitors():
"type": "http", "type": "http",
"url": "https://example.com", "url": "https://example.com",
"active": True, "active": True,
"parent": None "parent": None,
}, },
{ {
"id": 2, "id": 2,
@@ -36,14 +37,14 @@ def mock_monitors():
"type": "http", "type": "http",
"url": "https://test.com", "url": "https://test.com",
"active": False, "active": False,
"parent": None "parent": None,
}, },
{ {
"id": 3, "id": 3,
"name": "Group Monitor", "name": "Group Monitor",
"type": "group", "type": "group",
"active": True, "active": True,
"parent": None "parent": None,
}, },
{ {
"id": 4, "id": 4,
@@ -51,8 +52,8 @@ def mock_monitors():
"type": "http", "type": "http",
"url": "https://child.com", "url": "https://child.com",
"active": False, "active": False,
"parent": 3 "parent": 3,
} },
] ]
@@ -65,13 +66,13 @@ def mock_maintenances():
"title": "Test Maintenance", "title": "Test Maintenance",
"description": "Test maintenance description", "description": "Test maintenance description",
"strategy": "single", "strategy": "single",
"active": True "active": True,
}, },
{ {
"id": 2, "id": 2,
"title": "Inactive Maintenance", "title": "Inactive Maintenance",
"description": "Inactive maintenance description", "description": "Inactive maintenance description",
"strategy": "single", "strategy": "single",
"active": False "active": False,
} },
] ]

View File

@@ -16,31 +16,31 @@ class TestCLIIntegration:
"""Test monitor parser setup""" """Test monitor parser setup"""
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(dest="resource") subparsers = parser.add_subparsers(dest="resource")
monitor_parser = setup_monitor_parser(subparsers) monitor_parser = setup_monitor_parser(subparsers)
# Verify parser is created # Verify parser is created
assert monitor_parser is not None assert monitor_parser is not None
assert hasattr(setup_monitor_parser, '_parser') assert hasattr(setup_monitor_parser, "_parser")
def test_maintenance_parser_setup(self): def test_maintenance_parser_setup(self):
"""Test maintenance parser setup""" """Test maintenance parser setup"""
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(dest="resource") subparsers = parser.add_subparsers(dest="resource")
maintenance_parser = setup_maintenance_parser(subparsers) maintenance_parser = setup_maintenance_parser(subparsers)
# Verify parser is created # Verify parser is created
assert maintenance_parser is not None assert maintenance_parser is not None
assert hasattr(setup_maintenance_parser, '_parser') assert hasattr(setup_maintenance_parser, "_parser")
def test_info_parser_setup(self): def test_info_parser_setup(self):
"""Test info parser setup""" """Test info parser setup"""
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(dest="resource") subparsers = parser.add_subparsers(dest="resource")
info_parser = setup_info_parser(subparsers) info_parser = setup_info_parser(subparsers)
# Verify parser is created # Verify parser is created
assert info_parser is not None assert info_parser is not None
@@ -49,14 +49,14 @@ class TestCLIIntegration:
# Setup # Setup
mock_args = Mock() mock_args = Mock()
mock_args.monitor_action = None mock_args.monitor_action = None
# Setup parser reference # Setup parser reference
mock_parser = Mock() mock_parser = Mock()
setup_monitor_parser._parser = mock_parser setup_monitor_parser._parser = mock_parser
# Execute # Execute
result = handle_monitor_command(mock_args, mock_client) result = handle_monitor_command(mock_args, mock_client)
# Verify # Verify
assert result is False assert result is False
mock_parser.print_help.assert_called_once() mock_parser.print_help.assert_called_once()
@@ -66,14 +66,14 @@ class TestCLIIntegration:
# Setup # Setup
mock_args = Mock() mock_args = Mock()
mock_args.maintenance_action = None mock_args.maintenance_action = None
# Setup parser reference # Setup parser reference
mock_parser = Mock() mock_parser = Mock()
setup_maintenance_parser._parser = mock_parser setup_maintenance_parser._parser = mock_parser
# Execute # Execute
result = handle_maintenance_command(mock_args, mock_client) result = handle_maintenance_command(mock_args, mock_client)
# Verify # Verify
assert result is False assert result is False
mock_parser.print_help.assert_called_once() mock_parser.print_help.assert_called_once()
@@ -85,7 +85,7 @@ class TestCLIIntegration:
mock_args.monitor_action = "pause" mock_args.monitor_action = "pause"
mock_args.monitor = ["test*"] mock_args.monitor = ["test*"]
mock_args.group = ["web-services"] mock_args.group = ["web-services"]
# Mock client methods # Mock client methods
mock_client.find_monitors_by_pattern.return_value = [ mock_client.find_monitors_by_pattern.return_value = [
{"id": 1, "name": "test-monitor"} {"id": 1, "name": "test-monitor"}
@@ -94,10 +94,10 @@ class TestCLIIntegration:
{"id": 2, "name": "web-service-monitor"} {"id": 2, "name": "web-service-monitor"}
] ]
mock_client.api.pause_monitor.return_value = {"msg": "Paused Successfully."} mock_client.api.pause_monitor.return_value = {"msg": "Paused Successfully."}
# Execute # Execute
result = handle_monitor_command(mock_args, mock_client) result = handle_monitor_command(mock_args, mock_client)
# Verify # Verify
assert result is True assert result is True
mock_client.find_monitors_by_pattern.assert_called_once_with(["test*"]) mock_client.find_monitors_by_pattern.assert_called_once_with(["test*"])
@@ -113,13 +113,13 @@ class TestCLIIntegration:
mock_args.monitor = None mock_args.monitor = None
mock_args.group = None mock_args.group = None
mock_args.all = True mock_args.all = True
mock_client.api.get_monitors.return_value = mock_monitors mock_client.api.get_monitors.return_value = mock_monitors
mock_client.api.resume_monitor.return_value = {"msg": "Resumed Successfully."} mock_client.api.resume_monitor.return_value = {"msg": "Resumed Successfully."}
# Execute # Execute
result = handle_monitor_command(mock_args, mock_client) result = handle_monitor_command(mock_args, mock_client)
# Verify # Verify
assert result is True assert result is True
mock_client.api.get_monitors.assert_called_once() mock_client.api.get_monitors.assert_called_once()
@@ -135,9 +135,11 @@ class TestArgumentParsing:
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(dest="resource") subparsers = parser.add_subparsers(dest="resource")
setup_monitor_parser(subparsers) setup_monitor_parser(subparsers)
# Test with monitor patterns # Test with monitor patterns
args = parser.parse_args(["monitor", "list", "--monitor", "web*", "--monitor", "api*"]) args = parser.parse_args(
["monitor", "list", "--monitor", "web*", "--monitor", "api*"]
)
assert args.resource == "monitor" assert args.resource == "monitor"
assert args.monitor_action == "list" assert args.monitor_action == "list"
assert args.monitor == ["web*", "api*"] assert args.monitor == ["web*", "api*"]
@@ -147,7 +149,7 @@ class TestArgumentParsing:
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(dest="resource") subparsers = parser.add_subparsers(dest="resource")
setup_monitor_parser(subparsers) setup_monitor_parser(subparsers)
# Test with group patterns # Test with group patterns
args = parser.parse_args(["monitor", "pause", "--group", "production"]) args = parser.parse_args(["monitor", "pause", "--group", "production"])
assert args.resource == "monitor" assert args.resource == "monitor"
@@ -159,7 +161,7 @@ class TestArgumentParsing:
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(dest="resource") subparsers = parser.add_subparsers(dest="resource")
setup_monitor_parser(subparsers) setup_monitor_parser(subparsers)
# Test with --all flag # Test with --all flag
args = parser.parse_args(["monitor", "resume", "--all"]) args = parser.parse_args(["monitor", "resume", "--all"])
assert args.resource == "monitor" assert args.resource == "monitor"
@@ -171,15 +173,22 @@ class TestArgumentParsing:
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(dest="resource") subparsers = parser.add_subparsers(dest="resource")
setup_maintenance_parser(subparsers) setup_maintenance_parser(subparsers)
# Test maintenance add # Test maintenance add
args = parser.parse_args([ args = parser.parse_args(
"maintenance", "add", [
"--title", "Server Update", "maintenance",
"--description", "Updating server software", "add",
"--duration", "2h", "--title",
"--monitor", "server*" "Server Update",
]) "--description",
"Updating server software",
"--duration",
"2h",
"--monitor",
"server*",
]
)
assert args.resource == "maintenance" assert args.resource == "maintenance"
assert args.maintenance_action == "add" assert args.maintenance_action == "add"
assert args.title == "Server Update" assert args.title == "Server Update"
@@ -192,7 +201,7 @@ class TestArgumentParsing:
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(dest="resource") subparsers = parser.add_subparsers(dest="resource")
setup_maintenance_parser(subparsers) setup_maintenance_parser(subparsers)
# Test delete by ID # Test delete by ID
args = parser.parse_args(["maintenance", "delete", "--id", "123"]) args = parser.parse_args(["maintenance", "delete", "--id", "123"])
assert args.resource == "maintenance" assert args.resource == "maintenance"
@@ -210,7 +219,7 @@ class TestArgumentParsing:
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(dest="resource") subparsers = parser.add_subparsers(dest="resource")
setup_info_parser(subparsers) setup_info_parser(subparsers)
# Test info command # Test info command
args = parser.parse_args(["info"]) args = parser.parse_args(["info"])
assert args.resource == "info" assert args.resource == "info"
@@ -224,31 +233,34 @@ class TestErrorHandling:
mock_args.monitor_action = "pause" mock_args.monitor_action = "pause"
mock_args.monitor = ["nonexistent*"] mock_args.monitor = ["nonexistent*"]
mock_args.group = None mock_args.group = None
# Mock no matches found # Mock no matches found
mock_client.find_monitors_by_pattern.return_value = [] mock_client.find_monitors_by_pattern.return_value = []
# Execute # Execute
result = handle_monitor_command(mock_args, mock_client) result = handle_monitor_command(mock_args, mock_client)
# Verify error handling # Verify error handling
assert result is True # Command completes even with no matches assert result is True # Command completes even with no matches
captured = capsys.readouterr() captured = capsys.readouterr()
assert "Error: No monitors found matching the specified patterns or groups" in captured.out assert (
"Error: No monitors found matching the specified patterns or groups"
in captured.out
)
def test_maintenance_command_resilience(self, mock_client, capsys): def test_maintenance_command_resilience(self, mock_client, capsys):
"""Test maintenance command handles API errors""" """Test maintenance command handles API errors"""
# Setup # Setup
mock_args = Mock() mock_args = Mock()
mock_args.maintenance_action = "list" mock_args.maintenance_action = "list"
# Mock API error # Mock API error
mock_client.api.get_maintenances.side_effect = Exception("Connection timeout") mock_client.api.get_maintenances.side_effect = Exception("Connection timeout")
# Execute # Execute
result = handle_maintenance_command(mock_args, mock_client) result = handle_maintenance_command(mock_args, mock_client)
# Verify error handling # Verify error handling
assert result is True # Command completes even with error assert result is True # Command completes even with error
captured = capsys.readouterr() captured = capsys.readouterr()
assert "Error listing maintenances: Connection timeout" in captured.out assert "Error listing maintenances: Connection timeout" in captured.out

View File

@@ -11,7 +11,7 @@ class TestKumaClient:
def test_parse_duration_minutes(self): def test_parse_duration_minutes(self):
"""Test parsing duration in minutes""" """Test parsing duration in minutes"""
client = KumaClient("http://test.com") client = KumaClient("http://test.com")
assert client.parse_duration("90m") == 5400 # 90 * 60 assert client.parse_duration("90m") == 5400 # 90 * 60
assert client.parse_duration("1m") == 60 assert client.parse_duration("1m") == 60
assert client.parse_duration("120m") == 7200 assert client.parse_duration("120m") == 7200
@@ -19,7 +19,7 @@ class TestKumaClient:
def test_parse_duration_hours(self): def test_parse_duration_hours(self):
"""Test parsing duration in hours""" """Test parsing duration in hours"""
client = KumaClient("http://test.com") client = KumaClient("http://test.com")
assert client.parse_duration("1h") == 3600 # 1 * 3600 assert client.parse_duration("1h") == 3600 # 1 * 3600
assert client.parse_duration("2h") == 7200 assert client.parse_duration("2h") == 7200
assert client.parse_duration("24h") == 86400 assert client.parse_duration("24h") == 86400
@@ -27,7 +27,7 @@ class TestKumaClient:
def test_parse_duration_seconds(self): def test_parse_duration_seconds(self):
"""Test parsing duration in seconds""" """Test parsing duration in seconds"""
client = KumaClient("http://test.com") client = KumaClient("http://test.com")
assert client.parse_duration("3600s") == 3600 assert client.parse_duration("3600s") == 3600
assert client.parse_duration("60s") == 60 assert client.parse_duration("60s") == 60
assert client.parse_duration("1s") == 1 assert client.parse_duration("1s") == 1
@@ -35,42 +35,42 @@ class TestKumaClient:
def test_parse_duration_default(self): def test_parse_duration_default(self):
"""Test parsing duration with default value""" """Test parsing duration with default value"""
client = KumaClient("http://test.com") client = KumaClient("http://test.com")
assert client.parse_duration(None) == 5400 # Default 90 minutes assert client.parse_duration(None) == 5400 # Default 90 minutes
assert client.parse_duration("") == 5400 assert client.parse_duration("") == 5400
def test_parse_duration_invalid(self): def test_parse_duration_invalid(self):
"""Test parsing invalid duration format""" """Test parsing invalid duration format"""
client = KumaClient("http://test.com") client = KumaClient("http://test.com")
with pytest.raises(ValueError, match="Invalid duration format"): with pytest.raises(ValueError, match="Invalid duration format"):
client.parse_duration("invalid") client.parse_duration("invalid")
with pytest.raises(ValueError, match="Invalid duration format"): with pytest.raises(ValueError, match="Invalid duration format"):
client.parse_duration("90x") client.parse_duration("90x")
with pytest.raises(ValueError, match="Invalid duration format"): with pytest.raises(ValueError, match="Invalid duration format"):
client.parse_duration("90") client.parse_duration("90")
def test_parse_start_time_none(self): def test_parse_start_time_none(self):
"""Test parsing start time with None (current time)""" """Test parsing start time with None (current time)"""
client = KumaClient("http://test.com") client = KumaClient("http://test.com")
before = datetime.utcnow() before = datetime.utcnow()
result = client.parse_start_time(None) result = client.parse_start_time(None)
after = datetime.utcnow() after = datetime.utcnow()
assert before <= result <= after assert before <= result <= after
def test_parse_start_time_iso_format(self): def test_parse_start_time_iso_format(self):
"""Test parsing ISO format start time""" """Test parsing ISO format start time"""
client = KumaClient("http://test.com") client = KumaClient("http://test.com")
# Test ISO format with Z # Test ISO format with Z
result = client.parse_start_time("2023-12-25T10:30:00Z") result = client.parse_start_time("2023-12-25T10:30:00Z")
expected = datetime(2023, 12, 25, 10, 30, 0) expected = datetime(2023, 12, 25, 10, 30, 0)
assert result == expected assert result == expected
# Test ISO format with timezone # Test ISO format with timezone
result = client.parse_start_time("2023-12-25T10:30:00+00:00") result = client.parse_start_time("2023-12-25T10:30:00+00:00")
assert result == expected assert result == expected
@@ -78,17 +78,17 @@ class TestKumaClient:
def test_parse_start_time_common_formats(self): def test_parse_start_time_common_formats(self):
"""Test parsing common date/time formats""" """Test parsing common date/time formats"""
client = KumaClient("http://test.com") client = KumaClient("http://test.com")
# Full datetime # Full datetime
result = client.parse_start_time("2023-12-25 10:30:00") result = client.parse_start_time("2023-12-25 10:30:00")
expected = datetime(2023, 12, 25, 10, 30, 0) expected = datetime(2023, 12, 25, 10, 30, 0)
assert result == expected assert result == expected
# Date and hour:minute # Date and hour:minute
result = client.parse_start_time("2023-12-25 10:30") result = client.parse_start_time("2023-12-25 10:30")
expected = datetime(2023, 12, 25, 10, 30, 0) expected = datetime(2023, 12, 25, 10, 30, 0)
assert result == expected assert result == expected
# Date only # Date only
result = client.parse_start_time("2023-12-25") result = client.parse_start_time("2023-12-25")
expected = datetime(2023, 12, 25, 0, 0, 0) expected = datetime(2023, 12, 25, 0, 0, 0)
@@ -97,10 +97,10 @@ class TestKumaClient:
def test_parse_start_time_invalid(self): def test_parse_start_time_invalid(self):
"""Test parsing invalid start time format""" """Test parsing invalid start time format"""
client = KumaClient("http://test.com") client = KumaClient("http://test.com")
with pytest.raises(ValueError, match="Invalid start time format"): with pytest.raises(ValueError, match="Invalid start time format"):
client.parse_start_time("invalid-date") client.parse_start_time("invalid-date")
with pytest.raises(ValueError, match="Invalid start time format"): with pytest.raises(ValueError, match="Invalid start time format"):
client.parse_start_time("2023-13-45") client.parse_start_time("2023-13-45")
@@ -108,20 +108,20 @@ class TestKumaClient:
"""Test finding monitors by pattern successfully""" """Test finding monitors by pattern successfully"""
client = KumaClient("http://test.com") client = KumaClient("http://test.com")
client.api = Mock() client.api = Mock()
mock_monitors = [ mock_monitors = [
{"id": 1, "name": "Web Server"}, {"id": 1, "name": "Web Server"},
{"id": 2, "name": "API Server"}, {"id": 2, "name": "API Server"},
{"id": 3, "name": "Database"}, {"id": 3, "name": "Database"},
{"id": 4, "name": "Web Frontend"} {"id": 4, "name": "Web Frontend"},
] ]
client.api.get_monitors.return_value = mock_monitors client.api.get_monitors.return_value = mock_monitors
# Test exact match # Test exact match
result = client.find_monitors_by_pattern(["Web Server"]) result = client.find_monitors_by_pattern(["Web Server"])
assert len(result) == 1 assert len(result) == 1
assert result[0]["name"] == "Web Server" assert result[0]["name"] == "Web Server"
# Test wildcard pattern # Test wildcard pattern
result = client.find_monitors_by_pattern(["Web*"]) result = client.find_monitors_by_pattern(["Web*"])
assert len(result) == 2 assert len(result) == 2
@@ -133,13 +133,13 @@ class TestKumaClient:
"""Test finding monitors by pattern is case insensitive""" """Test finding monitors by pattern is case insensitive"""
client = KumaClient("http://test.com") client = KumaClient("http://test.com")
client.api = Mock() client.api = Mock()
mock_monitors = [ mock_monitors = [
{"id": 1, "name": "Web Server"}, {"id": 1, "name": "Web Server"},
{"id": 2, "name": "API Server"} {"id": 2, "name": "API Server"},
] ]
client.api.get_monitors.return_value = mock_monitors client.api.get_monitors.return_value = mock_monitors
# Test case insensitive matching # Test case insensitive matching
result = client.find_monitors_by_pattern(["web*"]) result = client.find_monitors_by_pattern(["web*"])
assert len(result) == 1 assert len(result) == 1
@@ -149,12 +149,10 @@ class TestKumaClient:
"""Test finding monitors with no matches""" """Test finding monitors with no matches"""
client = KumaClient("http://test.com") client = KumaClient("http://test.com")
client.api = Mock() client.api = Mock()
mock_monitors = [ mock_monitors = [{"id": 1, "name": "Web Server"}]
{"id": 1, "name": "Web Server"}
]
client.api.get_monitors.return_value = mock_monitors client.api.get_monitors.return_value = mock_monitors
result = client.find_monitors_by_pattern(["Database*"]) result = client.find_monitors_by_pattern(["Database*"])
assert len(result) == 0 assert len(result) == 0
@@ -162,12 +160,10 @@ class TestKumaClient:
"""Test finding monitors removes duplicates""" """Test finding monitors removes duplicates"""
client = KumaClient("http://test.com") client = KumaClient("http://test.com")
client.api = Mock() client.api = Mock()
mock_monitors = [ mock_monitors = [{"id": 1, "name": "Web Server"}]
{"id": 1, "name": "Web Server"}
]
client.api.get_monitors.return_value = mock_monitors client.api.get_monitors.return_value = mock_monitors
# Same monitor should match both patterns # Same monitor should match both patterns
result = client.find_monitors_by_pattern(["Web*", "*Server"]) result = client.find_monitors_by_pattern(["Web*", "*Server"])
assert len(result) == 1 assert len(result) == 1
@@ -177,41 +173,41 @@ class TestKumaClient:
"""Test finding monitors handles API errors""" """Test finding monitors handles API errors"""
client = KumaClient("http://test.com") client = KumaClient("http://test.com")
client.api = Mock() client.api = Mock()
client.api.get_monitors.side_effect = Exception("API Error") client.api.get_monitors.side_effect = Exception("API Error")
result = client.find_monitors_by_pattern(["Web*"]) result = client.find_monitors_by_pattern(["Web*"])
assert len(result) == 0 assert len(result) == 0
captured = capsys.readouterr() captured = capsys.readouterr()
assert "Error finding monitors: API Error" in captured.out assert "Error finding monitors: API Error" in captured.out
@patch('kumacli.client.UptimeKumaApi') @patch("kumacli.client.UptimeKumaApi")
def test_connect_success(self, mock_api_class, capsys): def test_connect_success(self, mock_api_class, capsys):
"""Test successful connection""" """Test successful connection"""
mock_api = Mock() mock_api = Mock()
mock_api_class.return_value = mock_api mock_api_class.return_value = mock_api
mock_api.login.return_value = True mock_api.login.return_value = True
client = KumaClient("http://test.com", "user", "pass") client = KumaClient("http://test.com", "user", "pass")
result = client.connect() result = client.connect()
assert result is True assert result is True
assert client.api is mock_api assert client.api is mock_api
mock_api_class.assert_called_once_with("http://test.com") mock_api_class.assert_called_once_with("http://test.com")
mock_api.login.assert_called_once_with("user", "pass") mock_api.login.assert_called_once_with("user", "pass")
captured = capsys.readouterr() captured = capsys.readouterr()
assert "Connected to http://test.com" in captured.out assert "Connected to http://test.com" in captured.out
@patch('kumacli.client.UptimeKumaApi') @patch("kumacli.client.UptimeKumaApi")
def test_connect_failure(self, mock_api_class, capsys): def test_connect_failure(self, mock_api_class, capsys):
"""Test connection failure""" """Test connection failure"""
mock_api_class.side_effect = Exception("Connection failed") mock_api_class.side_effect = Exception("Connection failed")
client = KumaClient("http://test.com", "user", "pass") client = KumaClient("http://test.com", "user", "pass")
result = client.connect() result = client.connect()
assert result is False assert result is False
captured = capsys.readouterr() captured = capsys.readouterr()
assert "Failed to connect: Connection failed" in captured.out assert "Failed to connect: Connection failed" in captured.out
@@ -220,7 +216,7 @@ class TestKumaClient:
"""Test disconnection""" """Test disconnection"""
client = KumaClient("http://test.com") client = KumaClient("http://test.com")
client.api = Mock() client.api = Mock()
client.disconnect() client.disconnect()
client.api.disconnect.assert_called_once() client.api.disconnect.assert_called_once()

View File

@@ -15,15 +15,15 @@ class TestInfoCommands:
mock_info_data = { mock_info_data = {
"version": "1.23.0", "version": "1.23.0",
"hostname": "kuma-server", "hostname": "kuma-server",
"primaryBaseURL": "https://status.example.com" "primaryBaseURL": "https://status.example.com",
} }
mock_client.api.info.return_value = mock_info_data mock_client.api.info.return_value = mock_info_data
info_commands = InfoCommands(mock_client) info_commands = InfoCommands(mock_client)
# Execute # Execute
info_commands.get_info() info_commands.get_info()
# Verify # Verify
mock_client.api.info.assert_called_once() mock_client.api.info.assert_called_once()
captured = capsys.readouterr() captured = capsys.readouterr()
@@ -36,12 +36,12 @@ class TestInfoCommands:
"""Test info command with empty response""" """Test info command with empty response"""
# Setup # Setup
mock_client.api.info.return_value = None mock_client.api.info.return_value = None
info_commands = InfoCommands(mock_client) info_commands = InfoCommands(mock_client)
# Execute # Execute
info_commands.get_info() info_commands.get_info()
# Verify # Verify
mock_client.api.info.assert_called_once() mock_client.api.info.assert_called_once()
captured = capsys.readouterr() captured = capsys.readouterr()
@@ -51,12 +51,12 @@ class TestInfoCommands:
"""Test info command with API error""" """Test info command with API error"""
# Setup # Setup
mock_client.api.info.side_effect = Exception("Connection failed") mock_client.api.info.side_effect = Exception("Connection failed")
info_commands = InfoCommands(mock_client) info_commands = InfoCommands(mock_client)
# Execute # Execute
info_commands.get_info() info_commands.get_info()
# Verify # Verify
mock_client.api.info.assert_called_once() mock_client.api.info.assert_called_once()
captured = capsys.readouterr() captured = capsys.readouterr()
@@ -70,10 +70,10 @@ class TestInfoCommandHandler:
mock_args = Mock() mock_args = Mock()
mock_info_data = {"version": "1.23.0"} mock_info_data = {"version": "1.23.0"}
mock_client.api.info.return_value = mock_info_data mock_client.api.info.return_value = mock_info_data
# Execute # Execute
result = handle_info_command(mock_args, mock_client) result = handle_info_command(mock_args, mock_client)
# Verify # Verify
assert result is True assert result is True
mock_client.api.info.assert_called_once() mock_client.api.info.assert_called_once()
@@ -83,10 +83,10 @@ class TestInfoCommandHandler:
# Setup # Setup
mock_args = Mock() mock_args = Mock()
mock_client.api.info.side_effect = Exception("API Error") mock_client.api.info.side_effect = Exception("API Error")
# Execute # Execute
result = handle_info_command(mock_args, mock_client) result = handle_info_command(mock_args, mock_client)
# Verify # Verify
assert result is True # Handler always returns True assert result is True # Handler always returns True
mock_client.api.info.assert_called_once() mock_client.api.info.assert_called_once()

View File

@@ -13,12 +13,12 @@ class TestMaintenanceCommands:
"""Test successful maintenance listing""" """Test successful maintenance listing"""
# Setup # Setup
mock_client.api.get_maintenances.return_value = mock_maintenances mock_client.api.get_maintenances.return_value = mock_maintenances
maintenance_commands = MaintenanceCommands(mock_client) maintenance_commands = MaintenanceCommands(mock_client)
# Execute # Execute
maintenance_commands.list_maintenances() maintenance_commands.list_maintenances()
# Verify # Verify
mock_client.api.get_maintenances.assert_called_once() mock_client.api.get_maintenances.assert_called_once()
captured = capsys.readouterr() captured = capsys.readouterr()
@@ -31,12 +31,12 @@ class TestMaintenanceCommands:
"""Test maintenance listing with no maintenances""" """Test maintenance listing with no maintenances"""
# Setup # Setup
mock_client.api.get_maintenances.return_value = [] mock_client.api.get_maintenances.return_value = []
maintenance_commands = MaintenanceCommands(mock_client) maintenance_commands = MaintenanceCommands(mock_client)
# Execute # Execute
maintenance_commands.list_maintenances() maintenance_commands.list_maintenances()
# Verify # Verify
captured = capsys.readouterr() captured = capsys.readouterr()
assert "No maintenances found" in captured.out assert "No maintenances found" in captured.out
@@ -45,12 +45,12 @@ class TestMaintenanceCommands:
"""Test maintenance listing with API error""" """Test maintenance listing with API error"""
# Setup # Setup
mock_client.api.get_maintenances.side_effect = Exception("API Error") mock_client.api.get_maintenances.side_effect = Exception("API Error")
maintenance_commands = MaintenanceCommands(mock_client) maintenance_commands = MaintenanceCommands(mock_client)
# Execute # Execute
maintenance_commands.list_maintenances() maintenance_commands.list_maintenances()
# Verify # Verify
captured = capsys.readouterr() captured = capsys.readouterr()
assert "Error listing maintenances: API Error" in captured.out assert "Error listing maintenances: API Error" in captured.out
@@ -60,30 +60,37 @@ class TestMaintenanceCommands:
# Setup # Setup
mock_maintenance = {"id": 1, "title": "Test Maintenance"} mock_maintenance = {"id": 1, "title": "Test Maintenance"}
mock_client.api.get_maintenance.return_value = mock_maintenance mock_client.api.get_maintenance.return_value = mock_maintenance
mock_client.api.delete_maintenance.return_value = {"msg": "Deleted Successfully"} mock_client.api.delete_maintenance.return_value = {
"msg": "Deleted Successfully"
}
maintenance_commands = MaintenanceCommands(mock_client) maintenance_commands = MaintenanceCommands(mock_client)
# Execute # Execute
maintenance_commands.delete_maintenance(maintenance_id=1) maintenance_commands.delete_maintenance(maintenance_id=1)
# Verify # Verify
mock_client.api.get_maintenance.assert_called_once_with(1) mock_client.api.get_maintenance.assert_called_once_with(1)
mock_client.api.delete_maintenance.assert_called_once_with(1) mock_client.api.delete_maintenance.assert_called_once_with(1)
captured = capsys.readouterr() captured = capsys.readouterr()
assert "Successfully deleted maintenance 'Test Maintenance' (ID: 1)" in captured.out assert (
"Successfully deleted maintenance 'Test Maintenance' (ID: 1)"
in captured.out
)
def test_delete_all_maintenances(self, mock_client, mock_maintenances, capsys): def test_delete_all_maintenances(self, mock_client, mock_maintenances, capsys):
"""Test deleting all maintenances""" """Test deleting all maintenances"""
# Setup # Setup
mock_client.api.get_maintenances.return_value = mock_maintenances mock_client.api.get_maintenances.return_value = mock_maintenances
mock_client.api.delete_maintenance.return_value = {"msg": "Deleted Successfully"} mock_client.api.delete_maintenance.return_value = {
"msg": "Deleted Successfully"
}
maintenance_commands = MaintenanceCommands(mock_client) maintenance_commands = MaintenanceCommands(mock_client)
# Execute # Execute
maintenance_commands.delete_maintenance(delete_all=True) maintenance_commands.delete_maintenance(delete_all=True)
# Verify # Verify
assert mock_client.api.delete_maintenance.call_count == 2 assert mock_client.api.delete_maintenance.call_count == 2
captured = capsys.readouterr() captured = capsys.readouterr()
@@ -93,13 +100,16 @@ class TestMaintenanceCommands:
def test_delete_maintenance_no_params(self, mock_client, capsys): def test_delete_maintenance_no_params(self, mock_client, capsys):
"""Test deleting maintenance without parameters""" """Test deleting maintenance without parameters"""
maintenance_commands = MaintenanceCommands(mock_client) maintenance_commands = MaintenanceCommands(mock_client)
# Execute # Execute
maintenance_commands.delete_maintenance() maintenance_commands.delete_maintenance()
# Verify # Verify
captured = capsys.readouterr() captured = capsys.readouterr()
assert "Error: Either --id or --all flag is required for delete operation" in captured.out assert (
"Error: Either --id or --all flag is required for delete operation"
in captured.out
)
class TestMaintenanceCommandHandler: class TestMaintenanceCommandHandler:
@@ -108,15 +118,15 @@ class TestMaintenanceCommandHandler:
# Setup # Setup
mock_args = Mock() mock_args = Mock()
mock_args.maintenance_action = None mock_args.maintenance_action = None
# Mock the parser setup # Mock the parser setup
with patch('kumacli.cmd.maintenance.setup_maintenance_parser') as mock_setup: with patch("kumacli.cmd.maintenance.setup_maintenance_parser") as mock_setup:
mock_parser = Mock() mock_parser = Mock()
mock_setup._parser = mock_parser mock_setup._parser = mock_parser
# Execute # Execute
result = handle_maintenance_command(mock_args, mock_client) result = handle_maintenance_command(mock_args, mock_client)
# Verify # Verify
assert result is False assert result is False
@@ -126,10 +136,10 @@ class TestMaintenanceCommandHandler:
mock_args = Mock() mock_args = Mock()
mock_args.maintenance_action = "list" mock_args.maintenance_action = "list"
mock_client.api.get_maintenances.return_value = mock_maintenances mock_client.api.get_maintenances.return_value = mock_maintenances
# Execute # Execute
result = handle_maintenance_command(mock_args, mock_client) result = handle_maintenance_command(mock_args, mock_client)
# Verify # Verify
assert result is True assert result is True
mock_client.api.get_maintenances.assert_called_once() mock_client.api.get_maintenances.assert_called_once()
@@ -141,14 +151,16 @@ class TestMaintenanceCommandHandler:
mock_args.maintenance_action = "delete" mock_args.maintenance_action = "delete"
mock_args.id = 1 mock_args.id = 1
mock_args.all = False mock_args.all = False
mock_maintenance = {"id": 1, "title": "Test Maintenance"} mock_maintenance = {"id": 1, "title": "Test Maintenance"}
mock_client.api.get_maintenance.return_value = mock_maintenance mock_client.api.get_maintenance.return_value = mock_maintenance
mock_client.api.delete_maintenance.return_value = {"msg": "Deleted Successfully"} mock_client.api.delete_maintenance.return_value = {
"msg": "Deleted Successfully"
}
# Execute # Execute
result = handle_maintenance_command(mock_args, mock_client) result = handle_maintenance_command(mock_args, mock_client)
# Verify # Verify
assert result is True assert result is True
mock_client.api.delete_maintenance.assert_called_once_with(1) mock_client.api.delete_maintenance.assert_called_once_with(1)
@@ -158,11 +170,14 @@ class TestMaintenanceCommandHandler:
# Setup # Setup
mock_args = Mock() mock_args = Mock()
mock_args.maintenance_action = "unknown" mock_args.maintenance_action = "unknown"
# Execute # Execute
result = handle_maintenance_command(mock_args, mock_client) result = handle_maintenance_command(mock_args, mock_client)
# Verify # Verify
assert result is False assert result is False
captured = capsys.readouterr() captured = capsys.readouterr()
assert "Unknown maintenance action. Use --help for usage information." in captured.out assert (
"Unknown maintenance action. Use --help for usage information."
in captured.out
)

View File

@@ -5,7 +5,11 @@ from unittest.mock import Mock, patch
from io import StringIO from io import StringIO
import sys import sys
from kumacli.cmd.monitor import MonitorCommands, handle_monitor_command, setup_monitor_parser from kumacli.cmd.monitor import (
MonitorCommands,
handle_monitor_command,
setup_monitor_parser,
)
class TestMonitorCommands: class TestMonitorCommands:
@@ -15,21 +19,21 @@ class TestMonitorCommands:
mock_client.api.get_monitors.return_value = mock_monitors mock_client.api.get_monitors.return_value = mock_monitors
mock_client.find_monitors_by_pattern.return_value = [ mock_client.find_monitors_by_pattern.return_value = [
{"id": 1, "name": "Test Monitor 1"}, {"id": 1, "name": "Test Monitor 1"},
{"id": 2, "name": "Test Monitor 2"} {"id": 2, "name": "Test Monitor 2"},
] ]
mock_client.api.pause_monitor.return_value = {"msg": "Paused Successfully."} mock_client.api.pause_monitor.return_value = {"msg": "Paused Successfully."}
monitor_commands = MonitorCommands(mock_client) monitor_commands = MonitorCommands(mock_client)
# Execute # Execute
monitor_commands.pause_monitors(monitor_patterns=["Test*"]) monitor_commands.pause_monitors(monitor_patterns=["Test*"])
# Verify # Verify
mock_client.find_monitors_by_pattern.assert_called_once_with(["Test*"]) mock_client.find_monitors_by_pattern.assert_called_once_with(["Test*"])
assert mock_client.api.pause_monitor.call_count == 2 assert mock_client.api.pause_monitor.call_count == 2
mock_client.api.pause_monitor.assert_any_call(1) mock_client.api.pause_monitor.assert_any_call(1)
mock_client.api.pause_monitor.assert_any_call(2) mock_client.api.pause_monitor.assert_any_call(2)
captured = capsys.readouterr() captured = capsys.readouterr()
assert "Found 2 matching monitors to pause:" in captured.out assert "Found 2 matching monitors to pause:" in captured.out
assert "Paused monitor 'Test Monitor 1' (ID: 1)" in captured.out assert "Paused monitor 'Test Monitor 1' (ID: 1)" in captured.out
@@ -43,16 +47,16 @@ class TestMonitorCommands:
{"id": 4, "name": "Child Monitor"} {"id": 4, "name": "Child Monitor"}
] ]
mock_client.api.pause_monitor.return_value = {"msg": "Paused Successfully."} mock_client.api.pause_monitor.return_value = {"msg": "Paused Successfully."}
monitor_commands = MonitorCommands(mock_client) monitor_commands = MonitorCommands(mock_client)
# Execute # Execute
monitor_commands.pause_monitors(group_patterns=["Group*"]) monitor_commands.pause_monitors(group_patterns=["Group*"])
# Verify # Verify
mock_client.get_monitors_in_groups.assert_called_once_with(["Group*"]) mock_client.get_monitors_in_groups.assert_called_once_with(["Group*"])
mock_client.api.pause_monitor.assert_called_once_with(4) mock_client.api.pause_monitor.assert_called_once_with(4)
captured = capsys.readouterr() captured = capsys.readouterr()
assert "Found 1 matching monitors to pause:" in captured.out assert "Found 1 matching monitors to pause:" in captured.out
assert "Paused monitor 'Child Monitor' (ID: 4)" in captured.out assert "Paused monitor 'Child Monitor' (ID: 4)" in captured.out
@@ -60,10 +64,10 @@ class TestMonitorCommands:
def test_pause_monitors_no_patterns(self, mock_client, capsys): def test_pause_monitors_no_patterns(self, mock_client, capsys):
"""Test pausing monitors without patterns""" """Test pausing monitors without patterns"""
monitor_commands = MonitorCommands(mock_client) monitor_commands = MonitorCommands(mock_client)
# Execute # Execute
monitor_commands.pause_monitors() monitor_commands.pause_monitors()
# Verify # Verify
captured = capsys.readouterr() captured = capsys.readouterr()
assert "Error: Either --monitor or --group flag is required." in captured.out assert "Error: Either --monitor or --group flag is required." in captured.out
@@ -72,15 +76,18 @@ class TestMonitorCommands:
"""Test pausing monitors with no matches""" """Test pausing monitors with no matches"""
# Setup # Setup
mock_client.find_monitors_by_pattern.return_value = [] mock_client.find_monitors_by_pattern.return_value = []
monitor_commands = MonitorCommands(mock_client) monitor_commands = MonitorCommands(mock_client)
# Execute # Execute
monitor_commands.pause_monitors(monitor_patterns=["NonExistent*"]) monitor_commands.pause_monitors(monitor_patterns=["NonExistent*"])
# Verify # Verify
captured = capsys.readouterr() captured = capsys.readouterr()
assert "Error: No monitors found matching the specified patterns or groups" in captured.out assert (
"Error: No monitors found matching the specified patterns or groups"
in captured.out
)
def test_pause_monitors_api_error(self, mock_client, capsys): def test_pause_monitors_api_error(self, mock_client, capsys):
"""Test pausing monitors with API error""" """Test pausing monitors with API error"""
@@ -89,12 +96,12 @@ class TestMonitorCommands:
{"id": 1, "name": "Test Monitor 1"} {"id": 1, "name": "Test Monitor 1"}
] ]
mock_client.api.pause_monitor.side_effect = Exception("API Error") mock_client.api.pause_monitor.side_effect = Exception("API Error")
monitor_commands = MonitorCommands(mock_client) monitor_commands = MonitorCommands(mock_client)
# Execute # Execute
monitor_commands.pause_monitors(monitor_patterns=["Test*"]) monitor_commands.pause_monitors(monitor_patterns=["Test*"])
# Verify # Verify
captured = capsys.readouterr() captured = capsys.readouterr()
assert "Failed to pause monitor 'Test Monitor 1': API Error" in captured.out assert "Failed to pause monitor 'Test Monitor 1': API Error" in captured.out
@@ -107,15 +114,15 @@ class TestMonitorCommands:
{"id": 2, "name": "Test Monitor 2"} {"id": 2, "name": "Test Monitor 2"}
] ]
mock_client.api.resume_monitor.return_value = {"msg": "Resumed Successfully."} mock_client.api.resume_monitor.return_value = {"msg": "Resumed Successfully."}
monitor_commands = MonitorCommands(mock_client) monitor_commands = MonitorCommands(mock_client)
# Execute # Execute
monitor_commands.resume_monitors(monitor_patterns=["Test*"]) monitor_commands.resume_monitors(monitor_patterns=["Test*"])
# Verify # Verify
mock_client.api.resume_monitor.assert_called_once_with(2) mock_client.api.resume_monitor.assert_called_once_with(2)
captured = capsys.readouterr() captured = capsys.readouterr()
assert "Found 1 matching monitors to resume:" in captured.out assert "Found 1 matching monitors to resume:" in captured.out
assert "Resumed monitor 'Test Monitor 2' (ID: 2)" in captured.out assert "Resumed monitor 'Test Monitor 2' (ID: 2)" in captured.out
@@ -125,18 +132,18 @@ class TestMonitorCommands:
# Setup # Setup
mock_client.api.get_monitors.return_value = mock_monitors mock_client.api.get_monitors.return_value = mock_monitors
mock_client.api.resume_monitor.return_value = {"msg": "Resumed Successfully."} mock_client.api.resume_monitor.return_value = {"msg": "Resumed Successfully."}
monitor_commands = MonitorCommands(mock_client) monitor_commands = MonitorCommands(mock_client)
# Execute # Execute
monitor_commands.resume_monitors(resume_all=True) monitor_commands.resume_monitors(resume_all=True)
# Verify # Verify
# Should resume monitors with active=False (monitors 2 and 4) # Should resume monitors with active=False (monitors 2 and 4)
assert mock_client.api.resume_monitor.call_count == 2 assert mock_client.api.resume_monitor.call_count == 2
mock_client.api.resume_monitor.assert_any_call(2) mock_client.api.resume_monitor.assert_any_call(2)
mock_client.api.resume_monitor.assert_any_call(4) mock_client.api.resume_monitor.assert_any_call(4)
captured = capsys.readouterr() captured = capsys.readouterr()
assert "Found 2 paused monitors to resume:" in captured.out assert "Found 2 paused monitors to resume:" in captured.out
assert "Successfully resumed 2 out of 2 monitors" in captured.out assert "Successfully resumed 2 out of 2 monitors" in captured.out
@@ -144,16 +151,14 @@ class TestMonitorCommands:
def test_resume_monitors_all_no_paused(self, mock_client, capsys): def test_resume_monitors_all_no_paused(self, mock_client, capsys):
"""Test resuming all paused monitors when none are paused""" """Test resuming all paused monitors when none are paused"""
# Setup # Setup
active_monitors = [ active_monitors = [{"id": 1, "name": "Active Monitor", "active": True}]
{"id": 1, "name": "Active Monitor", "active": True}
]
mock_client.api.get_monitors.return_value = active_monitors mock_client.api.get_monitors.return_value = active_monitors
monitor_commands = MonitorCommands(mock_client) monitor_commands = MonitorCommands(mock_client)
# Execute # Execute
monitor_commands.resume_monitors(resume_all=True) monitor_commands.resume_monitors(resume_all=True)
# Verify # Verify
captured = capsys.readouterr() captured = capsys.readouterr()
assert "No paused monitors found to resume" in captured.out assert "No paused monitors found to resume" in captured.out
@@ -161,13 +166,16 @@ class TestMonitorCommands:
def test_resume_monitors_no_args(self, mock_client, capsys): def test_resume_monitors_no_args(self, mock_client, capsys):
"""Test resuming monitors without any arguments""" """Test resuming monitors without any arguments"""
monitor_commands = MonitorCommands(mock_client) monitor_commands = MonitorCommands(mock_client)
# Execute # Execute
monitor_commands.resume_monitors() monitor_commands.resume_monitors()
# Verify # Verify
captured = capsys.readouterr() captured = capsys.readouterr()
assert "Error: Either --monitor, --group, or --all flag is required." in captured.out assert (
"Error: Either --monitor, --group, or --all flag is required."
in captured.out
)
class TestMonitorCommandHandler: class TestMonitorCommandHandler:
@@ -176,15 +184,15 @@ class TestMonitorCommandHandler:
# Setup # Setup
mock_args = Mock() mock_args = Mock()
mock_args.monitor_action = None mock_args.monitor_action = None
# Mock the parser setup to avoid importing issues # Mock the parser setup to avoid importing issues
with patch('kumacli.cmd.monitor.setup_monitor_parser') as mock_setup: with patch("kumacli.cmd.monitor.setup_monitor_parser") as mock_setup:
mock_parser = Mock() mock_parser = Mock()
mock_setup._parser = mock_parser mock_setup._parser = mock_parser
# Execute # Execute
result = handle_monitor_command(mock_args, mock_client) result = handle_monitor_command(mock_args, mock_client)
# Verify # Verify
assert result is False assert result is False
@@ -195,15 +203,15 @@ class TestMonitorCommandHandler:
mock_args.monitor_action = "pause" mock_args.monitor_action = "pause"
mock_args.monitor = ["test*"] mock_args.monitor = ["test*"]
mock_args.group = None mock_args.group = None
mock_client.find_monitors_by_pattern.return_value = [ mock_client.find_monitors_by_pattern.return_value = [
{"id": 1, "name": "test monitor"} {"id": 1, "name": "test monitor"}
] ]
mock_client.api.pause_monitor.return_value = {"msg": "Paused Successfully."} mock_client.api.pause_monitor.return_value = {"msg": "Paused Successfully."}
# Execute # Execute
result = handle_monitor_command(mock_args, mock_client) result = handle_monitor_command(mock_args, mock_client)
# Verify # Verify
assert result is True assert result is True
mock_client.api.pause_monitor.assert_called_once_with(1) mock_client.api.pause_monitor.assert_called_once_with(1)
@@ -216,15 +224,15 @@ class TestMonitorCommandHandler:
mock_args.monitor = ["test*"] mock_args.monitor = ["test*"]
mock_args.group = None mock_args.group = None
mock_args.all = False mock_args.all = False
mock_client.find_monitors_by_pattern.return_value = [ mock_client.find_monitors_by_pattern.return_value = [
{"id": 1, "name": "test monitor"} {"id": 1, "name": "test monitor"}
] ]
mock_client.api.resume_monitor.return_value = {"msg": "Resumed Successfully."} mock_client.api.resume_monitor.return_value = {"msg": "Resumed Successfully."}
# Execute # Execute
result = handle_monitor_command(mock_args, mock_client) result = handle_monitor_command(mock_args, mock_client)
# Verify # Verify
assert result is True assert result is True
mock_client.api.resume_monitor.assert_called_once_with(1) mock_client.api.resume_monitor.assert_called_once_with(1)
@@ -237,13 +245,13 @@ class TestMonitorCommandHandler:
mock_args.monitor = None mock_args.monitor = None
mock_args.group = None mock_args.group = None
mock_args.all = True mock_args.all = True
mock_client.api.get_monitors.return_value = mock_monitors mock_client.api.get_monitors.return_value = mock_monitors
mock_client.api.resume_monitor.return_value = {"msg": "Resumed Successfully."} mock_client.api.resume_monitor.return_value = {"msg": "Resumed Successfully."}
# Execute # Execute
result = handle_monitor_command(mock_args, mock_client) result = handle_monitor_command(mock_args, mock_client)
# Verify # Verify
assert result is True assert result is True
# Should resume paused monitors (monitors 2 and 4) # Should resume paused monitors (monitors 2 and 4)
@@ -254,11 +262,13 @@ class TestMonitorCommandHandler:
# Setup # Setup
mock_args = Mock() mock_args = Mock()
mock_args.monitor_action = "unknown" mock_args.monitor_action = "unknown"
# Execute # Execute
result = handle_monitor_command(mock_args, mock_client) result = handle_monitor_command(mock_args, mock_client)
# Verify # Verify
assert result is False assert result is False
captured = capsys.readouterr() captured = capsys.readouterr()
assert "Unknown monitor action. Use --help for usage information." in captured.out assert (
"Unknown monitor action. Use --help for usage information." in captured.out
)