from types import SimpleNamespace from codex_dashboard.processes import format_uptime, scan_processes def test_scan_processes_filters_codex_lines(): output = "\n".join( [ "smlflg 101 0.0 0.1 1000 2048 ? S 10:00 0:00 codex", "smlflg 102 0.0 0.1 1000 2048 ? S 10:00 0:00 bash", "smlflg 103 1.5 0.2 1000 4096 pts/1 S 10:00 0:00 node mcp-server", ] ) processes = scan_processes(ps_output=output) assert [process.pid for process in processes] == [103, 101] assert processes[0].name in {"MCP Server", "node/mcp-server"} def test_scan_processes_reads_proc_metadata_for_live_ps(monkeypatch): import codex_dashboard.processes as processes_module output = "smlflg 4242 0.0 0.1 1000 2048 ? S 10:00 0:00 codex" monkeypatch.setattr( processes_module.subprocess, "run", lambda *_, **__: SimpleNamespace(returncode=0, stdout=output), ) monkeypatch.setattr(processes_module.os, "getpid", lambda: 9999) monkeypatch.setattr(processes_module, "_read_cwd", lambda pid: f"/work/{pid}") monkeypatch.setattr(processes_module, "_read_uptime_seconds", lambda pid, now=None: 25 * 3600) result = scan_processes() assert len(result) == 1 assert result[0].pid == 4242 assert result[0].cwd == "/work/4242" assert result[0].uptime_seconds == 25 * 3600 assert result[0].stale is True def test_format_uptime(): assert format_uptime(30) == "<1m" assert format_uptime(600) == "10m" assert format_uptime(7200) == "2h" assert format_uptime(172800) == "2d"