VibecoderMcSwaggins's picture
feat: Gradio Custom Component for NiiVue (#29)
227ab66 unverified
"""Smoke tests for Gradio app."""
from __future__ import annotations
from unittest.mock import MagicMock, patch
def test_app_module_imports() -> None:
"""App module imports without side effects."""
# This should not launch the app or make network calls
from stroke_deepisles_demo.ui import app
assert hasattr(app, "create_app")
assert hasattr(app, "get_demo")
def test_create_app_returns_blocks() -> None:
"""create_app returns a gr.Blocks instance."""
import gradio as gr
from stroke_deepisles_demo.ui.app import create_app
# No mock needed - create_case_selector is now lazy (empty dropdown)
# Data loading happens via demo.load() after UI renders
app = create_app()
assert isinstance(app, gr.Blocks)
def test_viewer_module_imports() -> None:
"""Viewer module imports without errors."""
from stroke_deepisles_demo.ui import viewer
assert hasattr(viewer, "render_3panel_view")
# create_niivue_html was removed
def test_components_module_imports() -> None:
"""Components module imports without errors."""
from stroke_deepisles_demo.ui import components
assert hasattr(components, "create_case_selector")
assert hasattr(components, "create_results_display")
def test_run_segmentation_logic() -> None:
"""Test run_segmentation logic with mocks."""
from stroke_deepisles_demo.pipeline import PipelineResult
from stroke_deepisles_demo.ui.app import run_segmentation
mock_result = PipelineResult(
case_id="sub-001",
input_files={"dwi": MagicMock(), "adc": MagicMock()},
results_dir=MagicMock(),
prediction_mask=MagicMock(),
ground_truth=MagicMock(),
dice_score=0.85,
elapsed_seconds=10.5,
)
# prediction_mask.exists() needs to be True for mask_url to be generated
mock_result.prediction_mask.exists.return_value = True # type: ignore[attr-defined]
# Mock everything that touches files/network
with (
patch("stroke_deepisles_demo.ui.app.run_pipeline_on_case", return_value=mock_result),
patch(
"stroke_deepisles_demo.ui.app.nifti_to_gradio_url",
return_value="/gradio_api/file=/tmp/test.nii.gz",
),
# create_niivue_html mock removed
patch("stroke_deepisles_demo.ui.app.render_slice_comparison", return_value=MagicMock()),
patch("stroke_deepisles_demo.ui.app.render_3panel_view", return_value=MagicMock()),
patch("stroke_deepisles_demo.ui.app.compute_volume_ml", return_value=15.5),
):
niivue_data, _fig, _ortho, metrics, _dl_path, status, _new_results_dir = run_segmentation(
"sub-001",
fast_mode=True,
show_ground_truth=True,
previous_results_dir=None, # No previous results in test
)
# Assertion updated for Custom Component dictionary output
assert niivue_data == {
"background_url": "/gradio_api/file=/tmp/test.nii.gz",
"overlay_url": "/gradio_api/file=/tmp/test.nii.gz",
}
assert metrics["case_id"] == "sub-001"
assert metrics["dice_score"] == 0.85
assert "volume_ml" in metrics # New metric added
assert "Success" in status