fix: test
This commit is contained in:
@@ -4,7 +4,6 @@ from src.naliiabot.bot.agent.agent import Agent
|
|||||||
from langchain_core.messages import HumanMessage, AIMessage, ToolMessage
|
from langchain_core.messages import HumanMessage, AIMessage, ToolMessage
|
||||||
from langgraph.graph import END
|
from langgraph.graph import END
|
||||||
|
|
||||||
|
|
||||||
"""
|
"""
|
||||||
Tests unitarios robustos para el Agente.
|
Tests unitarios robustos para el Agente.
|
||||||
|
|
||||||
@@ -32,7 +31,7 @@ class TestAgentConstruction:
|
|||||||
|
|
||||||
agent = Agent(model=mock_model)
|
agent = Agent(model=mock_model)
|
||||||
|
|
||||||
assert agent.config.max_iterations == 10
|
assert agent.config.max_iterations == 100
|
||||||
assert "helpful assistant" in agent.config.system_prompt
|
assert "helpful assistant" in agent.config.system_prompt
|
||||||
assert agent.tools == []
|
assert agent.tools == []
|
||||||
|
|
||||||
@@ -113,6 +112,7 @@ class TestGraphStructure:
|
|||||||
# TESTS DE COMPORTAMIENTO DE NODOS
|
# TESTS DE COMPORTAMIENTO DE NODOS
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
|
|
||||||
|
|
||||||
class TestLLMNode:
|
class TestLLMNode:
|
||||||
"""Tests del nodo de llamada al LLM."""
|
"""Tests del nodo de llamada al LLM."""
|
||||||
|
|
||||||
@@ -126,10 +126,7 @@ class TestLLMNode:
|
|||||||
mock_response = AIMessage(content="Hola")
|
mock_response = AIMessage(content="Hola")
|
||||||
agent._model.invoke = Mock(return_value=mock_response)
|
agent._model.invoke = Mock(return_value=mock_response)
|
||||||
|
|
||||||
state = {
|
state = {"messages": [HumanMessage(content="Hi")], "llm_calls": 2}
|
||||||
"messages": [HumanMessage(content="Hi")],
|
|
||||||
"llm_calls": 2
|
|
||||||
}
|
|
||||||
|
|
||||||
result = agent._llm_call_node(state)
|
result = agent._llm_call_node(state)
|
||||||
|
|
||||||
@@ -166,7 +163,7 @@ class TestLLMNode:
|
|||||||
|
|
||||||
state = {
|
state = {
|
||||||
"messages": [HumanMessage(content="Hi")],
|
"messages": [HumanMessage(content="Hi")],
|
||||||
"llm_calls": 5 # Ya en límite
|
"llm_calls": 5, # Ya en límite
|
||||||
}
|
}
|
||||||
|
|
||||||
with pytest.raises(RuntimeError, match="Max iterations"):
|
with pytest.raises(RuntimeError, match="Max iterations"):
|
||||||
@@ -203,11 +200,13 @@ class TestToolNode:
|
|||||||
|
|
||||||
ai_msg = AIMessage(
|
ai_msg = AIMessage(
|
||||||
content="",
|
content="",
|
||||||
tool_calls=[{
|
tool_calls=[
|
||||||
"name": "calculator",
|
{
|
||||||
"args": {"x": 1, "y": 2},
|
"name": "calculator",
|
||||||
"id": "call_123"
|
"args": {"x": 1, "y": 2},
|
||||||
}]
|
"id": "call_123",
|
||||||
|
}
|
||||||
|
],
|
||||||
)
|
)
|
||||||
state = {"messages": [HumanMessage(content="Calc"), ai_msg]}
|
state = {"messages": [HumanMessage(content="Calc"), ai_msg]}
|
||||||
|
|
||||||
@@ -227,11 +226,9 @@ class TestToolNode:
|
|||||||
|
|
||||||
ai_msg = AIMessage(
|
ai_msg = AIMessage(
|
||||||
content="",
|
content="",
|
||||||
tool_calls=[{
|
tool_calls=[
|
||||||
"name": "unknown_tool",
|
{"name": "unknown_tool", "args": {}, "id": "call_123"}
|
||||||
"args": {},
|
],
|
||||||
"id": "call_123"
|
|
||||||
}]
|
|
||||||
)
|
)
|
||||||
state = {"messages": [ai_msg]}
|
state = {"messages": [ai_msg]}
|
||||||
|
|
||||||
@@ -254,7 +251,9 @@ class TestToolNode:
|
|||||||
|
|
||||||
ai_msg = AIMessage(
|
ai_msg = AIMessage(
|
||||||
content="",
|
content="",
|
||||||
tool_calls=[{"name": "calculator", "args": {}, "id": "call_123"}]
|
tool_calls=[
|
||||||
|
{"name": "calculator", "args": {}, "id": "call_123"}
|
||||||
|
],
|
||||||
)
|
)
|
||||||
state = {"messages": [ai_msg]}
|
state = {"messages": [ai_msg]}
|
||||||
|
|
||||||
@@ -276,11 +275,9 @@ class TestToolNode:
|
|||||||
|
|
||||||
ai_msg = AIMessage(
|
ai_msg = AIMessage(
|
||||||
content="",
|
content="",
|
||||||
tool_calls=[{
|
tool_calls=[
|
||||||
"name": "calculator",
|
{"name": "calculator", "args": {}, "id": "call_123"}
|
||||||
"args": {},
|
],
|
||||||
"id": "call_123"
|
|
||||||
}]
|
|
||||||
)
|
)
|
||||||
state = {"messages": [ai_msg]}
|
state = {"messages": [ai_msg]}
|
||||||
|
|
||||||
@@ -314,7 +311,7 @@ class TestShouldContinue:
|
|||||||
"""
|
"""
|
||||||
ai_msg = AIMessage(
|
ai_msg = AIMessage(
|
||||||
content="",
|
content="",
|
||||||
tool_calls=[{"name": "calc", "args": {}, "id": "1"}]
|
tool_calls=[{"name": "calc", "args": {}, "id": "1"}],
|
||||||
)
|
)
|
||||||
state = {"messages": [ai_msg]}
|
state = {"messages": [ai_msg]}
|
||||||
|
|
||||||
@@ -354,6 +351,7 @@ class TestShouldContinue:
|
|||||||
# TESTS DE INTEGRACIÓN CON FLUJO COMPLETO
|
# TESTS DE INTEGRACIÓN CON FLUJO COMPLETO
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
|
|
||||||
|
|
||||||
class TestIntegrationFlows:
|
class TestIntegrationFlows:
|
||||||
"""Tests de flujos completos con mocks controlados."""
|
"""Tests de flujos completos con mocks controlados."""
|
||||||
|
|
||||||
@@ -363,12 +361,12 @@ class TestIntegrationFlows:
|
|||||||
CUANDO: Usuario pregunta algo simple
|
CUANDO: Usuario pregunta algo simple
|
||||||
ENTONCES: Flujo: START → llm_call → END
|
ENTONCES: Flujo: START → llm_call → END
|
||||||
"""
|
"""
|
||||||
final_response = AIMessage(content="¡Hola! ¿En qué puedo ayudarte?")
|
final_response = AIMessage(
|
||||||
|
content="¡Hola! ¿En qué puedo ayudarte?"
|
||||||
|
)
|
||||||
agent._model.invoke = Mock(return_value=final_response)
|
agent._model.invoke = Mock(return_value=final_response)
|
||||||
|
|
||||||
initial_state = {
|
initial_state = {"messages": [HumanMessage(content="Hola")]}
|
||||||
"messages": [HumanMessage(content="Hola")]
|
|
||||||
}
|
|
||||||
|
|
||||||
result = agent.invoke(initial_state)
|
result = agent.invoke(initial_state)
|
||||||
|
|
||||||
@@ -377,7 +375,8 @@ class TestIntegrationFlows:
|
|||||||
assert result["llm_calls"] == 1
|
assert result["llm_calls"] == 1
|
||||||
assert len(result["messages"]) == 2
|
assert len(result["messages"]) == 2
|
||||||
assert result["messages"][-1].content == (
|
assert result["messages"][-1].content == (
|
||||||
"¡Hola! ¿En qué puedo ayudarte?")
|
"¡Hola! ¿En qué puedo ayudarte?"
|
||||||
|
)
|
||||||
|
|
||||||
def test_tool_use_flow(self, agent_with_tool):
|
def test_tool_use_flow(self, agent_with_tool):
|
||||||
"""
|
"""
|
||||||
@@ -388,23 +387,22 @@ class TestIntegrationFlows:
|
|||||||
# Primera llamada: LLM decide usar tool
|
# Primera llamada: LLM decide usar tool
|
||||||
first_response = AIMessage(
|
first_response = AIMessage(
|
||||||
content="",
|
content="",
|
||||||
tool_calls=[{
|
tool_calls=[
|
||||||
"name": "calculator",
|
{
|
||||||
"args": {"expr": "2+2"},
|
"name": "calculator",
|
||||||
"id": "calc_1"
|
"args": {"expr": "2+2"},
|
||||||
}]
|
"id": "calc_1",
|
||||||
|
}
|
||||||
|
],
|
||||||
)
|
)
|
||||||
# Segunda llamada: LLM responde con resultado
|
# Segunda llamada: LLM responde con resultado
|
||||||
second_response = AIMessage(content="El resultado es 42")
|
second_response = AIMessage(content="El resultado es 42")
|
||||||
|
|
||||||
agent_with_tool._model.invoke = Mock(side_effect=[
|
agent_with_tool._model.invoke = Mock(
|
||||||
first_response,
|
side_effect=[first_response, second_response]
|
||||||
second_response
|
)
|
||||||
])
|
|
||||||
|
|
||||||
initial_state = {
|
initial_state = {"messages": [HumanMessage(content="Calcula 2+2")]}
|
||||||
"messages": [HumanMessage(content="Calcula 2+2")]
|
|
||||||
}
|
|
||||||
|
|
||||||
result = agent_with_tool.invoke(initial_state)
|
result = agent_with_tool.invoke(initial_state)
|
||||||
|
|
||||||
@@ -431,6 +429,7 @@ class TestIntegrationFlows:
|
|||||||
# TESTS DE EJECUCIÓN DE TOOLS (UNITARIO DETALLADO)
|
# TESTS DE EJECUCIÓN DE TOOLS (UNITARIO DETALLADO)
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
|
|
||||||
|
|
||||||
class TestToolExecution:
|
class TestToolExecution:
|
||||||
"""Tests específicos del método _execute_tool."""
|
"""Tests específicos del método _execute_tool."""
|
||||||
|
|
||||||
@@ -443,7 +442,7 @@ class TestToolExecution:
|
|||||||
tool_call = {
|
tool_call = {
|
||||||
"name": "calculator",
|
"name": "calculator",
|
||||||
"args": {"x": 10},
|
"args": {"x": 10},
|
||||||
"id": "call_123"
|
"id": "call_123",
|
||||||
}
|
}
|
||||||
|
|
||||||
result = agent_with_tool._execute_tool(tool_call)
|
result = agent_with_tool._execute_tool(tool_call)
|
||||||
@@ -459,11 +458,7 @@ class TestToolExecution:
|
|||||||
CUANDO: Ejecuto _execute_tool
|
CUANDO: Ejecuto _execute_tool
|
||||||
ENTONCES: Retorna ToolMessage con error
|
ENTONCES: Retorna ToolMessage con error
|
||||||
"""
|
"""
|
||||||
tool_call = {
|
tool_call = {"name": "nonexistent", "args": {}, "id": "call_404"}
|
||||||
"name": "nonexistent",
|
|
||||||
"args": {},
|
|
||||||
"id": "call_404"
|
|
||||||
}
|
|
||||||
|
|
||||||
result = agent._execute_tool(tool_call)
|
result = agent._execute_tool(tool_call)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user