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
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:
parent
f0f224fd3f
commit
8dfd3feba8
2 changed files with 18 additions and 17 deletions
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue