import pytest from log_parser import strip_ts, classify_line # ── strip_ts ──────────────────────────────────────────────────────────────── def test_strip_ts_with_prefix(): line = "[2026-06-22 14:29:49] 0.00.044.403 I srv init: running without SSL" assert strip_ts(line) == "0.00.044.403 I srv init: running without SSL" def test_strip_ts_without_prefix(): line = "0.00.044.403 I srv init: running without SSL" assert strip_ts(line) == "0.00.044.403 I srv init: running without SSL" def test_strip_ts_child_line(): line = "[2026-06-22 14:31:59] [41803] 0.00.041.673 I log_info: verbosity = 3" assert strip_ts(line) == "[41803] 0.00.041.673 I log_info: verbosity = 3" def test_strip_ts_cmd_line(): line = '[2026-06-22 14:31:59] [41803] cmd_child_to_router:state:{"state":"loading"}' assert strip_ts(line) == '[41803] cmd_child_to_router:state:{"state":"loading"}' # ── classify_line ──────────────────────────────────────────────────────────── def test_classify_router_line(): kind, port, content = classify_line("0.00.044.403 I srv init: running without SSL") assert kind == "router" assert port is None assert content == "0.00.044.403 I srv init: running without SSL" def test_classify_child_line(): kind, port, content = classify_line("[41803] 0.00.041.673 I log_info: verbosity = 3") assert kind == "child" assert port == 41803 assert content == "0.00.041.673 I log_info: verbosity = 3" def test_classify_child_cmd_line(): payload = '{"state":"loading","payload":null}' kind, port, content = classify_line(f"[41803] cmd_child_to_router:state:{payload}") assert kind == "child" assert port == 41803 assert content == f"cmd_child_to_router:state:{payload}" def test_classify_router_proxy_line(): line = "2.10.286.889 I srv proxy_reques: proxying request to model Qwen3 on port 41803" kind, port, content = classify_line(line) assert kind == "router" assert port is None # ── ServerState data model ─────────────────────────────────────────────────── from log_parser import ServerState, LoadingInfo, Metrics def test_server_state_defaults(): s = ServerState() assert s.state == "offline" assert s.model is None assert s.loading is None assert s.request_count == 0 def test_server_state_to_dict_offline(): s = ServerState() d = s.to_dict() assert d["state"] == "offline" assert d["model"] is None assert d["loading"] is None assert d["metrics"]["gen_speed"] is None assert "timestamp" in d def test_server_state_to_dict_loading(): s = ServerState( state="loading", model="Qwen3", loading=LoadingInfo(stages=["text_model", "mmproj_model"], current="text_model", progress=0.5), ) d = s.to_dict() assert d["state"] == "loading" assert d["loading"]["current"] == "text_model" assert d["loading"]["progress"] == 0.5 def test_server_state_to_dict_generating(): s = ServerState( state="generating", model="Qwen3", metrics=Metrics(gen_speed=72.2, n_decoded=218), request_count=5, ) d = s.to_dict() assert d["metrics"]["gen_speed"] == 72.2 assert d["metrics"]["n_decoded"] == 218 assert d["request_count"] == 5