import pytest from prometheus.graph.knowledge_graph import KnowledgeGraph from prometheus.tools.graph_traversal import GraphTraversalTool from tests.test_utils import test_project_paths @pytest.fixture(scope="function") async def knowledge_graph_fixture(): kg = KnowledgeGraph(1000, 100, 10, 0) await kg.build_graph(test_project_paths.TEST_PROJECT_PATH) return kg @pytest.fixture(scope="function") def graph_traversal_tool(knowledge_graph_fixture): graph_traversal_tool = GraphTraversalTool(knowledge_graph_fixture) return graph_traversal_tool @pytest.mark.slow async def test_find_file_node_with_basename(graph_traversal_tool): result = graph_traversal_tool.find_file_node_with_basename(test_project_paths.PYTHON_FILE.name) basename = test_project_paths.PYTHON_FILE.name relative_path = str( test_project_paths.PYTHON_FILE.relative_to(test_project_paths.TEST_PROJECT_PATH).as_posix() ) result_data = result[1] assert len(result_data) == 1 assert "FileNode" in result_data[0] assert result_data[0]["FileNode"].get("basename", "") == basename assert result_data[0]["FileNode"].get("relative_path", "") == relative_path @pytest.mark.slow async def test_find_file_node_with_relative_path(graph_traversal_tool): relative_path = str( test_project_paths.MD_FILE.relative_to(test_project_paths.TEST_PROJECT_PATH).as_posix() ) result = graph_traversal_tool.find_file_node_with_relative_path(relative_path) basename = test_project_paths.MD_FILE.name result_data = result[1] assert len(result_data) == 1 assert "FileNode" in result_data[0] assert result_data[0]["FileNode"].get("basename", "") == basename assert result_data[0]["FileNode"].get("relative_path", "") == relative_path @pytest.mark.slow async def test_find_ast_node_with_text_in_file_with_basename(graph_traversal_tool): basename = test_project_paths.PYTHON_FILE.name result = graph_traversal_tool.find_ast_node_with_text_in_file_with_basename( "Hello world!", basename ) result_data = result[1] assert len(result_data) > 0 for result_row in result_data: assert "ASTNode" in result_row assert "Hello world!" in result_row["ASTNode"].get("text", "") assert "FileNode" in result_row assert result_row["FileNode"].get("basename", "") == basename @pytest.mark.slow async def test_find_ast_node_with_text_in_file_with_relative_path(graph_traversal_tool): relative_path = str( test_project_paths.C_FILE.relative_to(test_project_paths.TEST_PROJECT_PATH).as_posix() ) result = graph_traversal_tool.find_ast_node_with_text_in_file_with_relative_path( "Hello world!", relative_path ) result_data = result[1] assert len(result_data) > 0 for result_row in result_data: assert "ASTNode" in result_row assert "Hello world!" in result_row["ASTNode"].get("text", "") assert "FileNode" in result_row assert result_row["FileNode"].get("relative_path", "") == relative_path @pytest.mark.slow async def test_find_ast_node_with_type_in_file_with_basename(graph_traversal_tool): basename = test_project_paths.C_FILE.name node_type = "function_definition" result = graph_traversal_tool.find_ast_node_with_type_in_file_with_basename(node_type, basename) result_data = result[1] assert len(result_data) > 0 for result_row in result_data: assert "ASTNode" in result_row assert result_row["ASTNode"].get("type", "") == node_type assert "FileNode" in result_row assert result_row["FileNode"].get("basename", "") == basename @pytest.mark.slow async def test_find_ast_node_with_type_in_file_with_relative_path(graph_traversal_tool): relative_path = str( test_project_paths.JAVA_FILE.relative_to(test_project_paths.TEST_PROJECT_PATH).as_posix() ) node_type = "string_literal" result = graph_traversal_tool.find_ast_node_with_type_in_file_with_relative_path( node_type, relative_path ) result_data = result[1] assert len(result_data) > 0 for result_row in result_data: assert "ASTNode" in result_row assert result_row["ASTNode"].get("type", "") == node_type assert "FileNode" in result_row assert result_row["FileNode"].get("relative_path", "") == relative_path @pytest.mark.slow async def test_find_text_node_with_text(graph_traversal_tool): text = "Text under header C" result = graph_traversal_tool.find_text_node_with_text(text) result_data = result[1] assert len(result_data) > 0 for result_row in result_data: assert "TextNode" in result_row assert text in result_row["TextNode"].get("text", "") assert "start_line" in result_row["TextNode"] assert result_row["TextNode"]["start_line"] == 1 assert "end_line" in result_row["TextNode"] assert result_row["TextNode"]["end_line"] == 13 assert "FileNode" in result_row assert result_row["FileNode"].get("relative_path", "") == "foo/test.md" @pytest.mark.slow async def test_find_text_node_with_text_in_file(graph_traversal_tool): basename = test_project_paths.MD_FILE.name text = "Text under header B" result = graph_traversal_tool.find_text_node_with_text_in_file(text, basename) result_data = result[1] assert len(result_data) > 0 for result_row in result_data: assert "TextNode" in result_row assert text in result_row["TextNode"].get("text", "") assert "start_line" in result_row["TextNode"] assert result_row["TextNode"]["start_line"] == 1 assert "end_line" in result_row["TextNode"] assert result_row["TextNode"]["end_line"] == 13 assert "FileNode" in result_row assert result_row["FileNode"].get("basename", "") == basename @pytest.mark.slow async def test_get_next_text_node_with_node_id(graph_traversal_tool): node_id = 34 result = graph_traversal_tool.get_next_text_node_with_node_id(node_id) result_data = result[1] assert len(result_data) > 0 for result_row in result_data: assert "TextNode" in result_row assert "Text under header D" in result_row["TextNode"].get("text", "") assert "start_line" in result_row["TextNode"] assert result_row["TextNode"]["start_line"] == 13 assert "end_line" in result_row["TextNode"] assert result_row["TextNode"]["end_line"] == 15 assert "FileNode" in result_row assert result_row["FileNode"].get("relative_path", "") == "foo/test.md" @pytest.mark.slow async def test_read_code_with_relative_path(graph_traversal_tool): relative_path = str( test_project_paths.C_FILE.relative_to(test_project_paths.TEST_PROJECT_PATH).as_posix() ) result = graph_traversal_tool.read_code_with_relative_path(relative_path, 5, 6) result_data = result[1] assert len(result_data) > 0 for result_row in result_data: assert "SelectedLines" in result_row assert "return 0;" in result_row["SelectedLines"].get("text", "") assert "FileNode" in result_row assert result_row["FileNode"].get("relative_path", "") == relative_path