Files
kumacli/tests/test_monitor.py
Pim van Pelt e2e65add2e Add tests
2025-08-02 20:03:32 +02:00

264 lines
9.8 KiB
Python

#!/usr/bin/env python3
import pytest
from unittest.mock import Mock, patch
from io import StringIO
import sys
from kumacli.cmd.monitor import MonitorCommands, handle_monitor_command, setup_monitor_parser
class TestMonitorCommands:
def test_pause_monitors_by_pattern(self, mock_client, mock_monitors, capsys):
"""Test pausing monitors by pattern"""
# Setup
mock_client.api.get_monitors.return_value = mock_monitors
mock_client.find_monitors_by_pattern.return_value = [
{"id": 1, "name": "Test Monitor 1"},
{"id": 2, "name": "Test Monitor 2"}
]
mock_client.api.pause_monitor.return_value = {"msg": "Paused Successfully."}
monitor_commands = MonitorCommands(mock_client)
# Execute
monitor_commands.pause_monitors(monitor_patterns=["Test*"])
# Verify
mock_client.find_monitors_by_pattern.assert_called_once_with(["Test*"])
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(2)
captured = capsys.readouterr()
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 2' (ID: 2)" in captured.out
assert "Successfully paused 2 out of 2 monitors" in captured.out
def test_pause_monitors_by_group(self, mock_client, mock_monitors, capsys):
"""Test pausing monitors by group"""
# Setup
mock_client.get_monitors_in_groups.return_value = [
{"id": 4, "name": "Child Monitor"}
]
mock_client.api.pause_monitor.return_value = {"msg": "Paused Successfully."}
monitor_commands = MonitorCommands(mock_client)
# Execute
monitor_commands.pause_monitors(group_patterns=["Group*"])
# Verify
mock_client.get_monitors_in_groups.assert_called_once_with(["Group*"])
mock_client.api.pause_monitor.assert_called_once_with(4)
captured = capsys.readouterr()
assert "Found 1 matching monitors to pause:" in captured.out
assert "Paused monitor 'Child Monitor' (ID: 4)" in captured.out
def test_pause_monitors_no_patterns(self, mock_client, capsys):
"""Test pausing monitors without patterns"""
monitor_commands = MonitorCommands(mock_client)
# Execute
monitor_commands.pause_monitors()
# Verify
captured = capsys.readouterr()
assert "Error: Either --monitor or --group flag is required." in captured.out
def test_pause_monitors_no_matches(self, mock_client, capsys):
"""Test pausing monitors with no matches"""
# Setup
mock_client.find_monitors_by_pattern.return_value = []
monitor_commands = MonitorCommands(mock_client)
# Execute
monitor_commands.pause_monitors(monitor_patterns=["NonExistent*"])
# Verify
captured = capsys.readouterr()
assert "Error: No monitors found matching the specified patterns or groups" in captured.out
def test_pause_monitors_api_error(self, mock_client, capsys):
"""Test pausing monitors with API error"""
# Setup
mock_client.find_monitors_by_pattern.return_value = [
{"id": 1, "name": "Test Monitor 1"}
]
mock_client.api.pause_monitor.side_effect = Exception("API Error")
monitor_commands = MonitorCommands(mock_client)
# Execute
monitor_commands.pause_monitors(monitor_patterns=["Test*"])
# Verify
captured = capsys.readouterr()
assert "Failed to pause monitor 'Test Monitor 1': API Error" in captured.out
assert "Successfully paused 0 out of 1 monitors" in captured.out
def test_resume_monitors_by_pattern(self, mock_client, mock_monitors, capsys):
"""Test resuming monitors by pattern"""
# Setup
mock_client.find_monitors_by_pattern.return_value = [
{"id": 2, "name": "Test Monitor 2"}
]
mock_client.api.resume_monitor.return_value = {"msg": "Resumed Successfully."}
monitor_commands = MonitorCommands(mock_client)
# Execute
monitor_commands.resume_monitors(monitor_patterns=["Test*"])
# Verify
mock_client.api.resume_monitor.assert_called_once_with(2)
captured = capsys.readouterr()
assert "Found 1 matching monitors to resume:" in captured.out
assert "Resumed monitor 'Test Monitor 2' (ID: 2)" in captured.out
def test_resume_monitors_all_paused(self, mock_client, mock_monitors, capsys):
"""Test resuming all paused monitors"""
# Setup
mock_client.api.get_monitors.return_value = mock_monitors
mock_client.api.resume_monitor.return_value = {"msg": "Resumed Successfully."}
monitor_commands = MonitorCommands(mock_client)
# Execute
monitor_commands.resume_monitors(resume_all=True)
# Verify
# Should resume monitors with active=False (monitors 2 and 4)
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(4)
captured = capsys.readouterr()
assert "Found 2 paused monitors to resume:" in captured.out
assert "Successfully resumed 2 out of 2 monitors" in captured.out
def test_resume_monitors_all_no_paused(self, mock_client, capsys):
"""Test resuming all paused monitors when none are paused"""
# Setup
active_monitors = [
{"id": 1, "name": "Active Monitor", "active": True}
]
mock_client.api.get_monitors.return_value = active_monitors
monitor_commands = MonitorCommands(mock_client)
# Execute
monitor_commands.resume_monitors(resume_all=True)
# Verify
captured = capsys.readouterr()
assert "No paused monitors found to resume" in captured.out
def test_resume_monitors_no_args(self, mock_client, capsys):
"""Test resuming monitors without any arguments"""
monitor_commands = MonitorCommands(mock_client)
# Execute
monitor_commands.resume_monitors()
# Verify
captured = capsys.readouterr()
assert "Error: Either --monitor, --group, or --all flag is required." in captured.out
class TestMonitorCommandHandler:
def test_handle_monitor_command_no_action(self, mock_client, capsys):
"""Test monitor command handler with no action"""
# Setup
mock_args = Mock()
mock_args.monitor_action = None
# Mock the parser setup to avoid importing issues
with patch('kumacli.cmd.monitor.setup_monitor_parser') as mock_setup:
mock_parser = Mock()
mock_setup._parser = mock_parser
# Execute
result = handle_monitor_command(mock_args, mock_client)
# Verify
assert result is False
def test_handle_monitor_command_pause(self, mock_client):
"""Test monitor command handler for pause action"""
# Setup
mock_args = Mock()
mock_args.monitor_action = "pause"
mock_args.monitor = ["test*"]
mock_args.group = None
mock_client.find_monitors_by_pattern.return_value = [
{"id": 1, "name": "test monitor"}
]
mock_client.api.pause_monitor.return_value = {"msg": "Paused Successfully."}
# Execute
result = handle_monitor_command(mock_args, mock_client)
# Verify
assert result is True
mock_client.api.pause_monitor.assert_called_once_with(1)
def test_handle_monitor_command_resume(self, mock_client):
"""Test monitor command handler for resume action"""
# Setup
mock_args = Mock()
mock_args.monitor_action = "resume"
mock_args.monitor = ["test*"]
mock_args.group = None
mock_args.all = False
mock_client.find_monitors_by_pattern.return_value = [
{"id": 1, "name": "test monitor"}
]
mock_client.api.resume_monitor.return_value = {"msg": "Resumed Successfully."}
# Execute
result = handle_monitor_command(mock_args, mock_client)
# Verify
assert result is True
mock_client.api.resume_monitor.assert_called_once_with(1)
def test_handle_monitor_command_resume_all(self, mock_client, mock_monitors):
"""Test monitor command handler for resume all action"""
# Setup
mock_args = Mock()
mock_args.monitor_action = "resume"
mock_args.monitor = None
mock_args.group = None
mock_args.all = True
mock_client.api.get_monitors.return_value = mock_monitors
mock_client.api.resume_monitor.return_value = {"msg": "Resumed Successfully."}
# Execute
result = handle_monitor_command(mock_args, mock_client)
# Verify
assert result is True
# Should resume paused monitors (monitors 2 and 4)
assert mock_client.api.resume_monitor.call_count == 2
def test_handle_monitor_command_unknown_action(self, mock_client, capsys):
"""Test monitor command handler with unknown action"""
# Setup
mock_args = Mock()
mock_args.monitor_action = "unknown"
# Execute
result = handle_monitor_command(mock_args, mock_client)
# Verify
assert result is False
captured = capsys.readouterr()
assert "Unknown monitor action. Use --help for usage information." in captured.out