feat: local storage logic & endpoints

This commit is contained in:
Senko-san
2026-06-07 15:34:06 +03:00
parent dfd512a13f
commit 81ea93c371
23 changed files with 945 additions and 18 deletions
+104
View File
@@ -0,0 +1,104 @@
"""Unit tests for LocalFileStorage."""
import pytest
from app.infrastructure.storage.local import LocalFileStorage
pytestmark = pytest.mark.asyncio
async def test_save_and_stat(tmp_path):
storage = LocalFileStorage(tmp_path)
src = tmp_path / "src.mp3"
src.write_bytes(b"test audio data")
size = await storage.save_file("tracks/te/test.mp3", src)
assert size == 15
stat = await storage.stat("tracks/te/test.mp3")
assert stat.size == 15
assert stat.content_type == "audio/mpeg"
async def test_save_creates_parent_dirs(tmp_path):
storage = LocalFileStorage(tmp_path)
src = tmp_path / "src.flac"
src.write_bytes(b"x")
await storage.save_file("tracks/ab/cdef.flac", src)
assert (tmp_path / "tracks" / "ab" / "cdef.flac").exists()
async def test_open_range_full(tmp_path):
storage = LocalFileStorage(tmp_path)
data = b"hello world" * 100
src = tmp_path / "src.flac"
src.write_bytes(data)
await storage.save_file("tracks/he/hello.flac", src)
stream, total = await storage.open_range("tracks/he/hello.flac", 0, None)
result = b"".join([chunk async for chunk in stream])
assert result == data
assert total == len(data)
async def test_open_range_partial(tmp_path):
storage = LocalFileStorage(tmp_path)
data = b"0123456789"
src = tmp_path / "src.mp3"
src.write_bytes(data)
await storage.save_file("tracks/sr/src.mp3", src)
stream, total = await storage.open_range("tracks/sr/src.mp3", 3, 7)
result = b"".join([chunk async for chunk in stream])
assert result == b"34567"
assert total == 10
async def test_open_range_from_offset_to_end(tmp_path):
storage = LocalFileStorage(tmp_path)
data = b"abcdefghij"
src = tmp_path / "src.wav"
src.write_bytes(data)
await storage.save_file("tracks/sr/src.wav", src)
stream, total = await storage.open_range("tracks/sr/src.wav", 5, None)
result = b"".join([chunk async for chunk in stream])
assert result == b"fghij"
assert total == 10
async def test_exists_and_delete(tmp_path):
storage = LocalFileStorage(tmp_path)
src = tmp_path / "src.ogg"
src.write_bytes(b"ogg data")
await storage.save_file("tracks/sr/src.ogg", src)
assert await storage.exists("tracks/sr/src.ogg") is True
await storage.delete("tracks/sr/src.ogg")
assert await storage.exists("tracks/sr/src.ogg") is False
async def test_delete_missing_is_noop(tmp_path):
storage = LocalFileStorage(tmp_path)
await storage.delete("tracks/no/nope.mp3")
async def test_as_local_path(tmp_path):
storage = LocalFileStorage(tmp_path)
src = tmp_path / "src.mp3"
src.write_bytes(b"local bytes")
await storage.save_file("tracks/lo/local.mp3", src)
async with storage.as_local_path("tracks/lo/local.mp3") as path:
assert path.read_bytes() == b"local bytes"
async def test_stat_unknown_extension(tmp_path):
storage = LocalFileStorage(tmp_path)
src = tmp_path / "src.xyz"
src.write_bytes(b"mystery")
await storage.save_file("tracks/my/mystery.xyz", src)
stat = await storage.stat("tracks/my/mystery.xyz")
assert stat.size == 7
assert stat.content_type is None