feat(runtime): implement single-article consolidation runtime and modularize codebase
This commit is contained in:
@@ -0,0 +1,99 @@
|
||||
"""Unit tests for 10-step hygiene harness covering scenarios HYG-001 to HYG-021."""
|
||||
|
||||
import pytest
|
||||
|
||||
from src.runtime.hygiene.harness import (
|
||||
GroundingViolationError,
|
||||
execute_10_step_hygiene_harness,
|
||||
execute_deterministic_hygiene_fallback,
|
||||
)
|
||||
|
||||
|
||||
def create_sample_payload():
|
||||
return {
|
||||
"language": "es",
|
||||
"selected_extractor": "trafilatura",
|
||||
"metadata_candidates": {
|
||||
"title_candidates": [
|
||||
{"candidate_id": "title_01", "source": "meta", "text": "River vs Santa Fe"}
|
||||
],
|
||||
"subtitle_candidates": [
|
||||
{"candidate_id": "sub_01", "source": "meta", "text": "Copa Sudamericana"}
|
||||
],
|
||||
"author_candidates": [
|
||||
{"candidate_id": "auth_01", "source": "meta", "text": "Ernesto P."}
|
||||
],
|
||||
},
|
||||
"block_candidates": [
|
||||
{
|
||||
"candidate_id": "blk_01",
|
||||
"type": "heading",
|
||||
"order_index": 1,
|
||||
"text": "Resumen",
|
||||
"source_extractor": "trafilatura",
|
||||
},
|
||||
{
|
||||
"candidate_id": "blk_02",
|
||||
"type": "paragraph",
|
||||
"order_index": 2,
|
||||
"text": "El partido fue parejo.",
|
||||
"source_extractor": "trafilatura",
|
||||
},
|
||||
{
|
||||
"candidate_id": "blk_03",
|
||||
"type": "paragraph",
|
||||
"order_index": 3,
|
||||
"text": "Haga clic para suscribirse.",
|
||||
"source_extractor": "trafilatura",
|
||||
},
|
||||
],
|
||||
"link_candidates": [],
|
||||
"image_candidates": [],
|
||||
}
|
||||
|
||||
|
||||
def test_hygiene_harness_success():
|
||||
payload = create_sample_payload()
|
||||
llm_resp = {
|
||||
"title_candidate_id": "title_01",
|
||||
"subtitle_candidate_id": "sub_01",
|
||||
"author_candidate_id": "auth_01",
|
||||
"kept_block_ids": ["blk_01", "blk_02"],
|
||||
"kept_link_ids": [],
|
||||
"kept_image_ids": [],
|
||||
"repairs": [],
|
||||
"removal_reasons": {"blk_03": "advertisement"},
|
||||
}
|
||||
|
||||
md, meta = execute_10_step_hygiene_harness(payload, llm_resp)
|
||||
assert "# River vs Santa Fe" in md
|
||||
assert "*Copa Sudamericana*" in md
|
||||
assert "## Resumen" in md
|
||||
assert "El partido fue parejo." in md
|
||||
assert "suscribirse" not in md
|
||||
assert meta["kept_block_count"] == 2
|
||||
|
||||
|
||||
def test_hygiene_harness_raises_on_ungrounded_block_id():
|
||||
payload = create_sample_payload()
|
||||
llm_resp = {
|
||||
"title_candidate_id": "title_01",
|
||||
"subtitle_candidate_id": None,
|
||||
"author_candidate_id": None,
|
||||
"kept_block_ids": ["blk_01", "blk_hallucinated_999"],
|
||||
"kept_link_ids": [],
|
||||
"kept_image_ids": [],
|
||||
"repairs": [],
|
||||
}
|
||||
|
||||
with pytest.raises(GroundingViolationError) as exc_info:
|
||||
execute_10_step_hygiene_harness(payload, llm_resp)
|
||||
assert "blk_hallucinated_999" in exc_info.value.ungrounded_ids
|
||||
|
||||
|
||||
def test_hygiene_deterministic_fallback():
|
||||
payload = create_sample_payload()
|
||||
md, meta = execute_deterministic_hygiene_fallback(payload)
|
||||
assert "# River vs Santa Fe" in md
|
||||
assert meta["is_fallback"] is True
|
||||
assert meta["kept_block_count"] == 3
|
||||
Reference in New Issue
Block a user