File size: 2,446 Bytes
0b87551
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
"""Unit tests for pure helpers (no model loading, fast in CI)."""

from types import SimpleNamespace
from src.utils import (
    extract_content,
    parse_tool_results,
    extract_citations,
    is_invalid_key,
    retry_delay,
)


def _msg(content, name=None):
    return SimpleNamespace(content=content, name=name)


class TestExtractContent:
    def test_plain_string(self):
        assert extract_content(_msg("hello")) == "hello"

    def test_list_of_text_blocks(self):
        msg = _msg([{"type": "text", "text": "a"}, {"type": "text", "text": "b"}])
        assert extract_content(msg) == "a b"

    def test_list_skips_non_text_blocks(self):
        msg = _msg([{"type": "text", "text": "keep"}, {"type": "image", "data": "x"}])
        assert extract_content(msg) == "keep"


class TestParseToolResults:
    def test_rag_only(self):
        msgs = [_msg("[Source: Page 1] law text", name="lookup_documents")]
        source, output = parse_tool_results(msgs)
        assert source == "rag"
        assert "law text" in output

    def test_web_only(self):
        msgs = [_msg("breaking news", name="search_web")]
        assert parse_tool_results(msgs)[0] == "web"

    def test_both_tools(self):
        msgs = [_msg("doc", name="lookup_documents"), _msg("web", name="search_web")]
        assert parse_tool_results(msgs)[0] == "rag+web"

    def test_no_tools(self):
        assert parse_tool_results([_msg("just an answer")]) == ("unknown", "")


class TestExtractCitations:
    def test_file_and_page_labels(self):
        text = "[File: resume.pdf] foo\n\n[Source: Page 3] bar"
        assert extract_citations(text) == ["File: resume.pdf", "Source: Page 3"]

    def test_deduplicates_preserving_order(self):
        text = "[File: a.pdf] x [File: a.pdf] y [File: b.pdf] z"
        assert extract_citations(text) == ["File: a.pdf", "File: b.pdf"]

    def test_empty(self):
        assert extract_citations("") == []


class TestKeyAndRetryHelpers:
    def test_invalid_key_detected(self):
        assert is_invalid_key("400 API_KEY_INVALID ...") is True
        assert is_invalid_key("PERMISSION_DENIED") is True

    def test_valid_key_not_flagged(self):
        assert is_invalid_key("RESOURCE_EXHAUSTED quota") is False

    def test_retry_delay_parsed(self):
        assert retry_delay("please retry. retryDelay: 20s") == 20.0

    def test_retry_delay_absent(self):
        assert retry_delay("some other error") == 0.0