"""Tests unitarios para el módulo main.""" from unittest.mock import MagicMock, patch class TestMain: """Tests para la función main.""" # ======================================== # Tests para main - Complejidad Baja # Path 1: Orquestación correcta de componentes # ======================================== def test_main_creates_playlist_manager(self): """Test: main crea una instancia de PlaylistManager.""" with patch("m3u_list_builder.main.settings") as mock_settings: mock_settings.host = "http://test.com" with patch("m3u_list_builder.main.PlaylistManager") as mock_manager_class: mock_manager = MagicMock() mock_manager_class.return_value = mock_manager with patch("m3u_list_builder.main.threading.Thread") as mock_thread: mock_thread_instance = MagicMock() mock_thread.return_value = mock_thread_instance with patch("m3u_list_builder.main.run_server"): from m3u_list_builder.main import main main() mock_manager_class.assert_called_once() def test_main_starts_updater_thread(self): """Test: main inicia el hilo de actualización.""" with patch("m3u_list_builder.main.settings") as mock_settings: mock_settings.host = "http://test.com" with patch("m3u_list_builder.main.PlaylistManager") as mock_manager_class: mock_manager = MagicMock() mock_manager_class.return_value = mock_manager with patch("m3u_list_builder.main.threading.Thread") as mock_thread: mock_thread_instance = MagicMock() mock_thread.return_value = mock_thread_instance with patch("m3u_list_builder.main.run_server"): from m3u_list_builder.main import main main() mock_thread.assert_called_once() mock_thread_instance.start.assert_called_once() def test_main_thread_is_daemon(self): """Test: main crea el hilo como daemon.""" with patch("m3u_list_builder.main.settings") as mock_settings: mock_settings.host = "http://test.com" with patch("m3u_list_builder.main.PlaylistManager") as mock_manager_class: mock_manager = MagicMock() mock_manager_class.return_value = mock_manager with patch("m3u_list_builder.main.threading.Thread") as mock_thread: mock_thread_instance = MagicMock() mock_thread.return_value = mock_thread_instance with patch("m3u_list_builder.main.run_server"): from m3u_list_builder.main import main main() # Verificar que daemon=True call_kwargs = mock_thread.call_args[1] assert call_kwargs["daemon"] is True def test_main_thread_targets_manager_loop(self): """Test: main configura el hilo con target=manager.loop.""" with patch("m3u_list_builder.main.settings") as mock_settings: mock_settings.host = "http://test.com" with patch("m3u_list_builder.main.PlaylistManager") as mock_manager_class: mock_manager = MagicMock() mock_manager_class.return_value = mock_manager with patch("m3u_list_builder.main.threading.Thread") as mock_thread: mock_thread_instance = MagicMock() mock_thread.return_value = mock_thread_instance with patch("m3u_list_builder.main.run_server"): from m3u_list_builder.main import main main() # Verificar que target es manager.loop call_kwargs = mock_thread.call_args[1] assert call_kwargs["target"] == mock_manager.loop def test_main_thread_has_correct_name(self): """Test: main nombra el hilo como UpdaterThread.""" with patch("m3u_list_builder.main.settings") as mock_settings: mock_settings.host = "http://test.com" with patch("m3u_list_builder.main.PlaylistManager") as mock_manager_class: mock_manager = MagicMock() mock_manager_class.return_value = mock_manager with patch("m3u_list_builder.main.threading.Thread") as mock_thread: mock_thread_instance = MagicMock() mock_thread.return_value = mock_thread_instance with patch("m3u_list_builder.main.run_server"): from m3u_list_builder.main import main main() call_kwargs = mock_thread.call_args[1] assert call_kwargs["name"] == "UpdaterThread" def test_main_runs_server(self): """Test: main ejecuta run_server.""" with patch("m3u_list_builder.main.settings") as mock_settings: mock_settings.host = "http://test.com" with patch("m3u_list_builder.main.PlaylistManager"): with patch("m3u_list_builder.main.threading.Thread") as mock_thread: mock_thread_instance = MagicMock() mock_thread.return_value = mock_thread_instance with patch("m3u_list_builder.main.run_server") as mock_run_server: from m3u_list_builder.main import main main() mock_run_server.assert_called_once() def test_main_starts_thread_before_server(self): """Test: main inicia el hilo antes de ejecutar el servidor.""" call_order = [] with patch("m3u_list_builder.main.settings") as mock_settings: mock_settings.host = "http://test.com" with patch("m3u_list_builder.main.PlaylistManager"): with patch("m3u_list_builder.main.threading.Thread") as mock_thread: mock_thread_instance = MagicMock() mock_thread_instance.start.side_effect = lambda: call_order.append( "thread_start" ) mock_thread.return_value = mock_thread_instance with patch("m3u_list_builder.main.run_server") as mock_run_server: mock_run_server.side_effect = lambda: call_order.append( "run_server" ) from m3u_list_builder.main import main main() assert call_order == ["thread_start", "run_server"] def test_main_logs_startup_info(self, caplog): """Test: main registra información de inicio.""" import logging with patch("m3u_list_builder.main.settings") as mock_settings: mock_settings.host = "http://test-host.com" with patch("m3u_list_builder.main.PlaylistManager"): with patch("m3u_list_builder.main.threading.Thread") as mock_thread: mock_thread_instance = MagicMock() mock_thread.return_value = mock_thread_instance with patch("m3u_list_builder.main.run_server"): with caplog.at_level(logging.INFO): from m3u_list_builder.main import main main() # Puede que el log se capture dependiendo del setup