Files
gti d21a9d1140 Add 'fiscal/' from commit '102ba84500dbd9655a0471288c3e278652593ca9'
git-subtree-dir: fiscal
git-subtree-mainline: d95165fc8f
git-subtree-split: 102ba84500
2026-09-29 14:43:23 -03:00

68 lines
2.2 KiB
Python

import copy
import pytest
from central.app.ai.fake_provider import DeterministicFakeSemanticProvider
from central.app.ai.llm_provider import LlmAnswerError, LlmEvalItem
from central.app.ai.provider import ProviderContractError, ProviderTransportError
def _item(work_item_id="w1"):
return LlmEvalItem(
work_item_id=work_item_id,
description="AGUA MINERAL 500ML",
normalized_description="AGUA MINERAL 500ML",
brand=None,
unit="ML",
segment="mercado",
candidates=[("22011000", "AGUAS MINERAIS", 0.9), ("22019000", "OUTRAS AGUAS", 0.4)],
)
@pytest.mark.parametrize(
("scenario", "selected", "abstain"),
[
("CORRECT", "22011000", False),
("WRONG", "22019000", False),
("ABSTAIN", None, True),
],
)
def test_fake_provider_returns_deterministic_valid_answers(scenario, selected, abstain):
provider = DeterministicFakeSemanticProvider()
answers = provider.select_batch([_item()], scenario=scenario)
assert answers == provider.select_batch([_item()], scenario=scenario)
assert answers[0]["work_item_id"] == "w1"
assert answers[0]["selected_ncm"] == selected
assert answers[0]["abstain"] is abstain
assert provider.calls == 2
@pytest.mark.parametrize("scenario", ["INVALID_JSON", "MISSING_ITEM", "DUPLICATE_ITEM", "OUT_OF_CANDIDATE"])
def test_fake_provider_rejects_contract_scenarios_without_mutating_items(scenario):
provider = DeterministicFakeSemanticProvider()
items = [_item("w1"), _item("w2")]
original = copy.deepcopy(items)
with pytest.raises((LlmAnswerError, ProviderContractError)):
provider.select_batch(items, scenario=scenario)
assert items == original
assert provider.calls == 1
@pytest.mark.parametrize("scenario", ["TIMEOUT", "429", "500"])
def test_fake_provider_raises_typed_transport_errors(scenario):
provider = DeterministicFakeSemanticProvider()
with pytest.raises(ProviderTransportError):
provider.select_batch([_item()], scenario=scenario)
assert provider.calls == 1
def test_fake_provider_rejects_unknown_scenarios():
with pytest.raises(ValueError):
DeterministicFakeSemanticProvider().select_batch([_item()], scenario="UNKNOWN")