150 lines
5.0 KiB
Python
150 lines
5.0 KiB
Python
import json
|
|
import pytest
|
|
from pathlib import Path
|
|
|
|
from depaudit.parsers import Parser, ParsedManifest
|
|
from depaudit.parsers.javascript import JavaScriptParser
|
|
from depaudit.parsers.python import PythonParser
|
|
from depaudit.parsers.go import GoParser
|
|
from depaudit.parsers.rust import RustParser
|
|
from depaudit.parsers.java import JavaParser
|
|
|
|
|
|
class TestJavaScriptParser:
|
|
def test_can_parse_package_json(self, temp_dir, sample_package_json):
|
|
parser = JavaScriptParser()
|
|
file_path = temp_dir / "package.json"
|
|
file_path.write_text(json.dumps(sample_package_json))
|
|
assert parser.can_parse(file_path) is True
|
|
|
|
def test_can_parse_package_lock_json(self, temp_dir):
|
|
parser = JavaScriptParser()
|
|
file_path = temp_dir / "package-lock.json"
|
|
file_path.write_text("{}")
|
|
assert parser.can_parse(file_path) is True
|
|
|
|
def test_parse_package_json(self, temp_dir, sample_package_json):
|
|
parser = JavaScriptParser()
|
|
file_path = temp_dir / "package.json"
|
|
file_path.write_text(json.dumps(sample_package_json))
|
|
|
|
manifest = parser.parse(file_path)
|
|
|
|
assert manifest.language == "javascript"
|
|
assert manifest.project_name == "test-project"
|
|
assert manifest.project_version == "1.0.0"
|
|
assert len(manifest.dependencies) == 4
|
|
|
|
dep_names = {d.name for d in manifest.dependencies}
|
|
assert "express" in dep_names
|
|
assert "lodash" in dep_names
|
|
assert "jest" in dep_names
|
|
assert "fsevents" in dep_names
|
|
|
|
|
|
class TestPythonParser:
|
|
def test_can_parse_requirements_txt(self, temp_dir):
|
|
parser = PythonParser()
|
|
file_path = temp_dir / "requirements.txt"
|
|
file_path.write_text("")
|
|
assert parser.can_parse(file_path) is True
|
|
|
|
def test_can_parse_pyproject_toml(self, temp_dir):
|
|
parser = PythonParser()
|
|
file_path = temp_dir / "pyproject.toml"
|
|
file_path.write_text("")
|
|
assert parser.can_parse(file_path) is True
|
|
|
|
def test_parse_requirements_txt(self, temp_dir, sample_requirements_txt):
|
|
parser = PythonParser()
|
|
file_path = temp_dir / "requirements.txt"
|
|
file_path.write_text(sample_requirements_txt)
|
|
|
|
manifest = parser.parse(file_path)
|
|
|
|
assert manifest.language == "python"
|
|
dep_names = {d.name for d in manifest.dependencies}
|
|
assert "requests" in dep_names
|
|
assert "flask" in dep_names
|
|
assert "pytest" in dep_names
|
|
|
|
|
|
class TestGoParser:
|
|
def test_can_parse_go_mod(self, temp_dir):
|
|
parser = GoParser()
|
|
file_path = temp_dir / "go.mod"
|
|
file_path.write_text("")
|
|
assert parser.can_parse(file_path) is True
|
|
|
|
def test_parse_go_mod(self, temp_dir, sample_go_mod):
|
|
parser = GoParser()
|
|
file_path = temp_dir / "go.mod"
|
|
file_path.write_text(sample_go_mod)
|
|
|
|
manifest = parser.parse(file_path)
|
|
|
|
assert manifest.language == "go"
|
|
assert "github.com/test/project" in (manifest.project_name or "")
|
|
|
|
dep_names = {d.name for d in manifest.dependencies}
|
|
assert "github.com/gin-gonic/gin" in dep_names
|
|
assert "github.com/spf13/viper" in dep_names
|
|
|
|
|
|
class TestRustParser:
|
|
def test_can_parse_cargo_toml(self, temp_dir):
|
|
parser = RustParser()
|
|
file_path = temp_dir / "Cargo.toml"
|
|
file_path.write_text("")
|
|
assert parser.can_parse(file_path) is True
|
|
|
|
def test_parse_cargo_toml(self, temp_dir, sample_cargo_toml):
|
|
parser = RustParser()
|
|
file_path = temp_dir / "Cargo.toml"
|
|
file_path.write_text(sample_cargo_toml)
|
|
|
|
manifest = parser.parse(file_path)
|
|
|
|
assert manifest.language == "rust"
|
|
assert manifest.project_name == "test-project"
|
|
|
|
dep_names = {d.name for d in manifest.dependencies}
|
|
assert "serde" in dep_names
|
|
assert "tokio" in dep_names
|
|
|
|
|
|
class TestJavaParser:
|
|
def test_can_parse_pom_xml(self, temp_dir):
|
|
parser = JavaParser()
|
|
file_path = temp_dir / "pom.xml"
|
|
file_path.write_text("")
|
|
assert parser.can_parse(file_path) is True
|
|
|
|
def test_parse_pom_xml(self, temp_dir, sample_pom_xml):
|
|
parser = JavaParser()
|
|
file_path = temp_dir / "pom.xml"
|
|
file_path.write_text(sample_pom_xml)
|
|
|
|
manifest = parser.parse(file_path)
|
|
|
|
assert manifest.language == "java"
|
|
assert "com.example" in (manifest.project_name or "")
|
|
|
|
|
|
class TestParserFactory:
|
|
def test_get_parser_for_package_json(self, temp_dir):
|
|
from depaudit.parsers.factory import ParserFactory
|
|
file_path = temp_dir / "package.json"
|
|
file_path.write_text("{}")
|
|
parser = ParserFactory.get_parser(file_path)
|
|
assert parser is not None
|
|
assert isinstance(parser, JavaScriptParser)
|
|
|
|
def test_get_parser_for_requirements_txt(self, temp_dir):
|
|
from depaudit.parsers.factory import ParserFactory
|
|
file_path = temp_dir / "requirements.txt"
|
|
file_path.write_text("")
|
|
parser = ParserFactory.get_parser(file_path)
|
|
assert parser is not None
|
|
assert isinstance(parser, PythonParser)
|