We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/oraios/serena'
If you have feedback or need assistance with the MCP directory API, please join our Discord server
"""
Tests for TOML language server symbol retrieval functionality.
These tests focus on advanced symbol operations:
- request_containing_symbol
- request_document_overview
- request_full_symbol_tree
- request_dir_overview
"""
from pathlib import Path
import pytest
from solidlsp import SolidLanguageServer
from solidlsp.ls_config import Language
pytestmark = pytest.mark.toml
class TestTomlSymbolRetrieval:
"""Test advanced symbol retrieval functionality for TOML files."""
@pytest.mark.parametrize("language_server", [Language.TOML], indirect=True)
@pytest.mark.parametrize("repo_path", [Language.TOML], indirect=True)
def test_request_containing_symbol_behavior(self, language_server: SolidLanguageServer, repo_path: Path) -> None:
"""Test request_containing_symbol behavior for TOML files.
Note: Taplo LSP doesn't support definition/containing symbol lookups for TOML files
since TOML is a configuration format, not code. This test verifies the behavior.
"""
# Line 2 (0-indexed: 1) is inside the [package] table
containing_symbol = language_server.request_containing_symbol("Cargo.toml", 1, 5)
# Taplo doesn't support containing symbol lookup - returns None
# This is expected behavior for a configuration file format
assert containing_symbol is None, "TOML LSP doesn't support containing symbol lookup"
@pytest.mark.parametrize("language_server", [Language.TOML], indirect=True)
@pytest.mark.parametrize("repo_path", [Language.TOML], indirect=True)
def test_request_document_overview_cargo(self, language_server: SolidLanguageServer, repo_path: Path) -> None:
"""Test request_document_overview for Cargo.toml."""
overview = language_server.request_document_overview("Cargo.toml")
assert overview is not None
assert len(overview) > 0
# Get symbol names from overview
symbol_names = {symbol.get("name") for symbol in overview if "name" in symbol}
# Verify expected top-level tables appear
expected_tables = {"package", "dependencies", "dev-dependencies", "features", "workspace"}
assert expected_tables.issubset(symbol_names), f"Missing expected tables in overview: {expected_tables - symbol_names}"
@pytest.mark.parametrize("language_server", [Language.TOML], indirect=True)
@pytest.mark.parametrize("repo_path", [Language.TOML], indirect=True)
def test_request_document_overview_pyproject(self, language_server: SolidLanguageServer, repo_path: Path) -> None:
"""Test request_document_overview for pyproject.toml."""
overview = language_server.request_document_overview("pyproject.toml")
assert overview is not None
assert len(overview) > 0
# Get symbol names from overview
symbol_names = {symbol.get("name") for symbol in overview if "name" in symbol}
# Verify expected top-level tables appear
assert "project" in symbol_names, "Should detect 'project' table"
assert "build-system" in symbol_names, "Should detect 'build-system' table"
@pytest.mark.parametrize("language_server", [Language.TOML], indirect=True)
@pytest.mark.parametrize("repo_path", [Language.TOML], indirect=True)
def test_request_full_symbol_tree(self, language_server: SolidLanguageServer, repo_path: Path) -> None:
"""Test request_full_symbol_tree returns TOML files."""
symbol_tree = language_server.request_full_symbol_tree()
assert symbol_tree is not None
assert len(symbol_tree) > 0
# The root should be test_repo
root = symbol_tree[0]
assert root["name"] == "test_repo"
assert "children" in root
# Children should include TOML files
child_names = {child["name"] for child in root.get("children", [])}
# Note: File names are stripped of extension in some cases
assert (
"Cargo" in child_names or "Cargo.toml" in child_names or any("cargo" in name.lower() for name in child_names)
), f"Should find Cargo.toml in tree, got: {child_names}"
@pytest.mark.parametrize("language_server", [Language.TOML], indirect=True)
@pytest.mark.parametrize("repo_path", [Language.TOML], indirect=True)
def test_request_dir_overview(self, language_server: SolidLanguageServer, repo_path: Path) -> None:
"""Test request_dir_overview returns symbols for TOML files."""
overview = language_server.request_dir_overview(".")
assert overview is not None
assert len(overview) > 0
# Should have entries for both Cargo.toml and pyproject.toml
file_paths = list(overview.keys())
assert any("Cargo.toml" in path for path in file_paths), f"Should find Cargo.toml in overview, got: {file_paths}"
assert any("pyproject.toml" in path for path in file_paths), f"Should find pyproject.toml in overview, got: {file_paths}"
@pytest.mark.parametrize("language_server", [Language.TOML], indirect=True)
@pytest.mark.parametrize("repo_path", [Language.TOML], indirect=True)
def test_symbol_hierarchy_in_cargo(self, language_server: SolidLanguageServer, repo_path: Path) -> None:
"""Test that symbol hierarchy is properly preserved in Cargo.toml."""
all_symbols, root_symbols = language_server.request_document_symbols("Cargo.toml").get_all_symbols_and_roots()
# Find the 'package' table
package_symbol = next((s for s in root_symbols if s.get("name") == "package"), None)
assert package_symbol is not None, "Should find 'package' as root symbol"
# Verify it has children (nested keys)
assert "children" in package_symbol, "'package' should have children"
child_names = {child.get("name") for child in package_symbol.get("children", [])}
# Package should have name, version, edition at minimum
assert "name" in child_names, "'package' should have 'name' child"
assert "version" in child_names, "'package' should have 'version' child"
assert "edition" in child_names, "'package' should have 'edition' child"
@pytest.mark.parametrize("language_server", [Language.TOML], indirect=True)
@pytest.mark.parametrize("repo_path", [Language.TOML], indirect=True)
def test_symbol_hierarchy_in_pyproject(self, language_server: SolidLanguageServer, repo_path: Path) -> None:
"""Test that symbol hierarchy is properly preserved in pyproject.toml."""
all_symbols, root_symbols = language_server.request_document_symbols("pyproject.toml").get_all_symbols_and_roots()
# Find the 'project' table
project_symbol = next((s for s in root_symbols if s.get("name") == "project"), None)
assert project_symbol is not None, "Should find 'project' as root symbol"
# Verify it has children
assert "children" in project_symbol, "'project' should have children"
child_names = {child.get("name") for child in project_symbol.get("children", [])}
# Project should have name, version, dependencies at minimum
assert "name" in child_names, "'project' should have 'name' child"
assert "version" in child_names, "'project' should have 'version' child"
@pytest.mark.parametrize("language_server", [Language.TOML], indirect=True)
@pytest.mark.parametrize("repo_path", [Language.TOML], indirect=True)
def test_tool_section_hierarchy(self, language_server: SolidLanguageServer, repo_path: Path) -> None:
"""Test that tool sections in pyproject.toml are properly structured."""
all_symbols, root_symbols = language_server.request_document_symbols("pyproject.toml").get_all_symbols_and_roots()
# Get all symbol names
all_names = [s.get("name") for s in all_symbols]
# Should detect tool.ruff, tool.mypy, or tool.pytest
has_ruff = any("ruff" in name.lower() for name in all_names if name)
has_mypy = any("mypy" in name.lower() for name in all_names if name)
has_pytest = any("pytest" in name.lower() for name in all_names if name)
assert has_ruff or has_mypy or has_pytest, f"Should detect tool sections, got names: {all_names}"
@pytest.mark.parametrize("language_server", [Language.TOML], indirect=True)
@pytest.mark.parametrize("repo_path", [Language.TOML], indirect=True)
def test_array_of_tables_symbol(self, language_server: SolidLanguageServer, repo_path: Path) -> None:
"""Test that [[bin]] array of tables is detected."""
all_symbols, root_symbols = language_server.request_document_symbols("Cargo.toml").get_all_symbols_and_roots()
# Get all symbol names
all_names = [s.get("name") for s in all_symbols]
# Should detect bin array of tables
has_bin = "bin" in all_names
assert has_bin, f"Should detect [[bin]] array of tables, got names: {all_names}"
# Find the bin symbol and verify its structure
bin_symbol = next((s for s in all_symbols if s.get("name") == "bin"), None)
assert bin_symbol is not None, "Should find bin symbol"
# Array of tables should be kind 18 (array)
assert bin_symbol.get("kind") == 18, "[[bin]] should have kind 18 (array)"
# Children of array of tables are indexed by position ('0', '1', etc.)
if "children" in bin_symbol:
bin_children = bin_symbol.get("children", [])
assert len(bin_children) > 0, "[[bin]] should have at least one child element"
# First child is index '0'
first_child = bin_children[0]
assert first_child.get("name") == "0", f"First array element should be named '0', got: {first_child.get('name')}"
# The '0' element should contain name and path as grandchildren
if "children" in first_child:
grandchild_names = {gc.get("name") for gc in first_child.get("children", [])}
assert "name" in grandchild_names, f"[[bin]] element should have 'name' field, got: {grandchild_names}"
assert "path" in grandchild_names, f"[[bin]] element should have 'path' field, got: {grandchild_names}"