mirror of
https://github.com/semantica-agi/semantica.git
synced 2026-08-29 04:26:20 +00:00
- Robust ID extraction in CentralityCalculator, CommunityDetector, and ConnectivityAnalyzer - Support for direct Entity objects and dictionaries as node identifiers - Improved Entity hashability in utils/types.py - Added integration test to verify fix and prevent regression
128 lines
4.7 KiB
Python
128 lines
4.7 KiB
Python
|
|
import unittest
|
|
from unittest.mock import MagicMock, patch
|
|
import sys
|
|
import numpy as np
|
|
|
|
# Mock heavy libraries before importing visualization modules
|
|
sys.modules['matplotlib'] = MagicMock()
|
|
sys.modules['matplotlib.pyplot'] = MagicMock()
|
|
sys.modules['matplotlib.colors'] = MagicMock()
|
|
sys.modules['matplotlib.patches'] = MagicMock()
|
|
sys.modules['plotly'] = MagicMock()
|
|
sys.modules['plotly.express'] = MagicMock()
|
|
sys.modules['plotly.graph_objects'] = MagicMock()
|
|
sys.modules['plotly.subplots'] = MagicMock()
|
|
sys.modules['seaborn'] = MagicMock()
|
|
sys.modules['umap'] = MagicMock()
|
|
sys.modules['sklearn'] = MagicMock()
|
|
sys.modules['sklearn.decomposition'] = MagicMock()
|
|
sys.modules['sklearn.manifold'] = MagicMock()
|
|
|
|
from semantica.visualization.analytics_visualizer import AnalyticsVisualizer
|
|
from semantica.visualization.embedding_visualizer import EmbeddingVisualizer
|
|
from semantica.visualization.utils.color_schemes import ColorScheme
|
|
|
|
class TestVisualizationAdvanced(unittest.TestCase):
|
|
|
|
def setUp(self):
|
|
self.mock_logger = MagicMock()
|
|
self.mock_tracker = MagicMock()
|
|
|
|
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}
|
|
|
|
# Access the mock that was injected
|
|
import plotly.graph_objects as go
|
|
# Reset mock to ensure clean state
|
|
go.Bar.reset_mock()
|
|
|
|
viz.visualize_centrality_rankings(centrality, output="interactive")
|
|
go.Bar.assert_called()
|
|
|
|
def test_visualize_community_structure(self):
|
|
viz = AnalyticsVisualizer()
|
|
|
|
if hasattr(viz, 'visualize_community_structure'):
|
|
import plotly.graph_objects as go
|
|
# Reset mocks
|
|
go.Figure.reset_mock()
|
|
|
|
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)
|
|
|
|
import plotly.graph_objects as go
|
|
|
|
# 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)
|
|
|
|
import plotly.graph_objects as go
|
|
go.Heatmap.reset_mock()
|
|
|
|
if hasattr(viz, 'visualize_similarity_heatmap'):
|
|
viz.visualize_similarity_heatmap(embeddings)
|
|
go.Heatmap.assert_called()
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|