mirror of
https://github.com/aljazceru/nutshell.git
synced 2025-12-20 18:44:20 +01:00
* `PaymentResult` * ledger: rely on PaymentResult instead of paid flag. Double check for payments marked pending. * `None` is `PENDING` * make format * reflected changes API tests where `PaymentStatus` is used + reflected changes in lnbits * reflect changes in blink backend and tests * fix lnbits get_payment_status * remove paid flag * fix mypy * remove more paid flags * fix strike mypy * green * shorten all state checks * fix * fix some tests * gimme ✅ * fix............ * fix lnbits * fix error * lightning refactor * add more regtest tests * add tests for pending state and failure * shorten checks * use match case for startup check - and remember modified checking_id from pay_invoice * fix strike pending return * new tests? * refactor startup routine into get_melt_quote * test with purge * refactor blink * cleanup responses * blink: return checking_id on failure * fix lndgrpc try except * add more testing for melt branches * speed things up a bit * remove comments * remove comments * block pending melt quotes * remove comments --------- Co-authored-by: lollerfirst <lollerfirst@gmail.com>
113 lines
3.4 KiB
Python
113 lines
3.4 KiB
Python
import asyncio
|
|
|
|
import pytest
|
|
import pytest_asyncio
|
|
|
|
from cashu.core.base import Method, MintQuoteState, ProofState
|
|
from cashu.core.json_rpc.base import JSONRPCNotficationParams
|
|
from cashu.core.nuts import WEBSOCKETS_NUT
|
|
from cashu.core.settings import settings
|
|
from cashu.wallet.wallet import Wallet
|
|
from tests.conftest import SERVER_ENDPOINT
|
|
from tests.helpers import (
|
|
is_fake,
|
|
pay_if_regtest,
|
|
)
|
|
|
|
|
|
@pytest_asyncio.fixture(scope="function")
|
|
async def wallet(mint):
|
|
wallet1 = await Wallet.with_db(
|
|
url=SERVER_ENDPOINT,
|
|
db="test_data/wallet_subscriptions",
|
|
name="wallet_subscriptions",
|
|
)
|
|
await wallet1.load_mint()
|
|
yield wallet1
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
@pytest.mark.skipif(is_fake, reason="only regtest")
|
|
async def test_wallet_subscription_mint(wallet: Wallet):
|
|
if not wallet.mint_info.supports_nut(WEBSOCKETS_NUT):
|
|
pytest.skip("No websocket support")
|
|
|
|
if not wallet.mint_info.supports_websocket_mint_quote(
|
|
Method["bolt11"], wallet.unit
|
|
):
|
|
pytest.skip("No websocket support for bolt11_mint_quote")
|
|
|
|
triggered = False
|
|
msg_stack: list[JSONRPCNotficationParams] = []
|
|
|
|
def callback(msg: JSONRPCNotficationParams):
|
|
nonlocal triggered, msg_stack
|
|
triggered = True
|
|
msg_stack.append(msg)
|
|
asyncio.run(wallet.mint(int(invoice.amount), id=invoice.id))
|
|
|
|
invoice, sub = await wallet.request_mint_with_callback(128, callback=callback)
|
|
await pay_if_regtest(invoice.bolt11)
|
|
wait = settings.fakewallet_delay_incoming_payment or 2
|
|
await asyncio.sleep(wait + 2)
|
|
|
|
assert triggered
|
|
assert len(msg_stack) == 3
|
|
|
|
assert msg_stack[0].payload["state"] == MintQuoteState.unpaid.value
|
|
|
|
assert msg_stack[1].payload["state"] == MintQuoteState.paid.value
|
|
|
|
assert msg_stack[2].payload["state"] == MintQuoteState.issued.value
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_wallet_subscription_swap(wallet: Wallet):
|
|
if not wallet.mint_info.supports_nut(WEBSOCKETS_NUT):
|
|
pytest.skip("No websocket support")
|
|
|
|
invoice = await wallet.request_mint(64)
|
|
await pay_if_regtest(invoice.bolt11)
|
|
await wallet.mint(64, id=invoice.id)
|
|
|
|
triggered = False
|
|
msg_stack: list[JSONRPCNotficationParams] = []
|
|
|
|
def callback(msg: JSONRPCNotficationParams):
|
|
nonlocal triggered, msg_stack
|
|
triggered = True
|
|
msg_stack.append(msg)
|
|
|
|
n_subscriptions = len(wallet.proofs)
|
|
state, sub = await wallet.check_proof_state_with_callback(
|
|
wallet.proofs, callback=callback
|
|
)
|
|
|
|
_ = await wallet.swap_to_send(wallet.proofs, 64)
|
|
|
|
wait = 1
|
|
await asyncio.sleep(wait)
|
|
assert triggered
|
|
|
|
# we receive 3 messages for each subscription:
|
|
# initial state (UNSPENT), pending state (PENDING), spent state (SPENT)
|
|
assert len(msg_stack) == n_subscriptions * 3
|
|
|
|
# the first one is the UNSPENT state
|
|
pending_stack = msg_stack[:n_subscriptions]
|
|
for msg in pending_stack:
|
|
proof_state = ProofState.parse_obj(msg.payload)
|
|
assert proof_state.unspent
|
|
|
|
# the second one is the PENDING state
|
|
spent_stack = msg_stack[n_subscriptions : n_subscriptions * 2]
|
|
for msg in spent_stack:
|
|
proof_state = ProofState.parse_obj(msg.payload)
|
|
assert proof_state.pending
|
|
|
|
# the third one is the SPENT state
|
|
spent_stack = msg_stack[n_subscriptions * 2 :]
|
|
for msg in spent_stack:
|
|
proof_state = ProofState.parse_obj(msg.payload)
|
|
assert proof_state.spent
|