mirror of
https://github.com/lnbits/lnbits.git
synced 2025-06-15 19:33:34 +02:00
test: refactor to not use paid_invoices stream for real invoice tests (#2628)
This commit is contained in:
parent
ddb8fcb986
commit
40ffa7dea0
@ -972,7 +972,6 @@ async def update_payment_details(
|
|||||||
f"UPDATE apipayments SET {', '.join(set_clause)} WHERE checking_id = ?",
|
f"UPDATE apipayments SET {', '.join(set_clause)} WHERE checking_id = ?",
|
||||||
tuple(set_variables),
|
tuple(set_variables),
|
||||||
)
|
)
|
||||||
return
|
|
||||||
|
|
||||||
|
|
||||||
async def update_payment_extra(
|
async def update_payment_extra(
|
||||||
|
@ -217,6 +217,8 @@ async def invoice_callback_dispatcher(checking_id: str, is_internal: bool = Fals
|
|||||||
preimage=status.preimage,
|
preimage=status.preimage,
|
||||||
status=PaymentState.SUCCESS,
|
status=PaymentState.SUCCESS,
|
||||||
)
|
)
|
||||||
|
payment = await get_standalone_payment(checking_id, incoming=True)
|
||||||
|
assert payment, "updated payment not found"
|
||||||
internal = "internal" if is_internal else ""
|
internal = "internal" if is_internal else ""
|
||||||
logger.success(f"{internal} invoice {checking_id} settled")
|
logger.success(f"{internal} invoice {checking_id} settled")
|
||||||
for name, send_chan in invoice_listeners.items():
|
for name, send_chan in invoice_listeners.items():
|
||||||
|
@ -10,6 +10,10 @@ from lnbits.db import DB_TYPE, POSTGRES, FromRowModel
|
|||||||
from lnbits.wallets import get_funding_source, set_funding_source
|
from lnbits.wallets import get_funding_source, set_funding_source
|
||||||
|
|
||||||
|
|
||||||
|
class FakeError(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
class DbTestModel(FromRowModel):
|
class DbTestModel(FromRowModel):
|
||||||
id: int
|
id: int
|
||||||
name: str
|
name: str
|
||||||
|
@ -7,9 +7,10 @@ from lnbits import bolt11
|
|||||||
from lnbits.core.crud import get_standalone_payment, update_payment_details
|
from lnbits.core.crud import get_standalone_payment, update_payment_details
|
||||||
from lnbits.core.models import CreateInvoice, Payment, PaymentState
|
from lnbits.core.models import CreateInvoice, Payment, PaymentState
|
||||||
from lnbits.core.services import fee_reserve_total, get_balance_delta
|
from lnbits.core.services import fee_reserve_total, get_balance_delta
|
||||||
|
from lnbits.tasks import create_task, wait_for_paid_invoices
|
||||||
from lnbits.wallets import get_funding_source
|
from lnbits.wallets import get_funding_source
|
||||||
|
|
||||||
from ..helpers import is_fake, is_regtest
|
from ..helpers import FakeError, is_fake, is_regtest
|
||||||
from .helpers import (
|
from .helpers import (
|
||||||
cancel_invoice,
|
cancel_invoice,
|
||||||
get_real_invoice,
|
get_real_invoice,
|
||||||
@ -79,22 +80,9 @@ async def test_create_real_invoice(client, adminkey_headers_from, inkey_headers_
|
|||||||
payment_status = response.json()
|
payment_status = response.json()
|
||||||
assert not payment_status["paid"]
|
assert not payment_status["paid"]
|
||||||
|
|
||||||
async def listen():
|
async def on_paid(payment: Payment):
|
||||||
async for checking_id in get_funding_source().paid_invoices_stream():
|
|
||||||
if checking_id == invoice["checking_id"]:
|
|
||||||
# wait for the backend to update the payment status
|
|
||||||
await asyncio.sleep(3)
|
|
||||||
return checking_id
|
|
||||||
|
|
||||||
async def pay():
|
assert payment.checking_id == invoice["payment_hash"]
|
||||||
# wait a sec to paid_invoices_stream to start listening
|
|
||||||
await asyncio.sleep(1)
|
|
||||||
pay_real_invoice(invoice["payment_request"])
|
|
||||||
return True
|
|
||||||
|
|
||||||
checking_id, paid = await asyncio.gather(listen(), pay())
|
|
||||||
assert paid
|
|
||||||
assert checking_id == invoice["payment_hash"]
|
|
||||||
|
|
||||||
response = await client.get(
|
response = await client.get(
|
||||||
f'/api/v1/payments/{invoice["payment_hash"]}', headers=inkey_headers_from
|
f'/api/v1/payments/{invoice["payment_hash"]}', headers=inkey_headers_from
|
||||||
@ -107,6 +95,16 @@ async def test_create_real_invoice(client, adminkey_headers_from, inkey_headers_
|
|||||||
balance = await get_node_balance_sats()
|
balance = await get_node_balance_sats()
|
||||||
assert balance - prev_balance == create_invoice.amount
|
assert balance - prev_balance == create_invoice.amount
|
||||||
|
|
||||||
|
# exit out of infinite loop
|
||||||
|
raise FakeError()
|
||||||
|
|
||||||
|
task = create_task(wait_for_paid_invoices("test_create_invoice", on_paid)())
|
||||||
|
pay_real_invoice(invoice["payment_request"])
|
||||||
|
|
||||||
|
# wait for the task to exit
|
||||||
|
with pytest.raises(FakeError):
|
||||||
|
await task
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.asyncio
|
@pytest.mark.asyncio
|
||||||
@pytest.mark.skipif(is_fake, reason="this only works in regtest")
|
@pytest.mark.skipif(is_fake, reason="this only works in regtest")
|
||||||
@ -298,22 +296,8 @@ async def test_receive_real_invoice_set_pending_and_check_state(
|
|||||||
payment_status = response.json()
|
payment_status = response.json()
|
||||||
assert not payment_status["paid"]
|
assert not payment_status["paid"]
|
||||||
|
|
||||||
async def listen():
|
async def on_paid(payment: Payment):
|
||||||
async for checking_id in get_funding_source().paid_invoices_stream():
|
assert payment.checking_id == invoice["payment_hash"]
|
||||||
if checking_id == invoice["checking_id"]:
|
|
||||||
# wait for the backend to update the payment status
|
|
||||||
await asyncio.sleep(3)
|
|
||||||
return checking_id
|
|
||||||
|
|
||||||
async def pay():
|
|
||||||
# wait a sec to paid_invoices_stream to start listening
|
|
||||||
await asyncio.sleep(1)
|
|
||||||
pay_real_invoice(invoice["payment_request"])
|
|
||||||
return True
|
|
||||||
|
|
||||||
checking_id, paid = await asyncio.gather(listen(), pay())
|
|
||||||
assert paid
|
|
||||||
assert checking_id == invoice["payment_hash"]
|
|
||||||
|
|
||||||
response = await client.get(
|
response = await client.get(
|
||||||
f'/api/v1/payments/{invoice["payment_hash"]}', headers=inkey_headers_from
|
f'/api/v1/payments/{invoice["payment_hash"]}', headers=inkey_headers_from
|
||||||
@ -322,8 +306,6 @@ async def test_receive_real_invoice_set_pending_and_check_state(
|
|||||||
payment_status = response.json()
|
payment_status = response.json()
|
||||||
assert payment_status["paid"]
|
assert payment_status["paid"]
|
||||||
|
|
||||||
# get the incoming payment from the db
|
|
||||||
payment = await get_standalone_payment(invoice["payment_hash"], incoming=True)
|
|
||||||
assert payment
|
assert payment
|
||||||
assert payment.pending is False
|
assert payment.pending is False
|
||||||
|
|
||||||
@ -338,6 +320,15 @@ async def test_receive_real_invoice_set_pending_and_check_state(
|
|||||||
assert payment_pending.success is False
|
assert payment_pending.success is False
|
||||||
assert payment_pending.failed is False
|
assert payment_pending.failed is False
|
||||||
|
|
||||||
|
# exit out of infinite loop
|
||||||
|
raise FakeError()
|
||||||
|
|
||||||
|
task = create_task(wait_for_paid_invoices("test_create_invoice", on_paid)())
|
||||||
|
pay_real_invoice(invoice["payment_request"])
|
||||||
|
|
||||||
|
with pytest.raises(FakeError):
|
||||||
|
await task
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.asyncio
|
@pytest.mark.asyncio
|
||||||
async def test_check_fee_reserve(client, adminkey_headers_from):
|
async def test_check_fee_reserve(client, adminkey_headers_from):
|
||||||
|
@ -160,7 +160,8 @@ async def test_peer_management(node_client):
|
|||||||
|
|
||||||
response = await node_client.delete(f"/node/api/v1/peers/{peer_id}")
|
response = await node_client.delete(f"/node/api/v1/peers/{peer_id}")
|
||||||
assert response.status_code == 200
|
assert response.status_code == 200
|
||||||
await asyncio.sleep(0.1)
|
# lndrest is slow to remove the peer
|
||||||
|
await asyncio.sleep(0.3)
|
||||||
|
|
||||||
response = await node_client.get("/node/api/v1/peers")
|
response = await node_client.get("/node/api/v1/peers")
|
||||||
assert response.status_code == 200
|
assert response.status_code == 200
|
||||||
|
Loading…
x
Reference in New Issue
Block a user