[Mint] add mint api tests (#189)

* add mint api tests

* add /info test and fix NUT-09 contact info strings

* add test mint api

* replace with requests
This commit is contained in:
calle
2023-05-02 00:43:49 +02:00
committed by GitHub
parent 3c47ab2ac7
commit 61078ce7c8
6 changed files with 78 additions and 35 deletions

View File

@@ -25,12 +25,12 @@ NOSTR_RELAYS=["wss://nostr-pub.wellorder.net"]
# --------- MINT --------- # --------- MINT ---------
# MINT
MINT_INFO_NAME="My Cashu mint" MINT_INFO_NAME="My Cashu mint"
MINT_INFO_PUBKEY="<hex_pubkey>"
MINT_INFO_DESCRIPTION="The short mint description" MINT_INFO_DESCRIPTION="The short mint description"
MINT_INFO_DESCRIPTION_LONG="A long mint description that can be a long piece of text." MINT_INFO_DESCRIPTION_LONG="A long mint description that can be a long piece of text."
MINT_INFO_CONTACT=["Email: contact@me.com", "Twitter: @me", "Nostr: npub..."] MINT_INFO_CONTACT=[["email","contact@me.com"], ["twitter","@me"], ["nostr", "npub..."]]
# MINT_INFO_MOTD="Message to users" MINT_INFO_MOTD="Message to users"
MINT_PRIVATE_KEY=supersecretprivatekey MINT_PRIVATE_KEY=supersecretprivatekey

View File

@@ -113,7 +113,7 @@ class GetInfoResponse(BaseModel):
version: Optional[str] = None version: Optional[str] = None
description: Optional[str] = None description: Optional[str] = None
description_long: Optional[str] = None description_long: Optional[str] = None
contact: Optional[List[str]] = None contact: Optional[List[List[str]]] = None
nuts: Optional[List[str]] = None nuts: Optional[List[str]] = None
motd: Optional[str] = None motd: Optional[str] = None

View File

@@ -43,7 +43,7 @@ class CashuSettings(BaseSettings):
class EnvSettings(CashuSettings): class EnvSettings(CashuSettings):
debug: bool = Field(default=False) debug: bool = Field(default=False)
host: str = Field(default="127.0.0.1") host: str = Field(default="127.0.0.1")
port: int = Field(default=5000) port: int = Field(default=3338)
cashu_dir: str = Field(default=os.path.join(str(Path.home()), ".cashu")) cashu_dir: str = Field(default=os.path.join(str(Path.home()), ".cashu"))
@@ -64,8 +64,8 @@ class MintInformation(CashuSettings):
mint_info_name: str = Field(default="Cashu mint") mint_info_name: str = Field(default="Cashu mint")
mint_info_description: str = Field(default=None) mint_info_description: str = Field(default=None)
mint_info_description_long: str = Field(default=None) mint_info_description_long: str = Field(default=None)
mint_info_contact: List[str] = Field(default=[]) mint_info_contact: List[List[str]] = Field(default=[["", ""]])
mint_info_nuts: List[str] = Field(default=["NUT-07", "NUT-08"]) mint_info_nuts: List[str] = Field(default=["NUT-07", "NUT-08", "NUT-09"])
mint_info_motd: str = Field(default=None) mint_info_motd: str = Field(default=None)

View File

@@ -1,4 +1,5 @@
import multiprocessing import multiprocessing
import os
import shutil import shutil
import time import time
from pathlib import Path from pathlib import Path
@@ -8,9 +9,13 @@ import pytest_asyncio
import uvicorn import uvicorn
from uvicorn import Config, Server from uvicorn import Config, Server
from cashu.core.db import Database
from cashu.core.migrations import migrate_databases from cashu.core.migrations import migrate_databases
from cashu.core.settings import settings from cashu.core.settings import settings
from cashu.wallet import migrations from cashu.lightning.fake import FakeWallet
from cashu.mint import migrations as migrations_mint
from cashu.mint.ledger import Ledger
from cashu.wallet import migrations as migrations_wallet
from cashu.wallet.wallet import Wallet from cashu.wallet.wallet import Wallet
SERVER_ENDPOINT = "http://localhost:3337" SERVER_ENDPOINT = "http://localhost:3337"
@@ -61,3 +66,23 @@ def mint():
time.sleep(1) time.sleep(1)
yield server yield server
server.stop() server.stop()
@pytest_asyncio.fixture(scope="function")
async def ledger():
async def start_mint_init(ledger):
await migrate_databases(ledger.db, migrations_mint)
await ledger.load_used_proofs()
await ledger.init_keysets()
db_file = "data/mint/test.sqlite3"
if os.path.exists(db_file):
os.remove(db_file)
ledger = Ledger(
db=Database("test", "data/mint"),
seed="TEST_PRIVATE_KEY",
derivation_path="0/0/0/0",
lightning=FakeWallet(),
)
await start_mint_init(ledger)
yield ledger

View File

@@ -1,20 +1,15 @@
from typing import List from typing import List
import pytest import pytest
import pytest_asyncio
from cashu.core.base import BlindedMessage, Proof from cashu.core.base import BlindedMessage, Proof
from cashu.core.migrations import migrate_databases from cashu.core.migrations import migrate_databases
SERVER_ENDPOINT = "http://localhost:3338" SERVER_ENDPOINT = "http://localhost:3338"
import os
from cashu.core.db import Database
from cashu.core.settings import settings from cashu.core.settings import settings
from cashu.lightning.fake import FakeWallet
from cashu.mint import migrations
from cashu.mint.ledger import Ledger from cashu.mint.ledger import Ledger
from tests.conftest import ledger
async def assert_err(f, msg): async def assert_err(f, msg):
@@ -32,27 +27,6 @@ def assert_amt(proofs: List[Proof], expected: int):
assert [p.amount for p in proofs] == expected assert [p.amount for p in proofs] == expected
async def start_mint_init(ledger):
await migrate_databases(ledger.db, migrations)
await ledger.load_used_proofs()
await ledger.init_keysets()
@pytest_asyncio.fixture(scope="function")
async def ledger():
db_file = "data/mint/test.sqlite3"
if os.path.exists(db_file):
os.remove(db_file)
ledger = Ledger(
db=Database("test", "data/mint"),
seed="TEST_PRIVATE_KEY",
derivation_path="0/0/0/0",
lightning=FakeWallet(),
)
await start_mint_init(ledger)
yield ledger
@pytest.mark.asyncio @pytest.mark.asyncio
async def test_pubkeys(ledger: Ledger): async def test_pubkeys(ledger: Ledger):
assert ledger.keyset.public_keys assert ledger.keyset.public_keys

44
tests/test_mint_api.py Normal file
View File

@@ -0,0 +1,44 @@
import asyncio
import pytest
import pytest_asyncio
import requests
from cashu.core.settings import settings
from tests.conftest import ledger
BASE_URL = f"http://localhost:3337"
@pytest.mark.asyncio
async def test_info(ledger):
response = requests.get(f"{BASE_URL}/info")
assert response.status_code == 200, f"{response.url} {response.status_code}"
assert response.json()["pubkey"] == ledger.pubkey.serialize().hex()
@pytest.mark.asyncio
async def test_api_keys(ledger):
response = requests.get(f"{BASE_URL}/keys")
assert response.status_code == 200, f"{response.url} {response.status_code}"
assert response.json() == {
str(k): v.serialize().hex() for k, v in ledger.keyset.public_keys.items()
}
@pytest.mark.asyncio
async def test_api_keysets(ledger):
response = requests.get(f"{BASE_URL}/keysets")
assert response.status_code == 200, f"{response.url} {response.status_code}"
assert response.json()["keysets"] == list(ledger.keysets.keysets.keys())
@pytest.mark.asyncio
async def test_api_keyset_keys(ledger):
response = requests.get(
f"{BASE_URL}/keys/{'1cCNIAZ2X/w1'.replace('/', '_').replace('+', '-')}"
)
assert response.status_code == 200, f"{response.url} {response.status_code}"
assert response.json() == {
str(k): v.serialize().hex() for k, v in ledger.keyset.public_keys.items()
}