Fix CI/CD: Add Gitea Actions workflow and fix linting issues
This commit is contained in:
242
tests/test_parsers.py
Normal file
242
tests/test_parsers.py
Normal file
@@ -0,0 +1,242 @@
|
||||
"""Tests for dependency parsers."""
|
||||
|
||||
import tempfile
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
from src.auto_readme.parsers import (
|
||||
PythonDependencyParser,
|
||||
JavaScriptDependencyParser,
|
||||
GoDependencyParser,
|
||||
RustDependencyParser,
|
||||
DependencyParserFactory,
|
||||
)
|
||||
|
||||
|
||||
class TestPythonDependencyParser:
|
||||
"""Tests for PythonDependencyParser."""
|
||||
|
||||
def test_can_parse_requirements_txt(self):
|
||||
"""Test that parser recognizes requirements.txt."""
|
||||
parser = PythonDependencyParser()
|
||||
with tempfile.TemporaryDirectory() as tmp_dir:
|
||||
req_file = Path(tmp_dir) / "requirements.txt"
|
||||
req_file.write_text("requests>=2.31.0\n")
|
||||
assert parser.can_parse(req_file)
|
||||
|
||||
def test_can_parse_pyproject_toml(self):
|
||||
"""Test that parser recognizes pyproject.toml."""
|
||||
parser = PythonDependencyParser()
|
||||
with tempfile.TemporaryDirectory() as tmp_dir:
|
||||
pyproject_file = Path(tmp_dir) / "pyproject.toml"
|
||||
pyproject_file.write_text('[project]\ndependencies = ["requests>=2.0"]')
|
||||
assert parser.can_parse(pyproject_file)
|
||||
|
||||
def test_parse_requirements_txt(self):
|
||||
"""Test parsing requirements.txt file."""
|
||||
with tempfile.TemporaryDirectory() as tmp_dir:
|
||||
req_file = Path(tmp_dir) / "requirements.txt"
|
||||
req_file.write_text("""
|
||||
requests>=2.31.0
|
||||
click>=8.0.0
|
||||
pytest==7.0.0
|
||||
-e git+https://github.com/user/repo.git#egg=package
|
||||
# This is a comment
|
||||
numpy~=1.24.0
|
||||
""")
|
||||
|
||||
parser = PythonDependencyParser()
|
||||
deps = parser.parse(req_file)
|
||||
|
||||
assert len(deps) == 5
|
||||
names = {d.name for d in deps}
|
||||
assert "requests" in names
|
||||
assert "click" in names
|
||||
assert "pytest" in names
|
||||
assert "numpy" in names
|
||||
|
||||
def test_parse_pyproject_toml(self):
|
||||
"""Test parsing pyproject.toml file."""
|
||||
with tempfile.TemporaryDirectory() as tmp_dir:
|
||||
pyproject_file = Path(tmp_dir) / "pyproject.toml"
|
||||
pyproject_file.write_text("""
|
||||
[project]
|
||||
name = "test-project"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"requests>=2.31.0",
|
||||
"click>=8.0.0",
|
||||
]
|
||||
|
||||
[project.optional-dependencies]
|
||||
dev = ["pytest>=7.0.0", "black>=23.0.0"]
|
||||
""")
|
||||
|
||||
parser = PythonDependencyParser()
|
||||
deps = parser.parse(pyproject_file)
|
||||
|
||||
assert len(deps) == 4
|
||||
|
||||
|
||||
class TestJavaScriptDependencyParser:
|
||||
"""Tests for JavaScriptDependencyParser."""
|
||||
|
||||
def test_can_parse_package_json(self):
|
||||
"""Test that parser recognizes package.json."""
|
||||
parser = JavaScriptDependencyParser()
|
||||
with tempfile.TemporaryDirectory() as tmp_dir:
|
||||
package_file = Path(tmp_dir) / "package.json"
|
||||
package_file.write_text('{"name": "test"}')
|
||||
assert parser.can_parse(package_file)
|
||||
|
||||
def test_parse_package_json(self):
|
||||
"""Test parsing package.json file."""
|
||||
with tempfile.TemporaryDirectory() as tmp_dir:
|
||||
package_file = Path(tmp_dir) / "package.json"
|
||||
package_file.write_text("""
|
||||
{
|
||||
"name": "test-project",
|
||||
"version": "1.0.0",
|
||||
"dependencies": {
|
||||
"express": "^4.18.0",
|
||||
"lodash": "~4.17.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"jest": "^29.0.0"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"bcrypt": "^5.0.0"
|
||||
}
|
||||
}
|
||||
""")
|
||||
|
||||
parser = JavaScriptDependencyParser()
|
||||
deps = parser.parse(package_file)
|
||||
|
||||
assert len(deps) == 4
|
||||
|
||||
express = next((d for d in deps if d.name == "express"), None)
|
||||
assert express is not None
|
||||
assert express.version == "4.18.0"
|
||||
assert not express.is_dev
|
||||
|
||||
jest = next((d for d in deps if d.name == "jest"), None)
|
||||
assert jest is not None
|
||||
assert jest.is_dev
|
||||
|
||||
bcrypt = next((d for d in deps if d.name == "bcrypt"), None)
|
||||
assert bcrypt is not None
|
||||
assert bcrypt.is_optional
|
||||
|
||||
|
||||
class TestGoDependencyParser:
|
||||
"""Tests for GoDependencyParser."""
|
||||
|
||||
def test_can_parse_go_mod(self):
|
||||
"""Test that parser recognizes go.mod."""
|
||||
parser = GoDependencyParser()
|
||||
with tempfile.TemporaryDirectory() as tmp_dir:
|
||||
go_mod_file = Path(tmp_dir) / "go.mod"
|
||||
go_mod_file.write_text("module test\n")
|
||||
assert parser.can_parse(go_mod_file)
|
||||
|
||||
def test_parse_go_mod(self):
|
||||
"""Test parsing go.mod file."""
|
||||
with tempfile.TemporaryDirectory() as tmp_dir:
|
||||
go_mod_file = Path(tmp_dir) / "go.mod"
|
||||
go_mod_file.write_text("""
|
||||
module test-go-project
|
||||
|
||||
go 1.21
|
||||
|
||||
require (
|
||||
github.com/gin-gonic/gin v1.9.0
|
||||
github.com/stretchr/testify v1.8.0
|
||||
)
|
||||
|
||||
require github.com/user/repo v1.0.0
|
||||
""")
|
||||
|
||||
parser = GoDependencyParser()
|
||||
deps = parser.parse(go_mod_file)
|
||||
|
||||
assert len(deps) == 3
|
||||
|
||||
gin = next((d for d in deps if d.name == "github.com/gin-gonic/gin"), None)
|
||||
assert gin is not None
|
||||
assert gin.version is not None and "1.9.0" in gin.version
|
||||
|
||||
|
||||
class TestRustDependencyParser:
|
||||
"""Tests for RustDependencyParser."""
|
||||
|
||||
def test_can_parse_cargo_toml(self):
|
||||
"""Test that parser recognizes Cargo.toml."""
|
||||
parser = RustDependencyParser()
|
||||
with tempfile.TemporaryDirectory() as tmp_dir:
|
||||
cargo_file = Path(tmp_dir) / "Cargo.toml"
|
||||
cargo_file.write_text('[package]\nname = "test"')
|
||||
assert parser.can_parse(cargo_file)
|
||||
|
||||
def test_parse_cargo_toml(self):
|
||||
"""Test parsing Cargo.toml file."""
|
||||
with tempfile.TemporaryDirectory() as tmp_dir:
|
||||
cargo_file = Path(tmp_dir) / "Cargo.toml"
|
||||
cargo_file.write_text("""
|
||||
[package]
|
||||
name = "test-project"
|
||||
version = "0.1.0"
|
||||
|
||||
[dependencies]
|
||||
serde = { version = "1.0", features = ["derive"] }
|
||||
tokio = { version = "1.0", features = ["full"] }
|
||||
|
||||
[dev-dependencies]
|
||||
assertions = "0.1"
|
||||
""")
|
||||
|
||||
parser = RustDependencyParser()
|
||||
deps = parser.parse(cargo_file)
|
||||
|
||||
assert len(deps) == 3
|
||||
|
||||
serde = next((d for d in deps if d.name == "serde"), None)
|
||||
assert serde is not None
|
||||
assert serde.version is not None and "1.0" in serde.version
|
||||
assert not serde.is_dev
|
||||
|
||||
assertions = next((d for d in deps if d.name == "assertions"), None)
|
||||
assert assertions is not None
|
||||
assert assertions.is_dev
|
||||
|
||||
|
||||
class TestDependencyParserFactory:
|
||||
"""Tests for DependencyParserFactory."""
|
||||
|
||||
def test_get_parser_python(self):
|
||||
"""Test getting parser for Python file."""
|
||||
parser = DependencyParserFactory.get_parser(Path("requirements.txt"))
|
||||
assert isinstance(parser, PythonDependencyParser)
|
||||
|
||||
def test_get_parser_js(self):
|
||||
"""Test getting parser for JavaScript file."""
|
||||
parser = DependencyParserFactory.get_parser(Path("package.json"))
|
||||
assert isinstance(parser, JavaScriptDependencyParser)
|
||||
|
||||
def test_get_parser_go(self):
|
||||
"""Test getting parser for Go file."""
|
||||
parser = DependencyParserFactory.get_parser(Path("go.mod"))
|
||||
assert isinstance(parser, GoDependencyParser)
|
||||
|
||||
def test_get_parser_rust(self):
|
||||
"""Test getting parser for Rust file."""
|
||||
parser = DependencyParserFactory.get_parser(Path("Cargo.toml"))
|
||||
assert isinstance(parser, RustDependencyParser)
|
||||
|
||||
def test_can_parse(self):
|
||||
"""Test can_parse returns correct results."""
|
||||
assert DependencyParserFactory.can_parse(Path("requirements.txt"))
|
||||
assert DependencyParserFactory.can_parse(Path("package.json"))
|
||||
assert DependencyParserFactory.can_parse(Path("go.mod"))
|
||||
assert DependencyParserFactory.can_parse(Path("Cargo.toml"))
|
||||
assert not DependencyParserFactory.can_parse(Path("random.txt"))
|
||||
Reference in New Issue
Block a user