From aae2c9059e4b49485c0870ffa6777558e239a404 Mon Sep 17 00:00:00 2001 From: 9qeklajc Date: Tue, 25 Aug 2026 01:47:26 +0200 Subject: [PATCH] test: cover busy_timeout connect_arg and refund single-attempt side effects --- tests/unit/test_db_pool_config.py | 31 ++++++++++++++++++++++++++++++ tests/unit/test_refund_no_retry.py | 23 ++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/tests/unit/test_db_pool_config.py b/tests/unit/test_db_pool_config.py index 8f5d0367..bc2a8dd9 100644 --- a/tests/unit/test_db_pool_config.py +++ b/tests/unit/test_db_pool_config.py @@ -56,9 +56,40 @@ def test_non_sqlite_backend_enables_pre_ping_automatically( assert created is fake_engine assert factory.call_args.kwargs["pool_pre_ping"] is True + assert "timeout" not in factory.call_args.kwargs["connect_args"] assert listen.call_count == 2 +def test_file_sqlite_sets_busy_timeout_connect_arg( + monkeypatch: pytest.MonkeyPatch, tmp_path: object +) -> None: + monkeypatch.setattr(settings, "database_busy_timeout", 42.0) + fake_engine = MagicMock() + + with ( + patch.object(db, "create_async_engine", return_value=fake_engine) as factory, + patch.object(db.event, "listen"), + ): + create_db_engine(f"sqlite+aiosqlite:///{tmp_path}/busy.db") + + assert factory.call_args.kwargs["connect_args"]["timeout"] == 42.0 + + +def test_memory_sqlite_omits_busy_timeout_connect_arg( + monkeypatch: pytest.MonkeyPatch, +) -> None: + monkeypatch.setattr(settings, "database_busy_timeout", 42.0) + fake_engine = MagicMock() + + with ( + patch.object(db, "create_async_engine", return_value=fake_engine) as factory, + patch.object(db.event, "listen"), + ): + create_db_engine("sqlite+aiosqlite://") + + assert "timeout" not in factory.call_args.kwargs["connect_args"] + + @pytest.mark.asyncio async def test_every_created_engine_warns_for_long_checkouts( monkeypatch: pytest.MonkeyPatch, tmp_path: object diff --git a/tests/unit/test_refund_no_retry.py b/tests/unit/test_refund_no_retry.py index 8c6b4b88..f176755d 100644 --- a/tests/unit/test_refund_no_retry.py +++ b/tests/unit/test_refund_no_retry.py @@ -13,9 +13,11 @@ from routstr.upstream.base import BaseUpstreamProvider async def test_send_refund_does_not_retry_ambiguous_token_creation() -> None: provider = object.__new__(BaseUpstreamProvider) send_token = AsyncMock(side_effect=httpx.ReadTimeout("swap response lost")) + store = AsyncMock() with ( patch("routstr.upstream.base.send_token", send_token), + patch("routstr.upstream.base.store_cashu_transaction", store), pytest.raises(HTTPException) as raised, ): await provider.send_refund(10, "sat", mint="https://mint.test") @@ -24,3 +26,24 @@ async def test_send_refund_does_not_retry_ambiguous_token_creation() -> None: send_token.assert_awaited_once_with( 10, unit="sat", mint_url="https://mint.test" ) + store.assert_not_awaited() + + +@pytest.mark.asyncio +async def test_send_refund_does_not_retry_or_store_on_generic_failure() -> None: + provider = object.__new__(BaseUpstreamProvider) + send_token = AsyncMock(side_effect=Exception("mint rejected swap")) + store = AsyncMock() + + with ( + patch("routstr.upstream.base.send_token", send_token), + patch("routstr.upstream.base.store_cashu_transaction", store), + pytest.raises(HTTPException) as raised, + ): + await provider.send_refund(10, "sat", mint="https://mint.test") + + assert raised.value.status_code == 401 + send_token.assert_awaited_once_with( + 10, unit="sat", mint_url="https://mint.test" + ) + store.assert_not_awaited()