238 lines
6.9 KiB
Python
238 lines
6.9 KiB
Python
"""Unit tests for analyzers."""
|
|
|
|
import tempfile
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
from vibeguard.analyzers.languages.python import PythonAnalyzer
|
|
from vibeguard.analyzers.languages.javascript import JavaScriptAnalyzer
|
|
from vibeguard.analyzers.languages.typescript import TypeScriptAnalyzer
|
|
from vibeguard.analyzers.languages.go import GoAnalyzer
|
|
from vibeguard.analyzers.languages.rust import RustAnalyzer
|
|
from vibeguard.analyzers.factory import AnalyzerFactory
|
|
|
|
|
|
class TestPythonAnalyzer:
|
|
"""Tests for Python analyzer."""
|
|
|
|
def setup_method(self):
|
|
"""Set up test fixtures."""
|
|
self.analyzer = PythonAnalyzer()
|
|
|
|
def test_parse_valid_python(self):
|
|
"""Test parsing valid Python code."""
|
|
code = """
|
|
def hello():
|
|
return "world"
|
|
"""
|
|
with tempfile.NamedTemporaryFile(mode="w", suffix=".py", delete=False) as f:
|
|
f.write(code)
|
|
f.flush()
|
|
|
|
try:
|
|
tree = self.analyzer.parse_file(Path(f.name))
|
|
assert tree is not None
|
|
finally:
|
|
Path(f.name).unlink()
|
|
|
|
def test_parse_invalid_python(self):
|
|
"""Test parsing invalid Python code returns None."""
|
|
code = """
|
|
def hello()
|
|
return "world"
|
|
"""
|
|
with tempfile.NamedTemporaryFile(mode="w", suffix=".py", delete=False) as f:
|
|
f.write(code)
|
|
f.flush()
|
|
|
|
try:
|
|
tree = self.analyzer.parse_file(Path(f.name))
|
|
assert tree is None
|
|
finally:
|
|
Path(f.name).unlink()
|
|
|
|
def test_get_language(self):
|
|
"""Test getting language name."""
|
|
assert self.analyzer.get_language() == "python"
|
|
|
|
def test_supports_extension(self):
|
|
"""Test extension checking."""
|
|
assert self.analyzer.supports_extension(".py")
|
|
assert self.analyzer.supports_extension(".pyi")
|
|
assert not self.analyzer.supports_extension(".js")
|
|
|
|
|
|
class TestJavaScriptAnalyzer:
|
|
"""Tests for JavaScript analyzer."""
|
|
|
|
def setup_method(self):
|
|
"""Set up test fixtures."""
|
|
self.analyzer = JavaScriptAnalyzer()
|
|
|
|
def test_parse_javascript(self):
|
|
"""Test parsing JavaScript code."""
|
|
code = """
|
|
function hello() {
|
|
return "world";
|
|
}
|
|
"""
|
|
with tempfile.NamedTemporaryFile(mode="w", suffix=".js", delete=False) as f:
|
|
f.write(code)
|
|
f.flush()
|
|
|
|
try:
|
|
content = self.analyzer.parse_file(Path(f.name))
|
|
assert content is not None
|
|
finally:
|
|
Path(f.name).unlink()
|
|
|
|
def test_get_language(self):
|
|
"""Test getting language name."""
|
|
assert self.analyzer.get_language() == "javascript"
|
|
|
|
|
|
class TestTypeScriptAnalyzer:
|
|
"""Tests for TypeScript analyzer."""
|
|
|
|
def setup_method(self):
|
|
"""Set up test fixtures."""
|
|
self.analyzer = TypeScriptAnalyzer()
|
|
|
|
def test_parse_typescript(self):
|
|
"""Test parsing TypeScript code."""
|
|
code = """
|
|
function hello(): string {
|
|
return "world";
|
|
}
|
|
"""
|
|
with tempfile.NamedTemporaryFile(mode="w", suffix=".ts", delete=False) as f:
|
|
f.write(code)
|
|
f.flush()
|
|
|
|
try:
|
|
content = self.analyzer.parse_file(Path(f.name))
|
|
assert content is not None
|
|
finally:
|
|
Path(f.name).unlink()
|
|
|
|
def test_get_language(self):
|
|
"""Test getting language name."""
|
|
assert self.analyzer.get_language() == "typescript"
|
|
|
|
|
|
class TestGoAnalyzer:
|
|
"""Tests for Go analyzer."""
|
|
|
|
def setup_method(self):
|
|
"""Set up test fixtures."""
|
|
self.analyzer = GoAnalyzer()
|
|
|
|
def test_parse_go(self):
|
|
"""Test parsing Go code."""
|
|
code = """
|
|
package main
|
|
|
|
func hello() string {
|
|
return "world"
|
|
}
|
|
"""
|
|
with tempfile.NamedTemporaryFile(mode="w", suffix=".go", delete=False) as f:
|
|
f.write(code)
|
|
f.flush()
|
|
|
|
try:
|
|
content = self.analyzer.parse_file(Path(f.name))
|
|
assert content is not None
|
|
finally:
|
|
Path(f.name).unlink()
|
|
|
|
def test_get_language(self):
|
|
"""Test getting language name."""
|
|
assert self.analyzer.get_language() == "go"
|
|
|
|
|
|
class TestRustAnalyzer:
|
|
"""Tests for Rust analyzer."""
|
|
|
|
def setup_method(self):
|
|
"""Set up test fixtures."""
|
|
self.analyzer = RustAnalyzer()
|
|
|
|
def test_parse_rust(self):
|
|
"""Test parsing Rust code."""
|
|
code = """
|
|
fn hello() -> &'static str {
|
|
return "world";
|
|
}
|
|
"""
|
|
with tempfile.NamedTemporaryFile(mode="w", suffix=".rs", delete=False) as f:
|
|
f.write(code)
|
|
f.flush()
|
|
|
|
try:
|
|
content = self.analyzer.parse_file(Path(f.name))
|
|
assert content is not None
|
|
finally:
|
|
Path(f.name).unlink()
|
|
|
|
def test_get_language(self):
|
|
"""Test getting language name."""
|
|
assert self.analyzer.get_language() == "rust"
|
|
|
|
|
|
class TestAnalyzerFactory:
|
|
"""Tests for analyzer factory."""
|
|
|
|
def test_get_python_analyzer(self):
|
|
"""Test getting Python analyzer."""
|
|
analyzer = AnalyzerFactory.get_analyzer(Path("test.py"))
|
|
assert analyzer is not None
|
|
assert analyzer.get_language() == "python"
|
|
|
|
def test_get_javascript_analyzer(self):
|
|
"""Test getting JavaScript analyzer."""
|
|
analyzer = AnalyzerFactory.get_analyzer(Path("test.js"))
|
|
assert analyzer is not None
|
|
assert analyzer.get_language() == "javascript"
|
|
|
|
def test_get_typescript_analyzer(self):
|
|
"""Test getting TypeScript analyzer."""
|
|
analyzer = AnalyzerFactory.get_analyzer(Path("test.ts"))
|
|
assert analyzer is not None
|
|
assert analyzer.get_language() == "typescript"
|
|
|
|
def test_get_go_analyzer(self):
|
|
"""Test getting Go analyzer."""
|
|
analyzer = AnalyzerFactory.get_analyzer(Path("test.go"))
|
|
assert analyzer is not None
|
|
assert analyzer.get_language() == "go"
|
|
|
|
def test_get_rust_analyzer(self):
|
|
"""Test getting Rust analyzer."""
|
|
analyzer = AnalyzerFactory.get_analyzer(Path("test.rs"))
|
|
assert analyzer is not None
|
|
assert analyzer.get_language() == "rust"
|
|
|
|
def test_get_unsupported_file(self):
|
|
"""Test getting analyzer for unsupported file."""
|
|
analyzer = AnalyzerFactory.get_analyzer(Path("test.txt"))
|
|
assert analyzer is None
|
|
|
|
def test_get_supported_languages(self):
|
|
"""Test getting supported languages."""
|
|
languages = AnalyzerFactory.get_supported_languages()
|
|
assert "python" in languages
|
|
assert "javascript" in languages
|
|
assert "typescript" in languages
|
|
assert "go" in languages
|
|
assert "rust" in languages
|
|
|
|
def test_get_supported_extensions(self):
|
|
"""Test getting supported extensions."""
|
|
extensions = AnalyzerFactory.get_supported_extensions()
|
|
assert ".py" in extensions
|
|
assert ".js" in extensions
|
|
assert ".ts" in extensions
|
|
assert ".go" in extensions
|
|
assert ".rs" in extensions
|