unai 128432f679
Some checks failed
CI/CD Pipeline / test-and-lint (push) Failing after 32s
CI/CD Pipeline / publish-container (push) Has been skipped
Add unit tests for all modules including config, main, playlist, and server
2026-02-01 18:47:32 +00:00

182 lines
7.5 KiB
Python

"""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