"""Базовые тесты моделей и структуры проекта."""
import pytest
from vmk_data_mcp.models import (
GetListingInput,
ListingResult,
MetadataFilters,
PaginationParams,
SearchMetadataInput,
SearchResult,
SearchSimilarInput,
)
def test_pagination_defaults():
p = PaginationParams()
assert p.limit == 20
assert p.offset == 0
def test_pagination_bounds():
with pytest.raises(ValueError):
PaginationParams(limit=0)
with pytest.raises(ValueError):
PaginationParams(limit=101)
with pytest.raises(ValueError):
PaginationParams(offset=-1)
def test_metadata_filters_empty():
f = MetadataFilters()
assert f.deal_type is None
assert f.city is None
def test_search_similar_input():
inp = SearchSimilarInput(query="двокімнатна квартира київ")
assert inp.query == "двокімнатна квартира київ"
assert inp.pagination.limit == 20
# min_similarity зашит внутри tools.py (всегда 0.7)
assert not hasattr(inp, "min_similarity")
def test_search_metadata_input():
inp = SearchMetadataInput(query="центр міста")
assert inp.query == "центр міста"
def test_get_listing_input():
inp = GetListingInput(listing_id=42)
assert inp.listing_id == 42
def test_listing_result_serializes():
listing = ListingResult(id=1, title="Test")
data = listing.model_dump()
assert data["id"] == 1
assert data["title"] == "Test"
def test_search_result_serializes():
result = SearchResult(total=5, limit=10, offset=0, listings=[])
data = result.model_dump()
assert data["total"] == 5
def test_descriptions_contain_hints():
"""Проверяем, что Field descriptions содержат подсказки для агента."""
schema = SearchSimilarInput.model_json_schema()
query_desc = schema["properties"]["query"]["description"]
assert "✓ Хорошо" in query_desc
assert "✗ Плохо" in query_desc
filter_schema = MetadataFilters.model_json_schema()
city_desc = filter_schema["properties"]["city"]["description"]
assert "ILIKE" in city_desc
assert "Київ" in city_desc
def test_listing_result_scores_documented():
"""similarity_score и rank_score содержат описания."""
listing = ListingResult(id=1, title="Test")
# Просто проверяем что модель создаётся и сериализуется
assert listing.similarity_score is None
assert listing.rank_score is None