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

115 lines
4.4 KiB
Python

"""Unit tests for ``NotebookLMClient._reqid.next_reqid``.
Covers:
- ``next_reqid()`` returns monotonic, post-increment values.
- Custom ``step`` parameter works.
- ``next_reqid()`` itself does NOT emit a ``DeprecationWarning``.
The ``NotebookLMClient.next_reqid`` compatibility forward was deleted in Wave 11c
of session-decoupling; callers reach the canonical counter directly via
``core._collaborators.reqid.next_reqid(...)``. The ``_reqid_counter`` compat property +
setter (the read-bridge and the deprecation gesture on direct mutation)
were retired earlier in the session-shrink arc; tests read
``core._collaborators.reqid.value`` directly and use ``core._collaborators.reqid.set_value(...)`` to
seed a baseline.
"""
import warnings
import pytest
from notebooklm.auth import AuthTokens
from notebooklm.client import NotebookLMClient
from tests._helpers.client_factory import build_client_shell_for_tests
def _make_core() -> NotebookLMClient:
auth = AuthTokens(
cookies={"SID": "test"},
csrf_token="test_csrf",
session_id="test_session",
)
return build_client_shell_for_tests(auth=auth)
@pytest.mark.asyncio
async def test_next_reqid_returns_post_increment_values() -> None:
"""Three successive calls bump by the default step and return new values."""
core = _make_core()
assert core._collaborators.reqid.value == 100000 # baseline
first = await core._collaborators.reqid.next_reqid()
second = await core._collaborators.reqid.next_reqid()
third = await core._collaborators.reqid.next_reqid()
assert first == 200000
assert second == 300000
assert third == 400000
# And the property reflects the final state.
assert core._collaborators.reqid.value == 400000
@pytest.mark.asyncio
async def test_next_reqid_custom_step() -> None:
"""A non-default ``step`` parameter is honoured."""
core = _make_core()
assert await core._collaborators.reqid.next_reqid(step=1) == 100001
assert await core._collaborators.reqid.next_reqid(step=7) == 100008
assert await core._collaborators.reqid.next_reqid(step=1000) == 101008
@pytest.mark.asyncio
async def test_next_reqid_does_not_warn() -> None:
"""The intended API surface must be silent — no ``DeprecationWarning``."""
core = _make_core()
with warnings.catch_warnings(record=True) as caught:
warnings.simplefilter("always")
await core._collaborators.reqid.next_reqid()
await core._collaborators.reqid.next_reqid()
deprecations = [w for w in caught if issubclass(w.category, DeprecationWarning)]
assert deprecations == [], (
"next_reqid() must not emit DeprecationWarning; "
f"got {[(w.category.__name__, str(w.message)) for w in deprecations]}"
)
@pytest.mark.asyncio
async def test_next_reqid_rejects_zero_step() -> None:
"""``step=0`` would break uniqueness (two callers see the same value)."""
core = _make_core()
with pytest.raises(ValueError, match="step must be positive"):
await core._collaborators.reqid.next_reqid(step=0)
# Counter must not have moved.
assert core._collaborators.reqid.value == 100000
@pytest.mark.asyncio
async def test_next_reqid_rejects_negative_step() -> None:
"""``step<0`` would break monotonicity (counter moves backwards)."""
core = _make_core()
with pytest.raises(ValueError, match="step must be positive"):
await core._collaborators.reqid.next_reqid(step=-1)
assert core._collaborators.reqid.value == 100000
@pytest.mark.asyncio
async def test_next_reqid_rejects_non_int_step() -> None:
"""Non-``int`` ``step`` (e.g. ``str``) must raise ``TypeError`` early."""
core = _make_core()
with pytest.raises(TypeError, match="step must be int"):
await core._collaborators.reqid.next_reqid(step="100") # type: ignore[arg-type]
assert core._collaborators.reqid.value == 100000
@pytest.mark.asyncio
async def test_next_reqid_rejects_bool_step() -> None:
"""``bool`` is a subclass of ``int`` in Python; the guard must still
reject ``step=True`` to prevent a silent degradation to ``step=1``.
"""
core = _make_core()
with pytest.raises(TypeError, match="step must be int"):
await core._collaborators.reqid.next_reqid(step=True) # type: ignore[arg-type]
with pytest.raises(TypeError, match="step must be int"):
await core._collaborators.reqid.next_reqid(step=False) # type: ignore[arg-type]
assert core._collaborators.reqid.value == 100000