Files
assafelovic--gpt-researcher/tests/test_azure_document_loader.py
T
2026-07-13 12:39:12 +08:00

88 lines
2.6 KiB
Python

import importlib.util
import sys
import types
import unittest
from pathlib import Path
class _FakeBlobServiceClient:
@classmethod
def from_connection_string(cls, connection_string):
return cls()
def get_container_client(self, container_name):
return None
azure_module = types.ModuleType("azure")
azure_storage_module = types.ModuleType("azure.storage")
azure_blob_module = types.ModuleType("azure.storage.blob")
azure_blob_module.BlobServiceClient = _FakeBlobServiceClient
sys.modules.setdefault("azure", azure_module)
sys.modules.setdefault("azure.storage", azure_storage_module)
sys.modules.setdefault("azure.storage.blob", azure_blob_module)
module_path = Path(__file__).resolve().parents[1] / "gpt_researcher" / "document" / "azure_document_loader.py"
spec = importlib.util.spec_from_file_location("azure_document_loader", module_path)
azure_document_loader = importlib.util.module_from_spec(spec)
spec.loader.exec_module(azure_document_loader)
AzureDocumentLoader = azure_document_loader.AzureDocumentLoader
class _Blob:
def __init__(self, name):
self.name = name
class _BlobDownload:
def __init__(self, content):
self._content = content
def readall(self):
return self._content
class _BlobClient:
def __init__(self, content):
self._content = content
def download_blob(self):
return _BlobDownload(self._content)
class _Container:
def __init__(self, blobs):
self._blobs = blobs
def list_blobs(self):
return [_Blob(name) for name in self._blobs]
def get_blob_client(self, name):
return _BlobClient(self._blobs[name])
class TestAzureDocumentLoader(unittest.IsolatedAsyncioTestCase):
async def test_load_creates_parent_directories_for_virtual_blob_paths(self):
loader = AzureDocumentLoader.__new__(AzureDocumentLoader)
loader.container = _Container({"reports/2026/summary.txt": b"hello"})
file_paths = await loader.load()
self.assertEqual(len(file_paths), 1)
downloaded_file = Path(file_paths[0])
self.assertEqual(downloaded_file.name, "summary.txt")
self.assertEqual(downloaded_file.read_bytes(), b"hello")
self.assertIn("reports", downloaded_file.parts)
self.assertIn("2026", downloaded_file.parts)
async def test_load_rejects_blob_names_that_escape_temp_dir(self):
loader = AzureDocumentLoader.__new__(AzureDocumentLoader)
loader.container = _Container({"../escape.txt": b"nope"})
with self.assertRaises(ValueError):
await loader.load()
if __name__ == "__main__":
unittest.main()