Add test files
This commit is contained in:
193
tests/integration/test_full_workflow.py
Normal file
193
tests/integration/test_full_workflow.py
Normal file
@@ -0,0 +1,193 @@
|
||||
import pytest
|
||||
import tempfile
|
||||
import json
|
||||
from pathlib import Path
|
||||
from src.parsers.python import PythonParser
|
||||
from src.parsers.javascript import JavaScriptParser
|
||||
from src.graph.builder import GraphBuilder, GraphType
|
||||
from src.analyzers.complexity import ComplexityCalculator
|
||||
from src.exporters.json_exporter import JSONExporter
|
||||
|
||||
|
||||
class TestFullWorkflow:
|
||||
def test_python_file_analysis(self):
|
||||
with tempfile.TemporaryDirectory() as tmpdir:
|
||||
test_file = Path(tmpdir) / "test.py"
|
||||
test_file.write_text("""
|
||||
def hello(name):
|
||||
if name:
|
||||
print(f"Hello, {name}")
|
||||
else:
|
||||
print("Hello, World")
|
||||
|
||||
class Greeter:
|
||||
def __init__(self, prefix):
|
||||
self.prefix = prefix
|
||||
|
||||
def greet(self, name):
|
||||
if self.prefix and name:
|
||||
return f"{self.prefix} {name}"
|
||||
return "Hello
|
||||
""")
|
||||
|
||||
parser = PythonParser()
|
||||
content = test_file.read_text()
|
||||
result = parser.parse(test_file, content)
|
||||
|
||||
assert result.language == "python"
|
||||
assert len(result.entities) >= 2
|
||||
assert any(e.name == "hello" for e in result.entities)
|
||||
assert any(e.name == "Greeter" for e in result.entities)
|
||||
|
||||
def test_javascript_file_analysis(self):
|
||||
with tempfile.TemporaryDirectory() as tmpdir:
|
||||
test_file = Path(tmpdir) / "test.js"
|
||||
test_file.write_text("""
|
||||
function calculate(a, b) {
|
||||
if (a > 0 && b > 0) {
|
||||
return a + b;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
class Calculator {
|
||||
constructor() {
|
||||
this.value = 0;
|
||||
}
|
||||
|
||||
add(num) {
|
||||
this.value += num;
|
||||
return this.value;
|
||||
}
|
||||
}
|
||||
""")
|
||||
|
||||
parser = JavaScriptParser()
|
||||
content = test_file.read_text()
|
||||
result = parser.parse(test_file, content)
|
||||
|
||||
assert result.language == "javascript"
|
||||
assert len(result.entities) >= 2
|
||||
|
||||
def test_graph_construction(self):
|
||||
with tempfile.TemporaryDirectory() as tmpdir:
|
||||
file1 = Path(tmpdir) / "main.py"
|
||||
file1.write_text("""
|
||||
from utils import helper
|
||||
|
||||
def main():
|
||||
helper()
|
||||
""")
|
||||
|
||||
file2 = Path(tmpdir) / "utils.py"
|
||||
file2.write_text("""
|
||||
def helper():
|
||||
print("Helper")
|
||||
""")
|
||||
|
||||
builder = GraphBuilder(GraphType.DIRECTED)
|
||||
|
||||
parser = PythonParser()
|
||||
results = []
|
||||
for file_path in [file1, file2]:
|
||||
content = file_path.read_text()
|
||||
result = parser.parse(file_path, content)
|
||||
results.append(result)
|
||||
|
||||
builder.build_from_parser_results(results)
|
||||
nodes = builder.get_nodes()
|
||||
|
||||
assert len(nodes) >= 2
|
||||
|
||||
def test_complexity_calculation(self):
|
||||
with tempfile.TemporaryDirectory() as tmpdir:
|
||||
test_file = Path(tmpdir) / "test.py"
|
||||
test_file.write_text("""
|
||||
def complex_function(x, y, z):
|
||||
if x > 0:
|
||||
if y > 0:
|
||||
for i in range(z):
|
||||
if i % 2 == 0:
|
||||
print(i)
|
||||
return True
|
||||
""")
|
||||
|
||||
parser = PythonParser()
|
||||
content = test_file.read_text()
|
||||
result = parser.parse(test_file, content)
|
||||
|
||||
calculator = ComplexityCalculator()
|
||||
|
||||
for entity in result.entities:
|
||||
complexity = calculator.calculate_for_entity(entity)
|
||||
assert complexity["complexity_score"] >= 1
|
||||
|
||||
def test_json_export(self):
|
||||
with tempfile.TemporaryDirectory() as tmpdir:
|
||||
test_file = Path(tmpdir) / "test.py"
|
||||
test_file.write_text("""
|
||||
def simple():
|
||||
pass
|
||||
""")
|
||||
|
||||
parser = PythonParser()
|
||||
content = test_file.read_text()
|
||||
result = parser.parse(test_file, content)
|
||||
|
||||
builder = GraphBuilder(GraphType.DIRECTED)
|
||||
builder.build_from_parser_results([result])
|
||||
|
||||
exporter = JSONExporter(builder)
|
||||
|
||||
output_file = Path(tmpdir) / "output.json"
|
||||
exporter.export(output_file)
|
||||
|
||||
assert output_file.exists()
|
||||
data = json.loads(output_file.read_text())
|
||||
assert "nodes" in data
|
||||
assert "edges" in data
|
||||
|
||||
def test_multi_file_project_analysis(self):
|
||||
with tempfile.TemporaryDirectory() as tmpdir:
|
||||
(Path(tmpdir) / "main.py").write_text("""
|
||||
from module_a import func_a
|
||||
from module_b import func_b
|
||||
|
||||
def main():
|
||||
func_a()
|
||||
func_b()
|
||||
""")
|
||||
|
||||
(Path(tmpdir) / "module_a.py").write_text("""
|
||||
def func_a():
|
||||
pass
|
||||
|
||||
class ClassA:
|
||||
pass
|
||||
""")
|
||||
|
||||
(Path(tmpdir) / "module_b.py").write_text("""
|
||||
def func_b():
|
||||
pass
|
||||
""")
|
||||
|
||||
parser = PythonParser()
|
||||
results = []
|
||||
|
||||
for py_file in Path(tmpdir).glob("*.py"):
|
||||
content = py_file.read_text()
|
||||
result = parser.parse(py_file, content)
|
||||
results.append(result)
|
||||
|
||||
builder = GraphBuilder(GraphType.DIRECTED)
|
||||
builder.build_from_parser_results(results)
|
||||
|
||||
nodes = builder.get_nodes()
|
||||
assert len(nodes) >= 3
|
||||
|
||||
file_nodes = [n for n in nodes if n.node_type.value == "file"]
|
||||
func_nodes = [n for n in nodes if n.node_type.value == "function"]
|
||||
class_nodes = [n for n in nodes if n.node_type.value == "class"]
|
||||
|
||||
assert len(file_nodes) == 3
|
||||
assert len(func_nodes) >= 3
|
||||
Reference in New Issue
Block a user