File size: 2,825 Bytes
7880373
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""tests/test_chat_agent.py — config threading through the chat Q&A agent."""
from __future__ import annotations

from unittest.mock import MagicMock, patch

from langchain_core.messages import AIMessage

from agent.llm import RunConfig


def _fake_llm_no_tool_calls(answer_text: str = "The answer is 42."):
    """Return a MagicMock standing in for a bound chat model that answers directly."""
    llm = MagicMock()
    llm.bind_tools.return_value = llm
    llm.invoke.return_value = AIMessage(content=answer_text, tool_calls=[])
    return llm


@patch("agent.chat_agent.metrics_db.get_all_metrics")
@patch("agent.chat_agent.make_chat_model")
def test_answer_question_threads_config_to_factory(mock_make_chat_model, mock_get_all_metrics):
    mock_get_all_metrics.return_value = [
        {"period": "Q1 2025", "form_type": "10-Q", "filing_date": "2025-05-01"}
    ]
    mock_make_chat_model.return_value = _fake_llm_no_tool_calls()

    cfg = RunConfig(provider="openai", model="gpt-5-mini", api_key="sk-test")
    from agent.chat_agent import answer_question
    result = answer_question("nvda", "What changed?", [], config=cfg)

    assert result["answer"] == "The answer is 42."
    assert mock_make_chat_model.call_count >= 1
    called_cfg = mock_make_chat_model.call_args_list[0].args[0]
    assert called_cfg is cfg


@patch("agent.chat_agent.metrics_db.get_all_metrics")
@patch("agent.chat_agent.make_chat_model")
def test_answer_question_uses_default_config_when_none_given(mock_make_chat_model, mock_get_all_metrics):
    mock_get_all_metrics.return_value = [
        {"period": "Q1 2025", "form_type": "10-Q", "filing_date": "2025-05-01"}
    ]
    mock_make_chat_model.return_value = _fake_llm_no_tool_calls()

    from agent.chat_agent import answer_question
    answer_question("NVDA", "What changed?", [])

    called_cfg = mock_make_chat_model.call_args_list[0].args[0]
    assert called_cfg.provider == "anthropic"
    assert called_cfg.api_key is None


@patch("agent.chat_agent.metrics_db.get_all_metrics")
@patch("agent.chat_agent.build_system_message")
@patch("agent.chat_agent.make_chat_model")
def test_answer_question_builds_provider_aware_system_message(
    mock_make_chat_model, mock_build_system_message, mock_get_all_metrics
):
    mock_get_all_metrics.return_value = [
        {"period": "Q1 2025", "form_type": "10-Q", "filing_date": "2025-05-01"}
    ]
    mock_make_chat_model.return_value = _fake_llm_no_tool_calls()
    from langchain_core.messages import SystemMessage
    mock_build_system_message.return_value = SystemMessage(content="sys")

    cfg = RunConfig(provider="openai", model="gpt-5-mini", api_key="sk-test")
    from agent.chat_agent import answer_question
    answer_question("NVDA", "hi", [], config=cfg)

    assert mock_build_system_message.call_args.args[0] is cfg