"""Tests for the mock LLM provider."""
from __future__ import annotations
import pytest
from providers.llm.mock_llm import MockLLM
def test_custom_fixtures_take_priority():
llm = MockLLM(fixtures={"coffee": {"custom": True}})
result = llm.complete_json("Coffee preference", {"type": "object"})
assert result == {"custom": True}
assert llm.call_count == 1
@pytest.mark.parametrize(
("prompt", "expected_category", "expected_scope"),
[
("profile details", "profile", "user"),
("preference details", "preference", "user"),
("entity details", "entity", "user"),
("event details", "event", "user"),
("pattern details", "pattern", "agent"),
("skill details", "skill", "agent"),
],
)
def test_builtin_prompt_routing_returns_expected_fixture(prompt, expected_category, expected_scope):
llm = MockLLM()
result = llm.complete_json(prompt, {"type": "object"})
assert result["candidates"][0]["category"] == expected_category
assert result["candidates"][0]["owner_scope"] == expected_scope
def test_unknown_prompt_returns_empty_candidates():
llm = MockLLM()
assert llm.complete_json("no known keywords", {"type": "object"}) == {"candidates": []}
def test_complete_with_tools_returns_mock_calls_and_tracks_prompt():
llm = MockLLM()
llm._mock_tool_calls = [{"tool": "search", "input": {"query": "coffee"}}]
result = llm.complete_with_tools("Find coffee", tools=[{"name": "search"}])
assert result == [{"tool": "search", "input": {"query": "coffee"}}]
assert llm.call_count == 1
assert llm._last_prompt == "Find coffee"
def test_reset_clears_call_count():
llm = MockLLM()
llm.complete_json("profile", {"type": "object"})
llm.reset()
assert llm.call_count == 0