"""Unit tests for RecallSettings configuration.
Tests the embedding_backend and mlx_model configuration options.
"""
import pytest
from pydantic import ValidationError
from recall.config import EmbeddingBackend, RecallSettings
@pytest.fixture(autouse=True)
def set_required_env_vars(monkeypatch):
"""Set required env vars for all tests (no longer have fallback defaults)."""
monkeypatch.setenv("RECALL_OLLAMA_MODEL", "mxbai-embed-large")
monkeypatch.setenv("RECALL_OLLAMA_LLM_MODEL", "gemma3:12b")
monkeypatch.setenv("RECALL_OLLAMA_MONITOR_MODEL", "gemma3:12b")
class TestEmbeddingBackendConfig:
"""Tests for embedding_backend configuration field."""
def test_default_backend_is_ollama(self, monkeypatch):
"""Verify default embedding backend is 'ollama' for backward compatibility."""
# Clear environment override
monkeypatch.delenv("RECALL_EMBEDDING_BACKEND", raising=False)
# Use _env_file=None to ignore .env file and test pure code defaults
settings = RecallSettings(_env_file=None)
assert settings.embedding_backend == "ollama"
def test_backend_can_be_set_to_mlx(self, monkeypatch):
"""Verify embedding_backend can be set to 'mlx' via environment variable."""
monkeypatch.setenv("RECALL_EMBEDDING_BACKEND", "mlx")
settings = RecallSettings()
assert settings.embedding_backend == "mlx"
def test_backend_can_be_set_to_ollama(self, monkeypatch):
"""Verify embedding_backend can be explicitly set to 'ollama'."""
monkeypatch.setenv("RECALL_EMBEDDING_BACKEND", "ollama")
settings = RecallSettings()
assert settings.embedding_backend == "ollama"
def test_invalid_backend_raises_validation_error(self, monkeypatch):
"""Verify invalid embedding_backend value raises ValidationError."""
monkeypatch.setenv("RECALL_EMBEDDING_BACKEND", "invalid")
with pytest.raises(ValidationError) as exc_info:
RecallSettings()
assert "embedding_backend" in str(exc_info.value)
assert "literal_error" in str(exc_info.value)
class TestMlxModelConfig:
"""Tests for mlx_model configuration field."""
def test_default_mlx_model(self):
"""Verify default MLX model is mlx-community/mxbai-embed-large-v1."""
settings = RecallSettings()
assert settings.mlx_model == "mlx-community/mxbai-embed-large-v1"
def test_mlx_model_env_override(self, monkeypatch):
"""Verify mlx_model can be overridden via environment variable."""
monkeypatch.setenv("RECALL_MLX_MODEL", "mlx-community/all-MiniLM-L6-v2")
settings = RecallSettings()
assert settings.mlx_model == "mlx-community/all-MiniLM-L6-v2"
class TestEmbeddingBackendType:
"""Tests for EmbeddingBackend type alias."""
def test_type_alias_is_literal(self):
"""Verify EmbeddingBackend is a Literal type with correct values."""
# Type checking - at runtime, Literal becomes a special form
from typing import get_args
args = get_args(EmbeddingBackend)
assert "ollama" in args
assert "mlx" in args
assert len(args) == 2