-
Notifications
You must be signed in to change notification settings - Fork 14
Expand file tree
/
Copy pathtest_utils.py
More file actions
109 lines (82 loc) · 3.7 KB
/
Copy pathtest_utils.py
File metadata and controls
109 lines (82 loc) · 3.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
"""Tests for display utilities."""
import pytest
from holoviz_mcp.display_mcp.utils import extract_last_expression
from holoviz_mcp.display_mcp.utils import find_extensions
from holoviz_mcp.display_mcp.utils import find_requirements
class TestUtils:
"""Tests for utility functions."""
def test_find_extensions_plotly(self):
"""Test finding plotly extension."""
code = "import plotly.express as px\nfig = px.scatter()"
extensions = find_extensions(code)
assert "plotly" in extensions
def test_find_extensions_altair(self):
"""Test finding vega extension for altair."""
code = "import altair as alt\nchart = alt.Chart()"
extensions = find_extensions(code)
assert "vega" in extensions
def test_find_extensions_pandas(self):
"""Test finding tabulator extension for pandas."""
code = "import pandas as pd\ndf = pd.DataFrame()"
# Without namespace
extensions = find_extensions(code)
# Should not find tabulator without result in namespace
assert "tabulator" not in extensions
# With namespace
import pandas as pd
namespace = {"_panel_result": pd.DataFrame({"x": [1, 2, 3]})}
extensions = find_extensions(code, namespace)
assert "tabulator" in extensions
def test_find_extensions_deduplicate(self):
"""Test that extensions are deduplicated."""
code = "import plotly\nimport plotly.express"
extensions = find_extensions(code)
assert extensions.count("plotly") == 1
def test_find_requirements_basic(self):
"""Test finding package requirements."""
code = "import pandas as pd\nimport numpy as np"
requirements = find_requirements(code)
assert "pandas" in requirements
assert "numpy" in requirements
def test_find_requirements_from_import(self):
"""Test finding requirements from 'from' imports."""
code = "from matplotlib import pyplot as plt"
requirements = find_requirements(code)
assert "matplotlib" in requirements
def test_extract_last_expression_simple(self):
"""Test extracting last expression from simple code."""
code = "x = 1\ny = 2\nx + y"
statements, expr = extract_last_expression(code)
assert "x = 1" in statements
assert "y = 2" in statements
assert expr.strip() == "x + y"
def test_extract_last_expression_no_expression(self):
"""Test code with no final expression."""
code = "x = 1\ny = 2"
statements, expr = extract_last_expression(code)
assert "x = 1" in statements
assert "y = 2" in statements
assert expr == ""
def test_extract_last_expression_only_expression(self):
"""Test code that is only an expression."""
code = "42"
statements, expr = extract_last_expression(code)
assert statements == ""
assert expr == "42"
def test_extract_last_expression_syntax_error(self):
"""Test handling of syntax errors."""
code = "x = \n invalid"
with pytest.raises(ValueError, match="Syntax error"):
extract_last_expression(code)
def test_validate_code_valid(self):
"""Test validate_code with valid Python code."""
from holoviz_mcp.display_mcp.utils import validate_code
code = "x = 1\ny = 2\nz = x + y"
result = validate_code(code)
assert result == ""
def test_validate_code_invalid(self):
"""Test validate_code with invalid Python code."""
from holoviz_mcp.display_mcp.utils import validate_code
code = "x = 1\ny = 2\nz = x + undefined_var"
result = validate_code(code)
assert "NameError" in result