Files
MajoorWaldi-ComfyUI-Majoor-…/tests/features/test_metadata_route_more.py
T
MajoorWaldi 4411c72e4e Refactor test imports and clean up unused code across multiple test files
- Removed unnecessary imports from various test files to improve readability and maintainability.
- Added new settings for the Generated Feed display in the settingsFeed.js file.
- Introduced a new configuration file for Pyright type checking.
2026-03-28 13:26:28 +01:00

120 lines
4.1 KiB
Python

import json
from pathlib import Path
import pytest
from aiohttp import web
from aiohttp.test_utils import make_mocked_request
from mjr_am_backend.routes.handlers import metadata as m
from mjr_am_backend.shared import Result
def _app():
app = web.Application()
routes = web.RouteTableDef()
m.register_metadata_routes(routes)
app.add_routes(routes)
return app
@pytest.mark.asyncio
async def test_metadata_route_missing_filename_and_invalid_filename(monkeypatch):
async def _require_services():
return {"metadata": object()}, None
monkeypatch.setattr(m, "_require_services", _require_services)
monkeypatch.setattr(m, "_check_rate_limit", lambda *args, **kwargs: (True, None))
app = _app()
req = make_mocked_request("GET", "/mjr/am/metadata?type=output", app=app)
match = await app.router.resolve(req)
resp = await match.handler(req)
body = json.loads(resp.text)
assert body.get("code") == "INVALID_INPUT"
req2 = make_mocked_request("GET", "/mjr/am/metadata?type=output&filename=../x.png", app=app)
match2 = await app.router.resolve(req2)
resp2 = await match2.handler(req2)
body2 = json.loads(resp2.text)
assert body2.get("code") == "INVALID_INPUT"
@pytest.mark.asyncio
async def test_metadata_route_custom_filepath_and_custom_root_branches(monkeypatch, tmp_path: Path):
class _Meta:
async def get_metadata(self, _fp):
return Result.Ok({"ok": 1})
async def get_workflow_only(self, _fp):
return Result.Ok({"workflow": 1})
async def _require_services():
return {"metadata": _Meta()}, None
app = _app()
monkeypatch.setattr(m, "_require_services", _require_services)
monkeypatch.setattr(m, "_check_rate_limit", lambda *args, **kwargs: (True, None))
f = tmp_path / "a.png"
f.write_bytes(b"x")
monkeypatch.setattr(m, "_normalize_path", lambda p: Path(p))
req = make_mocked_request("GET", f"/mjr/am/metadata?type=custom&filename=a.png&filepath={f}", app=app)
match = await app.router.resolve(req)
resp = await match.handler(req)
body = json.loads(resp.text)
assert body.get("ok") is True
monkeypatch.setattr(m, "resolve_custom_root", lambda _rid: Result.Err("INVALID_INPUT", "bad root"))
req2 = make_mocked_request("GET", "/mjr/am/metadata?type=custom&filename=a.png&root_id=r1", app=app)
match2 = await app.router.resolve(req2)
resp2 = await match2.handler(req2)
body2 = json.loads(resp2.text)
assert body2.get("code") == "INVALID_INPUT"
@pytest.mark.asyncio
async def test_metadata_route_input_path_denied_and_timeout(monkeypatch, tmp_path: Path):
class _Meta:
async def get_metadata(self, _fp):
raise TimeoutError("x")
async def get_workflow_only(self, _fp):
return Result.Ok({"workflow": 1})
async def _require_services():
return {"metadata": _Meta()}, None
app = _app()
monkeypatch.setattr(m, "_require_services", _require_services)
monkeypatch.setattr(m, "_check_rate_limit", lambda *args, **kwargs: (True, None))
monkeypatch.setattr(m.folder_paths, "get_input_directory", lambda: str(tmp_path))
f = tmp_path / "a.png"
f.write_bytes(b"x")
monkeypatch.setattr(m, "_normalize_path", lambda p: Path(p))
monkeypatch.setattr(m, "_is_path_allowed", lambda _p: False)
req = make_mocked_request("GET", "/mjr/am/metadata?type=input&filename=a.png", app=app)
match = await app.router.resolve(req)
resp = await match.handler(req)
body = json.loads(resp.text)
assert body.get("code") == "INVALID_INPUT"
monkeypatch.setattr(m, "_is_path_allowed", lambda _p: True)
async def _wait_for(*args, **kwargs):
if args:
c = args[0]
try:
c.close()
except Exception:
pass
raise m.asyncio.TimeoutError()
monkeypatch.setattr(m.asyncio, "wait_for", _wait_for)
req2 = make_mocked_request("GET", "/mjr/am/metadata?type=input&filename=a.png", app=app)
match2 = await app.router.resolve(req2)
resp2 = await match2.handler(req2)
body2 = json.loads(resp2.text)
assert body2.get("code") == "TIMEOUT"