Files
codebase-knowledge-graph-cli/tests/unit/test_parsers.py
7000pctAUTO c0ca28a962
Some checks failed
CI / test (push) Has been cancelled
CI / build (push) Has been cancelled
fix: resolve CI/CD issues - remove unused imports and fix type mismatches
2026-02-02 02:56:11 +00:00

208 lines
5.7 KiB
Python

from pathlib import Path
from src.parsers.base import BaseParser, Entity, EntityType, ParserResult
from src.parsers.python import PythonParser
from src.parsers.javascript import JavaScriptParser
from src.parsers.go import GoParser
from src.parsers.rust import RustParser
class TestBaseParser:
def test_entity_creation(self):
entity = Entity(
name="test_func",
entity_type=EntityType.FUNCTION,
file_path=Path("/test/file.py"),
start_line=1,
end_line=10,
code="def test_func(): pass",
)
assert entity.name == "test_func"
assert entity.entity_type == EntityType.FUNCTION
assert entity.start_line == 1
assert entity.end_line == 10
def test_parser_result(self):
result = ParserResult(
file_path=Path("/test/file.py"),
language="python",
)
assert result.file_path == Path("/test/file.py")
assert result.language == "python"
assert result.entities == []
assert result.imports == []
class TestPythonParser:
def setup_method(self):
self.parser = PythonParser()
def test_parse_simple_function(self):
code = """
def hello():
print("Hello, World!")
"""
result = self.parser.parse(Path("/test.py"), code)
assert result.language == "python"
assert len(result.entities) >= 1
def test_parse_class_with_methods(self):
code = """
class MyClass:
def method1(self):
pass
def method2(self):
pass
"""
result = self.parser.parse(Path("/test.py"), code)
assert result.language == "python"
class_entities = [e for e in result.entities if e.entity_type == EntityType.CLASS]
assert len(class_entities) == 1
def test_extract_imports(self):
code = """
import os
import sys
from pathlib import Path
"""
result = self.parser.parse(Path("/test.py"), code)
assert "os" in result.imports
assert "sys" in result.imports
def test_can_parse_py_file(self):
assert self.parser.can_parse(Path("/test.py"))
assert self.parser.can_parse(Path("/test.pyi"))
assert not self.parser.can_parse(Path("/test.js"))
class TestJavaScriptParser:
def setup_method(self):
self.parser = JavaScriptParser()
def test_parse_function(self):
code = """
function hello() {
console.log("Hello");
}
"""
result = self.parser.parse(Path("/test.js"), code)
assert result.language == "javascript"
assert len(result.entities) >= 1
def test_parse_arrow_function(self):
code = """
const add = (a, b) => a + b;
"""
result = self.parser.parse(Path("/test.js"), code)
assert result.language == "javascript"
def test_parse_class(self):
code = """
class MyClass {
constructor() {}
method1() {}
}
"""
result = self.parser.parse(Path("/test.js"), code)
class_entities = [e for e in result.entities if e.entity_type == EntityType.CLASS]
assert len(class_entities) == 1
def test_can_parse_js_file(self):
assert self.parser.can_parse(Path("/test.js"))
assert self.parser.can_parse(Path("/test.jsx"))
assert not self.parser.can_parse(Path("/test.py"))
class TestGoParser:
def setup_method(self):
self.parser = GoParser()
def test_parse_function(self):
code = """
func hello() {
fmt.Println("Hello")
}
"""
result = self.parser.parse(Path("/test.go"), code)
assert result.language == "go"
assert len(result.entities) >= 1
def test_parse_struct(self):
code = """
type Person struct {
Name string
Age int
}
"""
result = self.parser.parse(Path("/test.go"), code)
assert result.language == "go"
def test_can_parse_go_file(self):
assert self.parser.can_parse(Path("/test.go"))
assert not self.parser.can_parse(Path("/test.py"))
class TestRustParser:
def setup_method(self):
self.parser = RustParser()
def test_parse_function(self):
code = """
fn hello() {
println!("Hello");
}
"""
result = self.parser.parse(Path("/test.rs"), code)
assert result.language == "rust"
assert len(result.entities) >= 1
def test_parse_struct(self):
code = """
struct Person {
name: String,
age: u32,
}
"""
result = self.parser.parse(Path("/test.rs"), code)
assert result.language == "rust"
def test_parse_trait(self):
code = """
trait Drawable {
fn draw(&self);
}
"""
result = self.parser.parse(Path("/test.rs"), code)
assert result.language == "rust"
def test_can_parse_rs_file(self):
assert self.parser.can_parse(Path("/test.rs"))
assert not self.parser.can_parse(Path("/test.py"))
class TestParserFactory:
def test_get_parser_for_python_file(self):
parser = BaseParser.get_parser_for_file(Path("/test.py"))
assert parser is not None
assert isinstance(parser, PythonParser)
def test_get_parser_for_js_file(self):
parser = BaseParser.get_parser_for_file(Path("/test.js"))
assert parser is not None
assert isinstance(parser, JavaScriptParser)
def test_get_parser_for_go_file(self):
parser = BaseParser.get_parser_for_file(Path("/test.go"))
assert parser is not None
assert isinstance(parser, GoParser)
def test_get_parser_for_rs_file(self):
parser = BaseParser.get_parser_for_file(Path("/test.rs"))
assert parser is not None
assert isinstance(parser, RustParser)
def test_get_parser_returns_none_for_unknown(self):
parser = BaseParser.get_parser_for_file(Path("/test.xyz"))
assert parser is None