56 lines
2.0 KiB
Python
56 lines
2.0 KiB
Python
# retoor <retoor@molodetz.nl>
|
|
|
|
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
|