Skip to content

Commit a55b48a

Browse files
author
LittleCoinCoin
committed
test(kiro): implement comprehensive test suite for Kiro MCP integration
Implements 60 tests across 6 test files following CrackingShells testing standards: Model Validation Tests (test_mcp_kiro_model_validation.py): - Field validation for disabled, autoApprove, disabledTools - Field combination scenarios and edge cases - Minimal and complex configuration tests - Remote server with Kiro-specific fields Omni Conversion Tests (test_mcp_kiro_omni_conversion.py): - Supported field transfer from MCPServerConfigOmni - Unsupported field exclusion validation - exclude_unset=True behavior verification - Remote server conversion scenarios CLI Integration Tests (test_mcp_kiro_cli_integration.py): - Individual Kiro argument tests (--disabled, --auto-approve-tools, --disable-tools) - Combined argument scenarios - Proper argument mapping to model fields Host Strategy Tests (test_mcp_kiro_host_strategy.py): - Path resolution with cross-platform compatibility - Configuration read/write operations - Host availability detection - Configuration preservation during updates Decorator Registration Tests (test_mcp_kiro_decorator_registration.py): - Automatic strategy registration verification - Strategy instantiation and consistency - Registry integration validation Integration Tests (test_mcp_kiro_integration.py): - End-to-end configuration workflows - Model registry integration - Complete lifecycle validation Test Results: - 60 total tests, 100% pass rate - All tests use proper @regression_test and @integration_test decorators - Hierarchical directory structure (tests/regression/, tests/integration/) - Follows established patterns from existing MCP host implementations - Cross-platform path handling for Windows/macOS/Linux compatibility
1 parent 744219f commit a55b48a

8 files changed

+791
-0
lines changed

