Files
DocsGPT/tests/parser/file/test_openapi3_parser.py
T
Alex b3326b3c33 chore(deps): redis 8, tiktoken 0.14, openapi3-parser 2, daytona 0.211, reportlab 5
Major bumps whose ceilings had to move. redis 8.1.0, tiktoken 0.14.0 and
daytona 0.211.2 needed no code change (the Daytona client, filesystem and
process signatures the sandbox calls are unchanged; redis 8 was checked
against a live server through the app's own sync and async clients).
reportlab 5.0.1 is test-only.

openapi-parser 2.0.0 is a rewrite onto pydantic spec models: `paths` is now
a dict keyed by URL rather than a list of objects carrying their own `url`,
and a path item exposes one field per HTTP method instead of an `operations`
list. `OpenAPI3Parser` reads both accordingly, iterating methods in the
order the spec declares them, and its rendered output is byte-identical to
before. The rewrite also drops prance, openapi-spec-validator and five more
transitive packages.

tokenizers stays at 0.22.2: transformers 5.8.1 caps it at <=0.23.0 and no
such release exists, so it moves with the transformers cap or not at all.
2026-09-12 17:28:58 +01:00

81 lines
3.1 KiB
Python

"""Tests for docsgpt.parser.file.openapi3_parser covering lines 7-8, 45."""
import pytest
from unittest.mock import MagicMock, patch
_HTTP_METHODS = ("get", "put", "post", "delete", "options", "head", "patch", "trace")
def _path_item(description=None, parameters=None, **operations):
"""A stand-in for openapi-parser 2.x's PathItem: one field per HTTP method,
``None`` where the spec defines no operation."""
item = MagicMock()
item.description = description
item.parameters = parameters
for method in _HTTP_METHODS:
setattr(item, method, operations.get(method))
return item
@pytest.mark.unit
class TestOpenAPI3ParserImportFallback:
def test_import_fallback_to_base_parser(self):
"""Cover lines 7-8: try/except ModuleNotFoundError import fallback."""
# The fallback import is a module-level concern. Just verify the class works.
with patch("docsgpt.parser.file.openapi3_parser.parse"):
from docsgpt.parser.file.openapi3_parser import OpenAPI3Parser
parser = OpenAPI3Parser()
assert parser is not None
def test_get_base_urls(self):
"""Cover basic URL extraction."""
with patch("docsgpt.parser.file.openapi3_parser.parse"):
from docsgpt.parser.file.openapi3_parser import OpenAPI3Parser
parser = OpenAPI3Parser()
urls = parser.get_base_urls([
"https://api.example.com/v1/users",
"https://api.example.com/v1/items",
"https://other.example.com/v2/test",
])
assert "https://api.example.com" in urls
assert "https://other.example.com" in urls
assert len(urls) == 2
def test_get_info_from_paths_empty(self):
"""Cover a path item that defines no methods."""
with patch("docsgpt.parser.file.openapi3_parser.parse"):
from docsgpt.parser.file.openapi3_parser import OpenAPI3Parser
parser = OpenAPI3Parser()
result = parser.get_info_from_paths(_path_item())
assert result == ""
def test_parse_file_writes_results(self, tmp_path):
"""Cover line 45: parse_file writes to results.txt."""
with patch("docsgpt.parser.file.openapi3_parser.parse") as mock_parse:
from docsgpt.parser.file.openapi3_parser import OpenAPI3Parser
mock_server = MagicMock()
mock_server.url = "https://api.example.com"
mock_data = MagicMock()
mock_data.servers = [mock_server]
mock_data.paths = {"/users": _path_item(description="Get users")}
mock_parse.return_value = mock_data
parser = OpenAPI3Parser()
import os
original_cwd = os.getcwd()
try:
os.chdir(str(tmp_path))
parser.parse_file(str(tmp_path / "spec.yaml"))
assert (tmp_path / "results.txt").exists()
content = (tmp_path / "results.txt").read_text()
assert "Base URL:" in content
assert "/users" in content
finally:
os.chdir(original_cwd)