diff --git a/tasks.py b/tasks.py index a19a0d8..70f3205 100644 --- a/tasks.py +++ b/tasks.py @@ -114,6 +114,14 @@ async def _process_invoice( payment_status = await check_transaction_status(wallet_id, payment_hash) if payment_status.success: break + if payment_status.failed: + return { + "error": { + "code": "PAYMENT_FAILED", + "message": "Payment failed.", + }, + "in_budget": in_budget, + } await asyncio.sleep(0.05) if not payment_status: raise Exception("Payment status not found") diff --git a/tests/unit/test_tasks.py b/tests/unit/test_tasks.py new file mode 100644 index 0000000..cca51bb --- /dev/null +++ b/tests/unit/test_tasks.py @@ -0,0 +1,31 @@ +from types import SimpleNamespace + +import pytest + +from ... import tasks + + +@pytest.mark.asyncio +async def test_process_invoice_returns_payment_failed_on_failed_status(monkeypatch): + async def fake_tracked_spend_nwc(*args, **kwargs): + return True, "a" * 64 + + async def fake_check_transaction_status(wallet_id: str, payment_hash: str): + return SimpleNamespace(success=False, failed=True) + + monkeypatch.setattr(tasks, "tracked_spend_nwc", fake_tracked_spend_nwc) + monkeypatch.setattr( + tasks, "check_transaction_status", fake_check_transaction_status + ) + + result = await tasks._process_invoice( + wallet_id="wallet123", + pubkey="a" * 64, + invoice="lnbc1example", + amount_msats=1000, + description="test", + ) + + assert result["error"]["code"] == "PAYMENT_FAILED" + assert result["error"]["message"] == "Payment failed." + assert result["in_budget"] is True