""" Tests for Fact Lock: якщо session має doc_facts і питання про прибуток — ask_about_document НЕ повинна викликатись. """ import sys import os import asyncio from unittest.mock import AsyncMock, patch, MagicMock sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) from crews.agromatrix_crew import session_context as sc from crews.agromatrix_crew.doc_facts import can_answer_from_facts FACTS = { "profit_uah": 5_972_016.0, "fertilizer_uah": 1_521_084.0, "area_ha": 497.0, } def _setup_session(chat_id: str, facts: dict): sc._STORE[chat_id] = { **sc._default_session(), "doc_facts": facts, "updated_at": __import__("time").time(), } def test_can_answer_profit(): ok, keys = can_answer_from_facts("скільки прибутку у звіті?", FACTS) assert ok is True assert "profit_uah" in keys def test_can_answer_fertilizer(): ok, keys = can_answer_from_facts("витрати на добрива?", FACTS) assert ok is True assert "fertilizer_uah" in keys def test_cannot_answer_unknown(): facts_without_seed = {"area_ha": 497.0} ok, keys = can_answer_from_facts("скільки витратили на насіння?", facts_without_seed) assert ok is False def test_session_has_doc_facts(): chat_id = "test_chat_fact_lock" _setup_session(chat_id, FACTS) session = sc.load_session(chat_id) assert session.get("doc_facts") == FACTS def test_fact_reuse_bypasses_rag(): """ Перевіряємо що can_answer_from_facts повертає True і RAG можна пропустити. Це unit-тест логіки bypass; інтеграційний тест потребує мока run.handle_message. """ chat_id = "test_bypass_rag" _setup_session(chat_id, FACTS) session = sc.load_session(chat_id) facts = session.get("doc_facts", {}) question = "яка сума прибутку у звіті кукурудза?" ok, keys = can_answer_from_facts(question, facts) # Якщо ok=True — run.py НЕ викликає RAG (за логікою Fact Lock) assert ok is True, f"Expected fact reuse, keys={keys}"