"""Run tab Python pieces: line parsing, endings, sheet reading, sample workbook, theme writing.""" import subprocess import sys from pathlib import Path ROOT = Path(__file__).resolve().parents[1] T = ROOT / "skills" / "rpa-run-tab" / "templates" sys.path.insert(0, str(T)) import runner # noqa: E402 def test_parse_lines(): assert runner.parse("[CPSTATE] active 3") == ("cpstate", {"kind": "active", "cp": 3}) assert runner.parse("[UI:ok] Signed in") == ("log", {"msg": "Signed in", "type": "success"}) assert runner.parse("[UI] Opening list") == ("log", {"msg": "Opening list", "type": "info"}) assert runner.parse("ValueError: bad row") == ("log", {"msg": "ValueError: bad row", "type": "error"}) assert runner.parse("debug: clicked button 4") is None assert runner.parse(' File "bot.py", line 3') is None def test_outcomes(): assert runner.outcome({"total": 3, "failed": []})[0] == "done" assert runner.outcome({"total": 3, "failed": [["a", "x"]]}) == ("partial", "Finished: 1 of 3 failed") assert runner.outcome({"total": 1, "failed": [["a", "x"]]})[0] == "error" assert runner.outcome(None)[0] == "error" assert runner.outcome({"total": 3}, stuck_name="Sign in") == ("error", "Stuck at Sign in, run again") def test_sample_and_sheet_reading(tmp_path, monkeypatch): monkeypatch.setattr(sys, "argv", ["x"]) pytest_qt = __import__("importlib").util.find_spec("PyQt6.QtWebEngineWidgets") if pytest_qt is None: import pytest pytest.skip("PyQt6-WebEngine not installed") import run_tab out = tmp_path / "sample.xlsx" run_tab.build_sample(out, {"Accounts": ["Account", "Password"]}) header, rows, more = run_tab.read_sheet_rows(out, "Accounts") assert header == ["Account", "Password"] and rows == [["Example Account", "Example Password"]] and not more def test_palette_writes_theme(tmp_path): page = tmp_path / "run_tab.html" page.write_text((T / "run_tab.html").read_text(encoding="utf-8"), encoding="utf-8") r = subprocess.run([sys.executable, str(T / "palette.py"), "#7a3cff", "--write", str(page)], capture_output=True, text=True) assert r.returncode == 0, r.stdout + r.stderr html = page.read_text(encoding="utf-8") assert "--accent-rgb:122,60,255" in html and html.count("THEME:START") == 1