145 lines
5.0 KiB
Python
145 lines
5.0 KiB
Python
import json
|
|
import subprocess
|
|
import sys
|
|
from datetime import datetime, timezone
|
|
|
|
|
|
def _write_receipt(root, *, platform, manifest_id, title, url, http_status=200):
|
|
receipt_dir = root / platform / manifest_id
|
|
tiles_dir = receipt_dir / "tiles"
|
|
tiles_dir.mkdir(parents=True)
|
|
screenshot = receipt_dir / "screenshot.png"
|
|
screenshot.write_bytes(b"png")
|
|
files = [{"kind": "screenshot", "path": str(screenshot)}]
|
|
for index in range(4):
|
|
tile = tiles_dir / f"tile-{index}.png"
|
|
tile.write_bytes(b"tile")
|
|
files.append({"kind": "tile", "path": str(tile)})
|
|
receipt = {
|
|
"generated_at": datetime.now(timezone.utc).isoformat(),
|
|
"status": "captured",
|
|
"manifest_id": manifest_id,
|
|
"http_status": http_status,
|
|
"capture_target": {
|
|
"platform": platform,
|
|
"url": url,
|
|
"crawler": "PixelRAGMarketplaceSearch.visual_fallback",
|
|
},
|
|
"page_metrics": {
|
|
"title": title,
|
|
"final_url": url,
|
|
},
|
|
"tile_plan": {
|
|
"planned_tile_count": 4,
|
|
"emitted_tile_count": 4,
|
|
},
|
|
"files": files,
|
|
}
|
|
path = receipt_dir / "capture_receipt.json"
|
|
path.write_text(json.dumps(receipt, ensure_ascii=False), encoding="utf-8")
|
|
return path
|
|
|
|
|
|
def test_pixelrag_ocr_vlm_replay_contract_splits_ready_and_blocked_receipts(tmp_path):
|
|
from services.pixelrag_ocr_vlm_replay_service import (
|
|
POLICY,
|
|
build_pixelrag_ocr_vlm_replay_contract,
|
|
)
|
|
|
|
_write_receipt(
|
|
tmp_path,
|
|
platform="shopee_tw",
|
|
manifest_id="shopee-ok",
|
|
title="Shopee 防曬乳",
|
|
url="https://shopee.tw/search?keyword=%E9%98%B2%E6%9B%AC%E4%B9%B3",
|
|
)
|
|
_write_receipt(
|
|
tmp_path,
|
|
platform="coupang_tw",
|
|
manifest_id="coupang-403",
|
|
title="Access Denied",
|
|
url="https://www.tw.coupang.com/search?q=iphone",
|
|
http_status=403,
|
|
)
|
|
|
|
payload = build_pixelrag_ocr_vlm_replay_contract(artifact_root=tmp_path)
|
|
by_platform = {item["platform"]: item for item in payload["replay_items"]}
|
|
|
|
assert payload["policy"] == POLICY
|
|
assert payload["status"] == "warning"
|
|
assert payload["summary"]["receipt_count"] == 2
|
|
assert payload["summary"]["replay_ready_count"] == 1
|
|
assert payload["summary"]["blocked_count"] == 1
|
|
assert payload["summary"]["extraction_execution_performed"] is False
|
|
assert by_platform["shopee_tw"]["replay_status"] == "ready_for_ocr_vlm_replay"
|
|
assert by_platform["shopee_tw"]["ready_for_ollama_vlm_worker"] is True
|
|
assert len(by_platform["shopee_tw"]["input_tiles"]) == 4
|
|
assert "price" in {
|
|
field["field"] for field in by_platform["shopee_tw"]["field_contract"]
|
|
}
|
|
assert by_platform["coupang_tw"]["replay_status"] == "blocked"
|
|
assert by_platform["coupang_tw"]["next_machine_action"] == (
|
|
"run_platform_probe_or_use_structured_api"
|
|
)
|
|
assert payload["model_route_contract"]["hosted_vlm_api_allowed"] is False
|
|
assert payload["replay_contract"]["writes_price_tables"] is False
|
|
assert payload["controlled_apply"]["primary_human_gate_count"] == 0
|
|
|
|
|
|
def test_pixelrag_ocr_vlm_replay_cli_outputs_machine_readable_json(tmp_path):
|
|
_write_receipt(
|
|
tmp_path,
|
|
platform="shopee_tw",
|
|
manifest_id="shopee-ok",
|
|
title="Shopee 防曬乳",
|
|
url="https://shopee.tw/search?keyword=sunscreen",
|
|
)
|
|
|
|
completed = subprocess.run(
|
|
[
|
|
sys.executable,
|
|
"scripts/ops/report_pixelrag_ocr_vlm_replay.py",
|
|
"--artifact-root",
|
|
str(tmp_path),
|
|
"--platform",
|
|
"shopee_tw",
|
|
],
|
|
capture_output=True,
|
|
check=False,
|
|
text=True,
|
|
)
|
|
|
|
assert completed.returncode == 0
|
|
payload = json.loads(completed.stdout)
|
|
assert payload["summary"]["receipt_count"] == 1
|
|
assert payload["summary"]["replay_ready_count"] == 1
|
|
assert payload["replay_items"][0]["platform"] == "shopee_tw"
|
|
assert payload["replay_items"][0]["automation_boundary"]["vlm_execution_performed"] is False
|
|
|
|
|
|
def test_pixelrag_ocr_vlm_replay_route_returns_readback(tmp_path, monkeypatch):
|
|
from flask import Flask
|
|
from routes import system_public_routes as routes
|
|
from services import pixelrag_ocr_vlm_replay_service as service
|
|
|
|
_write_receipt(
|
|
tmp_path,
|
|
platform="shopee_tw",
|
|
manifest_id="shopee-ok",
|
|
title="Shopee 防曬乳",
|
|
url="https://shopee.tw/search?keyword=sunscreen",
|
|
)
|
|
monkeypatch.setattr(service, "DEFAULT_ARTIFACT_ROOT", str(tmp_path))
|
|
|
|
app = Flask(__name__)
|
|
with app.test_request_context(
|
|
"/api/ai-automation/pixelrag-ocr-vlm-replay?platform=shopee_tw"
|
|
):
|
|
response = routes.ai_automation_pixelrag_ocr_vlm_replay_api.__wrapped__()
|
|
payload = response.get_json()
|
|
|
|
assert payload["policy"] == "read_only_pixelrag_ocr_vlm_replay_contract_v1"
|
|
assert payload["summary"]["receipt_count"] == 1
|
|
assert payload["summary"]["replay_ready_count"] == 1
|
|
assert payload["replay_contract"]["writes_database"] is False
|