mirror of
https://github.com/Comfy-Org/ComfyUI.git
synced 2026-08-16 22:46:38 +08:00
Cleanup pass over the previous commit. No behaviour change except the cache header noted below. app/api_docs.py (111 -> 59 lines): - Cut the rationale comments. The file was ~32% commentary against 2-6% in neighbouring app/ modules, and most of it argued decisions that belong in the PR rather than the source, including a TODO explaining why an SRI hash could not be computed. - Inline the spec and bundle URLs into the HTML. The __TOKEN__ replace() machinery existed only to hoist two string literals, and then needed a comment defending its own existence. - Drop the hand-rolled <style> block for two inline style attributes. - Drop the os.path.isfile guard. FileResponse already answers a missing file with a 404, so the check was a second stat for the same result. - Serve the spec with Cache-Control: no-cache rather than no-store. Both mean "never use a stale copy", but no-store also forbids storing it, so every docs page load re-transferred all 230 KB. no-cache lets the browser revalidate against the ETag FileResponse already sets; an unchanged spec now costs a 304 instead of a full download. tests-unit/server_test/test_api_docs.py (11 tests -> 6, 144 -> 70 lines): - Drop the local copy of server.py's /api prefix loop and the two tests that depended on it. They exercised the copy, not the real loop, so they would have stayed green through a change to the thing they claimed to protect. What actually makes prefixing work is that the spec URL is relative, which is now asserted directly. - Drop the static-catch-all test. It asserted aiohttp's own route precedence against a synthetic app, and could not fail if the registration call moved after the catch-all in server.py. - Drop the tautological SPEC_PATH assertion, already covered by fetching the spec through the route. - Loosen the fallback assertions, which pinned the exact quoting and inline-handler style of the HTML. Claude-Session: https://claude.ai/code/session_01BvUveU9ofyGrSz3QxYeecB
71 lines
2.2 KiB
Python
71 lines
2.2 KiB
Python
"""Tests for the OpenAPI spec and API docs routes."""
|
|
|
|
import pytest
|
|
import pytest_asyncio
|
|
import yaml
|
|
from aiohttp import web
|
|
|
|
from app.api_docs import add_api_docs_routes
|
|
|
|
pytestmark = pytest.mark.asyncio
|
|
|
|
|
|
@pytest_asyncio.fixture
|
|
async def client(aiohttp_client):
|
|
app = web.Application()
|
|
routes = web.RouteTableDef()
|
|
add_api_docs_routes(routes)
|
|
app.add_routes(routes)
|
|
return await aiohttp_client(app)
|
|
|
|
|
|
async def test_get_spec(client):
|
|
resp = await client.get("/openapi.yaml")
|
|
assert resp.status == 200
|
|
assert resp.headers["Content-Type"] == "application/yaml"
|
|
assert resp.headers["Cache-Control"] == "no-cache"
|
|
spec = yaml.safe_load(await resp.text())
|
|
assert spec["openapi"].startswith("3.")
|
|
assert spec["paths"]
|
|
|
|
|
|
async def test_missing_spec_returns_404(client, monkeypatch):
|
|
monkeypatch.setattr("app.api_docs.SPEC_PATH", "/nonexistent/openapi.yaml")
|
|
resp = await client.get("/openapi.yaml")
|
|
assert resp.status == 404
|
|
|
|
|
|
async def test_docs_page(client):
|
|
resp = await client.get("/api-docs")
|
|
assert resp.status == 200
|
|
assert resp.content_type == "text/html"
|
|
body = await resp.text()
|
|
# Redoc has no request execution; Swagger UI's "Try it out" would give
|
|
# one-click access to destructive endpoints on an unauthenticated server.
|
|
assert "<redoc" in body
|
|
assert "openapi.yaml" in body
|
|
|
|
|
|
async def test_docs_page_has_offline_fallback(client):
|
|
"""Offline installs should get a notice, not a blank page."""
|
|
body = await (await client.get("/api-docs")).text()
|
|
assert 'id="fallback"' in body
|
|
|
|
|
|
async def test_spec_url_is_relative(client):
|
|
"""What makes the page work under both /api-docs and /api/api-docs.
|
|
|
|
server.py re-registers every route under an /api prefix; a relative spec
|
|
URL resolves to the sibling spec from either mount point.
|
|
"""
|
|
body = await (await client.get("/api-docs")).text()
|
|
assert 'spec-url="openapi.yaml"' in body
|
|
|
|
|
|
async def test_flag_is_off_by_default():
|
|
"""Serving the API surface of an unauthenticated server is opt-in."""
|
|
from comfy.cli_args import parser
|
|
|
|
assert parser.parse_args([]).enable_api_docs is False
|
|
assert parser.parse_args(["--enable-api-docs"]).enable_api_docs is True
|