s
This commit is contained in:
@@ -33,13 +33,13 @@ class WebDynamicProcessesTests(unittest.TestCase):
|
||||
|
||||
self.assertEqual(resolved, "youtube.py")
|
||||
|
||||
def test_process_monitor_entries_overlay_static_youtube_label_for_lane_one(self) -> None:
|
||||
def test_process_monitor_entries_keep_static_youtube_label_for_lane_one(self) -> None:
|
||||
channels = [{"id": "lane1", "name": "Lane 1", "pm2Name": "youtube"}]
|
||||
with patch("web.get_youtube_pro_channels", return_value=channels):
|
||||
entries = web.process_monitor_entries()
|
||||
|
||||
youtube_row = next(row for row in entries if row["pm2"] == "youtube")
|
||||
self.assertEqual(youtube_row["label"], "YouTube Pro \u00b7 Lane 1")
|
||||
self.assertEqual(youtube_row["label"], "YouTube")
|
||||
|
||||
def test_process_monitor_entries_do_not_duplicate_static_pm2_rows(self) -> None:
|
||||
channels = [
|
||||
@@ -85,10 +85,13 @@ class WebDynamicProcessesTests(unittest.TestCase):
|
||||
web.process_backend._use_pm2 = False
|
||||
try:
|
||||
with patch.object(web.process_backend, "ensure_mode", AsyncMock()):
|
||||
with patch("web.get_process_info", AsyncMock(return_value={"process_status": "not_found", "out_path": None, "err_path": None})):
|
||||
with patch.object(
|
||||
web.process_backend,
|
||||
"process_infos",
|
||||
AsyncMock(return_value={"youtube": {"process_status": "not_found", "out_path": None, "err_path": None}}),
|
||||
):
|
||||
with patch("web.read_log_path_normalized", AsyncMock(return_value="")):
|
||||
with patch.object(web.process_backend, "live_ffmpeg_pids", AsyncMock(return_value=[])):
|
||||
payload = asyncio.run(web.process_monitor())
|
||||
payload = asyncio.run(web.process_monitor())
|
||||
finally:
|
||||
web.process_backend._use_pm2 = original_use_pm2
|
||||
|
||||
@@ -97,6 +100,59 @@ class WebDynamicProcessesTests(unittest.TestCase):
|
||||
self.assertEqual(youtube_row["business_status"], "ready")
|
||||
self.assertFalse(youtube_row["is_pushing"])
|
||||
|
||||
def test_process_monitor_family_filter_returns_youtube_rows_only(self) -> None:
|
||||
original_use_pm2 = web.process_backend._use_pm2
|
||||
web.process_backend._use_pm2 = False
|
||||
try:
|
||||
with patch("web.process_monitor_entries", return_value=(
|
||||
{"pm2": "youtube", "script": "youtube.py", "label": "YouTube"},
|
||||
{"pm2": "youtube2__lane1", "script": "youtube.py", "label": "Lane 1"},
|
||||
{"pm2": "tiktok", "script": "tiktok.py", "label": "TikTok"},
|
||||
)):
|
||||
with patch.object(web.process_backend, "ensure_mode", AsyncMock()):
|
||||
with patch.object(
|
||||
web.process_backend,
|
||||
"process_infos",
|
||||
AsyncMock(
|
||||
return_value={
|
||||
"youtube": {"process_status": "stopped", "out_path": None, "err_path": None},
|
||||
"youtube2__lane1": {"process_status": "online", "out_path": None, "err_path": None},
|
||||
}
|
||||
),
|
||||
):
|
||||
with patch("web.read_log_path_normalized", AsyncMock(return_value="")):
|
||||
with patch.object(web.process_backend, "live_ffmpeg_pids", AsyncMock(return_value=[])):
|
||||
payload = asyncio.run(web.process_monitor(family="youtube", light=True))
|
||||
finally:
|
||||
web.process_backend._use_pm2 = original_use_pm2
|
||||
|
||||
pm2_names = {row["pm2"] for row in payload["entries"]}
|
||||
self.assertIn("youtube", pm2_names)
|
||||
self.assertIn("youtube2__lane1", pm2_names)
|
||||
self.assertTrue(all(name.startswith("youtube") or name.startswith("douyin_youtube") for name in pm2_names))
|
||||
|
||||
def test_restart_kills_old_ffmpeg_before_backend_restart(self) -> None:
|
||||
calls: list[str] = []
|
||||
|
||||
async def fake_kill(process: str, base_dir, **_kwargs) -> None: # noqa: ANN001
|
||||
calls.append(f"kill:{process}")
|
||||
|
||||
async def fake_restart(process: str, script: str) -> str:
|
||||
calls.append(f"restart:{process}:{script}")
|
||||
return "ok"
|
||||
|
||||
with patch("web.is_valid_control_process", return_value=True):
|
||||
with patch("web.script_for_pm2_or_pro", return_value="youtube.py"):
|
||||
with patch("web._validate_youtube_runtime_files", return_value=[]):
|
||||
with patch("web._stop_other_hdmi_sink_processes", new=AsyncMock(return_value=[])):
|
||||
with patch("web.force_kill_ffmpeg", new=AsyncMock(side_effect=fake_kill)):
|
||||
with patch.object(web.process_backend, "restart", new=AsyncMock(side_effect=fake_restart)):
|
||||
response = asyncio.run(web.restart("youtube"))
|
||||
|
||||
payload = json.loads(response.body)
|
||||
self.assertEqual(payload["output"], "ok")
|
||||
self.assertEqual(calls, ["kill:youtube", "restart:youtube:youtube.py"])
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
||||
Reference in New Issue
Block a user