Files
oci-deal-accelerator/tests/test_oci_bizcase_gen_input_aliases.py
root b30a4f0d32 Diagram generation: ref-arch-driven procedure + spec validator + KB enrichment
The diagram path now follows a documented standard procedure (lookup
the closest Oracle Architecture Center reference → confirm components
→ author absolute_layout → spec validator → render → visually verify)
and ships persistent guardrails so layout regressions can't recur.

Persistent procedure changes (apply to all users, all sessions):
- tools/diagram_spec_validator.py — geometry checks (CONTAINER_TOO_THIN,
  CONTAINER_PADDING_VIOLATION, LABEL_OVERFLOW_PARENT) run BEFORE either
  renderer (drawio + PPTX). Catches the subnet-collapse / label-overflow
  bugs that the post-render drawio validator missed.
- tools/oci_diagram_gen.py + tools/oci_pptx_diagram_gen.py — call the
  spec validator before emitting any output. Adds mysql / mysql_heatwave
  type aliases.
- tools/archcenter_pattern_lookup.py — scores against cached page
  descriptions (not just the 1-line summary), supports --queries for
  multi-fragment composition, and applies synonym expansion via
  kb/architecture-center/synonyms.yaml so "LB HA cross AD" matches
  "load balancer high availability availability domain".
- kb/architecture-center/synonyms.yaml — canonical synonym table
  (load balancer, autonomous database, data guard, …) used by the
  lookup scorer.

KB enrichment:
- tools/archcenter_description_fetcher.py + 121 cached _description.md
  under kb/diagram/assets/archcenter-refs/<slug>/. Removes the runtime
  dependency on docs.oracle.com when authoring specs and feeds the
  pattern-lookup scorer.
- 110+ cached .drawio / .svg / .png references for offline reuse,
  plus the OCI Toolkit v24.2 import (kb/diagram/assets/oci-toolkit-drawio).

Documentation:
- docs/skill/output-formats.md — new "Standard diagram-generation
  procedure (MANDATORY)" + geometry rules + the new validator entry.
- SKILL.md option 2 — references the mandatory procedure.
- README.md — describes the spec validator, archcenter_pattern_lookup
  and description fetcher, and updates the KB-health table.

Tooling that backs the procedure (cumulative across recent sessions):
tools/archcenter_case_runner.py, archcenter_batch_driver.py,
archcenter_zip_downloader.py, drawio_visual_validator.py,
drawio_fidelity_eval.py, harvest_drawio_icon.py, import_oci_library.py,
oci_pptx_diagram_gen.py, oci_pptx_render.py, refresh_pptx_icon_index.py.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 21:15:21 -03:00

103 lines
2.9 KiB
Python

import sys
from pathlib import Path
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 oci_bizcase_gen import BusinessCaseDeckGenerator
def _collect_slide_text(gen):
texts = []
for slide in gen.prs.slides:
for shape in slide.shapes:
if hasattr(shape, "text"):
text = shape.text.strip()
if text:
texts.append(text)
if getattr(shape, "has_table", False):
for row in shape.table.rows:
for cell in row.cells:
text = cell.text.strip()
if text:
texts.append(text)
return "\n".join(texts)
def test_from_spec_accepts_cover_aliases_and_recommendation_fallback():
spec = {
"customer": "Acme Corp",
"author": "Diego",
"generated_on": "2026-04-21",
"recommendation": {
"commitment_amount": "100K",
"commitment_type": "UCM",
},
}
gen = BusinessCaseDeckGenerator.from_spec(spec)
text = _collect_slide_text(gen)
assert "Acme Corp" in text
assert "Prepared by: Diego" in text
assert "Recommended: 100K UCM commitment" in text
def test_from_spec_accepts_roadmap_aliases_and_mixed_next_steps():
spec = {
"customer_name": "Acme Corp",
"roadmap": {
"phases": [
{
"title": "Assess",
"weeks": "2 weeks",
"outputs": ["Blueprint"],
"milestones": ["Kickoff"],
}
],
"total_duration": "6 weeks",
},
"recommendation": {
"summary": "Proceed with phased migration",
"next_steps": [
"Confirm scope",
{"action": "Approve budget", "owner": "Finance", "deadline": "May"},
],
},
}
gen = BusinessCaseDeckGenerator.from_spec(spec)
text = _collect_slide_text(gen)
assert "Assess" in text
assert "2 weeks" in text
assert "Kickoff" in text
assert "Blueprint" in text
assert "Confirm scope" in text
assert "Approve budget" in text
assert "Finance" in text
assert "May" in text
def test_from_spec_enriches_sparse_business_case_from_executive_summary():
spec = {
"customer_name": "Acme Corp",
"executive_summary": (
"Acme wants to move an on-prem Oracle platform to OCI to reduce cost "
"and improve disaster recovery in 12 weeks."
),
}
gen = BusinessCaseDeckGenerator.from_spec(spec)
text = _collect_slide_text(gen)
assert "Business Drivers" in text
assert "Risk Assessment" in text
assert "Implementation Roadmap" in text
assert "Our Recommendation" in text
assert "12 weeks" in text