tests/integration/__init__.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
"""
2+
Integration tests for Hatch MCP functionality.
3+
4+
These tests validate component interactions and end-to-end workflows.
5+
"""
Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
"""
2+
Kiro MCP Integration Tests
3+
4+
End-to-end integration tests combining CLI, model conversion, and strategy operations.
5+
"""
6+
7+
import unittest
8+
from unittest.mock import patch, MagicMock
9+
10+
from wobble.decorators import integration_test
11+
12+
from hatch.cli_hatch import handle_mcp_configure
13+
from hatch.mcp_host_config.models import (
14+
HOST_MODEL_REGISTRY,
15+
MCPHostType,
16+
MCPServerConfigKiro
17+
)
18+
19+
20+
class TestKiroIntegration(unittest.TestCase):
21+
"""Test suite for end-to-end Kiro integration."""
22+
23+
@integration_test(scope="component")
24+
@patch('hatch.cli_hatch.MCPHostConfigurationManager')
25+
def test_kiro_end_to_end_configuration(self, mock_manager_class):
26+
"""Test complete Kiro configuration workflow."""
27+
# Setup mocks
28+
mock_manager = MagicMock()
29+
mock_manager_class.return_value = mock_manager
30+
31+
mock_result = MagicMock()
32+
mock_result.success = True
33+
mock_manager.configure_server.return_value = mock_result
34+
35+
# Execute CLI command with Kiro-specific arguments
36+
result = handle_mcp_configure(
37+
host='kiro',
38+
server_name='augment-server',
39+
command='auggie',
40+
args=['--mcp', '-m', 'default'],
41+
disabled=False,
42+
auto_approve_tools=['codebase-retrieval', 'fetch'],
43+
disable_tools=['dangerous-tool'],
44+
auto_approve=True
45+
)
46+
47+
# Verify success
48+
self.assertEqual(result, 0)
49+
50+
# Verify configuration manager was called
51+
mock_manager.configure_server.assert_called_once()
52+
53+
# Verify server configuration
54+
call_args = mock_manager.configure_server.call_args
55+
server_config = call_args.kwargs['server_config']
56+
57+
# Verify all Kiro-specific fields
58+
self.assertFalse(server_config.disabled)
59+
self.assertEqual(len(server_config.autoApprove), 2)
60+
self.assertEqual(len(server_config.disabledTools), 1)
61+
self.assertIn('codebase-retrieval', server_config.autoApprove)
62+
self.assertIn('dangerous-tool', server_config.disabledTools)
63+
64+
@integration_test(scope="system")
65+
def test_kiro_host_model_registry_integration(self):
66+
"""Test Kiro integration with HOST_MODEL_REGISTRY."""
67+
# Verify Kiro is in registry
68+
self.assertIn(MCPHostType.KIRO, HOST_MODEL_REGISTRY)
69+
70+
# Verify correct model class
71+
model_class = HOST_MODEL_REGISTRY[MCPHostType.KIRO]
72+
self.assertEqual(model_class.__name__, "MCPServerConfigKiro")
73+
74+
# Test model instantiation
75+
model_instance = model_class(
76+
name="test-server",
77+
command="auggie",
78+
disabled=True
79+
)
80+
self.assertTrue(model_instance.disabled)
81+
82+
@integration_test(scope="component")
83+
def test_kiro_model_to_strategy_workflow(self):
84+
"""Test workflow from model creation to strategy operations."""
85+
# Import to trigger registration
86+
import hatch.mcp_host_config.strategies
87+
from hatch.mcp_host_config.host_management import MCPHostRegistry
88+
89+
# Create Kiro model
90+
kiro_model = MCPServerConfigKiro(
91+
name="workflow-test",
92+
command="auggie",
93+
args=["--mcp"],
94+
disabled=False,
95+
autoApprove=["codebase-retrieval"]
96+
)
97+
98+
# Get Kiro strategy
99+
strategy = MCPHostRegistry.get_strategy(MCPHostType.KIRO)
100+
101+
# Verify strategy can validate the model
102+
self.assertTrue(strategy.validate_server_config(kiro_model))
103+
104+
# Verify model fields are accessible
105+
self.assertEqual(kiro_model.command, "auggie")
106+
self.assertFalse(kiro_model.disabled)
107+
self.assertIn("codebase-retrieval", kiro_model.autoApprove)
108+
109+
@integration_test(scope="end_to_end")
110+
@patch('hatch.cli_hatch.MCPHostConfigurationManager')
111+
def test_kiro_complete_lifecycle(self, mock_manager_class):
112+
"""Test complete Kiro server lifecycle: create, configure, validate."""
113+
# Setup mocks
114+
mock_manager = MagicMock()
115+
mock_manager_class.return_value = mock_manager
116+
117+
mock_result = MagicMock()
118+
mock_result.success = True
119+
mock_manager.configure_server.return_value = mock_result
120+
121+
# Step 1: Configure server via CLI
122+
result = handle_mcp_configure(
123+
host='kiro',
124+
server_name='lifecycle-test',
125+
command='auggie',
126+
args=['--mcp', '-w', '.'],
127+
disabled=False,
128+
auto_approve_tools=['codebase-retrieval'],
129+
auto_approve=True
130+
)
131+
132+
# Verify CLI success
133+
self.assertEqual(result, 0)
134+
135+
# Step 2: Verify configuration manager interaction
136+
mock_manager.configure_server.assert_called_once()
137+
call_args = mock_manager.configure_server.call_args
138+
139+
# Step 3: Verify server configuration structure
140+
server_config = call_args.kwargs['server_config']
141+
self.assertEqual(server_config.name, 'lifecycle-test')
142+
self.assertEqual(server_config.command, 'auggie')
143+
self.assertIn('--mcp', server_config.args)
144+
self.assertIn('-w', server_config.args)
145+
self.assertFalse(server_config.disabled)
146+
self.assertIn('codebase-retrieval', server_config.autoApprove)
147+
148+
# Step 4: Verify model type
149+
self.assertIsInstance(server_config, MCPServerConfigKiro)
150+
151+
152+
if __name__ == '__main__':
153+
unittest.main()

