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

1from unittest.mock import patch 

2 

3from pytest import raises 

4 

5from graphable.enums import Engine 

6from graphable.views.utils import detect_engine, get_image_exporter 

7 

8 

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" 

15 

16 # Only Graphviz available 

17 mock_which.side_effect = lambda x: "/path/to/" + x if x == "dot" else None 

18 assert detect_engine() == "graphviz" 

19 

20 # Only D2 available 

21 mock_which.side_effect = lambda x: "/path/to/" + x if x == "d2" else None 

22 assert detect_engine() == "d2" 

23 

24 # Only PlantUML available 

25 mock_which.side_effect = lambda x: "/path/to/" + x if x == "plantuml" else None 

26 assert detect_engine() == "plantuml" 

27 

28 

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() 

35 

36 

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 

42 

43 with patch("graphable.views.graphviz.export_topology_graphviz_image") as mock_gv: 

44 exporter = get_image_exporter("graphviz") 

45 assert exporter == mock_gv 

46 

47 

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() 

56 

57 

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")