# -*- coding: utf-8 -*- """ Browser launch helper checks (no real browser started). """ import pytest class TestPlaywrightLaunchHelpers: """Persistent context launch parts must match RPA contract.""" def test_persistent_context_includes_maximized(self): from util.playwright_stealth import persistent_context_launch_parts args, _ignore = persistent_context_launch_parts() assert "--start-maximized" in args def test_open_child_runner_cleans_config_after_read(self): import os path = os.path.join( os.path.dirname(__file__), "..", "scripts", "service", "open_child_runner.py", ) path = os.path.abspath(path) with open(path, encoding="utf-8") as f: src = f.read() assert "os.unlink(cfg_path)" in src assert "wait_for_event" in src assert "launch_persistent_context" in src assert "headless=False" in src assert "no_viewport=True" in src class TestCmdOpenDetached: def test_cmd_open_spawns_and_returns(self, clean_db, tmp_path, capsys, monkeypatch): from db.accounts_repo import insert_account from service import browser_service from util.platforms import seed_platforms seed_platforms(clean_db) profile = tmp_path / "prof" aid = insert_account( clean_db, platform_key="sohu", account_label="open-test", login_id="1", login_id_type="phone", tenant_id=None, environment="production", role="default", provider_code="sohu", profile_dir=str(profile), url="https://example.com", extra_json=None, now=1_700_000_000, auth_strategy="password_auto", ) clean_db.commit() monkeypatch.setattr(browser_service, "resolve_chromium_channel", lambda: "chrome") class FakeProc: pid = 4242 spawned = {} def fake_spawn(cmd, *, cwd, env): spawned["cmd"] = cmd spawned["cwd"] = cwd return FakeProc() monkeypatch.setattr(browser_service, "_spawn_browser_child", fake_spawn) browser_service.cmd_open(str(aid)) out = capsys.readouterr().out.strip() import json payload = json.loads(out.splitlines()[-1]) assert payload["success"] is True assert payload["data"]["detached"] is True assert payload["data"]["pid"] == 4242 assert "-m" in spawned["cmd"] assert "service.open_child_runner" in spawned["cmd"] class TestResolveChromiumChannel: """resolve_chromium_channel returns a channel string when browsers exist.""" def test_returns_string_or_none(self): from service.browser_service import resolve_chromium_channel ch = resolve_chromium_channel() assert ch is None or ch in ("chrome", "msedge")