diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4b1e78c..4819a0f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -57,8 +57,24 @@ jobs: poetry-version: ${{ matrix.poetry-version }} mint-database: ${{ matrix.mint-database }} - regtest: - uses: ./.github/workflows/regtest.yml + regtest-mint: + uses: ./.github/workflows/regtest-mint.yml + strategy: + fail-fast: false + matrix: + python-version: ["3.10"] + poetry-version: ["1.8.5"] + backend-wallet-class: + ["LndRPCWallet", "LndRestWallet", "CLNRestWallet", "CoreLightningRestWallet", "LNbitsWallet"] + mint-database: ["./test_data/test_mint", "postgres://cashu:cashu@localhost:5432/cashu"] + # mint-database: ["./test_data/test_mint"] + with: + python-version: ${{ matrix.python-version }} + backend-wallet-class: ${{ matrix.backend-wallet-class }} + mint-database: ${{ matrix.mint-database }} + + regtest-wallet: + uses: ./.github/workflows/regtest-wallet.yml strategy: fail-fast: false matrix: diff --git a/.github/workflows/regtest.yml b/.github/workflows/regtest-mint.yml similarity index 97% rename from .github/workflows/regtest.yml rename to .github/workflows/regtest-mint.yml index 0514624..d59a0bc 100644 --- a/.github/workflows/regtest.yml +++ b/.github/workflows/regtest-mint.yml @@ -1,4 +1,4 @@ -name: regtest +name: regtest-mint on: workflow_call: @@ -20,7 +20,7 @@ on: type: string jobs: - regtest: + regtest-mint: runs-on: ${{ inputs.os-version }} timeout-minutes: 10 steps: @@ -73,7 +73,7 @@ jobs: MINT_CLNREST_CERT: ./regtest/data/clightning-2/regtest/ca.pem run: | sudo chmod -R 777 . - make test + make test-mint - name: Upload coverage to Codecov uses: codecov/codecov-action@v3 diff --git a/.github/workflows/regtest-wallet.yml b/.github/workflows/regtest-wallet.yml new file mode 100644 index 0000000..052a88c --- /dev/null +++ b/.github/workflows/regtest-wallet.yml @@ -0,0 +1,79 @@ +name: regtest-wallet + +on: + workflow_call: + inputs: + python-version: + default: "3.10.4" + type: string + poetry-version: + default: "1.5.1" + type: string + os-version: + default: "ubuntu-latest" + type: string + mint-database: + default: "" + type: string + backend-wallet-class: + required: true + type: string + +jobs: + regtest-wallet: + runs-on: ${{ inputs.os-version }} + timeout-minutes: 10 + steps: + - name: Start PostgreSQL service + if: contains(inputs.mint-database, 'postgres') + run: | + docker run -d --name postgres -e POSTGRES_USER=cashu -e POSTGRES_PASSWORD=cashu -e POSTGRES_DB=cashu -p 5432:5432 postgres:latest + until docker exec postgres pg_isready; do sleep 1; done + + - uses: actions/checkout@v3 + + - uses: ./.github/actions/prepare + with: + python-version: ${{ inputs.python-version }} + poetry-version: ${{ inputs.poetry-version }} + + - name: Setup Regtest + run: | + git clone https://github.com/callebtc/cashu-regtest-enviroment.git regtest + cd regtest + chmod -R 777 . + bash ./start.sh + + - name: Run Tests + env: + WALLET_NAME: test_wallet + MINT_HOST: localhost + MINT_PORT: 3337 + MINT_TEST_DATABASE: ${{ inputs.mint-database }} + TOR: false + MINT_BACKEND_BOLT11_SAT: ${{ inputs.backend-wallet-class }} + # LNbits wallet + MINT_LNBITS_ENDPOINT: http://localhost:5001 + MINT_LNBITS_KEY: d08a3313322a4514af75d488bcc27eee + # LndRestWallet + MINT_LND_REST_ENDPOINT: https://localhost:8081/ + MINT_LND_REST_CERT: ./regtest/data/lnd-3/tls.cert + MINT_LND_REST_MACAROON: ./regtest/data/lnd-3/data/chain/bitcoin/regtest/admin.macaroon + # LndRPCWallet + MINT_LND_RPC_ENDPOINT: localhost:10009 + MINT_LND_RPC_CERT: ./regtest/data/lnd-3/tls.cert + MINT_LND_RPC_MACAROON: ./regtest/data/lnd-3/data/chain/bitcoin/regtest/admin.macaroon + # CoreLightningRestWallet + MINT_CORELIGHTNING_REST_URL: https://localhost:3001 + MINT_CORELIGHTNING_REST_MACAROON: ./regtest/data/clightning-2-rest/access.macaroon + MINT_CORELIGHTNING_REST_CERT: ./regtest/data/clightning-2-rest/certificate.pem + # CLNRestWallet + MINT_CLNREST_URL: https://localhost:3010 + MINT_CLNREST_RUNE: ./regtest/data/clightning-2/rune + MINT_CLNREST_CERT: ./regtest/data/clightning-2/regtest/ca.pem + run: | + sudo chmod -R 777 . + make test-wallet + + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v3 diff --git a/.github/workflows/tests_keycloak_auth.yml b/.github/workflows/tests_keycloak_auth.yml index 56a8239..9d48918 100644 --- a/.github/workflows/tests_keycloak_auth.yml +++ b/.github/workflows/tests_keycloak_auth.yml @@ -67,7 +67,7 @@ jobs: MINT_AUTH_OICD_DISCOVERY_URL: http://localhost:8080/realms/nutshell/.well-known/openid-configuration MINT_AUTH_OICD_CLIENT_ID: cashu-client run: | - poetry run pytest tests/test_wallet_auth.py -v --cov=mint --cov-report=xml + poetry run pytest tests/wallet/test_wallet_auth.py -v --cov=mint --cov-report=xml - name: Stop and clean up Docker Compose run: | diff --git a/.github/workflows/tests_redis_cache.yml b/.github/workflows/tests_redis_cache.yml index a1f0cb5..d234fc7 100644 --- a/.github/workflows/tests_redis_cache.yml +++ b/.github/workflows/tests_redis_cache.yml @@ -53,7 +53,7 @@ jobs: MINT_REDIS_CACHE_ENABLED: true MINT_REDIS_CACHE_URL: redis://localhost:6379 run: | - poetry run pytest tests/test_mint_api_cache.py -v --cov=mint --cov-report=xml + poetry run pytest tests/mint/test_mint_api_cache.py -v --cov=mint --cov-report=xml - name: Stop and clean up Docker Compose run: | diff --git a/Makefile b/Makefile index 3dc8c34..54a5aac 100644 --- a/Makefile +++ b/Makefile @@ -27,6 +27,16 @@ test: DEBUG=true \ poetry run pytest tests --cov-report xml --cov cashu +test-wallet: + PYTHONUNBUFFERED=1 \ + DEBUG=true \ + poetry run pytest tests/wallet --cov-report xml --cov cashu + +test-mint: + PYTHONUNBUFFERED=1 \ + DEBUG=true \ + poetry run pytest tests/mint --cov-report xml --cov cashu + test-lndrest: PYTHONUNBUFFERED=1 \ DEBUG=true \ diff --git a/tests/test_mint.py b/tests/mint/test_mint.py similarity index 100% rename from tests/test_mint.py rename to tests/mint/test_mint.py diff --git a/tests/test_mint_api.py b/tests/mint/test_mint_api.py similarity index 100% rename from tests/test_mint_api.py rename to tests/mint/test_mint_api.py diff --git a/tests/test_mint_api_cache.py b/tests/mint/test_mint_api_cache.py similarity index 100% rename from tests/test_mint_api_cache.py rename to tests/mint/test_mint_api_cache.py diff --git a/tests/test_mint_api_deprecated.py b/tests/mint/test_mint_api_deprecated.py similarity index 100% rename from tests/test_mint_api_deprecated.py rename to tests/mint/test_mint_api_deprecated.py diff --git a/tests/test_mint_db.py b/tests/mint/test_mint_db.py similarity index 100% rename from tests/test_mint_db.py rename to tests/mint/test_mint_db.py diff --git a/tests/test_db.py b/tests/mint/test_mint_db_operations.py similarity index 100% rename from tests/test_db.py rename to tests/mint/test_mint_db_operations.py diff --git a/tests/test_mint_fees.py b/tests/mint/test_mint_fees.py similarity index 100% rename from tests/test_mint_fees.py rename to tests/mint/test_mint_fees.py diff --git a/tests/test_mint_init.py b/tests/mint/test_mint_init.py similarity index 100% rename from tests/test_mint_init.py rename to tests/mint/test_mint_init.py diff --git a/tests/test_mint_keysets.py b/tests/mint/test_mint_keysets.py similarity index 79% rename from tests/test_mint_keysets.py rename to tests/mint/test_mint_keysets.py index 897eb9c..3f47366 100644 --- a/tests/test_mint_keysets.py +++ b/tests/mint/test_mint_keysets.py @@ -3,7 +3,12 @@ import pytest from cashu.core.base import MintKeyset, Unit from cashu.core.settings import settings from cashu.mint.ledger import Ledger -from tests.test_mint_init import DECRYPTON_KEY, DERIVATION_PATH, ENCRYPTED_SEED, SEED +from tests.mint.test_mint_init import ( + DECRYPTON_KEY, + DERIVATION_PATH, + ENCRYPTED_SEED, + SEED, +) async def assert_err(f, msg): @@ -73,19 +78,30 @@ async def test_keyset_0_15_0_encrypted(): ) assert keyset.id == "009a1f293253e41e" + @pytest.mark.asyncio async def test_keyset_rotation(ledger: Ledger): - keyset_sat = next(filter(lambda k: k.unit == Unit["sat"] and k.active, ledger.keysets.values())) - new_keyset_sat = await ledger.rotate_next_keyset(unit=Unit["sat"], max_order=20, input_fee_ppk=1) + keyset_sat = next( + filter(lambda k: k.unit == Unit["sat"] and k.active, ledger.keysets.values()) + ) + new_keyset_sat = await ledger.rotate_next_keyset( + unit=Unit["sat"], max_order=20, input_fee_ppk=1 + ) keyset_sat_derivation = keyset_sat.derivation_path.split("/") new_keyset_sat_derivation = keyset_sat.derivation_path.split("/") - assert keyset_sat_derivation[:-1] == new_keyset_sat_derivation[:-1], "keyset derivation does not match up to the counter branch" - assert int(new_keyset_sat_derivation[-1].replace("'", "")) - int(keyset_sat_derivation[-1].replace("'", "")) == 0, "counters should differ by exactly 1" + assert ( + keyset_sat_derivation[:-1] == new_keyset_sat_derivation[:-1] + ), "keyset derivation does not match up to the counter branch" + assert ( + int(new_keyset_sat_derivation[-1].replace("'", "")) + - int(keyset_sat_derivation[-1].replace("'", "")) + == 0 + ), "counters should differ by exactly 1" assert new_keyset_sat.input_fee_ppk == 1 assert len(new_keyset_sat.private_keys.values()) == 20 old_keyset = (await ledger.crud.get_keyset(db=ledger.db, id=keyset_sat.id))[0] - assert not old_keyset.active, "old keyset is still active" \ No newline at end of file + assert not old_keyset.active, "old keyset is still active" diff --git a/tests/test_mint_lightning_blink.py b/tests/mint/test_mint_lightning_blink.py similarity index 100% rename from tests/test_mint_lightning_blink.py rename to tests/mint/test_mint_lightning_blink.py diff --git a/tests/test_mint_melt.py b/tests/mint/test_mint_melt.py similarity index 100% rename from tests/test_mint_melt.py rename to tests/mint/test_mint_melt.py diff --git a/tests/test_mint_operations.py b/tests/mint/test_mint_operations.py similarity index 100% rename from tests/test_mint_operations.py rename to tests/mint/test_mint_operations.py diff --git a/tests/test_mint_p2pk.py b/tests/mint/test_mint_p2pk.py similarity index 100% rename from tests/test_mint_p2pk.py rename to tests/mint/test_mint_p2pk.py diff --git a/tests/test_mint_p2pk_comprehensive.py b/tests/mint/test_mint_p2pk_comprehensive.py similarity index 100% rename from tests/test_mint_p2pk_comprehensive.py rename to tests/mint/test_mint_p2pk_comprehensive.py diff --git a/tests/test_mint_regtest.py b/tests/mint/test_mint_regtest.py similarity index 100% rename from tests/test_mint_regtest.py rename to tests/mint/test_mint_regtest.py diff --git a/tests/test_wallet.py b/tests/wallet/test_wallet.py similarity index 100% rename from tests/test_wallet.py rename to tests/wallet/test_wallet.py diff --git a/tests/test_wallet_api.py b/tests/wallet/test_wallet_api.py similarity index 100% rename from tests/test_wallet_api.py rename to tests/wallet/test_wallet_api.py diff --git a/tests/test_wallet_auth.py b/tests/wallet/test_wallet_auth.py similarity index 100% rename from tests/test_wallet_auth.py rename to tests/wallet/test_wallet_auth.py diff --git a/tests/test_wallet_cli.py b/tests/wallet/test_wallet_cli.py similarity index 100% rename from tests/test_wallet_cli.py rename to tests/wallet/test_wallet_cli.py diff --git a/tests/test_wallet_htlc.py b/tests/wallet/test_wallet_htlc.py similarity index 100% rename from tests/test_wallet_htlc.py rename to tests/wallet/test_wallet_htlc.py diff --git a/tests/test_wallet_lightning.py b/tests/wallet/test_wallet_lightning.py similarity index 100% rename from tests/test_wallet_lightning.py rename to tests/wallet/test_wallet_lightning.py diff --git a/tests/test_wallet_p2pk.py b/tests/wallet/test_wallet_p2pk.py similarity index 100% rename from tests/test_wallet_p2pk.py rename to tests/wallet/test_wallet_p2pk.py diff --git a/tests/test_wallet_p2pk_methods.py b/tests/wallet/test_wallet_p2pk_methods.py similarity index 100% rename from tests/test_wallet_p2pk_methods.py rename to tests/wallet/test_wallet_p2pk_methods.py diff --git a/tests/test_wallet_regtest.py b/tests/wallet/test_wallet_regtest.py similarity index 100% rename from tests/test_wallet_regtest.py rename to tests/wallet/test_wallet_regtest.py diff --git a/tests/test_wallet_regtest_mpp.py b/tests/wallet/test_wallet_regtest_mpp.py similarity index 98% rename from tests/test_wallet_regtest_mpp.py rename to tests/wallet/test_wallet_regtest_mpp.py index 4dd1d87..480f3f4 100644 --- a/tests/test_wallet_regtest_mpp.py +++ b/tests/wallet/test_wallet_regtest_mpp.py @@ -17,6 +17,7 @@ from tests.helpers import ( assert_err, cancel_invoice, get_hold_invoice, + get_real_invoice, is_fake, partial_pay_real_invoice, pay_if_regtest, @@ -51,7 +52,7 @@ async def test_regtest_pay_mpp(wallet: Wallet, ledger: Ledger): assert wallet.balance == 128 # this is the invoice we want to pay in two parts - preimage, invoice_dict = get_hold_invoice(64) + invoice_dict = get_real_invoice(64) invoice_payment_request = str(invoice_dict["payment_request"]) async def _mint_pay_mpp(invoice: str, amount: int, proofs: List[Proof]): @@ -116,7 +117,7 @@ async def test_regtest_pay_mpp_incomplete_payment(wallet: Wallet, ledger: Ledger assert wallet.balance == 384 # this is the invoice we want to pay in two parts - preimage, invoice_dict = get_hold_invoice(64) + invoice_dict = get_real_invoice(64) invoice_payment_request = str(invoice_dict["payment_request"]) async def pay_mpp(amount: int, proofs: List[Proof], delay: float = 0.0): diff --git a/tests/test_wallet_requests.py b/tests/wallet/test_wallet_requests.py similarity index 100% rename from tests/test_wallet_requests.py rename to tests/wallet/test_wallet_requests.py diff --git a/tests/test_wallet_restore.py b/tests/wallet/test_wallet_restore.py similarity index 100% rename from tests/test_wallet_restore.py rename to tests/wallet/test_wallet_restore.py diff --git a/tests/test_wallet_subscription.py b/tests/wallet/test_wallet_subscription.py similarity index 100% rename from tests/test_wallet_subscription.py rename to tests/wallet/test_wallet_subscription.py diff --git a/tests/test_wallet_utils.py b/tests/wallet/test_wallet_utils.py similarity index 100% rename from tests/test_wallet_utils.py rename to tests/wallet/test_wallet_utils.py