"""Tests for the Ollama embedding client.

Behaviour under test: the embedding request keeps the embed model warm across
consecutive conversation turns. With ``keep_alive=0`` Ollama unloads the embed
model ~2s after every call, so each turn after a short idle gap pays a cold
reload. A short positive ``keep_alive`` keeps it resident between turns at a
negligible VRAM cost (nomic-embed-text is ~0.3 GB).
"""
from __future__ import annotations

from unittest.mock import MagicMock, patch

from jarvis.memory.embeddings import get_embedding


def _mock_response(vec):
    resp = MagicMock()
    resp.raise_for_status.return_value = None
    resp.json.return_value = {"embedding": vec}
    return resp


def test_get_embedding_posts_to_embeddings_endpoint():
    with patch("jarvis.memory.embeddings.requests") as mock_requests:
        mock_requests.post.return_value = _mock_response([0.1, 0.2, 0.3])
        vec = get_embedding("hello", "http://localhost:11434", "nomic-embed-text")

    assert vec == [0.1, 0.2, 0.3]
    args, kwargs = mock_requests.post.call_args
    assert args[0].endswith("/api/embeddings")
    assert kwargs["json"]["model"] == "nomic-embed-text"
    assert kwargs["json"]["prompt"] == "hello"


def test_get_embedding_keeps_model_warm_between_turns():
    """The request must not unload the model after each call (keep_alive > 0)."""
    with patch("jarvis.memory.embeddings.requests") as mock_requests:
        mock_requests.post.return_value = _mock_response([0.0])
        get_embedding("warm me", "http://localhost:11434", "nomic-embed-text")

    _, kwargs = mock_requests.post.call_args
    keep_alive = kwargs["json"].get("keep_alive")
    # A falsy/zero keep_alive evicts the model immediately, forcing a cold
    # reload on the next turn. Anything truthy positive keeps it resident.
    assert keep_alive, f"embedding keep_alive should be a positive duration, got {keep_alive!r}"
    assert keep_alive != 0


def test_get_embedding_returns_none_on_error():
    with patch("jarvis.memory.embeddings.requests") as mock_requests:
        mock_requests.post.side_effect = RuntimeError("boom")
        assert get_embedding("x", "http://localhost:11434", "nomic-embed-text") is None
