From 85fd40acf8941f14cd120e418110b3391e0859f3 Mon Sep 17 00:00:00 2001 From: "Gan, Jimmy" Date: Thu, 4 Jun 2026 10:38:50 +0800 Subject: [PATCH] Fix youtube-transcript-api call structure and make test assertions environment-robust - Instantiate YouTubeTranscriptApi class and call list() as required by v1.2.4 - Decorate async database fixture with pytest_asyncio.fixture - Replace hardcoded base URL string assertion in test_summarizer.py with dynamized summarizer.BASE_URL value to support proxy profiles Co-Authored-By: Claude Opus 4.8 --- backend/summarizer.py | 2 +- backend/tests/conftest.py | 3 ++- backend/tests/test_summarizer.py | 8 ++++---- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/backend/summarizer.py b/backend/summarizer.py index 7374374..48d9aa3 100644 --- a/backend/summarizer.py +++ b/backend/summarizer.py @@ -32,7 +32,7 @@ Transcript: def download_transcript(video_id: str) -> str: try: - transcript_list = YouTubeTranscriptApi.list_transcripts(video_id) + transcript_list = YouTubeTranscriptApi().list(video_id) # Try to find manual transcripts in preferred languages try: diff --git a/backend/tests/conftest.py b/backend/tests/conftest.py index 558b37f..dc9a3b1 100644 --- a/backend/tests/conftest.py +++ b/backend/tests/conftest.py @@ -1,5 +1,6 @@ import os import pytest +import pytest_asyncio import asyncio import aiosqlite import sys @@ -34,7 +35,7 @@ def mock_db_path(tmp_path, monkeypatch): return test_db_file -@pytest.fixture +@pytest_asyncio.fixture async def test_db(mock_db_path): # Initialize the tables await db.init_db() diff --git a/backend/tests/test_summarizer.py b/backend/tests/test_summarizer.py index 6cc3d2a..6e25c86 100644 --- a/backend/tests/test_summarizer.py +++ b/backend/tests/test_summarizer.py @@ -30,7 +30,7 @@ async def test_download_transcript_success(): mock_trans = MockTranscript() mock_list = MockTranscriptList(mock_trans) - with patch("youtube_transcript_api.YouTubeTranscriptApi.list_transcripts", return_value=mock_list): + with patch("youtube_transcript_api.YouTubeTranscriptApi.list", return_value=mock_list): text = summarizer.download_transcript("test_vid") assert text == "Welcome to this video tutorial. Today we are learning about Svelte 5 and runes." @@ -58,7 +58,7 @@ async def test_summarize_video_success(test_db): } # Patch both transcript api and httpx AsyncClient post call - with patch("youtube_transcript_api.YouTubeTranscriptApi.list_transcripts", return_value=mock_list), \ + with patch("youtube_transcript_api.YouTubeTranscriptApi.list", return_value=mock_list), \ patch("httpx.AsyncClient.post", new_callable=AsyncMock, return_value=mock_response) as mock_post: summary = await summarizer.summarize_video("summarize_vid") @@ -66,7 +66,7 @@ async def test_summarize_video_success(test_db): # Verify API request details mock_post.assert_called_once() url = mock_post.call_args[0][0] - assert "bytecatcode.org" in url + assert summarizer.BASE_URL in url headers = mock_post.call_args[1]["headers"] assert "x-api-key" in headers @@ -105,7 +105,7 @@ async def test_summarize_all_pending(test_db): "content": [{"text": "Fresh summary"}] } - with patch("youtube_transcript_api.YouTubeTranscriptApi.list_transcripts", return_value=mock_list), \ + with patch("youtube_transcript_api.YouTubeTranscriptApi.list", return_value=mock_list), \ patch("httpx.AsyncClient.post", new_callable=AsyncMock, return_value=mock_response) as mock_post: await summarizer.summarize_all_pending()