jdmagent / tests /test_agent.py
expAge
feat(phase-2): LangChain tools + agent (provider-agnostic)
2ae6548
"""Tests de l'agent LangChain 1.x (sans LLM réel)."""
from __future__ import annotations
import pytest
from jdm_agent.tools.jdm_agent import SYSTEM_PROMPT, build_jdm_agent
from jdm_agent.tools.jdm_tools import ALL_TOOLS
def test_system_prompt_grounded_constraints():
assert "EXCLUSIVEMENT" in SYSTEM_PROMPT
assert "triplets JDM" in SYSTEM_PROMPT
assert "N'invente JAMAIS" in SYSTEM_PROMPT
def test_build_jdm_agent_compiles_and_lists_tools():
"""L'agent doit se construire et exposer la liste complète des outils.
On utilise un FakeMessagesListChatModel pour éviter toute requête réseau.
"""
try:
from langchain_core.language_models import FakeMessagesListChatModel
from langchain_core.messages import AIMessage
except Exception as e:
pytest.skip(f"FakeMessagesListChatModel indisponible: {e}")
fake = FakeMessagesListChatModel(responses=[AIMessage(content="ok")])
agent = build_jdm_agent(llm=fake)
# create_agent renvoie un CompiledStateGraph — vérifions la présence des tools
# via le node "tools" du graphe.
graph = agent.get_graph()
node_names = set(graph.nodes.keys())
# LangChain 1.x agent graph contient typiquement {"__start__", "model", "tools", "__end__"}
# Le nom exact peut varier — on tolère.
assert any("tool" in n.lower() for n in node_names), f"node tools manquant: {node_names}"
def test_all_tools_listed():
names = {t.name for t in ALL_TOOLS}
expected = {
"lookup_term", "get_synonyms", "get_antonyms",
"get_hypernyms", "get_hyponyms", "get_parts",
"get_characteristics", "get_relations_of_type",
"get_relations_between", "disambiguate", "list_relation_types",
}
assert expected.issubset(names)