mirror of
https://github.com/langgenius/dify.git
synced 2026-03-11 10:17:50 +08:00
189 lines
5.5 KiB
Python
189 lines
5.5 KiB
Python
from uuid import UUID
|
|
|
|
import httpx
|
|
import pytest
|
|
|
|
from controllers.common import helpers
|
|
from controllers.common.helpers import FileInfo, guess_file_info_from_response
|
|
|
|
|
|
def make_response(
|
|
url="https://example.com/file.txt",
|
|
headers=None,
|
|
content=None,
|
|
):
|
|
return httpx.Response(
|
|
200,
|
|
request=httpx.Request("GET", url),
|
|
headers=headers or {},
|
|
content=content or b"",
|
|
)
|
|
|
|
|
|
class TestGuessFileInfoFromResponse:
|
|
def test_filename_from_url(self):
|
|
response = make_response(
|
|
url="https://example.com/test.pdf",
|
|
content=b"Hello World",
|
|
)
|
|
|
|
info = guess_file_info_from_response(response)
|
|
|
|
assert info.filename == "test.pdf"
|
|
assert info.extension == ".pdf"
|
|
assert info.mimetype == "application/pdf"
|
|
|
|
def test_filename_from_content_disposition(self):
|
|
headers = {
|
|
"Content-Disposition": "attachment; filename=myfile.csv",
|
|
"Content-Type": "text/csv",
|
|
}
|
|
response = make_response(
|
|
url="https://example.com/",
|
|
headers=headers,
|
|
content=b"Hello World",
|
|
)
|
|
|
|
info = guess_file_info_from_response(response)
|
|
|
|
assert info.filename == "myfile.csv"
|
|
assert info.extension == ".csv"
|
|
assert info.mimetype == "text/csv"
|
|
|
|
@pytest.mark.parametrize(
|
|
("magic_available", "expected_ext"),
|
|
[
|
|
(True, "txt"),
|
|
(False, "bin"),
|
|
],
|
|
)
|
|
def test_generated_filename_when_missing(self, monkeypatch, magic_available, expected_ext):
|
|
if magic_available:
|
|
if helpers.magic is None:
|
|
pytest.skip("python-magic is not installed, cannot run 'magic_available=True' test variant")
|
|
else:
|
|
monkeypatch.setattr(helpers, "magic", None)
|
|
|
|
response = make_response(
|
|
url="https://example.com/",
|
|
content=b"Hello World",
|
|
)
|
|
|
|
info = guess_file_info_from_response(response)
|
|
|
|
name, ext = info.filename.split(".")
|
|
UUID(name)
|
|
assert ext == expected_ext
|
|
|
|
def test_mimetype_from_header_when_unknown(self):
|
|
headers = {"Content-Type": "application/json"}
|
|
response = make_response(
|
|
url="https://example.com/file.unknown",
|
|
headers=headers,
|
|
content=b'{"a": 1}',
|
|
)
|
|
|
|
info = guess_file_info_from_response(response)
|
|
|
|
assert info.mimetype == "application/json"
|
|
|
|
def test_extension_added_when_missing(self):
|
|
headers = {"Content-Type": "image/png"}
|
|
response = make_response(
|
|
url="https://example.com/image",
|
|
headers=headers,
|
|
content=b"fakepngdata",
|
|
)
|
|
|
|
info = guess_file_info_from_response(response)
|
|
|
|
assert info.extension == ".png"
|
|
assert info.filename.endswith(".png")
|
|
|
|
def test_content_length_used_as_size(self):
|
|
headers = {
|
|
"Content-Length": "1234",
|
|
"Content-Type": "text/plain",
|
|
}
|
|
response = make_response(
|
|
url="https://example.com/a.txt",
|
|
headers=headers,
|
|
content=b"a" * 1234,
|
|
)
|
|
|
|
info = guess_file_info_from_response(response)
|
|
|
|
assert info.size == 1234
|
|
|
|
def test_size_minus_one_when_header_missing(self):
|
|
response = make_response(url="https://example.com/a.txt")
|
|
|
|
info = guess_file_info_from_response(response)
|
|
|
|
assert info.size == -1
|
|
|
|
def test_fallback_to_bin_extension(self):
|
|
headers = {"Content-Type": "application/octet-stream"}
|
|
response = make_response(
|
|
url="https://example.com/download",
|
|
headers=headers,
|
|
content=b"\x00\x01\x02\x03",
|
|
)
|
|
|
|
info = guess_file_info_from_response(response)
|
|
|
|
assert info.extension == ".bin"
|
|
assert info.filename.endswith(".bin")
|
|
|
|
def test_return_type(self):
|
|
response = make_response()
|
|
|
|
info = guess_file_info_from_response(response)
|
|
|
|
assert isinstance(info, FileInfo)
|
|
|
|
|
|
class TestMagicImportWarnings:
|
|
@pytest.mark.parametrize(
|
|
("platform_name", "expected_message"),
|
|
[
|
|
("Windows", "pip install python-magic-bin"),
|
|
("Darwin", "brew install libmagic"),
|
|
("Linux", "sudo apt-get install libmagic1"),
|
|
("Other", "install `libmagic`"),
|
|
],
|
|
)
|
|
def test_magic_import_warning_per_platform(
|
|
self,
|
|
monkeypatch,
|
|
platform_name,
|
|
expected_message,
|
|
):
|
|
import builtins
|
|
import importlib
|
|
|
|
# Force ImportError when "magic" is imported
|
|
real_import = builtins.__import__
|
|
|
|
def fake_import(name, *args, **kwargs):
|
|
if name == "magic":
|
|
raise ImportError("No module named magic")
|
|
return real_import(name, *args, **kwargs)
|
|
|
|
monkeypatch.setattr(builtins, "__import__", fake_import)
|
|
monkeypatch.setattr("platform.system", lambda: platform_name)
|
|
|
|
# Remove helpers so it imports fresh
|
|
import sys
|
|
|
|
original_helpers = sys.modules.get(helpers.__name__)
|
|
sys.modules.pop(helpers.__name__, None)
|
|
|
|
try:
|
|
with pytest.warns(UserWarning, match="To use python-magic") as warning:
|
|
imported_helpers = importlib.import_module(helpers.__name__)
|
|
assert expected_message in str(warning[0].message)
|
|
finally:
|
|
if original_helpers is not None:
|
|
sys.modules[helpers.__name__] = original_helpers
|