File size: 3,593 Bytes
b4f2238
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
"""Regression tests for case_id inference in placeholder context builder."""

from __future__ import annotations

from dataclasses import dataclass
from typing import Any

from apps.documents.services.placeholders.context_builder import EnhancedContextBuilder
from apps.documents.services.placeholders.fallback import PLACEHOLDER_FALLBACK_VALUE
from apps.documents.services.placeholders.litigation.enforcement_judgment_service import (
    EnforcementJudgmentMainTextService,
)
from apps.litigation_ai.placeholders.spec import LitigationPlaceholderKeys


@dataclass
class _CaseStub:
    id: int


class _CaptureCaseIdService:
    name = "capture_case_id_service"
    category = "test"
    placeholder_keys = ["captured_case_id"]

    def generate(self, context_data: dict[str, Any]) -> dict[str, Any]:
        return {"captured_case_id": context_data.get("case_id")}


class _RegistryStub:
    def __init__(self, services: list[Any]) -> None:
        self._services = services

    def get_all_services(self) -> list[Any]:
        return self._services

    def get_service_for_placeholder(self, placeholder_key: str) -> Any | None:
        for service in self._services:
            if placeholder_key in getattr(service, "placeholder_keys", []):
                return service
        return None


class _PartialService:
    name = "partial_service"
    category = "test"
    placeholder_keys = ["a", "b"]

    def generate(self, context_data: dict[str, Any]) -> dict[str, Any]:
        return {"a": "value-a"}


class _ErrorService:
    name = "error_service"
    category = "test"
    placeholder_keys = ["c"]

    def generate(self, context_data: dict[str, Any]) -> dict[str, Any]:
        raise RuntimeError("boom")


def test_build_context_infers_case_id_from_case_object() -> None:
    builder = EnhancedContextBuilder(registry=_RegistryStub([_CaptureCaseIdService()]))

    context = builder.build_context({"case": _CaseStub(id=11)})

    assert context["captured_case_id"] == 11


def test_build_context_keeps_explicit_case_id() -> None:
    builder = EnhancedContextBuilder(registry=_RegistryStub([_CaptureCaseIdService()]))

    context = builder.build_context({"case": _CaseStub(id=11), "case_id": 99})

    assert context["captured_case_id"] == 99


def test_enforcement_judgment_service_infers_case_id_from_case_object() -> None:
    service = EnforcementJudgmentMainTextService()
    service.get_judgment_main_text = lambda case_id: f"main-{case_id}"  # type: ignore[method-assign]

    result = service.generate({"case": _CaseStub(id=11)})

    assert result[LitigationPlaceholderKeys.ENFORCEMENT_JUDGMENT_MAIN_TEXT] == "main-11"


def test_build_context_fills_missing_service_keys_with_slash() -> None:
    builder = EnhancedContextBuilder(registry=_RegistryStub([_PartialService()]))

    context = builder.build_context({"case": _CaseStub(id=11)})

    assert context["a"] == "value-a"
    assert context["b"] == PLACEHOLDER_FALLBACK_VALUE


def test_build_context_fills_service_exception_keys_with_slash() -> None:
    builder = EnhancedContextBuilder(registry=_RegistryStub([_ErrorService()]))

    context = builder.build_context({"case": _CaseStub(id=11)})

    assert context["c"] == PLACEHOLDER_FALLBACK_VALUE


def test_build_context_fills_missing_required_placeholders_with_slash() -> None:
    builder = EnhancedContextBuilder(registry=_RegistryStub([]))

    context = builder.build_context({"case": _CaseStub(id=11)}, required_placeholders=["x", "y"])

    assert context["x"] == PLACEHOLDER_FALLBACK_VALUE
    assert context["y"] == PLACEHOLDER_FALLBACK_VALUE