import ipaddress import json import httpx import pytest from services.boxim_image_service import ( BoxIMImageError, download_boxim_image, parse_boxim_image_url, ) def test_parse_boxim_image_prefers_origin_and_supports_relative_url(): content = json.dumps({"originUrl": "/files/original.png", "thumbUrl": "/thumb.png"}) assert parse_boxim_image_url(content, base_url="https://im.example/api") == ( "https://im.example/files/original.png" ) def test_download_boxim_image_streams_public_https(monkeypatch): monkeypatch.setattr( "services.boxim_image_service._resolved_addresses", lambda _host, _port: {ipaddress.ip_address("8.8.8.8")}, ) transport = httpx.MockTransport( lambda request: httpx.Response( 200, headers={"content-type": "image/png"}, content=b"png-bytes", request=request, ) ) image = download_boxim_image( json.dumps({"originUrl": "https://cdn.example/case%20photo.png"}), transport=transport, ) assert image.content == b"png-bytes" assert image.filename == "case photo.png" assert image.mime_type == "image/png" def test_download_boxim_image_rejects_private_network_url(): with pytest.raises(BoxIMImageError, match="受限网络"): download_boxim_image( json.dumps({"originUrl": "https://127.0.0.1/private.png"}), transport=httpx.MockTransport(lambda request: httpx.Response(200, request=request)), ) def test_download_boxim_image_stops_oversized_stream(monkeypatch): monkeypatch.setenv("CHAT_IMAGE_MAX_BYTES", "1024") monkeypatch.setattr( "services.boxim_image_service._resolved_addresses", lambda _host, _port: {ipaddress.ip_address("8.8.8.8")}, ) transport = httpx.MockTransport( lambda request: httpx.Response( 200, headers={"content-length": "2048"}, request=request, ) ) with pytest.raises(BoxIMImageError, match="超过大小限制"): download_boxim_image( json.dumps({"originUrl": "https://cdn.example/large.png"}), transport=transport, )