feat: parse API Viewer source artifacts
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
"""Tests for safe API Viewer source parsing."""
|
||||
|
||||
import json
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
|
||||
from app.contracts.source import ApiViewerParser, LocalFileImporter, SourceError
|
||||
|
||||
FIXTURE = Path(__file__).parents[1] / "fixtures" / "api-viewer" / "pve-9.2.3-version.json"
|
||||
|
||||
|
||||
def test_parse_saved_json_fixture() -> None:
|
||||
parsed = ApiViewerParser().parse(FIXTURE.read_bytes())
|
||||
|
||||
assert parsed.nodes[0]["path"] == "/version"
|
||||
assert parsed.warnings == ()
|
||||
|
||||
|
||||
def test_extract_api_schema_without_executing_trailing_javascript() -> None:
|
||||
raw = b'const apiSchema = [{"path":"/x]y","leaf":1}]; throw new Error("no");'
|
||||
|
||||
parsed = ApiViewerParser().parse(raw)
|
||||
|
||||
assert parsed.nodes[0]["path"] == "/x]y"
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"raw, message",
|
||||
[
|
||||
(b"", "empty"),
|
||||
(b"const other = [];", "not found"),
|
||||
(b"const apiSchema = [", "truncated"),
|
||||
(b"const apiSchema = [}];", "invalid"),
|
||||
(b"42", "not found"),
|
||||
],
|
||||
)
|
||||
def test_reject_malformed_sources(raw: bytes, message: str) -> None:
|
||||
with pytest.raises(SourceError, match=message):
|
||||
ApiViewerParser().parse(raw)
|
||||
|
||||
|
||||
def test_preserve_unknown_fields_and_warn() -> None:
|
||||
raw = json.dumps([{"path": "/version", "future": {"enabled": True}}]).encode()
|
||||
|
||||
parsed = ApiViewerParser().parse(raw)
|
||||
|
||||
assert parsed.nodes[0]["future"] == {"enabled": True}
|
||||
assert parsed.warnings[0].code == "unknown-node-field"
|
||||
assert parsed.warnings[0].path == "/0/future"
|
||||
|
||||
|
||||
async def test_local_file_importer(tmp_path: Path) -> None:
|
||||
artifact = tmp_path / "api.json"
|
||||
artifact.write_bytes(b"[]")
|
||||
|
||||
assert await LocalFileImporter(artifact).load() == b"[]"
|
||||
Reference in New Issue
Block a user