Add test files
Some checks failed
CI / test (push) Failing after 48s
CI / build (push) Has been skipped

This commit is contained in:
2026-02-02 02:43:08 +00:00
parent db00b23b10
commit c53c5ee157

View 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