from unittest.mock import patch from click.testing import CliRunner from pathlib import Path import tempfile import json @pytest.fixture def runner(): return CliRunner() class TestCLI: def test_version_option(self, runner): from depaudit.cli import main result = runner.invoke(main, ["--version"]) assert result.exit_code == 0 assert "1.0.0" in result.output def test_audit_command_exists(self, runner): from depaudit.cli import main result = runner.invoke(main, ["--help"]) assert result.exit_code == 0 assert "audit" in result.output.lower() class TestAuditCommand: def test_audit_no_path(self, runner): from depaudit.cli import audit with tempfile.TemporaryDirectory() as tmpdir: result = runner.invoke(audit, [tmpdir]) assert result.exit_code == 0 def test_audit_single_file(self, runner): from depaudit.cli import audit with tempfile.TemporaryDirectory() as tmpdir: pkg_file = Path(tmpdir) / "package.json" pkg_file.write_text(json.dumps({ "name": "test", "version": "1.0.0", "dependencies": {} })) result = runner.invoke(audit, [str(pkg_file)]) assert result.exit_code == 0 class TestGenerateCICDCommand: def test_generate_github_workflow(self, runner): from depaudit.cli import generate_cicd with tempfile.TemporaryDirectory() as tmpdir: result = runner.invoke(generate_cicd, ["github", tmpdir]) assert result.exit_code == 0 class TestParseCommand: def test_parse_package_json(self, runner): from depaudit.cli import parse with tempfile.TemporaryDirectory() as tmpdir: pkg_file = Path(tmpdir) / "package.json" pkg_file.write_text(json.dumps({ "name": "test-project", "version": "1.0.0", "dependencies": {"express": "^4.0.0"} })) result = runner.invoke(parse, [str(pkg_file)]) assert result.exit_code == 0 assert "test-project" in result.output