mirror of
https://github.com/semantica-agi/semantica.git
synced 2026-08-29 04:26:20 +00:00
* test(visualization): isolate optional dependency mocks * test(visualization): stop requiring Plotly in unit tests Removing the global sys.modules stubs left the tests that patch `...go.Bar`, or call a visualizer, with nothing standing in for the module level `px` and `go` aliases. Those are None when Plotly is missing, so patch resolution and _check_dependencies() both failed. Add a helper that substitutes a double only for the aliases that are None, leaving the real module in place when Plotly is installed. ---------
113 lines
4.4 KiB
Python
113 lines
4.4 KiB
Python
|
|
import unittest
|
|
from contextlib import ExitStack
|
|
from unittest.mock import MagicMock, patch
|
|
import numpy as np
|
|
|
|
from semantica.visualization import analytics_visualizer, embedding_visualizer
|
|
from semantica.visualization.analytics_visualizer import AnalyticsVisualizer
|
|
from semantica.visualization.embedding_visualizer import EmbeddingVisualizer
|
|
from semantica.visualization.utils.color_schemes import ColorScheme
|
|
from tests.visualization._plotly_doubles import plotly_doubles
|
|
|
|
class TestVisualizationAdvanced(unittest.TestCase):
|
|
|
|
def setUp(self):
|
|
self.mock_logger = MagicMock()
|
|
self.mock_tracker = MagicMock()
|
|
|
|
stack = ExitStack()
|
|
self.addCleanup(stack.close)
|
|
stack.enter_context(plotly_doubles(analytics_visualizer, embedding_visualizer))
|
|
|
|
self.patchers = [
|
|
patch('semantica.visualization.analytics_visualizer.get_logger', return_value=self.mock_logger),
|
|
patch('semantica.visualization.analytics_visualizer.get_progress_tracker', return_value=self.mock_tracker),
|
|
patch('semantica.visualization.embedding_visualizer.get_logger', return_value=self.mock_logger),
|
|
patch('semantica.visualization.embedding_visualizer.get_progress_tracker', return_value=self.mock_tracker),
|
|
]
|
|
|
|
for p in self.patchers:
|
|
p.start()
|
|
|
|
def tearDown(self):
|
|
for p in self.patchers:
|
|
p.stop()
|
|
|
|
# --- AnalyticsVisualizer Tests ---
|
|
def test_analytics_viz_init(self):
|
|
viz = AnalyticsVisualizer(color_scheme="vibrant")
|
|
self.assertIsInstance(viz, AnalyticsVisualizer)
|
|
self.assertEqual(viz.color_scheme, ColorScheme.VIBRANT)
|
|
|
|
def test_visualize_centrality_rankings(self):
|
|
viz = AnalyticsVisualizer()
|
|
centrality = {"n1": 0.5, "n2": 0.3}
|
|
|
|
with (
|
|
patch('semantica.visualization.analytics_visualizer.go.Bar') as mock_bar,
|
|
patch('semantica.visualization.analytics_visualizer.go.Figure'),
|
|
):
|
|
viz.visualize_centrality_rankings(centrality, output="interactive")
|
|
mock_bar.assert_called()
|
|
|
|
def test_visualize_community_structure(self):
|
|
viz = AnalyticsVisualizer()
|
|
|
|
if hasattr(viz, 'visualize_community_structure'):
|
|
graph = MagicMock()
|
|
communities = {"c1": ["n1", "n2"]}
|
|
|
|
# Assuming it creates a figure or raises error if not implemented
|
|
try:
|
|
viz.visualize_community_structure(graph, communities)
|
|
except Exception:
|
|
pass
|
|
# Just ensuring it runs without crashing due to missing deps (since we mocked them)
|
|
|
|
# --- EmbeddingVisualizer Tests ---
|
|
def test_embedding_viz_init(self):
|
|
viz = EmbeddingVisualizer(point_size=10)
|
|
self.assertIsInstance(viz, EmbeddingVisualizer)
|
|
self.assertEqual(viz.point_size, 10)
|
|
|
|
def test_visualize_2d_projection(self):
|
|
viz = EmbeddingVisualizer()
|
|
embeddings = np.random.rand(10, 128)
|
|
|
|
# Mock UMAP/TSNE/PCA
|
|
with patch('semantica.visualization.embedding_visualizer.umap') as mock_umap, \
|
|
patch('semantica.visualization.embedding_visualizer.TSNE') as mock_tsne, \
|
|
patch('semantica.visualization.embedding_visualizer.PCA') as mock_pca:
|
|
|
|
# Setup mock returns
|
|
mock_reducer = MagicMock()
|
|
mock_reducer.fit_transform.return_value = np.random.rand(10, 2)
|
|
mock_umap.UMAP.return_value = mock_reducer
|
|
mock_tsne.return_value = mock_reducer
|
|
mock_pca.return_value = mock_reducer
|
|
|
|
# Test UMAP
|
|
viz.visualize_2d_projection(embeddings, method="umap")
|
|
if mock_umap:
|
|
mock_umap.UMAP.assert_called()
|
|
|
|
# Test PCA
|
|
viz.visualize_2d_projection(embeddings, method="pca")
|
|
mock_pca.assert_called()
|
|
|
|
def test_visualize_similarity_heatmap(self):
|
|
viz = EmbeddingVisualizer()
|
|
embeddings = np.random.rand(5, 5)
|
|
|
|
if hasattr(viz, 'visualize_similarity_heatmap'):
|
|
with (
|
|
patch('semantica.visualization.embedding_visualizer.go.Heatmap') as mock_heatmap,
|
|
patch('semantica.visualization.embedding_visualizer.go.Figure'),
|
|
):
|
|
viz.visualize_similarity_heatmap(embeddings)
|
|
mock_heatmap.assert_called()
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|