72 lines
2.2 KiB
Python
72 lines
2.2 KiB
Python
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,
|
|
)
|