mirror of
https://github.com/Monadical-SAS/reflector.git
synced 2025-12-20 20:29:06 +00:00
* feat: remove support of sqlite, 100% postgres * fix: more migration and make datetime timezone aware in postgres * fix: change how database is get, and use contextvar to have difference instance between different loops * test: properly use client fixture that handle lifetime/database connection * fix: add missing client fixture parameters to test functions This commit fixes NameError issues where test functions were trying to use the 'client' fixture but didn't have it as a parameter. The changes include: 1. Added 'client' parameter to test functions in: - test_transcripts_audio_download.py (6 functions including fixture) - test_transcripts_speaker.py (3 functions) - test_transcripts_upload.py (1 function) - test_transcripts_rtc_ws.py (2 functions + appserver fixture) 2. Resolved naming conflicts in test_transcripts_rtc_ws.py where both HTTP client and StreamClient were using variable name 'client'. StreamClient instances are now named 'stream_client' to avoid conflicts. 3. Added missing 'from reflector.app import app' import in rtc_ws tests. Background: Previously implemented contextvars solution with get_database() function resolves asyncio event loop conflicts in Celery tasks. The global client fixture was also created to replace manual AsyncClient instances, ensuring proper FastAPI application lifecycle management and database connections during tests. All tests now pass except for 2 pre-existing RTC WebSocket test failures related to asyncpg connection issues unrelated to these fixes. * fix: ensure task are correctly closed * fix: make separate event loop for the live server * fix: make default settings pointing at postgres * build: remove pytest-docker deps out of dev, just tests group
121 lines
3.5 KiB
Python
121 lines
3.5 KiB
Python
import shutil
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
|
|
|
|
@pytest.fixture
|
|
async def fake_transcript(tmpdir, client):
|
|
from reflector.settings import settings
|
|
from reflector.views.transcripts import transcripts_controller
|
|
|
|
settings.DATA_DIR = Path(tmpdir)
|
|
|
|
# create a transcript
|
|
response = await client.post("/transcripts", json={"name": "Test audio download"})
|
|
assert response.status_code == 200
|
|
tid = response.json()["id"]
|
|
|
|
transcript = await transcripts_controller.get_by_id(tid)
|
|
assert transcript is not None
|
|
|
|
await transcripts_controller.update(transcript, {"status": "finished"})
|
|
|
|
# manually copy a file at the expected location
|
|
audio_filename = transcript.audio_mp3_filename
|
|
path = Path(__file__).parent / "records" / "test_mathieu_hello.mp3"
|
|
audio_filename.parent.mkdir(parents=True, exist_ok=True)
|
|
shutil.copy(path, audio_filename)
|
|
yield transcript
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
@pytest.mark.parametrize(
|
|
"url_suffix,content_type",
|
|
[
|
|
["/mp3", "audio/mpeg"],
|
|
],
|
|
)
|
|
async def test_transcript_audio_download(
|
|
fake_transcript, url_suffix, content_type, client
|
|
):
|
|
response = await client.get(f"/transcripts/{fake_transcript.id}/audio{url_suffix}")
|
|
assert response.status_code == 200
|
|
assert response.headers["content-type"] == content_type
|
|
|
|
# test get 404
|
|
response = await client.get(
|
|
f"/transcripts/{fake_transcript.id}XXX/audio{url_suffix}"
|
|
)
|
|
assert response.status_code == 404
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
@pytest.mark.parametrize(
|
|
"url_suffix,content_type",
|
|
[
|
|
["/mp3", "audio/mpeg"],
|
|
],
|
|
)
|
|
async def test_transcript_audio_download_head(
|
|
fake_transcript, url_suffix, content_type, client
|
|
):
|
|
response = await client.head(f"/transcripts/{fake_transcript.id}/audio{url_suffix}")
|
|
assert response.status_code == 200
|
|
assert response.headers["content-type"] == content_type
|
|
|
|
# test head 404
|
|
response = await client.head(
|
|
f"/transcripts/{fake_transcript.id}XXX/audio{url_suffix}"
|
|
)
|
|
assert response.status_code == 404
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
@pytest.mark.parametrize(
|
|
"url_suffix,content_type",
|
|
[
|
|
["/mp3", "audio/mpeg"],
|
|
],
|
|
)
|
|
async def test_transcript_audio_download_range(
|
|
fake_transcript, url_suffix, content_type, client
|
|
):
|
|
response = await client.get(
|
|
f"/transcripts/{fake_transcript.id}/audio{url_suffix}",
|
|
headers={"range": "bytes=0-100"},
|
|
)
|
|
assert response.status_code == 206
|
|
assert response.headers["content-type"] == content_type
|
|
assert response.headers["content-range"].startswith("bytes 0-100/")
|
|
assert response.headers["content-length"] == "101"
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
@pytest.mark.parametrize(
|
|
"url_suffix,content_type",
|
|
[
|
|
["/mp3", "audio/mpeg"],
|
|
],
|
|
)
|
|
async def test_transcript_audio_download_range_with_seek(
|
|
fake_transcript, url_suffix, content_type, client
|
|
):
|
|
response = await client.get(
|
|
f"/transcripts/{fake_transcript.id}/audio{url_suffix}",
|
|
headers={"range": "bytes=100-"},
|
|
)
|
|
assert response.status_code == 206
|
|
assert response.headers["content-type"] == content_type
|
|
assert response.headers["content-range"].startswith("bytes 100-")
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_transcript_delete_with_audio(fake_transcript, client):
|
|
response = await client.delete(f"/transcripts/{fake_transcript.id}")
|
|
assert response.status_code == 200
|
|
assert response.json()["status"] == "ok"
|
|
|
|
response = await client.get(f"/transcripts/{fake_transcript.id}")
|
|
assert response.status_code == 404
|