import base64
import sys
import zlib
from pathlib import Path
from urllib.parse import quote
from PIL import Image
PROJECT_ROOT = Path(__file__).resolve().parent.parent
TOOLS_DIR = PROJECT_ROOT / "tools"
if str(TOOLS_DIR) not in sys.path:
sys.path.insert(0, str(TOOLS_DIR))
from archcenter_case_runner import _canonical_service_label, _label_to_type, extract_layout
from drawio_visual_validator import validate_drawio
from oci_archcenter_batch import choose_zip_urls, process_case
from oci_diagram_gen import OCIDiagramGenerator
def test_extract_layout_recovers_service_from_layered_userobject_icon(tmp_path):
drawio = tmp_path / "layered.drawio"
drawio.write_text(
"""
""",
encoding="utf-8",
)
result = extract_layout(drawio)
assert len(result.services) == 1
assert result.services[0]["type"] == "object_storage"
assert result.icon_clusters_total == 1
assert result.icon_clusters_classified == 1
def test_choose_zip_urls_prefers_architecture_assets_over_functional_assets():
ordered = choose_zip_urls([
"https://docs.oracle.com/en/solutions/example/img/lakehouse-functional-oracle.zip",
"https://docs.oracle.com/en/solutions/example/img/lakehouse-architecture-oracle.zip",
"https://docs.oracle.com/en/solutions/example/img/lakehouse-overview-oracle.zip",
])
assert ordered[0].endswith("lakehouse-architecture-oracle.zip")
assert ordered[-1].endswith("lakehouse-overview-oracle.zip")
def test_label_to_type_normalizes_multiline_captions():
assert _label_to_type("Internet\ngateway") == "internet_gateway"
assert _label_to_type("Virtual\nMachine") == "virtual_machine"
assert _label_to_type("Oracle\nIntegration 3") == "integration"
def test_label_to_type_prefers_autonomous_database_when_integration_noise_leaks_in():
assert _label_to_type(
"OCI Region\nOracle\nIntegration 3\nAutonomous\nInstance\nDatabase"
) == "adb_d"
def test_canonical_service_label_drops_nearby_annotation_noise():
assert _canonical_service_label(
"drg",
'Match attachment "VCN-3"\nDRG\nVCN-4 Import Route Distribution',
) == "DRG"
assert _canonical_service_label(
"oracle_exadata_database_service",
"Oracle Services Network\nRecovery Service",
) == ""
def test_extract_layout_supports_compressed_drawio_payloads(tmp_path):
graph_xml = (
''
''
''
''
''
''
''
''
''
''
''
""
)
compressor = zlib.compressobj(level=9, wbits=-15)
compressed_bytes = compressor.compress(quote(graph_xml).encode("utf-8")) + compressor.flush()
compressed = base64.b64encode(compressed_bytes).decode("ascii")
drawio = tmp_path / "compressed.drawio"
drawio.write_text(
f'{compressed}',
encoding="utf-8",
)
result = extract_layout(drawio)
assert len(result.services) == 1
assert result.services[0]["type"] == "internet_gateway"
def test_extract_layout_merges_nested_icon_satellite_cells(tmp_path):
drawio = tmp_path / "satellite.drawio"
drawio.write_text(
"""
""",
encoding="utf-8",
)
result = extract_layout(drawio)
assert len(result.services) == 1
assert result.services[0]["type"] == "object_storage"
assert len(result.services[0]["raw_icon_cells"]) == 2
def test_drawio_absolute_layout_preserves_raw_icon_cells(tmp_path):
spec = {
"absolute_layout": {
"canvas": {"width": 180, "height": 120},
"containers": [],
"services": [{
"id": "svc1",
"label": "",
"type": "custom_unknown",
"x": 24,
"y": 16,
"w": 60,
"h": 60,
"raw_icon_cells": [
'',
'',
],
}],
"labels": [],
"connections": [],
},
}
output = tmp_path / "raw-icon.drawio"
OCIDiagramGenerator.from_spec(spec).save(output)
xml = output.read_text(encoding="utf-8")
assert "shape=stencil(custom_base)" in xml
assert "shape=stencil(custom_overlay)" in xml
def test_drawio_absolute_layout_preserves_raw_underlay_cells_before_objects(tmp_path):
spec = {
"absolute_layout": {
"canvas": {"width": 180, "height": 120},
"containers": [],
"services": [],
"labels": [{
"id": "lbl1",
"text": "OCI Region",
"x": 60,
"y": 18,
"w": 70,
"h": 18,
"fontSize": 700,
}],
"raw_underlay_cells": [
'',
],
"connections": [],
},
}
output = tmp_path / "raw-underlay.drawio"
OCIDiagramGenerator.from_spec(spec).save(output)
xml = output.read_text(encoding="utf-8")
assert "shape=stencil(context_box)" in xml
assert xml.index("shape=stencil(context_box)") < xml.index('value="OCI Region"')
def test_validate_drawio_supports_compressed_payloads(tmp_path):
graph_xml = (
''
''
''
''
''
''
''
""
)
compressor = zlib.compressobj(level=9, wbits=-15)
compressed_bytes = compressor.compress(quote(graph_xml).encode("utf-8")) + compressor.flush()
compressed = base64.b64encode(compressed_bytes).decode("ascii")
drawio = tmp_path / "compressed.drawio"
drawio.write_text(
f'{compressed}',
encoding="utf-8",
)
report = validate_drawio(drawio)
assert report["status"] == "pass"
assert report["cell_count"] > 0
assert report["issue_count"] == 0
def test_process_case_forwards_fidelity_threshold_and_requires_native_fidelity(tmp_path, monkeypatch):
output_root = tmp_path / "batch"
candidate = {
"entry": {
"title": "Example Architecture",
"url": "https://docs.oracle.com/en/solutions/example/index.html",
"date": "2026-04",
"tags": ["database"],
"services": ["exacs"],
}
}
reference_drawio = tmp_path / "reference.drawio"
reference_drawio.write_text(
'',
encoding="utf-8",
)
reference_png = tmp_path / "reference.png"
Image.new("RGB", (32, 24), "white").save(reference_png)
reference_svg = tmp_path / "reference.svg"
reference_svg.write_text('', encoding="utf-8")
def fake_stage_reference_assets(candidate_arg, case_dir):
(case_dir / "evidence").mkdir(parents=True, exist_ok=True)
return reference_drawio, reference_png, reference_svg, {"chosen_zip": "example.zip"}
captured: dict = {}
def fake_run_case(**kwargs):
captured.update(kwargs)
return {
"drawio": {
"rebuilt_path": "examples/out/example-rebuilt.drawio",
"status": "rebuilt+verbatim",
},
"pptx": {
"status": "ok",
"audit": {"unresolved_count": 0, "oversize_ref_count": 0},
},
"pptx_fidelity": {"status": "pass"},
"fidelity": {"status": "pass"},
"eval": {"status": "fail"},
"extraction": {"icon_clusters_total": 2, "icon_clusters_classified": 2},
}
monkeypatch.setattr("oci_archcenter_batch.stage_reference_assets", fake_stage_reference_assets)
monkeypatch.setattr("oci_archcenter_batch.run_case", fake_run_case)
result = process_case(candidate, 1, output_root, 0.82, 0.91)
assert captured["fidelity_threshold"] == 0.91
assert result["status"] == "PASS"
assert result["reasons"] == []
def fake_run_case_fail(**kwargs):
return {
"drawio": {
"rebuilt_path": "examples/out/example-rebuilt.drawio",
"status": "rebuilt+verbatim",
},
"pptx": {
"status": "ok",
"audit": {"unresolved_count": 0, "oversize_ref_count": 0},
},
"pptx_fidelity": {"status": "fail"},
"fidelity": {"status": "pass"},
"eval": {"status": "pass"},
"extraction": {"icon_clusters_total": 2, "icon_clusters_classified": 2},
}
monkeypatch.setattr("oci_archcenter_batch.run_case", fake_run_case_fail)
result_fail = process_case(candidate, 2, output_root, 0.82, 0.91)
assert result_fail["status"] == "FAIL"
assert "pptx_fidelity" in result_fail["reasons"]
def test_process_case_skips_cases_outside_native_benchmark_pool(tmp_path, monkeypatch):
output_root = tmp_path / "batch"
candidate = {
"entry": {
"title": "Learn about dynamic routing gateway solutions",
"url": "https://docs.oracle.com/en/solutions/example/index.html",
"date": "2026-04",
"tags": ["networking"],
"services": ["drg", "fastconnect"],
}
}
reference_drawio = tmp_path / "reference.drawio"
reference_drawio.write_text(
'',
encoding="utf-8",
)
reference_png = tmp_path / "reference.png"
Image.new("RGB", (32, 24), "white").save(reference_png)
def fake_stage_reference_assets(candidate_arg, case_dir):
(case_dir / "evidence").mkdir(parents=True, exist_ok=True)
return reference_drawio, reference_png, None, {"chosen_zip": "example.zip"}
def fail_run_case(**kwargs):
raise AssertionError("run_case should not execute for skipped candidates")
monkeypatch.setattr("oci_archcenter_batch.stage_reference_assets", fake_stage_reference_assets)
monkeypatch.setattr(
"oci_archcenter_batch.assess_native_suitability",
lambda title, drawio_path: {"benchmarkable": False, "reasons": ["label_heavy"]},
)
monkeypatch.setattr("oci_archcenter_batch.run_case", fail_run_case)
result = process_case(candidate, 1, output_root, 0.82, 0.91)
assert result["status"] == "SKIP"
assert result["preflight"]["reasons"] == ["label_heavy"]