NEXUS_Visual_Weaver / tests /test_command_center.py
specimba's picture
fix: simplify creator-first generation flow
5090ba8 verified
raw
history blame contribute delete
29.1 kB
from pathlib import Path
from nexus_visual_weaver.catalog import (
DEFAULT_ACTIVE_STACK,
PRIVATE_RESEARCH_STACK,
active_stack,
catalog_summary,
filter_catalog,
parameter_budget,
)
from nexus_visual_weaver.grounding import inspect_outfit
from nexus_visual_weaver.model_relay import WeaverModelRelay
from nexus_visual_weaver.planner import build_command_center_run
from nexus_visual_weaver.render import (
render_command_header,
render_dashboard_regions,
render_inspector,
render_operations_panel,
render_provider_cards,
render_topbar,
render_trust_strip,
)
from nexus_visual_weaver.schema import ModelCandidate
from nexus_visual_weaver.security import scan_file
from nexus_visual_weaver.taste import refine_prompt, score_prompt
from nexus_visual_weaver.wardrobe import build_outfit_graph
def test_taste_refinement_adds_locked_features() -> None:
refined = refine_prompt("Cyberpunk woman in neon rain")
assert refined.score >= 0.75
assert "patent leather" in refined.refined.lower()
assert "crimson hardware" in refined.refined.lower()
def test_wardrobe_slots_have_required_structure() -> None:
outfit = build_outfit_graph("black patent leather coat, crimson hardware, platform boots")
slot_names = {slot.name for slot in outfit.slots}
assert {"outerwear", "upper_body", "footwear", "jewelry", "background_context"} <= slot_names
assert all(slot.edit_priority >= 1 for slot in outfit.slots)
def test_locateanything_inspection_flags_drift_when_needed() -> None:
outfit = build_outfit_graph("minimal cyberpunk portrait")
report = inspect_outfit(outfit)
assert report.locate_model == "nvidia/LocateAnything-3B"
assert report.targets
assert "footwear requires stronger prompt lock" in report.drift_flags
def test_adult_catalog_hidden_by_default_and_visible_when_enabled() -> None:
models_default, adapters_default = filter_catalog(False)
models_adult, adapters_adult = filter_catalog(True)
assert not any(model.adult_only for model in models_default)
assert not any(adapter.adult_only for adapter in adapters_default)
assert any(model.adult_only for model in models_adult)
assert any(adapter.adult_only for adapter in adapters_adult)
def test_active_parameter_budget_passes_default_stack() -> None:
budget = parameter_budget(active_stack(False))
assert budget["status"] == "pass"
assert budget["active_b"] <= 32.0
def test_public_stack_uses_flux_9b_and_excludes_offellia() -> None:
stack = active_stack(False)
repo_ids = {model.repo_id for model in stack}
assert "black-forest-labs/FLUX.2-klein-9B" in repo_ids
assert "black-forest-labs/FLUX.2-klein-4B" not in repo_ids
assert not any("OFFELLIA" in repo_id for repo_id in repo_ids)
assert all(model.params_b < 32.0 for model in stack)
def test_private_catalog_keeps_stronger_research_models_available() -> None:
"""
Verify that private catalog mode includes OFFELLIA and other research models alongside standard models.
"""
private_models, _ = filter_catalog(True)
repo_ids = {model.repo_id for model in private_models}
assert "black-forest-labs/FLUX.2-klein-9B" in repo_ids
assert "Brunobkr/OFFELLIA_Q4_0_gemma-4-12B-it.gguf" in repo_ids
def test_command_center_run_is_checkpointed() -> None:
run = build_command_center_run(
"Slavic model, patent leather, faux fur, Chantilly lace, crimson hardware, platform boots, NEXUS sigils"
)
assert run.checkpoint.checkpoint_id.startswith("nw-")
assert run.video.checkpoint_required is True
assert run.inspection.targets
assert any(model.repo_id == "nvidia/LocateAnything-3B" for model in run.model_stack)
def test_command_center_run_snapshots_controls_and_skips_empty_reference_ids() -> None:
controls = {"wardrobe": {"footwear": "platform boots"}}
references = [{"source": "upload"}, {"basename": "reference.png"}]
run = build_command_center_run(
"gothic couture archivist",
creator_controls=controls,
reference_metadata=references,
)
controls["wardrobe"]["footwear"] = "mutated"
references[1]["basename"] = "mutated.png"
assert run.request.references == ["reference.png"]
assert run.request.creator_controls["wardrobe"]["footwear"] == "platform boots"
assert run.request.reference_metadata[1]["basename"] == "reference.png"
def test_security_scan_does_not_return_payload_excerpt() -> None:
sample = Path(__file__).parent / "fixtures" / "sample.png"
scan = scan_file(str(sample))
assert scan["payload_excerpt"] is None
assert scan["status"] in {"pass", "review"}
assert scan["purification_actions"]
assert scan["export_gate"] in {"clear", "blocked"}
def test_security_scan_flags_extension_magic_mismatch() -> None:
sample = Path(__file__).parent / "fixtures" / "sample.png"
scan = scan_file(str(sample))
assert scan["extension"] == ".png"
assert scan["magic"] == "unknown"
assert scan["status"] == "review"
assert scan["export_gate"] == "blocked"
assert any("extension does not match" in finding for finding in scan["findings"])
def test_security_scan_safe_vs_blocked_fixtures() -> None:
fixture_dir = Path(__file__).parent / "fixtures"
safe = scan_file(str(fixture_dir / "st3gg_safe_clean.png"))
blocked = scan_file(str(fixture_dir / "st3gg_blocked_trailing.png"))
assert safe["status"] == "pass"
assert safe["export_gate"] == "clear"
assert blocked["status"] == "review"
assert blocked["export_gate"] == "blocked"
assert any("trailing data" in finding for finding in blocked["findings"])
def test_dashboard_regions_expose_artifacts_and_provider_cards() -> None:
run = build_command_center_run("gothic couture archivist, patent leather, platform boots")
relay = WeaverModelRelay()
regions = render_dashboard_regions(
run=run,
adult_mode=False,
scan=scan_file(None),
relay_status=relay.dashboard_snapshot(public_demo=True),
)
assert "Output" in regions["artifacts"]
assert "nw-preview-stage" in regions["artifacts"]
assert "PRIMARY OUTPUT STAGE" in regions["artifacts"]
assert "JUDGE-SAFE DEMO OUTPUT" in regions["artifacts"]
assert "Generate an image to unlock checkpoint review." in regions["artifacts"]
assert "Forge Operations" in regions["operations"]
assert "Optional Provider Lanes" in regions["providers"]
assert "nw-provider-meter" in regions["providers"]
assert "optional gateway" in regions["providers"]
assert "CHECKPOINTED" in regions["providers"]
assert "Forge Operations" in regions["operations"]
assert "Optional Provider Lanes" in regions["providers"]
assert "nw-provider-meter" in regions["providers"]
assert "Selected: Forge" in regions["command_rail"]
assert "TRUST MODEL" in regions["topbar"]
assert "Clean PNG -> pass" in regions["topbar"]
assert "ST3GG Scan" in regions["inspector"]
assert "nw-weave-console" in regions["workflow"]
assert "Current Run Summary" in regions["workflow"]
assert "Hackathon Signal" in regions["workflow"]
assert "Boots / heels" in regions["drawer"]
assert "checkpointed" in regions["drawer"]
def test_dashboard_regions_render_with_empty_relay_and_default_scan() -> None:
regions = render_dashboard_regions(relay_status={}, scan=None, active_section="Forge")
assert "Forge Operations" in regions["operations"]
assert "not-started" in regions["operations"]
assert "snapshot pending" in regions["providers"]
assert "Selected: Forge" in regions["command_rail"]
assert "Real output and export evidence appear here" in regions["artifacts"]
def test_dashboard_operations_follow_selected_section() -> None:
"""
Verify that dashboard operations and command rail update consistently across different active sections.
Asserts that the operations panel displays the active section name and its corresponding marker, while the command rail correctly reflects the selected section.
"""
relay = WeaverModelRelay()
sections = {
"Wardrobe": "Footwear focus",
"Lore": "Beat budget",
"Models": "Rotation mode",
"Security": "ST3GG state",
"Runs": "Ledger mode",
}
for section, marker in sections.items():
regions = render_dashboard_regions(
adult_mode=(section == "Models"),
scan=scan_file(None),
relay_status=relay.dashboard_snapshot(public_demo=section != "Models"),
active_section=section,
)
assert f"{section} Operations" in regions["operations"]
assert marker in regions["operations"]
assert f"Selected: {section}" in regions["command_rail"]
def test_security_operations_distinguish_clean_scan_from_idle() -> None:
"""
Validate that the Security operations panel distinguishes a clean scan from an unselected state.
When provided a clean scan (status "pass", no findings), the panel displays "No findings."
but does not display "No upload selected." (the idle-state message).
"""
clean_scan = {"status": "pass", "export_gate": "clear", "findings": []}
html = render_operations_panel(active_section="Security", scan=clean_scan)
assert "No findings." in html
assert "No upload selected." not in html
def test_command_header_exposes_governed_run_controls() -> None:
header = render_command_header()
assert "Raven Chronicle Active Weave" in header
assert "ST3GG ALWAYS ON" in header
assert "FLUX.2 9B PINNED" in header
assert "4B SIDECAR" in header
assert "HUMAN CHECKPOINT" in header
def test_dashboard_surfaces_hf_space_status_without_secrets(monkeypatch) -> None:
for name in ["FAL_KEY", "NETLIFY_AUTH_TOKEN", "NETLIFY_SITE_ID", "OPENAI_BASE_URL", "OPENAI_API_KEY", "MODAL_TOKEN_ID"]:
monkeypatch.delenv(name, raising=False)
regions = render_dashboard_regions(relay_status=WeaverModelRelay().dashboard_snapshot(public_demo=True))
assert "ZeroGPU" in regions["topbar"]
assert "no provider secrets" in regions["topbar"]
assert "HF Space" in regions["status"]
def test_catalog_summary_reflects_adult_scope() -> None:
default_summary = catalog_summary(False)
adult_summary = catalog_summary(True)
assert default_summary["adult_catalog"] == "hidden"
assert adult_summary["adult_catalog"] == "enabled"
assert adult_summary["models_visible"] > default_summary["models_visible"]
# --- render_trust_strip tests ---
def test_render_trust_strip_defaults_to_idle_state() -> None:
html = render_trust_strip()
assert "TRUST MODEL" in html
assert "Generation is not export." in html
assert "ST3GG READY" in html
assert "Export waits for review" in html
assert "Clean PNG -> pass." in html
assert "FIXTURE EVIDENCE" in html
def test_render_trust_strip_pass_scan_shows_clear_export() -> None:
scan = {"status": "pass", "export_gate": "clear", "findings": ["all checks passed"], "purification_actions": ["none needed"]}
html = render_trust_strip(scan=scan)
assert "ST3GG PASS" in html
assert "EXPORT CLEAR" in html
assert "all checks passed" in html
def test_render_trust_strip_review_scan_shows_blocked_export() -> None:
scan = {"status": "review", "export_gate": "blocked", "findings": ["trailing data after IEND"], "purification_actions": ["truncate PNG"]}
html = render_trust_strip(scan=scan)
assert "ST3GG REVIEW" in html
assert "Export Blocked - Override Available" in html
assert "trailing data after IEND" in html
def test_render_trust_strip_redacts_payload_details() -> None:
scan = {
"status": "review",
"export_gate": "blocked",
"findings": ["payload excerpt: deadbeef hidden content recovered"],
"purification_actions": ["raw byte hex dump should stay quarantined"],
}
html = render_trust_strip(scan=scan)
assert "Redacted scan detail" in html
assert "deadbeef" not in html
assert "hex dump" not in html
def test_render_trust_strip_approved_checkpoint_shows_pass() -> None:
operator_state = {"checkpoint": "approved", "provider_state": "export_ready"}
html = render_trust_strip(operator_state=operator_state)
assert "CHECKPOINT APPROVED" in html
def test_render_trust_strip_pending_review_checkpoint_label() -> None:
operator_state = {"checkpoint": "pending_review"}
html = render_trust_strip(operator_state=operator_state)
assert "CHECKPOINT PENDING REVIEW" in html
# --- render_topbar tests ---
def test_render_topbar_includes_trust_strip() -> None:
html = render_topbar()
assert "TRUST MODEL" in html
assert "nw-trust-strip" in html
def test_render_topbar_with_scan_passes_to_trust_strip() -> None:
scan = {"status": "pass", "export_gate": "clear", "findings": ["no issues"], "purification_actions": []}
html = render_topbar(scan=scan)
assert "ST3GG PASS" in html
assert "EXPORT CLEAR" in html
def test_render_topbar_with_operator_state_shows_checkpoint() -> None:
operator_state = {"checkpoint": "approved"}
html = render_topbar(operator_state=operator_state)
assert "CHECKPOINT APPROVED" in html
def test_render_topbar_default_scan_shows_fixture_evidence() -> None:
html = render_topbar()
assert "Clean PNG -> pass." in html
assert "PNG trailing bytes -> blocked." in html
# --- render_inspector sponsor evidence tests ---
def test_render_inspector_shows_sponsor_evidence_section() -> None:
html = render_inspector()
assert "Sponsor Evidence" in html
assert "OpenBMB MiniCPM" in html
assert "NVIDIA Nemotron" in html
def test_render_inspector_with_missing_secret_shows_pending() -> None:
operator_state = {
"minicpm_judge": {"status": "missing_secret", "repo_id": "openbmb/MiniCPM-V-4.6"},
"nemotron_evidence": {"status": "missing_secret", "repo_id": "nvidia/NVIDIA-Nemotron-Parse-v1.2"},
}
html = render_inspector(operator_state=operator_state)
assert "Optional - Secret Required" in html
def test_render_inspector_with_success_judge_shows_success_status() -> None:
operator_state = {
"minicpm_judge": {"status": "success", "repo_id": "openbmb/MiniCPM-V-4.6"},
"nemotron_evidence": {"status": "success", "repo_id": "nvidia/NVIDIA-Nemotron-Parse-v1.2"},
}
html = render_inspector(operator_state=operator_state)
assert html.count("SUCCESS") >= 2
def test_render_inspector_shows_default_stack_label_without_run() -> None:
html = render_inspector()
assert "FLUX.2 9B / MiniCPM / LocateAnything" in html
# --- render_provider_cards sponsor lane tests ---
def test_render_provider_cards_shows_openbmb_and_nvidia_entries() -> None:
html = render_provider_cards()
assert "Openbmb" in html or "openbmb" in html.lower()
assert "Nvidia" in html or "nvidia" in html.lower()
def test_render_provider_cards_shows_sponsor_lane_badge_for_openbmb(monkeypatch) -> None:
monkeypatch.setenv("MINICPM_API_KEY", "test-key")
monkeypatch.setenv("MINICPM_BASE_URL", "https://minicpm.example.test")
html = render_provider_cards()
assert "SPONSOR LANE" in html
def test_render_provider_cards_shows_missing_secret_for_unconfigured_sponsor(monkeypatch) -> None:
monkeypatch.delenv("MINICPM_API_KEY", raising=False)
monkeypatch.delenv("OPENBMB_API_KEY", raising=False)
monkeypatch.delenv("NEMOTRON_API_KEY", raising=False)
monkeypatch.delenv("NVIDIA_API_KEY", raising=False)
html = render_provider_cards()
assert "Optional - Secret Required" in html
def test_render_provider_cards_configured_openbmb_shows_configured(monkeypatch) -> None:
monkeypatch.setenv("MINICPM_API_KEY", "test-key")
monkeypatch.delenv("MINICPM_BASE_URL", raising=False)
monkeypatch.delenv("NEMOTRON_API_KEY", raising=False)
monkeypatch.delenv("NVIDIA_API_KEY", raising=False)
monkeypatch.delenv("NEMOTRON_BASE_URL", raising=False)
monkeypatch.delenv("FAL_KEY", raising=False)
monkeypatch.delenv("NETLIFY_AUTH_TOKEN", raising=False)
monkeypatch.delenv("OPENAI_BASE_URL", raising=False)
monkeypatch.delenv("CLOUDFLARE_API_TOKEN", raising=False)
html = render_provider_cards()
assert "CONFIGURED" not in html
assert "Optional - Secret Required" in html
def test_render_provider_cards_configured_openbmb_requires_key_and_base_url(monkeypatch) -> None:
monkeypatch.setenv("MINICPM_API_KEY", "test-key")
monkeypatch.setenv("MINICPM_BASE_URL", "https://minicpm.example.test")
html = render_provider_cards()
assert "CONFIGURED" in html
def test_render_operations_and_inspector_redact_payload_details() -> None:
scan = {
"status": "review",
"export_gate": "blocked",
"findings": ["payload excerpt: recovered hidden content"],
"purification_actions": ["base64 raw bytes quarantined"],
}
operations = render_operations_panel(active_section="Security", scan=scan)
inspector = render_inspector(scan=scan)
assert "Redacted scan detail" in operations
assert "Redacted scan detail" in inspector
assert "recovered hidden content" not in operations
assert "base64 raw bytes" not in inspector
# --- catalog public_demo field tests ---
def test_filter_catalog_includes_flux_9b_in_public_mode() -> None:
models, _ = filter_catalog(False)
repo_ids = {model.repo_id for model in models}
assert "black-forest-labs/FLUX.2-klein-9B" in repo_ids
def test_filter_catalog_includes_flux_9b_in_adult_mode() -> None:
models, _ = filter_catalog(True)
repo_ids = {model.repo_id for model in models}
assert "black-forest-labs/FLUX.2-klein-9B" in repo_ids
def test_filter_catalog_excludes_offellia_in_public_mode() -> None:
models, _ = filter_catalog(False)
repo_ids = {model.repo_id for model in models}
assert not any("OFFELLIA" in repo_id for repo_id in repo_ids)
def test_active_stack_uses_private_research_stack_in_adult_mode() -> None:
stack = active_stack(True)
repo_ids = {model.repo_id for model in stack}
assert "black-forest-labs/FLUX.2-klein-9B" in repo_ids
assert "black-forest-labs/FLUX.2-klein-4B" not in repo_ids
def test_private_research_stack_constant_contains_9b_and_offellia() -> None:
assert "black-forest-labs/FLUX.2-klein-9B" in PRIVATE_RESEARCH_STACK
assert "Brunobkr/OFFELLIA_Q4_0_gemma-4-12B-it.gguf" in PRIVATE_RESEARCH_STACK
def test_default_active_stack_constant_uses_9b_and_sponsor_models() -> None:
assert "black-forest-labs/FLUX.2-klein-9B" in DEFAULT_ACTIVE_STACK
assert "openbmb/MiniCPM-V-4.6" in DEFAULT_ACTIVE_STACK
assert "nvidia/NVIDIA-Nemotron-Parse-v1.2" in DEFAULT_ACTIVE_STACK
assert "black-forest-labs/FLUX.2-klein-4B" not in DEFAULT_ACTIVE_STACK
# --- schema ModelCandidate public_demo tests ---
def test_model_candidate_public_demo_defaults_to_true() -> None:
candidate = ModelCandidate(
repo_id="test/model",
role="test_role",
task="text-to-image",
params_b=1.0,
runtime="local",
license="apache-2.0",
)
assert candidate.public_demo is True
def test_model_candidate_public_demo_can_be_set_false() -> None:
candidate = ModelCandidate(
repo_id="test/private-model",
role="private_role",
task="text-to-image",
params_b=9.0,
runtime="gated provider",
license="other",
public_demo=False,
)
assert candidate.public_demo is False
def test_public_demo_false_models_are_excluded_from_public_filter() -> None:
private = ModelCandidate(
repo_id="test/hidden-model",
role="private",
task="text-to-image",
params_b=2.0,
runtime="local",
license="other",
public_demo=False,
)
models_public, _ = filter_catalog(False)
assert all(m.public_demo for m in models_public)
# --- catalog FLUX.2-klein-4B tests ---
def test_filter_catalog_includes_flux_4b_in_public_mode() -> None:
models, _ = filter_catalog(False)
repo_ids = {model.repo_id for model in models}
assert "black-forest-labs/FLUX.2-klein-4B" in repo_ids
def test_filter_catalog_includes_flux_4b_in_adult_mode() -> None:
models, _ = filter_catalog(True)
repo_ids = {model.repo_id for model in models}
assert "black-forest-labs/FLUX.2-klein-4B" in repo_ids
def test_flux_4b_is_not_in_default_active_stack() -> None:
stack = active_stack(False)
repo_ids = {model.repo_id for model in stack}
assert "black-forest-labs/FLUX.2-klein-4B" not in repo_ids
def test_flux_4b_role_is_tiny_titan_sidecar() -> None:
models, _ = filter_catalog(False)
flux_4b = next((m for m in models if m.repo_id == "black-forest-labs/FLUX.2-klein-4B"), None)
assert flux_4b is not None
assert "tiny_titan" in flux_4b.role
def test_flux_4b_has_apache_license() -> None:
models, _ = filter_catalog(False)
flux_4b = next((m for m in models if m.repo_id == "black-forest-labs/FLUX.2-klein-4B"), None)
assert flux_4b is not None
assert flux_4b.license == "apache-2.0"
# --- parameter_budget over_budget tests ---
def test_parameter_budget_passes_for_default_public_stack() -> None:
budget = parameter_budget(active_stack(False))
assert budget["status"] == "pass"
assert budget["active_b"] <= 32.0
def test_parameter_budget_over_budget_for_large_stack() -> None:
large_stack = [
ModelCandidate(
repo_id=f"test/model-{i}",
role="test",
task="text-to-image",
params_b=10.0,
runtime="local",
license="apache-2.0",
)
for i in range(5) # 50B total, over the 32B limit
]
budget = parameter_budget(large_stack)
assert budget["status"] == "over_budget"
assert budget["active_b"] == 50.0
assert budget["remaining_b"] < 0.0
def test_parameter_budget_exactly_at_limit() -> None:
stack = [
ModelCandidate(
repo_id="test/model",
role="test",
task="text-to-image",
params_b=32.0,
runtime="local",
license="apache-2.0",
)
]
budget = parameter_budget(stack)
assert budget["status"] == "pass"
assert budget["active_b"] == 32.0
assert budget["remaining_b"] == 0.0
def test_parameter_budget_just_over_limit() -> None:
stack = [
ModelCandidate(
repo_id="test/model",
role="test",
task="text-to-image",
params_b=32.1,
runtime="local",
license="apache-2.0",
)
]
budget = parameter_budget(stack)
assert budget["status"] == "over_budget"
def test_catalog_summary_includes_budget_keys() -> None:
summary = catalog_summary(False)
assert "active_b" in summary
assert "limit_b" in summary
assert "remaining_b" in summary
assert "status" in summary
assert summary["limit_b"] == 32.0
def test_catalog_summary_models_visible_count_matches_filter() -> None:
models, adapters = filter_catalog(False)
summary = catalog_summary(False)
assert summary["models_visible"] == len(models)
assert summary["adapters_visible"] == len(adapters)
# --- catalog MiniCPM-V-4.6 and Nemotron-Parse tests ---
def test_minicpm_v46_in_public_catalog() -> None:
models, _ = filter_catalog(False)
repo_ids = {model.repo_id for model in models}
assert "openbmb/MiniCPM-V-4.6" in repo_ids
def test_nemotron_parse_in_public_catalog() -> None:
models, _ = filter_catalog(False)
repo_ids = {model.repo_id for model in models}
assert "nvidia/NVIDIA-Nemotron-Parse-v1.2" in repo_ids
def test_minicpm_v46_role_is_sponsor_visual_judge() -> None:
models, _ = filter_catalog(False)
minicpm = next((m for m in models if m.repo_id == "openbmb/MiniCPM-V-4.6"), None)
assert minicpm is not None
assert minicpm.role == "sponsor_visual_judge"
assert minicpm.params_b == 1.30
def test_nemotron_parse_role_is_sponsor_structured_parse() -> None:
models, _ = filter_catalog(False)
nemotron = next((m for m in models if m.repo_id == "nvidia/NVIDIA-Nemotron-Parse-v1.2"), None)
assert nemotron is not None
assert nemotron.role == "sponsor_structured_parse"
assert nemotron.params_b == 0.94
# --- adapter catalog changes tests ---
def test_dever_style_lora_compatible_with_9b_and_4b() -> None:
from nexus_visual_weaver.catalog import ADAPTER_CATALOG
dever = next((a for a in ADAPTER_CATALOG if a.repo_id == "DeverStyle/Flux.2-Klein-Loras"), None)
assert dever is not None
assert "black-forest-labs/FLUX.2-klein-9B" in dever.compatible_repo_ids
assert "black-forest-labs/FLUX.2-klein-4B" in dever.compatible_repo_ids
def test_dever_style_lora_has_trigger_words() -> None:
from nexus_visual_weaver.catalog import ADAPTER_CATALOG
dever = next((a for a in ADAPTER_CATALOG if a.repo_id == "DeverStyle/Flux.2-Klein-Loras"), None)
assert dever is not None
assert len(dever.trigger_words) > 0
assert "gothic couture" in dever.trigger_words
def test_4b_outpaint_lora_requires_image() -> None:
from nexus_visual_weaver.catalog import ADAPTER_CATALOG
outpaint = next((a for a in ADAPTER_CATALOG if a.repo_id == "fal/flux-2-klein-4B-outpaint-lora"), None)
assert outpaint is not None
assert outpaint.requires_image is True
assert "black-forest-labs/FLUX.2-klein-4B" in outpaint.compatible_repo_ids
# --- wardrobe controls tests ---
def test_build_outfit_graph_controls_override_outerwear() -> None:
outfit = build_outfit_graph(
"minimal portrait",
controls={"outerwear": "tailored rain slicker"},
)
outerwear_slot = next((s for s in outfit.slots if s.name == "outerwear"), None)
assert outerwear_slot is not None
assert outerwear_slot.description == "tailored rain slicker"
def test_build_outfit_graph_controls_override_footwear() -> None:
outfit = build_outfit_graph(
"minimal portrait",
controls={"footwear": "patent leather heels"},
)
footwear_slot = next((s for s in outfit.slots if s.name == "footwear"), None)
assert footwear_slot is not None
assert footwear_slot.description == "patent leather heels"
def test_build_outfit_graph_controls_override_palette_for_all_slots() -> None:
custom_palette = "obsidian, pearl, crimson"
outfit = build_outfit_graph(
"minimal portrait",
controls={"palette": custom_palette},
)
for slot in outfit.slots:
assert slot.palette == custom_palette
def test_build_outfit_graph_controls_override_hardware() -> None:
outfit = build_outfit_graph(
"minimal portrait",
controls={"hardware": "silver occult buckles"},
)
jewelry_slot = next((s for s in outfit.slots if s.name == "jewelry"), None)
assert jewelry_slot is not None
assert jewelry_slot.material == "silver_occult_buckles"
def test_build_outfit_graph_locked_slots_control_locks_named_slots() -> None:
outfit = build_outfit_graph(
"minimal portrait",
controls={"locked_slots": ["hair_headwear", "props"]},
)
hair_slot = next((s for s in outfit.slots if s.name == "hair_headwear"), None)
props_slot = next((s for s in outfit.slots if s.name == "props"), None)
assert hair_slot is not None and hair_slot.locked is True
assert props_slot is not None and props_slot.locked is True
def test_build_outfit_graph_locate_focus_sets_manual_focus_region() -> None:
outfit = build_outfit_graph(
"minimal portrait",
controls={"locate_focus": ["footwear", "jewelry"]},
)
footwear_slot = next((s for s in outfit.slots if s.name == "footwear"), None)
jewelry_slot = next((s for s in outfit.slots if s.name == "jewelry"), None)
hair_slot = next((s for s in outfit.slots if s.name == "hair_headwear"), None)
assert footwear_slot is not None and footwear_slot.locate_region == "manual-focus"
assert jewelry_slot is not None and jewelry_slot.locate_region == "manual-focus"
assert hair_slot is not None and hair_slot.locate_region == "auto-map"
def test_build_outfit_graph_with_no_controls_uses_defaults() -> None:
outfit = build_outfit_graph("gothic couture brief")
assert len(outfit.slots) == len(outfit.slots) # All slots present
assert outfit.score >= 0.68 # Base score
def test_build_outfit_graph_adult_mode_marks_upper_lower_slots() -> None:
outfit = build_outfit_graph("gothic brief", adult_mode=True)
upper = next((s for s in outfit.slots if s.name == "upper_body"), None)
lower = next((s for s in outfit.slots if s.name == "lower_body"), None)
outerwear = next((s for s in outfit.slots if s.name == "outerwear"), None)
assert upper is not None and upper.adult_only is True
assert lower is not None and lower.adult_only is True
assert outerwear is not None and outerwear.adult_only is False