"""Tests for the debug CLI.""" from unittest.mock import MagicMock, patch from click.testing import CliRunner from main import cli class TestDebugGroup: """Tests for the debug command group.""" @patch("main.engine", new_callable=MagicMock) def test_debug_help_shows_subcommands(self, mock_engine: MagicMock) -> None: runner = CliRunner() result = runner.invoke(cli, ["debug", "--help"]) assert result.exit_code == 0 assert "districts" in result.output @patch("main.engine", new_callable=MagicMock) def test_debug_requires_user_email(self, mock_engine: MagicMock) -> None: runner = CliRunner() result = runner.invoke(cli, ["debug", "districts", "list"]) assert result.exit_code != 0 assert "user-email" in result.output.lower() or "Missing" in result.output class TestDistrictsCommand: """Tests for debug districts subcommand.""" @patch("cli.districts.district_service.get_all_districts") @patch("main.engine", new_callable=MagicMock) def test_list_districts_direct( self, mock_engine: MagicMock, mock_get: MagicMock ) -> None: mock_get.return_value = {"London": "R1", "Camden": "R2"} runner = CliRunner() result = runner.invoke( cli, ["debug", "-u", "test@example.com", "districts", "list"] ) assert result.exit_code == 0 assert "London" in result.output @patch("cli.districts.district_service.get_all_districts") @patch("main.engine", new_callable=MagicMock) def test_list_districts_json( self, mock_engine: MagicMock, mock_get: MagicMock ) -> None: mock_get.return_value = {"London": "R1"} runner = CliRunner() result = runner.invoke( cli, ["debug", "-u", "test@example.com", "--json", "districts", "list"] ) assert result.exit_code == 0 import json data = json.loads(result.output) assert "London" in data class TestDecisionsCommand: """Tests for debug decisions subcommand.""" @patch("cli.decisions.decision_service.set_decision") @patch("cli.decisions.resolve_user_id", return_value=1) @patch("main.engine", new_callable=MagicMock) def test_set_decision_direct( self, mock_engine: MagicMock, mock_resolve: MagicMock, mock_set: MagicMock ) -> None: from datetime import datetime mock_set.return_value = MagicMock( listing_id=123, listing_type="RENT", decision="liked", created_at=datetime(2025, 1, 1), updated_at=datetime(2025, 1, 1), ) runner = CliRunner() result = runner.invoke( cli, ["debug", "-u", "test@example.com", "decisions", "set", "123", "liked", "-t", "RENT"] ) assert result.exit_code == 0 mock_set.assert_called_once() @patch("cli.decisions.decision_service.get_user_decisions") @patch("cli.decisions.resolve_user_id", return_value=1) @patch("main.engine", new_callable=MagicMock) def test_list_decisions_direct( self, mock_engine: MagicMock, mock_resolve: MagicMock, mock_list: MagicMock ) -> None: mock_list.return_value = [] runner = CliRunner() result = runner.invoke( cli, ["debug", "-u", "test@example.com", "decisions", "list"] ) assert result.exit_code == 0 class TestPOIsCommand: """Tests for debug pois subcommand.""" @patch("cli.pois.poi_service.get_user_pois") @patch("cli.pois.resolve_user_id", return_value=1) @patch("main.engine", new_callable=MagicMock) def test_list_pois_empty( self, mock_engine: MagicMock, mock_resolve: MagicMock, mock_pois: MagicMock ) -> None: mock_pois.return_value = [] runner = CliRunner() result = runner.invoke( cli, ["debug", "-u", "test@example.com", "pois", "list"] ) assert result.exit_code == 0 assert "No results" in result.output