File size: 1,859 Bytes
f019486
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
from agent import render


def test_render_event_thought_and_revision():
    normal = render.render_event({"kind": "thought", "text": "hmm", "revision": False, "step": 1})
    assert "🧠" in normal and "hmm" in normal
    rev = render.render_event({"kind": "thought", "text": "rethink", "revision": True, "step": 2})
    assert "↻" in rev and "revision" in rev


def test_render_event_tool_call_observation_final():
    tc = render.render_event({"kind": "tool_call", "tool": "calculator",
                              "args": {"expression": "2+2"}, "step": 1})
    assert "🔧" in tc and "calculator" in tc and "2+2" in tc

    weak = render.render_event({"kind": "observation", "tool": "wikipedia_search",
                                "text": "may refer to", "weak": True, "step": 1})
    assert "📄" in weak and "weak" in weak

    fin = render.render_event({"kind": "final", "text": "42", "step": 3})
    assert "42" in fin


def test_render_stats():
    assert render.render_stats(steps=3, tool_calls=2, seconds=4.25) == "3 steps · 2 tool calls · 4.2s"


def test_check_run_allowed():
    ok, msg = render.check_run_allowed(0, cap=5)
    assert ok and msg == ""
    blocked, msg2 = render.check_run_allowed(5, cap=5)
    assert not blocked and "limit" in msg2.lower()


def test_render_timeline_escapes_html():
    html = render.render_timeline([{"kind": "observation", "tool": "web_get",
                                    "text": "<script>x</script>", "weak": False, "step": 1}])
    assert "<script>" not in html


def test_app_module_builds_blocks(monkeypatch):
    monkeypatch.setenv("GEMINI_API_KEY", "")  # must not be needed at import time
    import importlib
    import app as app_module
    importlib.reload(app_module)
    demo = app_module.build_demo()
    assert demo is not None