lmaf / tests /test_state.py
Lexai
feat(ci): add test suite and run tests in CI before deploy (#7)
4b7d391 unverified
"""Tests for ConsultationState and its data structures."""
import json
import tempfile
from pathlib import Path
import pytest
from lmaf.state.research_state import (
ConsultationState,
Critique,
CritiqueStatus,
HypothesisStatus,
LegalEvidence,
LegalHypothesis,
LegalStrategy,
RQStatus,
ResearchQuestion,
Severity,
)
class TestConsultationState:
def test_empty_state(self):
state = ConsultationState()
assert state.client_question == ""
assert state.hypotheses == []
assert state.evidence == []
assert state.questions == []
assert state.critiques == []
assert state.iteration == 0
def test_add_hypothesis(self):
state = ConsultationState()
h = state.add_hypothesis("Позовна давність становить 3 роки", iteration=1)
assert h.id == "H-001"
assert h.status == HypothesisStatus.WORKING
assert len(state.hypotheses) == 1
def test_add_multiple_hypotheses(self):
state = ConsultationState()
state.add_hypothesis("First")
state.add_hypothesis("Second")
state.add_hypothesis("Third")
assert len(state.hypotheses) == 3
assert state.hypotheses[2].id == "H-003"
def test_add_evidence(self):
state = ConsultationState()
ev = state.add_evidence(
type="case_law",
source="edrsr",
summary="Рішення ВС щодо строків давності",
citation="Справа №757/12345/22",
)
assert ev.id == "EV-001"
assert ev.type == "case_law"
assert not ev.refuted
def test_add_question(self):
state = ConsultationState()
rq = state.add_question("Чи застосовується ст. 625 ЦК?", iteration=2)
assert rq.id == "RQ-001"
assert rq.status == RQStatus.OPEN
def test_add_critique(self):
state = ConsultationState()
c = state.add_critique(
type="strategy",
severity=Severity.HIGH,
summary="Не враховано зустрічний позов",
)
assert c.id == "CR-001"
assert c.status == CritiqueStatus.ACTIVE
def test_open_questions(self):
state = ConsultationState()
q1 = state.add_question("Open question")
q2 = state.add_question("Resolved question")
q2.status = RQStatus.RESOLVED
assert len(state.open_questions()) == 1
assert state.open_questions()[0].id == q1.id
def test_active_critiques(self):
state = ConsultationState()
c1 = state.add_critique(type="strategy", summary="Active")
c2 = state.add_critique(type="reasoning", summary="Resolved")
c2.status = CritiqueStatus.RESOLVED
assert len(state.active_critiques()) == 1
assert state.active_critiques()[0].id == c1.id
def test_working_hypotheses(self):
state = ConsultationState()
h1 = state.add_hypothesis("Working")
h2 = state.add_hypothesis("Established")
h2.status = HypothesisStatus.ESTABLISHED
assert len(state.working_hypotheses()) == 1
assert len(state.established_hypotheses()) == 1
def test_serialization_roundtrip(self):
state = ConsultationState()
state.client_question = "Тестове питання"
state.jurisdiction = "civil"
state.survey_summary = "Огляд правового ландшафту"
state.strategy = LegalStrategy(
approach="Аналіз строків давності",
legal_domains=["цивільне право"],
key_questions=["Який строк?"],
)
state.add_hypothesis("Гіпотеза 1", iteration=1)
state.add_evidence(type="legislation", citation="ст. 257 ЦК")
state.add_question("Питання 1")
state.add_critique(type="completeness", summary="Прогалина")
with tempfile.NamedTemporaryFile(suffix=".json", delete=False) as f:
path = Path(f.name)
state.save(path)
loaded = ConsultationState.load(path)
assert loaded.client_question == "Тестове питання"
assert loaded.jurisdiction == "civil"
assert loaded.strategy.approach == "Аналіз строків давності"
assert len(loaded.hypotheses) == 1
assert len(loaded.evidence) == 1
assert len(loaded.questions) == 1
assert len(loaded.critiques) == 1
path.unlink()
def test_to_dict(self):
state = ConsultationState()
state.client_question = "Test"
d = state.to_dict()
assert isinstance(d, dict)
assert d["client_question"] == "Test"
class TestLegalEvidence:
def test_short(self):
ev = LegalEvidence(id="EV-001", citation="ст. 625 ЦК", summary="Пеня за прострочення")
assert "EV-001" in ev.short()
assert "ст. 625 ЦК" in ev.short()
def test_defaults(self):
ev = LegalEvidence()
assert ev.refuted is False
assert ev.iteration is None
class TestLegalHypothesis:
def test_short(self):
h = LegalHypothesis(id="H-001", statement="Позов обгрунтований", status=HypothesisStatus.WORKING)
assert "H-001" in h.short()
assert "working" in h.short()