# retoor from devplacepy.database import get_table from devplacepy.database import nodes as store from devplacepy.services.nodes import ledger as ledger_module from devplacepy.services.nodes.ledger import FIRST_BADGE, GIGABYTE, UsageLedger from devplacepy.utils import generate_uid, register_account def member(local_db): name = "ledger" + generate_uid()[-10:] uid, _, _ = register_account(name, f"{name}@t.dev", "secret123", age_band="adult", accepted_terms=True) return uid def badges(uid): return {row["badge_name"] for row in get_table("badges").find(user_uid=uid)} def test_first_success_awards_xp_and_the_first_badge(local_db): uid = member(local_db) before = get_table("users").find_one(uid=uid).get("xp") or 0 store.record_job(generate_uid(), uid, ok=True, bytes_up=10, bytes_down=100) UsageLedger().reward(uid) assert FIRST_BADGE in badges(uid) assert (get_table("users").find_one(uid=uid).get("xp") or 0) > before def test_xp_stops_at_the_daily_cap_but_not_the_counters(local_db): uid = member(local_db) ledger = UsageLedger() store.record_job(generate_uid(), uid, ok=True, bytes_up=1, bytes_down=1) granted = 0 for _ in range(store.LIMITS.xp_daily_cap + 10): granted += int(ledger.claim_xp(uid, ledger_module.XP_PER_JOB)) assert granted == store.LIMITS.xp_daily_cap def test_byte_badges_follow_lifetime_totals(local_db): uid = member(local_db) store.record_job( generate_uid(), uid, ok=True, bytes_up=0, bytes_down=GIGABYTE, cap_bytes=2 * GIGABYTE ) UsageLedger().reward(uid) assert {"Gigabyte Donor"} <= badges(uid) assert "10 GB Donor" not in badges(uid) def test_a_second_reward_call_does_not_duplicate_badges(local_db): uid = member(local_db) store.record_job(generate_uid(), uid, ok=True, bytes_up=1, bytes_down=1) ledger = UsageLedger() ledger.reward(uid) ledger.reward(uid) assert len(list(get_table("badges").find(user_uid=uid, badge_name=FIRST_BADGE))) == 1