Add test files: conftest, test_cli, test_parsers
This commit is contained in:
174
tests/test_parsers.py
Normal file
174
tests/test_parsers.py
Normal file
@@ -0,0 +1,174 @@
|
||||
import pytest
|
||||
from pathlib import Path
|
||||
import tempfile
|
||||
import os
|
||||
|
||||
from config_auditor.discovery import ConfigDiscovery
|
||||
from config_auditor.parsers import ParserFactory, JsonParser, YamlParser, TomlParser
|
||||
from config_auditor.rules import (
|
||||
RuleRegistry,
|
||||
DeprecatedPackageRule,
|
||||
OutdatedVersionRule,
|
||||
MissingTypeCheckingRule,
|
||||
SecurityVulnerabilityRule,
|
||||
MissingScriptsRule,
|
||||
PythonProjectMetaRule,
|
||||
)
|
||||
|
||||
|
||||
class TestConfigDiscovery:
|
||||
def test_discover_json_files(self):
|
||||
with tempfile.TemporaryDirectory() as tmpdir:
|
||||
(Path(tmpdir) / "package.json").write_text('{"name": "test"}')
|
||||
(Path(tmpdir) / "tsconfig.json").write_text('{"compilerOptions": {}}')
|
||||
|
||||
discovery = ConfigDiscovery(max_depth=2)
|
||||
configs = discovery.discover(Path(tmpdir))
|
||||
|
||||
assert len(configs) >= 2
|
||||
|
||||
def test_discover_nested_files(self):
|
||||
with tempfile.TemporaryDirectory() as tmpdir:
|
||||
nested = Path(tmpdir) / "src"
|
||||
nested.mkdir()
|
||||
(nested / "tsconfig.json").write_text('{"compilerOptions": {}}')
|
||||
|
||||
discovery = ConfigDiscovery(max_depth=3)
|
||||
configs = discovery.discover(Path(tmpdir))
|
||||
|
||||
assert len(configs) == 1
|
||||
|
||||
def test_no_files_found(self):
|
||||
with tempfile.TemporaryDirectory() as tmpdir:
|
||||
discovery = ConfigDiscovery(max_depth=2)
|
||||
configs = discovery.discover(Path(tmpdir))
|
||||
|
||||
assert len(configs) == 0
|
||||
|
||||
|
||||
class TestParsers:
|
||||
def test_json_parse_valid(self):
|
||||
parser = JsonParser()
|
||||
content = '{"name": "test", "version": "1.0.0"}'
|
||||
result = parser.parse(content)
|
||||
|
||||
assert result is not None
|
||||
assert result["name"] == "test"
|
||||
assert result["version"] == "1.0.0"
|
||||
|
||||
def test_json_parse_invalid(self):
|
||||
parser = JsonParser()
|
||||
content = "not valid json"
|
||||
result = parser.parse(content)
|
||||
|
||||
assert result is None
|
||||
|
||||
def test_yaml_parse_valid(self):
|
||||
parser = YamlParser()
|
||||
content = "key: value\nlist:\n - item1\n - item2"
|
||||
result = parser.parse(content)
|
||||
|
||||
assert result is not None
|
||||
assert result["key"] == "value"
|
||||
assert len(result["list"]) == 2
|
||||
|
||||
def test_toml_parse_valid(self):
|
||||
parser = TomlParser()
|
||||
content = 'name = "test"\nversion = "1.0.0"'
|
||||
result = parser.parse(content)
|
||||
|
||||
assert result is not None
|
||||
assert result["name"] == "test"
|
||||
|
||||
def test_parser_factory(self):
|
||||
factory = ParserFactory()
|
||||
|
||||
json_result = factory.parse("json", '{"test": true}')
|
||||
assert json_result is not None
|
||||
|
||||
yaml_result = factory.parse("yaml", "test: value")
|
||||
assert yaml_result is not None
|
||||
|
||||
toml_result = factory.parse("toml", 'test = true')
|
||||
assert toml_result is not None
|
||||
|
||||
|
||||
class TestRules:
|
||||
def test_deprecated_package_rule(self):
|
||||
rule = DeprecatedPackageRule()
|
||||
data = {"dependencies": {"request": "^2.0.0"}}
|
||||
result = rule.evaluate(data, Path("package.json"))
|
||||
|
||||
assert result.passed is False
|
||||
assert "deprecated" in result.message.lower()
|
||||
|
||||
def test_no_deprecated_packages(self):
|
||||
rule = DeprecatedPackageRule()
|
||||
data = {"dependencies": {"express": "^4.0.0"}}
|
||||
result = rule.evaluate(data, Path("package.json"))
|
||||
|
||||
assert result.passed is True
|
||||
|
||||
def test_outdated_version_rule(self):
|
||||
rule = OutdatedVersionRule()
|
||||
data = {"dependencies": {"express": "^0.1.0"}}
|
||||
result = rule.evaluate(data, Path("package.json"))
|
||||
|
||||
assert result.passed is False
|
||||
|
||||
def test_missing_type_checking_rule(self):
|
||||
rule = MissingTypeCheckingRule()
|
||||
data = {"compilerOptions": {"strict": False}}
|
||||
result = rule.evaluate(data, Path("tsconfig.json"))
|
||||
|
||||
assert result.passed is False
|
||||
|
||||
def test_strict_mode_enabled(self):
|
||||
rule = MissingTypeCheckingRule()
|
||||
data = {"compilerOptions": {"strict": True}}
|
||||
result = rule.evaluate(data, Path("tsconfig.json"))
|
||||
|
||||
assert result.passed is True
|
||||
|
||||
def test_missing_scripts_rule(self):
|
||||
rule = MissingScriptsRule()
|
||||
data = {"scripts": {}}
|
||||
result = rule.evaluate(data, Path("package.json"))
|
||||
|
||||
assert result.passed is False
|
||||
|
||||
def test_all_scripts_present(self):
|
||||
rule = MissingScriptsRule()
|
||||
data = {"scripts": {"test": "jest", "build": "tsc"}}
|
||||
result = rule.evaluate(data, Path("package.json"))
|
||||
|
||||
assert result.passed is True
|
||||
|
||||
def test_python_project_meta_rule(self):
|
||||
rule = PythonProjectMetaRule()
|
||||
data = {"tool": {"poetry": {"name": "test", "version": "1.0.0"}}}
|
||||
result = rule.evaluate(data, Path("pyproject.toml"))
|
||||
|
||||
assert result.passed is True
|
||||
|
||||
|
||||
class TestRuleRegistry:
|
||||
def test_evaluate_json_config(self):
|
||||
registry = RuleRegistry()
|
||||
data = {
|
||||
"dependencies": {"request": "^2.0.0"},
|
||||
"scripts": {}
|
||||
}
|
||||
issues = registry.evaluate("json", data, Path("package.json"))
|
||||
|
||||
issue_categories = [i.category for i in issues]
|
||||
assert "deprecated-package" in issue_categories
|
||||
assert "missing-scripts" in issue_categories
|
||||
|
||||
def test_empty_config_has_warnings(self):
|
||||
registry = RuleRegistry()
|
||||
issues = registry.evaluate("json", {}, Path("package.json"))
|
||||
|
||||
assert len(issues) > 0
|
||||
categories = [i.category for i in issues]
|
||||
assert "missing-scripts" in categories
|
||||
Reference in New Issue
Block a user