Files
wehub-resource-sync 09e9f3545f
Test / Code Quality (push) Has been cancelled
Test / Test (macos-latest, Python 3.10) (push) Has been cancelled
Test / Test (macos-latest, Python 3.11) (push) Has been cancelled
Test / Test (macos-latest, Python 3.12) (push) Has been cancelled
Test / Test (macos-latest, Python 3.13) (push) Has been cancelled
Test / Test (macos-latest, Python 3.14) (push) Has been cancelled
Test / Test (ubuntu-latest, Python 3.10) (push) Has been cancelled
Test / Test (ubuntu-latest, Python 3.11) (push) Has been cancelled
Test / Test (ubuntu-latest, Python 3.12) (push) Has been cancelled
Test / Test (ubuntu-latest, Python 3.13) (push) Has been cancelled
Test / Test (ubuntu-latest, Python 3.14) (push) Has been cancelled
Test / Test (windows-latest, Python 3.10) (push) Has been cancelled
Test / Test (windows-latest, Python 3.11) (push) Has been cancelled
Test / Test (windows-latest, Python 3.12) (push) Has been cancelled
Test / Test (windows-latest, Python 3.13) (push) Has been cancelled
Test / Test (windows-latest, Python 3.14) (push) Has been cancelled
CodeQL / Analyze (push) Has been cancelled
dependency-audit / pip-audit (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:30:13 +08:00

136 lines
4.4 KiB
Python

"""VCR tests against real NotebookLM API.
These tests record actual API interactions for regression testing.
Run with NOTEBOOKLM_VCR_RECORD=1 to record new cassettes.
Recording requires: NOTEBOOKLM_READ_ONLY_NOTEBOOK_ID (same as e2e tests)
Note: Notebook ID only matters when RECORDING. During replay, VCR uses
recorded responses regardless of notebook ID.
Note: These tests are automatically skipped if cassettes are not available.
"""
import os
import pytest
from notebooklm import NotebookLMClient
from tests.integration.conftest import get_vcr_auth, skip_no_cassettes
from tests.vcr_config import notebooklm_vcr
# Skip all tests in this module if cassettes are not available
pytestmark = [pytest.mark.vcr, skip_no_cassettes]
# Use same env var as e2e tests for consistency
TEST_NOTEBOOK_ID = os.environ.get("NOTEBOOKLM_READ_ONLY_NOTEBOOK_ID", "")
class TestRealAPIWithVCR:
"""Tests that record/replay real NotebookLM API interactions."""
@pytest.mark.vcr
@pytest.mark.asyncio
@notebooklm_vcr.use_cassette("real_api_list_notebooks.yaml")
async def test_list_notebooks(self):
"""Record listing notebooks from real API."""
auth = await get_vcr_auth()
async with NotebookLMClient(auth) as client:
notebooks = await client.notebooks.list()
assert isinstance(notebooks, list)
# Should have at least the test notebook
assert len(notebooks) >= 1
@pytest.mark.vcr
@pytest.mark.asyncio
@notebooklm_vcr.use_cassette("real_api_get_notebook.yaml")
async def test_get_notebook(self):
"""Record getting a specific notebook from real API."""
auth = await get_vcr_auth()
async with NotebookLMClient(auth) as client:
notebook = await client.notebooks.get(TEST_NOTEBOOK_ID)
assert notebook is not None
# Only check ID match when recording (env var set)
if TEST_NOTEBOOK_ID:
assert notebook.id == TEST_NOTEBOOK_ID
@pytest.mark.vcr
@pytest.mark.asyncio
@notebooklm_vcr.use_cassette("real_api_list_sources.yaml")
async def test_list_sources(self):
"""Record listing sources from a notebook."""
auth = await get_vcr_auth()
async with NotebookLMClient(auth) as client:
sources = await client.sources.list(TEST_NOTEBOOK_ID)
assert isinstance(sources, list)
class TestArtifactsWithVCR:
"""Tests for artifact operations (most likely to be rate-limited)."""
@pytest.mark.vcr
@pytest.mark.asyncio
@notebooklm_vcr.use_cassette("real_api_list_artifacts.yaml")
async def test_list_artifacts(self):
"""Record listing all artifacts from a notebook."""
auth = await get_vcr_auth()
async with NotebookLMClient(auth) as client:
artifacts = await client.artifacts.list(TEST_NOTEBOOK_ID)
assert isinstance(artifacts, list)
@pytest.mark.vcr
@pytest.mark.asyncio
@notebooklm_vcr.use_cassette("real_api_list_audio.yaml")
async def test_list_audio_artifacts(self):
"""Record listing audio artifacts (podcasts)."""
auth = await get_vcr_auth()
async with NotebookLMClient(auth) as client:
audio = await client.artifacts.list_audio(TEST_NOTEBOOK_ID)
assert isinstance(audio, list)
@pytest.mark.vcr
@pytest.mark.asyncio
@notebooklm_vcr.use_cassette("real_api_list_reports.yaml")
async def test_list_reports(self):
"""Record listing report artifacts."""
auth = await get_vcr_auth()
async with NotebookLMClient(auth) as client:
reports = await client.artifacts.list_reports(TEST_NOTEBOOK_ID)
assert isinstance(reports, list)
@pytest.mark.vcr
@pytest.mark.asyncio
@notebooklm_vcr.use_cassette("real_api_list_quizzes.yaml")
async def test_list_quizzes(self):
"""Record listing quiz artifacts."""
auth = await get_vcr_auth()
async with NotebookLMClient(auth) as client:
quizzes = await client.artifacts.list_quizzes(TEST_NOTEBOOK_ID)
assert isinstance(quizzes, list)
@pytest.mark.vcr
@pytest.mark.asyncio
@notebooklm_vcr.use_cassette("real_api_list_mind_maps.yaml")
async def test_list_mind_maps(self):
"""Record listing mind map artifacts (via notes API)."""
auth = await get_vcr_auth()
async with NotebookLMClient(auth) as client:
mind_maps = await client.notes.list_mind_maps(TEST_NOTEBOOK_ID)
assert isinstance(mind_maps, list)