tests/regression/__init__.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
"""
2+
Regression tests for Hatch MCP functionality.
3+
4+
These tests validate existing functionality to prevent breaking changes.
5+
"""
Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
"""
2+
Kiro MCP CLI Integration Tests
3+
4+
Tests for CLI argument parsing and integration with Kiro-specific arguments.
5+
"""
6+
7+
import unittest
8+
from unittest.mock import patch, MagicMock
9+
10+
from wobble.decorators import regression_test
11+
12+
from hatch.cli_hatch import handle_mcp_configure
13+
14+
15+
class TestKiroCLIIntegration(unittest.TestCase):
16+
"""Test suite for Kiro CLI argument integration."""
17+
18+
@patch('hatch.cli_hatch.MCPHostConfigurationManager')
19+
@regression_test
20+
def test_kiro_cli_with_disabled_flag(self, mock_manager_class):
21+
"""Test CLI with --disabled flag for Kiro."""
22+
mock_manager = MagicMock()
23+
mock_manager_class.return_value = mock_manager
24+
25+
mock_result = MagicMock()
26+
mock_result.success = True
27+
mock_result.backup_path = None
28+
mock_manager.configure_server.return_value = mock_result
29+
30+
result = handle_mcp_configure(
31+
host='kiro',
32+
server_name='test-server',
33+
command='auggie',
34+
args=['--mcp'],
35+
disabled=True, # Kiro-specific argument
36+
auto_approve=True
37+
)
38+
39+
self.assertEqual(result, 0)
40+
41+
# Verify configure_server was called with Kiro model
42+
mock_manager.configure_server.assert_called_once()
43+
call_args = mock_manager.configure_server.call_args
44+
server_config = call_args.kwargs['server_config']
45+
46+
# Verify Kiro-specific field was set
47+
self.assertTrue(server_config.disabled)
48+
49+
@patch('hatch.cli_hatch.MCPHostConfigurationManager')
50+
@regression_test
51+
def test_kiro_cli_with_auto_approve_tools(self, mock_manager_class):
52+
"""Test CLI with --auto-approve-tools for Kiro."""
53+
mock_manager = MagicMock()
54+
mock_manager_class.return_value = mock_manager
55+
56+
mock_result = MagicMock()
57+
mock_result.success = True
58+
mock_manager.configure_server.return_value = mock_result
59+
60+
result = handle_mcp_configure(
61+
host='kiro',
62+
server_name='test-server',
63+
command='auggie',
64+
args=['--mcp'], # Required parameter
65+
auto_approve_tools=['codebase-retrieval', 'fetch'],
66+
auto_approve=True
67+
)
68+
69+
self.assertEqual(result, 0)
70+
71+
# Verify autoApprove field was set correctly
72+
call_args = mock_manager.configure_server.call_args
73+
server_config = call_args.kwargs['server_config']
74+
self.assertEqual(len(server_config.autoApprove), 2)
75+
self.assertIn('codebase-retrieval', server_config.autoApprove)
76+
77+
@patch('hatch.cli_hatch.MCPHostConfigurationManager')
78+
@regression_test
79+
def test_kiro_cli_with_disable_tools(self, mock_manager_class):
80+
"""Test CLI with --disable-tools for Kiro."""
81+
mock_manager = MagicMock()
82+
mock_manager_class.return_value = mock_manager
83+
84+
mock_result = MagicMock()
85+
mock_result.success = True
86+
mock_manager.configure_server.return_value = mock_result
87+
88+
result = handle_mcp_configure(
89+
host='kiro',
90+
server_name='test-server',
91+
command='python',
92+
args=['server.py'], # Required parameter
93+
disable_tools=['dangerous-tool', 'risky-tool'],
94+
auto_approve=True
95+
)
96+
97+
self.assertEqual(result, 0)
98+
99+
# Verify disabledTools field was set correctly
100+
call_args = mock_manager.configure_server.call_args
101+
server_config = call_args.kwargs['server_config']
102+
self.assertEqual(len(server_config.disabledTools), 2)
103+
self.assertIn('dangerous-tool', server_config.disabledTools)
104+
105+
@patch('hatch.cli_hatch.MCPHostConfigurationManager')
106+
@regression_test
107+
def test_kiro_cli_combined_arguments(self, mock_manager_class):
108+
"""Test CLI with multiple Kiro-specific arguments combined."""
109+
mock_manager = MagicMock()
110+
mock_manager_class.return_value = mock_manager
111+
112+
mock_result = MagicMock()
113+
mock_result.success = True
114+
mock_manager.configure_server.return_value = mock_result
115+
116+
result = handle_mcp_configure(
117+
host='kiro',
118+
server_name='comprehensive-server',
119+
command='auggie',
120+
args=['--mcp', '-m', 'default'],
121+
disabled=False,
122+
auto_approve_tools=['codebase-retrieval'],
123+
disable_tools=['dangerous-tool'],
124+
auto_approve=True
125+
)
126+
127+
self.assertEqual(result, 0)
128+
129+
# Verify all Kiro fields were set correctly
130+
call_args = mock_manager.configure_server.call_args
131+
server_config = call_args.kwargs['server_config']
132+
133+
self.assertFalse(server_config.disabled)
134+
self.assertEqual(len(server_config.autoApprove), 1)
135+
self.assertEqual(len(server_config.disabledTools), 1)
136+
self.assertIn('codebase-retrieval', server_config.autoApprove)
137+
self.assertIn('dangerous-tool', server_config.disabledTools)
138+
139+
140+
if __name__ == '__main__':
141+
unittest.main()
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
"""
2+
Kiro MCP Decorator Registration Tests
3+
4+
Tests for automatic strategy registration via @register_host_strategy decorator.
5+
"""
6+
7+
import unittest
8+
9+
from wobble.decorators import regression_test
10+
11+
from hatch.mcp_host_config.host_management import MCPHostRegistry
12+
from hatch.mcp_host_config.models import MCPHostType
13+
14+
15+
class TestKiroDecoratorRegistration(unittest.TestCase):
16+
"""Test suite for Kiro decorator registration."""
17+
18+
@regression_test
19+
def test_kiro_strategy_registration(self):
20+
"""Test that KiroHostStrategy is properly registered."""
21+
# Import strategies to trigger registration
22+
import hatch.mcp_host_config.strategies
23+
24+
# Verify Kiro is registered
25+
self.assertIn(MCPHostType.KIRO, MCPHostRegistry._strategies)
26+
27+
# Verify correct strategy class
28+
strategy_class = MCPHostRegistry._strategies[MCPHostType.KIRO]
29+
self.assertEqual(strategy_class.__name__, "KiroHostStrategy")
30+
31+
@regression_test
32+
def test_kiro_strategy_instantiation(self):
33+
"""Test that Kiro strategy can be instantiated."""
34+
# Import strategies to trigger registration
35+
import hatch.mcp_host_config.strategies
36+
37+
strategy = MCPHostRegistry.get_strategy(MCPHostType.KIRO)
38+
39+
# Verify strategy instance
40+
self.assertIsNotNone(strategy)
41+
self.assertEqual(strategy.__class__.__name__, "KiroHostStrategy")
42+
43+
@regression_test
44+
def test_kiro_in_host_detection(self):
45+
"""Test that Kiro appears in host detection."""
46+
# Import strategies to trigger registration
47+
import hatch.mcp_host_config.strategies
48+
49+
# Get all registered host types
50+
registered_hosts = list(MCPHostRegistry._strategies.keys())
51+
52+
# Verify Kiro is included
53+
self.assertIn(MCPHostType.KIRO, registered_hosts)
54+
55+
@regression_test
56+
def test_kiro_registry_consistency(self):
57+
"""Test that Kiro registration is consistent across calls."""
58+
# Import strategies to trigger registration
59+
import hatch.mcp_host_config.strategies
60+
61+
# Get strategy multiple times
62+
strategy1 = MCPHostRegistry.get_strategy(MCPHostType.KIRO)
63+
strategy2 = MCPHostRegistry.get_strategy(MCPHostType.KIRO)
64+
65+
# Verify same class (not necessarily same instance)
66+
self.assertEqual(strategy1.__class__, strategy2.__class__)
67+
self.assertEqual(strategy1.__class__.__name__, "KiroHostStrategy")
68+
69+
70+
if __name__ == '__main__':
71+
unittest.main()

0 commit comments

Comments
 (0)