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)