Coverage for tests / unit / views / test_utils.py: 100%
36 statements
« prev ^ index » next coverage.py v7.13.3, created at 2026-02-16 21:32 +0000
« prev ^ index » next coverage.py v7.13.3, created at 2026-02-16 21:32 +0000
1from unittest.mock import patch
3from pytest import raises
5from graphable.enums import Engine
6from graphable.views.utils import detect_engine, get_image_exporter
9@patch("graphable.views.utils.which")
10def test_detect_engine_priority(mock_which):
11 """Verify priority: mermaid -> graphviz -> d2 -> plantuml."""
12 # Mermaid available
13 mock_which.side_effect = lambda x: "/path/to/" + x if x == "mmdc" else None
14 assert detect_engine() == "mermaid"
16 # Only Graphviz available
17 mock_which.side_effect = lambda x: "/path/to/" + x if x == "dot" else None
18 assert detect_engine() == "graphviz"
20 # Only D2 available
21 mock_which.side_effect = lambda x: "/path/to/" + x if x == "d2" else None
22 assert detect_engine() == "d2"
24 # Only PlantUML available
25 mock_which.side_effect = lambda x: "/path/to/" + x if x == "plantuml" else None
26 assert detect_engine() == "plantuml"
29@patch("graphable.views.utils.which")
30def test_detect_engine_none_available(mock_which):
31 """Verify error if no engine is found."""
32 mock_which.return_value = None
33 with raises(RuntimeError, match="No rendering engine found on PATH"):
34 detect_engine()
37def test_get_image_exporter_explicit():
38 """Verify get_image_exporter returns the correct function for an explicit engine."""
39 with patch("graphable.views.mermaid.export_topology_mermaid_image") as mock_mermaid:
40 exporter = get_image_exporter(Engine.MERMAID)
41 assert exporter == mock_mermaid
43 with patch("graphable.views.graphviz.export_topology_graphviz_image") as mock_gv:
44 exporter = get_image_exporter("graphviz")
45 assert exporter == mock_gv
48@patch("graphable.views.utils.detect_engine")
49def test_get_image_exporter_auto(mock_detect):
50 """Verify get_image_exporter uses detect_engine when none provided."""
51 mock_detect.return_value = "d2"
52 with patch("graphable.views.d2.export_topology_d2_image") as mock_d2:
53 exporter = get_image_exporter()
54 assert exporter == mock_d2
55 mock_detect.assert_called_once()
58def test_get_image_exporter_invalid():
59 """Verify get_image_exporter raises error for unknown engine."""
60 with raises(ValueError, match="Unknown rendering engine: unknown"):
61 get_image_exporter("unknown")