fix(session): price the balance from the warm rate cache only
Some checks failed
lint.yml / fix(session): price the balance from the warm rate cache only (pull_request) Failing after 0s

/session gates the terminal unlocking, and satoshis_amount_as_fiat() on a
cold cache queries external exchanges (~1 s measured on l484). Read the
LNbits btc-price cache directly instead: warm → fiat, miss → null and
the terminal prices the sats itself. No rate lookup ever blocks a tap.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Padreug 2026-09-22 14:23:33 +02:00
commit 8dfd3feba8
2 changed files with 18 additions and 17 deletions

View file

@ -106,16 +106,16 @@ def stubs(monkeypatch):
async def get_wallet(wallet_id):
return state["wallet"]
async def satoshis_amount_as_fiat(amount, currency):
assert currency == "USD"
return amount * 0.0008 # 123456 sats → 98.7648
def cache_get(key, default=None):
# A warm LNbits rate cache: 1 BTC = 80,000 USD → 123456 sats = 98.7648
return 80_000.0 if key == "btc-price-USD" else default
monkeypatch.setattr(v, "get_card_by_external_id", get_card_by_external_id)
monkeypatch.setattr(v, "update_card_counter", update_card_counter)
monkeypatch.setattr(v, "get_hits_today", get_hits_today)
monkeypatch.setattr(v, "create_hit", create_hit)
monkeypatch.setattr(v, "get_wallet", get_wallet)
monkeypatch.setattr(v, "satoshis_amount_as_fiat", satoshis_amount_as_fiat)
monkeypatch.setattr(v.cache, "get", cache_get)
monkeypatch.setattr(
v.settings, "lnbits_default_accounting_currency", state["default_currency"]
)
@ -209,18 +209,18 @@ async def test_session_falls_back_to_instance_default_currency(stubs, monkeypatc
p, c = make_sun(counter=6)
out = await v.api_session(p, c, FakeRequest(), "ext123")
assert out["currency"] == "USD"
assert out["fiat"] == pytest.approx(5 * 0.0008)
assert out["fiat"] == pytest.approx(5 / 100_000_000 * 80_000)
@pytest.mark.asyncio
async def test_session_survives_rate_failure(stubs, monkeypatch):
async def boom(amount, currency):
raise ValueError("no rate")
monkeypatch.setattr(v, "satoshis_amount_as_fiat", boom)
async def test_session_leaves_fiat_null_on_a_cold_rate_cache(stubs, monkeypatch):
# No external rate lookup ever happens on the unlock path: a cache miss
# simply means the terminal prices the balance itself.
monkeypatch.setattr(v.cache, "get", lambda key, default=None: default)
p, c = make_sun(counter=6)
out = await v.api_session(p, c, FakeRequest(), "ext123")
assert out["authenticated"] is True
assert out["currency"] == "USD"
assert out["fiat"] is None