from __future__ import annotations import pytest from yuxi.channel.container import StartupTracer class TestStartupTracer: def test_init(self): tracer = StartupTracer() assert tracer._events == [] assert tracer._start_time == 0.0 assert tracer._current_phase == "" def test_begin(self): tracer = StartupTracer() tracer.begin("config") assert tracer._current_phase == "config" assert tracer._start_time > 0 def test_end(self): tracer = StartupTracer() tracer.begin("config") tracer.end() assert len(tracer._events) == 1 assert tracer._events[0]["name"] == "config" assert tracer._events[0]["status"] == "ok" assert tracer._events[0]["duration_ms"] >= 0 def test_mark(self): tracer = StartupTracer() tracer.mark("ws_feishu", "registered", duration_ms=0.5) assert len(tracer._events) == 1 assert tracer._events[0]["name"] == "ws_feishu" assert tracer._events[0]["status"] == "registered" assert tracer._events[0]["duration_ms"] == 0.5 def test_total_ms(self): tracer = StartupTracer() tracer.mark("a", "ok", duration_ms=10.0) tracer.mark("b", "ok", duration_ms=20.5) assert tracer.total_ms == 30.5 def test_to_dict(self): tracer = StartupTracer() tracer.mark("a", "ok", duration_ms=5.0) result = tracer.to_dict() assert result == [{"name": "a", "status": "ok", "duration_ms": 5.0}] def test_multiple_phases(self): tracer = StartupTracer() tracer.begin("config") tracer.end() tracer.begin("redis") tracer.end() tracer.begin("infra") tracer.end() assert len(tracer._events) == 3 assert tracer._events[0]["name"] == "config" assert tracer._events[1]["name"] == "redis" assert tracer._events[2]["name"] == "infra" assert tracer.total_ms == sum(e["duration_ms"] for e in tracer._events)