mirror of
https://github.com/aljazceru/nutshell.git
synced 2025-12-20 10:34:20 +01:00
* clean up db * db: table lock * db.table_with_schema * fix encrypt.py * postgres nowait * add timeout to lock * melt quote state in db * kinda working * kinda working with postgres * remove dispose * getting there * porperly clean up db for tests * faster tests * configure connection pooling * try github with connection pool * invoice dispatcher does not lock db * fakewallet: pay_if_regtest waits * pay fakewallet invoices * add more * faster * slower * pay_if_regtest async * do not lock the invoice dispatcher * test: do I get disk I/O errors if we disable the invoice_callback_dispatcher? * fix fake so it workss without a callback dispatchert * test on github * readd tasks * refactor * increase time for lock invoice disatcher * try avoiding a race * remove task * github actions: test regtest with postgres * mint per module * no connection pool for testing * enable pool * do not resend paid event * reuse connection * close db connections * sessions * enable debug * dispose engine * disable connection pool for tests * enable connection pool for postgres only * clean up shutdown routine * remove wait for lightning fakewallet lightning invoice * cancel invoice listener tasks on shutdown * fakewallet conftest: decrease outgoing delay * delay payment and set postgres only if needed * disable fail fast for regtest * clean up regtest.yml * change order of tests_db.py * row-specific mint_quote locking * refactor * fix lock statement * refactor swap * refactor * remove psycopg2 * add connection string example to .env.example * remove unnecessary pay * shorter sleep in test_wallet_subscription_swap
131 lines
4.2 KiB
Python
131 lines
4.2 KiB
Python
from typing import List, Union
|
|
|
|
import pytest
|
|
import pytest_asyncio
|
|
|
|
from cashu.core.base import Proof
|
|
from cashu.core.errors import CashuError
|
|
from cashu.wallet.lightning import LightningWallet
|
|
from tests.conftest import SERVER_ENDPOINT
|
|
from tests.helpers import get_real_invoice, is_fake, is_regtest, pay_if_regtest
|
|
|
|
|
|
async def assert_err(f, msg: Union[str, CashuError]):
|
|
"""Compute f() and expect an error message 'msg'."""
|
|
try:
|
|
await f
|
|
except Exception as exc:
|
|
error_message: str = str(exc.args[0])
|
|
if isinstance(msg, CashuError):
|
|
if msg.detail not in error_message:
|
|
raise Exception(
|
|
f"CashuError. Expected error: {msg.detail}, got: {error_message}"
|
|
)
|
|
return
|
|
if msg not in error_message:
|
|
raise Exception(f"Expected error: {msg}, got: {error_message}")
|
|
return
|
|
raise Exception(f"Expected error: {msg}, got no error")
|
|
|
|
|
|
def assert_amt(proofs: List[Proof], expected: int):
|
|
"""Assert amounts the proofs contain."""
|
|
assert [p.amount for p in proofs] == expected
|
|
|
|
|
|
async def reset_wallet_db(wallet: LightningWallet):
|
|
await wallet.db.execute("DELETE FROM proofs")
|
|
await wallet.db.execute("DELETE FROM proofs_used")
|
|
await wallet.db.execute("DELETE FROM keysets")
|
|
await wallet.load_mint()
|
|
|
|
|
|
@pytest_asyncio.fixture(scope="function")
|
|
async def wallet():
|
|
wallet = await LightningWallet.with_db(
|
|
url=SERVER_ENDPOINT,
|
|
db="test_data/wallet1",
|
|
name="wallet1",
|
|
)
|
|
await wallet.async_init()
|
|
yield wallet
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_create_invoice(wallet: LightningWallet):
|
|
invoice = await wallet.create_invoice(64)
|
|
assert invoice.payment_request
|
|
assert invoice.payment_request.startswith("ln")
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
@pytest.mark.skipif(is_regtest, reason="only works with FakeWallet")
|
|
async def test_check_invoice_internal(wallet: LightningWallet):
|
|
# fill wallet
|
|
invoice = await wallet.create_invoice(64)
|
|
assert invoice.payment_request
|
|
assert invoice.checking_id
|
|
status = await wallet.get_invoice_status(invoice.checking_id)
|
|
assert status.paid
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
@pytest.mark.skipif(is_fake, reason="only works with Regtest")
|
|
async def test_check_invoice_external(wallet: LightningWallet):
|
|
# fill wallet
|
|
invoice = await wallet.create_invoice(64)
|
|
assert invoice.payment_request
|
|
assert invoice.checking_id
|
|
status = await wallet.get_invoice_status(invoice.checking_id)
|
|
assert not status.paid
|
|
await pay_if_regtest(invoice.payment_request)
|
|
status = await wallet.get_invoice_status(invoice.checking_id)
|
|
assert status.paid
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
@pytest.mark.skipif(is_regtest, reason="only works with FakeWallet")
|
|
async def test_pay_invoice_internal(wallet: LightningWallet):
|
|
# fill wallet
|
|
invoice = await wallet.create_invoice(64)
|
|
assert invoice.payment_request
|
|
assert invoice.checking_id
|
|
await wallet.get_invoice_status(invoice.checking_id)
|
|
assert wallet.available_balance >= 64
|
|
|
|
# pay invoice
|
|
invoice2 = await wallet.create_invoice(16)
|
|
assert invoice2.payment_request
|
|
status = await wallet.pay_invoice(invoice2.payment_request)
|
|
|
|
assert status.ok
|
|
|
|
# check payment
|
|
assert invoice2.checking_id
|
|
status = await wallet.get_payment_status(invoice2.checking_id)
|
|
assert status.paid
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
@pytest.mark.skipif(is_fake, reason="only works with Regtest")
|
|
async def test_pay_invoice_external(wallet: LightningWallet):
|
|
# fill wallet
|
|
invoice = await wallet.create_invoice(64)
|
|
assert invoice.payment_request
|
|
assert invoice.checking_id
|
|
await pay_if_regtest(invoice.payment_request)
|
|
status = await wallet.get_invoice_status(invoice.checking_id)
|
|
assert status.paid
|
|
assert wallet.available_balance >= 64
|
|
|
|
# pay invoice
|
|
invoice_real = get_real_invoice(16)
|
|
status = await wallet.pay_invoice(invoice_real["payment_request"])
|
|
|
|
assert status.ok
|
|
|
|
# check payment
|
|
assert status.checking_id
|
|
status = await wallet.get_payment_status(status.checking_id)
|
|
assert status.paid
|