"""Tests for SAM bridge CLI entry point.""" import sys from unittest.mock import AsyncMock, patch, MagicMock import pytest from i2p_sam.__main__ import main class TestSAMCLI: """Tests for the i2p-sam CLI entry point.""" def test_help_flag(self, capsys): """--help should print usage and exit.""" with pytest.raises(SystemExit) as exc_info: with patch.object(sys, "argv", ["i2p-sam", "--help"]): main() assert exc_info.value.code == 0 captured = capsys.readouterr() assert "i2p-sam" in captured.out assert "SAM bridge" in captured.out def test_default_args(self): """Default args should be host=127.0.0.1, port=7656.""" import argparse with patch.object(sys, "argv", ["i2p-sam"]): with patch("i2p_sam.__main__.SAMBridge") as mock_bridge: mock_instance = MagicMock() mock_instance.start = AsyncMock() mock_instance.stop = AsyncMock() mock_instance.port = 7656 mock_bridge.return_value = mock_instance with patch("i2p_sam.__main__.asyncio") as mock_asyncio: # Make asyncio.run just call the coroutine sync mock_asyncio.run = MagicMock(side_effect=SystemExit(0)) with pytest.raises(SystemExit): main() mock_bridge.assert_called_once_with(host="127.0.0.1", port=7656) def test_custom_port(self): """Custom --port should be passed to SAMBridge.""" with patch.object(sys, "argv", ["i2p-sam", "--port", "7700"]): with patch("i2p_sam.__main__.SAMBridge") as mock_bridge: mock_instance = MagicMock() mock_instance.start = AsyncMock() mock_instance.stop = AsyncMock() mock_instance.port = 7700 mock_bridge.return_value = mock_instance with patch("i2p_sam.__main__.asyncio") as mock_asyncio: mock_asyncio.run = MagicMock(side_effect=SystemExit(0)) with pytest.raises(SystemExit): main() mock_bridge.assert_called_once_with(host="127.0.0.1", port=7700) def test_custom_host(self): """Custom --host should be passed to SAMBridge.""" with patch.object(sys, "argv", ["i2p-sam", "--host", "0.0.0.0"]): with patch("i2p_sam.__main__.SAMBridge") as mock_bridge: mock_instance = MagicMock() mock_instance.start = AsyncMock() mock_instance.stop = AsyncMock() mock_instance.port = 7656 mock_bridge.return_value = mock_instance with patch("i2p_sam.__main__.asyncio") as mock_asyncio: mock_asyncio.run = MagicMock(side_effect=SystemExit(0)) with pytest.raises(SystemExit): main() mock_bridge.assert_called_once_with(host="0.0.0.0", port=7656)