import os
from unittest.mock import patch
from plugins.tb_graph_ascend.hierarchy_plugin.server.plugin import (
GraphsPlugin,
PLUGIN_NAME,
PLUGIN_NAME_RUN_METADATA_WITH_GRAPH,
DB_EXT,
)
from plugins.tb_graph_ascend.hierarchy_plugin.server.app.utils.global_state import (
GraphState,
)
class MockContext:
"""Mock TensorBoard context for testing."""
def __init__(self, logdir="/tmp/test_run"):
self.logdir = logdir
def test_graphs_plugin_init(monkeypatch):
"""Test GraphsPlugin initialization."""
context = MockContext(logdir="/tmp/test_run/")
monkeypatch.setattr(
"tensorboard.plugins.base_plugin.TBPlugin.__init__", lambda self, ctx: None
)
plugin = GraphsPlugin(context)
assert plugin.plugin_name == PLUGIN_NAME
assert plugin.logdir == "/tmp/test_run"
assert GraphState.get_global_value("logdir") == "/tmp/test_run"
def test_graphs_plugin_init_with_trailing_slash(monkeypatch):
"""Test GraphsPlugin initialization strips trailing slash."""
context = MockContext(logdir="/tmp/test_run///")
monkeypatch.setattr(
"tensorboard.plugins.base_plugin.TBPlugin.__init__", lambda self, ctx: None
)
plugin = GraphsPlugin(context)
assert plugin.logdir == "/tmp/test_run"
def test_graphs_plugin_init_with_home_expansion(monkeypatch):
"""Test GraphsPlugin initialization expands home directory."""
context = MockContext(logdir="~/test_run")
monkeypatch.setattr(
"tensorboard.plugins.base_plugin.TBPlugin.__init__", lambda self, ctx: None
)
plugin = GraphsPlugin(context)
assert plugin.logdir == os.path.expanduser("~/test_run")
def test_graphs_plugin_init_resets_global_state(monkeypatch):
"""Test GraphsPlugin initialization resets GraphState."""
context = MockContext()
GraphState.set_global_value("test_key", "test_value")
assert GraphState.get_global_value("test_key") == "test_value"
monkeypatch.setattr(
"tensorboard.plugins.base_plugin.TBPlugin.__init__", lambda self, ctx: None
)
plugin = GraphsPlugin(context)
assert GraphState.get_global_value("test_key") is None
def test_get_plugin_apps():
"""Test get_plugin_apps returns correct route mapping."""
context = MockContext()
with patch(
"tensorboard.plugins.base_plugin.TBPlugin.__init__", lambda self, ctx: None
):
plugin = GraphsPlugin(context)
apps = plugin.get_plugin_apps()
assert isinstance(apps, dict)
expected_routes = [
"/index.js",
"/index.html",
"/load_meta_dir",
"/filterNodes",
"/loadConvertedGraphData",
"/convertToGraph",
"/getConvertProgress",
"/screen",
"/loadGraphData",
"/loadGraphConfigInfo",
"/loadGraphAllNodeList",
"/loadGraphMatchedRelations",
"/changeNodeExpandState",
"/updateHierarchyData",
"/getNodeInfo",
"/addMatchNodes",
"/addMatchNodesByConfig",
"/deleteMatchNodes",
"/saveData",
"/updateColors",
"/saveMatchedRelations",
"/updatePrecisionError",
]
for route in expected_routes:
assert route in apps, f"Route {route} not found in plugin apps"
def test_get_plugin_apps_all_routes_reference_graph_view(monkeypatch):
"""Test that all routes reference GraphView methods."""
context = MockContext()
with patch(
"tensorboard.plugins.base_plugin.TBPlugin.__init__", lambda self, ctx: None
):
plugin = GraphsPlugin(context)
apps = plugin.get_plugin_apps()
for route, handler in apps.items():
assert handler is not None, f"Route {route} has None handler"
def test_is_active():
"""Test is_active always returns True."""
context = MockContext()
with patch(
"tensorboard.plugins.base_plugin.TBPlugin.__init__", lambda self, ctx: None
):
plugin = GraphsPlugin(context)
assert plugin.is_active() is True
def test_data_plugin_names():
"""Test data_plugin_names returns correct tuple."""
context = MockContext()
with patch(
"tensorboard.plugins.base_plugin.TBPlugin.__init__", lambda self, ctx: None
):
plugin = GraphsPlugin(context)
names = plugin.data_plugin_names()
assert isinstance(names, tuple)
assert len(names) == 2
assert PLUGIN_NAME in names
assert PLUGIN_NAME_RUN_METADATA_WITH_GRAPH in names
assert names[0] == PLUGIN_NAME
assert names[1] == PLUGIN_NAME_RUN_METADATA_WITH_GRAPH
def test_frontend_metadata():
"""Test frontend_metadata returns correct metadata."""
context = MockContext()
with patch(
"tensorboard.plugins.base_plugin.TBPlugin.__init__", lambda self, ctx: None
):
plugin = GraphsPlugin(context)
metadata = plugin.frontend_metadata()
assert metadata.es_module_path == "/index.js"
assert metadata.disable_reload is True
def test_plugin_constants():
"""Test plugin constants are defined correctly."""
assert PLUGIN_NAME == "graph_ascend"
assert PLUGIN_NAME_RUN_METADATA_WITH_GRAPH == "graph_ascend_run_metadata_graph"
assert DB_EXT is not None