generated from john/python-template
This commit is contained in:
@@ -124,7 +124,7 @@ async def seed_job(app_client: tuple[FastAPI, TestClient]) -> Callable[..., Awai
|
||||
page_number=1,
|
||||
upload_name=filename,
|
||||
filename=filename,
|
||||
file_path=str(stored_path),
|
||||
file_path=stored_path.resolve().relative_to(app.state.settings.upload_dir.resolve()).as_posix(),
|
||||
file_hash="b" * 64,
|
||||
file_size_bytes=len(stored_path.read_bytes()),
|
||||
)
|
||||
|
||||
+15
-40
@@ -4,24 +4,21 @@ from transcription.ui.components.media_urls import resolve_media_url
|
||||
|
||||
def test_resolve_media_url_maps_managed_absolute_path_to_upload_route(tmp_path):
|
||||
upload_dir = tmp_path / "uploads"
|
||||
managed_path = upload_dir / "documents" / "abc" / "page.jpg"
|
||||
managed_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
managed_path.write_bytes(b"x")
|
||||
canonical_path = upload_dir / "documents" / "abc" / "page.jpg"
|
||||
canonical_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
canonical_path.write_bytes(b"x")
|
||||
|
||||
resolved = resolve_media_url(str(managed_path), upload_dir=upload_dir, base_url="http://localhost:8000")
|
||||
resolved = resolve_media_url("documents/abc/page.jpg", upload_dir=upload_dir, base_url="http://localhost:8000")
|
||||
assert resolved == "http://localhost:8000/uploads/documents/abc/page.jpg"
|
||||
|
||||
|
||||
def test_resolve_media_url_rejects_unmanaged_absolute_path(tmp_path):
|
||||
def test_resolve_media_url_rejects_absolute_filesystem_path(tmp_path):
|
||||
upload_dir = tmp_path / "uploads"
|
||||
managed_path = upload_dir / "documents" / "abc" / "page.jpg"
|
||||
managed_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
managed_path.write_bytes(b"x")
|
||||
unmanaged_path = tmp_path / "other-root" / "secret" / "page.jpg"
|
||||
unmanaged_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
unmanaged_path.write_bytes(b"x")
|
||||
absolute_path = upload_dir / "documents" / "abc" / "page.jpg"
|
||||
absolute_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
absolute_path.write_bytes(b"x")
|
||||
|
||||
resolved = resolve_media_url(str(unmanaged_path), upload_dir=upload_dir, base_url="http://localhost:8000")
|
||||
resolved = resolve_media_url(str(absolute_path), upload_dir=upload_dir, base_url="http://localhost:8000")
|
||||
assert resolved is None
|
||||
|
||||
|
||||
@@ -36,21 +33,9 @@ def test_resolve_media_url_rejects_stale_relative_path(tmp_path):
|
||||
assert resolved is None
|
||||
|
||||
|
||||
def test_resolve_media_url_rejects_basename_collision_from_unmanaged_path(tmp_path):
|
||||
def test_resolve_media_url_rejects_non_canonical_relative_path(tmp_path):
|
||||
upload_dir = tmp_path / "uploads"
|
||||
managed_path = upload_dir / "documents" / "abc" / "shared-name.jpg"
|
||||
managed_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
managed_path.write_bytes(b"managed")
|
||||
|
||||
unmanaged_path = tmp_path / "scratch" / "shared-name.jpg"
|
||||
unmanaged_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
unmanaged_path.write_bytes(b"unmanaged")
|
||||
|
||||
resolved = resolve_media_url(
|
||||
str(unmanaged_path),
|
||||
upload_dir=upload_dir,
|
||||
base_url="http://localhost:8000",
|
||||
)
|
||||
resolved = resolve_media_url("shared-name.jpg", upload_dir=upload_dir, base_url="http://localhost:8000")
|
||||
assert resolved is None
|
||||
|
||||
|
||||
@@ -68,28 +53,18 @@ def test_resolve_media_url_accepts_existing_upload_relative_path(tmp_path):
|
||||
assert resolved == "http://localhost:8000/uploads/documents/abc/page.jpg"
|
||||
|
||||
|
||||
def test_resolve_media_url_accepts_existing_portraits_relative_path(tmp_path):
|
||||
def test_resolve_media_url_accepts_existing_persons_relative_path(tmp_path):
|
||||
upload_dir = tmp_path / "uploads"
|
||||
managed_path = upload_dir / "portraits" / "person" / "seeded.png"
|
||||
managed_path = upload_dir / "persons" / "person" / "seeded.png"
|
||||
managed_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
managed_path.write_bytes(b"x")
|
||||
|
||||
resolved = resolve_media_url(
|
||||
"portraits/person/seeded.png",
|
||||
"persons/person/seeded.png",
|
||||
upload_dir=upload_dir,
|
||||
base_url="http://localhost:8000",
|
||||
)
|
||||
assert resolved == "http://localhost:8000/uploads/portraits/person/seeded.png"
|
||||
|
||||
|
||||
def test_public_media_path_label_maps_managed_absolute_path_to_upload_route(tmp_path):
|
||||
upload_dir = tmp_path / "uploads"
|
||||
managed_path = upload_dir / "documents" / "abc" / "page.jpg"
|
||||
managed_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
managed_path.write_bytes(b"x")
|
||||
|
||||
label = public_media_path_label(str(managed_path), upload_dir=upload_dir)
|
||||
assert label == "/uploads/documents/abc/page.jpg"
|
||||
assert resolved == "http://localhost:8000/uploads/persons/person/seeded.png"
|
||||
|
||||
|
||||
def test_public_media_path_label_hides_unmanaged_absolute_path(tmp_path):
|
||||
|
||||
@@ -115,14 +115,14 @@ class TestPeoplePageRendering:
|
||||
app, client = app_client
|
||||
upload_dirs = {app.state.settings.upload_dir, get_settings().upload_dir}
|
||||
for upload_dir in upload_dirs:
|
||||
portrait_file = upload_dir / "portraits" / "person" / "seeded.png"
|
||||
portrait_file = upload_dir / "persons" / "person" / "seeded.png"
|
||||
portrait_file.parent.mkdir(parents=True, exist_ok=True)
|
||||
portrait_file.write_bytes(b"portrait")
|
||||
|
||||
async with session_scope() as session:
|
||||
person = Person(
|
||||
full_name="Portrait Person",
|
||||
portrait_path="portraits/person/seeded.png",
|
||||
portrait_path="persons/person/seeded.png",
|
||||
)
|
||||
session.add(person)
|
||||
await session.commit()
|
||||
|
||||
@@ -42,7 +42,7 @@ async def test_document_print_preview_and_safe_media_route(app_client):
|
||||
page_number=1,
|
||||
upload_name="print-page.png",
|
||||
filename="print-page.png",
|
||||
file_path=str(media_path),
|
||||
file_path="documents/print-page.png",
|
||||
file_hash="a" * 64,
|
||||
file_size_bytes=media_path.stat().st_size,
|
||||
raw_transcription="line one\nline two",
|
||||
@@ -54,7 +54,7 @@ async def test_document_print_preview_and_safe_media_route(app_client):
|
||||
page_number=2,
|
||||
upload_name="print-page.pdf",
|
||||
filename="print-page.pdf",
|
||||
file_path=str(pdf_path),
|
||||
file_path="documents/print-page.pdf",
|
||||
file_hash="c" * 64,
|
||||
file_size_bytes=pdf_path.stat().st_size,
|
||||
raw_transcription="PDF source",
|
||||
@@ -102,7 +102,7 @@ async def test_document_source_media_rejects_cross_document_access(app_client):
|
||||
page_number=1,
|
||||
upload_name="other.png",
|
||||
filename="other.png",
|
||||
file_path=str(media_path),
|
||||
file_path="documents/other.png",
|
||||
file_hash="b" * 64,
|
||||
file_size_bytes=media_path.stat().st_size,
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user