@@ -889,47 +889,47 @@ def _make_directive(self, options=None):
889889 return directive
890890
891891 def test_strips_xml_prologue (self ):
892- svg_bytes = (
893- b '<?xml version="1.0"?>\n <!DOCTYPE svg>\n '
894- b '<svg width="100pt" height="50pt" viewBox="0 0 100 50">'
895- b "<circle/></svg>"
892+ svg_text = (
893+ '<?xml version="1.0"?>\n <!DOCTYPE svg>\n '
894+ '<svg width="100pt" height="50pt" viewBox="0 0 100 50">'
895+ "<circle/></svg>"
896896 )
897897 directive = self ._make_directive ()
898- svg_tag , _ , _ = directive ._prepare_svg (svg_bytes )
898+ svg_tag , _ , _ = directive ._prepare_svg (svg_text )
899899
900900 assert not svg_tag .startswith ("<?xml" )
901901 assert svg_tag .startswith ("<svg" )
902902 assert "</svg>" in svg_tag
903903
904904 def test_extracts_intrinsic_dimensions (self ):
905- svg_bytes = b '<svg width="702pt" height="170pt"><rect/></svg>'
905+ svg_text = '<svg width="702pt" height="170pt"><rect/></svg>'
906906 directive = self ._make_directive ()
907- _ , w , h = directive ._prepare_svg (svg_bytes )
907+ _ , w , h = directive ._prepare_svg (svg_text )
908908
909909 assert w == "702pt"
910910 assert h == "170pt"
911911
912912 def test_removes_fixed_dimensions (self ):
913- svg_bytes = b '<svg width="702pt" height="170pt" viewBox="0 0 702 170"><rect/></svg>'
913+ svg_text = '<svg width="702pt" height="170pt" viewBox="0 0 702 170"><rect/></svg>'
914914 directive = self ._make_directive ()
915- svg_tag , _ , _ = directive ._prepare_svg (svg_bytes )
915+ svg_tag , _ , _ = directive ._prepare_svg (svg_text )
916916
917917 assert 'width="702pt"' not in svg_tag
918918 assert 'height="170pt"' not in svg_tag
919919 assert "viewBox" in svg_tag
920920
921921 def test_handles_no_dimensions (self ):
922- svg_bytes = b '<svg viewBox="0 0 100 50"><rect/></svg>'
922+ svg_text = '<svg viewBox="0 0 100 50"><rect/></svg>'
923923 directive = self ._make_directive ()
924- _ , w , h = directive ._prepare_svg (svg_bytes )
924+ _ , w , h = directive ._prepare_svg (svg_text )
925925
926926 assert w == ""
927927 assert h == ""
928928
929929 def test_handles_px_dimensions (self ):
930- svg_bytes = b '<svg width="200px" height="100px"><rect/></svg>'
930+ svg_text = '<svg width="200px" height="100px"><rect/></svg>'
931931 directive = self ._make_directive ()
932- _ , w , h = directive ._prepare_svg (svg_bytes )
932+ _ , w , h = directive ._prepare_svg (svg_text )
933933
934934 assert w == "200px"
935935 assert h == "100px"
@@ -1030,15 +1030,15 @@ def _make_directive(self, options=None, tmp_path=None):
10301030
10311031 def test_no_target_option (self ):
10321032 directive = self ._make_directive ()
1033- assert directive ._resolve_target (b "<svg/>" ) == ""
1033+ assert directive ._resolve_target ("<svg/>" ) == ""
10341034
10351035 def test_explicit_target_url (self ):
10361036 directive = self ._make_directive ({"target" : "https://example.com/diagram.svg" })
1037- assert directive ._resolve_target (b "<svg/>" ) == "https://example.com/diagram.svg"
1037+ assert directive ._resolve_target ("<svg/>" ) == "https://example.com/diagram.svg"
10381038
10391039 def test_empty_target_generates_file (self , tmp_path ):
10401040 directive = self ._make_directive ({"target" : "" }, tmp_path = tmp_path )
1041- svg_data = b "<svg><rect/></svg>"
1041+ svg_data = "<svg><rect/></svg>"
10421042 result = directive ._resolve_target (svg_data )
10431043
10441044 assert result .startswith ("/_images/statemachine-" )
@@ -1048,21 +1048,21 @@ def test_empty_target_generates_file(self, tmp_path):
10481048 images_dir = tmp_path / "_images"
10491049 svg_files = list (images_dir .glob ("statemachine-*.svg" ))
10501050 assert len (svg_files ) == 1
1051- assert svg_files [0 ].read_bytes ( ) == svg_data
1051+ assert svg_files [0 ].read_text ( encoding = "utf-8" ) == svg_data
10521052
10531053 def test_empty_target_deterministic_filename (self , tmp_path ):
10541054 """Same qualname + events produces the same filename."""
10551055 directive1 = self ._make_directive ({"target" : "" , "events" : "go" }, tmp_path = tmp_path )
10561056 directive2 = self ._make_directive ({"target" : "" , "events" : "go" }, tmp_path = tmp_path )
1057- result1 = directive1 ._resolve_target (b "<svg>1</svg>" )
1058- result2 = directive2 ._resolve_target (b "<svg>2</svg>" )
1057+ result1 = directive1 ._resolve_target ("<svg>1</svg>" )
1058+ result2 = directive2 ._resolve_target ("<svg>2</svg>" )
10591059 assert result1 == result2
10601060
10611061 def test_different_events_different_filename (self , tmp_path ):
10621062 """Different events produce different filenames."""
10631063 d1 = self ._make_directive ({"target" : "" , "events" : "a" }, tmp_path = tmp_path )
10641064 d2 = self ._make_directive ({"target" : "" , "events" : "b" }, tmp_path = tmp_path )
1065- assert d1 ._resolve_target (b "<svg/>" ) != d2 ._resolve_target (b "<svg/>" )
1065+ assert d1 ._resolve_target ("<svg/>" ) != d2 ._resolve_target ("<svg/>" )
10661066
10671067
10681068class TestDirectiveRun :
@@ -1347,6 +1347,33 @@ def test_render_dot(self):
13471347 result = formatter .render (TrafficLightMachine , "dot" )
13481348 assert result .startswith ("digraph TrafficLightMachine {" )
13491349
1350+ def test_render_svg (self ):
1351+ from statemachine .contrib .diagram import formatter
1352+
1353+ from tests .examples .traffic_light_machine import TrafficLightMachine
1354+
1355+ result = formatter .render (TrafficLightMachine , "svg" )
1356+ assert isinstance (result , str )
1357+ assert "<svg" in result
1358+ assert "green" in result
1359+
1360+ def test_render_svg_instance (self ):
1361+ from statemachine .contrib .diagram import formatter
1362+
1363+ from tests .examples .traffic_light_machine import TrafficLightMachine
1364+
1365+ sm = TrafficLightMachine ()
1366+ result = formatter .render (sm , "svg" )
1367+ assert "<svg" in result
1368+ # Active state should be highlighted
1369+ assert "turquoise" in result
1370+
1371+ def test_format_svg (self ):
1372+ from tests .examples .traffic_light_machine import TrafficLightMachine
1373+
1374+ result = f"{ TrafficLightMachine :svg} "
1375+ assert "<svg" in result
1376+
13501377 def test_render_md (self ):
13511378 from statemachine .contrib .diagram import formatter
13521379
@@ -1398,6 +1425,7 @@ def test_supported_formats(self):
13981425
13991426 fmts = formatter .supported_formats ()
14001427 assert "dot" in fmts
1428+ assert "svg" in fmts
14011429 assert "mermaid" in fmts
14021430 assert "md" in fmts
14031431 assert "markdown" in fmts
0 commit comments