45 lines
1.3 KiB
Python
45 lines
1.3 KiB
Python
import io
|
|
import zipfile
|
|
|
|
from backend.app.main import extract_zip_upload
|
|
|
|
|
|
def make_zip(entries):
|
|
payload = io.BytesIO()
|
|
with zipfile.ZipFile(payload, "w") as archive:
|
|
for name, content in entries.items():
|
|
archive.writestr(name, content)
|
|
return payload.getvalue()
|
|
|
|
|
|
def test_extract_zip_upload_preserves_folders(tmp_path):
|
|
contents = make_zip(
|
|
{
|
|
"docs/index.md": "# Hello",
|
|
"docs/nested/example.py": "print('ok')",
|
|
}
|
|
)
|
|
|
|
result = extract_zip_upload(contents, tmp_path)
|
|
|
|
assert sorted(result["extracted"]) == ["docs/index.md", "docs/nested/example.py"]
|
|
assert (tmp_path / "docs" / "index.md").read_text() == "# Hello"
|
|
assert (tmp_path / "docs" / "nested" / "example.py").read_text() == "print('ok')"
|
|
|
|
|
|
def test_extract_zip_upload_skips_unsafe_and_unsupported_members(tmp_path):
|
|
contents = make_zip(
|
|
{
|
|
"../escape.md": "bad",
|
|
"docs/image.png": "unsupported",
|
|
"docs/readme.md": "good",
|
|
}
|
|
)
|
|
|
|
result = extract_zip_upload(contents, tmp_path)
|
|
|
|
assert result["extracted"] == ["docs/readme.md"]
|
|
assert "../escape.md" in result["skipped"]
|
|
assert "docs/image.png" in result["skipped"]
|
|
assert not (tmp_path.parent / "escape.md").exists()
|