test(integration): add coverage for repositories, auth resolution, and the two-phase upload
This commit is contained in:
39
tests/integration/minio/conftest.py
Normal file
39
tests/integration/minio/conftest.py
Normal file
@@ -0,0 +1,39 @@
|
||||
from collections.abc import Iterator
|
||||
|
||||
import pytest
|
||||
from testcontainers.community.minio import MinioContainer
|
||||
|
||||
from src.config import MinioSettings
|
||||
from src.infrastructure.minio.client import create_client
|
||||
|
||||
_BUCKET = "test-source-files"
|
||||
|
||||
|
||||
@pytest.fixture(scope="session")
|
||||
def minio_container() -> Iterator[MinioContainer]:
|
||||
with MinioContainer() as container:
|
||||
yield container
|
||||
|
||||
|
||||
@pytest.fixture(scope="session")
|
||||
def minio_settings(minio_container: MinioContainer) -> MinioSettings:
|
||||
config = minio_container.get_config()
|
||||
# Pinned to IPv4 for the same reason as postgres_url (see
|
||||
# tests/integration/postgres/conftest.py): `localhost` resolves to `::1`
|
||||
# first, but Docker only publishes the mapped port on IPv4, so the
|
||||
# connection hangs instead of failing.
|
||||
endpoint = config["endpoint"].replace("localhost:", "127.0.0.1:")
|
||||
return MinioSettings(
|
||||
endpoint=endpoint,
|
||||
access_key=config["access_key"],
|
||||
secret_key=config["secret_key"],
|
||||
secure=False,
|
||||
bucket=_BUCKET,
|
||||
)
|
||||
|
||||
|
||||
@pytest.fixture(scope="session", autouse=True)
|
||||
def _ensure_bucket(minio_settings: MinioSettings) -> None:
|
||||
client = create_client(minio_settings)
|
||||
if not client.bucket_exists(minio_settings.bucket):
|
||||
client.make_bucket(minio_settings.bucket)
|
||||
39
tests/integration/minio/test_storage.py
Normal file
39
tests/integration/minio/test_storage.py
Normal file
@@ -0,0 +1,39 @@
|
||||
import uuid
|
||||
|
||||
import pytest
|
||||
from anyio import CapacityLimiter
|
||||
|
||||
from src.application.files.storage_keys import source_file_object_key
|
||||
from src.config import MinioSettings
|
||||
from src.infrastructure.minio.client import create_client
|
||||
from src.infrastructure.minio.storage import MinioObjectStorage
|
||||
|
||||
pytestmark = [pytest.mark.integration, pytest.mark.minio, pytest.mark.asyncio]
|
||||
|
||||
|
||||
async def test_put_object_stores_bytes_under_server_derived_key(
|
||||
minio_settings: MinioSettings,
|
||||
) -> None:
|
||||
client = create_client(minio_settings)
|
||||
storage = MinioObjectStorage(client, bucket=minio_settings.bucket, limiter=CapacityLimiter(2))
|
||||
key = source_file_object_key(uuid.uuid4(), uuid.uuid4())
|
||||
data = b"tenant-scoped, id-addressed bytes"
|
||||
|
||||
await storage.put_object(key=key, data=data, content_type="text/csv")
|
||||
|
||||
stored = client.get_object(minio_settings.bucket, key).read()
|
||||
assert stored == data
|
||||
|
||||
|
||||
async def test_put_object_overwrites_existing_object_at_same_key(
|
||||
minio_settings: MinioSettings,
|
||||
) -> None:
|
||||
client = create_client(minio_settings)
|
||||
storage = MinioObjectStorage(client, bucket=minio_settings.bucket, limiter=CapacityLimiter(2))
|
||||
key = source_file_object_key(uuid.uuid4(), uuid.uuid4())
|
||||
|
||||
await storage.put_object(key=key, data=b"first", content_type="text/csv")
|
||||
await storage.put_object(key=key, data=b"second", content_type="text/csv")
|
||||
|
||||
stored = client.get_object(minio_settings.bucket, key).read()
|
||||
assert stored == b"second"
|
||||
Reference in New Issue
Block a user