"""Базовые тесты моделей и структуры проекта."""
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 через config (всегда 0.7)
assert not hasattr(inp, "min_similarity")
def test_search_metadata_input_defaults():
inp = SearchMetadataInput(query="центр міста")
assert inp.query == "центр міста"
assert inp.sort_by == "relevance"
assert inp.pagination.limit == 20
def test_search_metadata_sort_by_validation():
# Допустимое значение
inp = SearchMetadataInput(query="test", sort_by="price_asc")
assert inp.sort_by == "price_asc"
# Недопустимое значение должно вызывать ошибку
with pytest.raises(ValueError):
SearchMetadataInput(query="test", sort_by="invalid_sort")
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
def test_nested_schema_generation():
"""Проверяем, что JSON-схема генерирует вложенные $defs для Filters и Pagination."""
schema = SearchSimilarInput.model_json_schema()
assert "$defs" in schema
assert "MetadataFilters" in schema["$defs"]
assert "PaginationParams" in schema["$defs"]