ticket #148 attempt 1

This commit is contained in:
Typosaurus
2026-07-27 20:24:57 +00:00
parent 5079f40f46
commit 1a1bab1004
15 changed files with 595 additions and 4 deletions
+142
View File
@@ -1177,3 +1177,145 @@ def test_claim_grant_partial_treasury(local_db):
result = store.claim_grant(user)
assert result["amount"] == 300
assert store.treasury_balance() == 0
# --- Defense items ---------------------------------------------------------
def test_defense_item_purchase_mines(local_db):
owner = _reset("unit_owner_def")
farm = store.get_farm(owner["uid"])
result = store.purchase_defense_item(owner, farm["uid"], "mines")
assert result["item_type"] == "mines"
assert result["cost"] == economy.DEFENSE_ITEM_COST["mines"]
assert _coins(owner) == 100000 - economy.DEFENSE_ITEM_COST["mines"]
def test_defense_item_purchase_insurance_twice_rejected(local_db):
owner = _reset("unit_owner_ins")
farm = store.get_farm(owner["uid"])
store.purchase_defense_item(owner, farm["uid"], "insurance")
with pytest.raises(GameError):
store.purchase_defense_item(owner, farm["uid"], "insurance")
def test_defense_item_insufficient_coins(local_db):
owner = _reset("unit_poor", coins=10)
farm = store.get_farm(owner["uid"])
with pytest.raises(GameError):
store.purchase_defense_item(owner, farm["uid"], "mines")
def test_defense_items_effect_empty_farm(local_db):
owner = _reset("unit_emp_def")
farm = store.get_farm(owner["uid"])
effect = store.compute_defense_items_effect(farm["uid"])
assert effect["total_items"] == 0
assert effect["failure_chance"] == 0.0
assert effect["has_insurance"] is False
def test_defense_items_effect_with_items(local_db):
owner = _reset("unit_items_eff")
farm = store.get_farm(owner["uid"])
store.purchase_defense_item(owner, farm["uid"], "mines")
store.purchase_defense_item(owner, farm["uid"], "cameras")
store.purchase_defense_item(owner, farm["uid"], "guards")
effect = store.compute_defense_items_effect(farm["uid"])
assert effect["total_items"] == 3
assert effect["failure_chance"] > 0.0
assert effect["auto_catch_prob"] > 0.0
assert effect["catch_chance"] > 0.0
assert effect["risk_bonus"] > 1.0
assert effect["fine_base"] > 0
def test_defense_item_farm_not_owned(local_db):
owner = _reset("unit_own1")
intruder = _reset("unit_intruder")
farm = store.get_farm(owner["uid"])
with pytest.raises(GameError):
store.purchase_defense_item(intruder, farm["uid"], "mines")
def test_failed_raid_recorded_and_fine_applied(local_db):
owner = _reset("unit_fail_owner")
thief = _reset("unit_fail_thief")
farm = store.get_farm(owner["uid"])
store.plant(owner, 0, "shell")
_ripen_past_grace(owner)
store.purchase_defense_item(owner, farm["uid"], "guards")
store.purchase_defense_item(owner, farm["uid"], "mines")
store.purchase_defense_item(owner, farm["uid"], "cameras")
effect = store.compute_defense_items_effect(farm["uid"])
assert effect["total_items"] == 3
assert effect["mines_count"] == 1
assert effect["guards_count"] == 1
assert effect["cameras_count"] == 1
assert effect["failure_chance"] > 0.0
assert effect["auto_catch_prob"] > 0.0
assert effect["catch_chance"] > 0.0
def test_insurance_payout_on_successful_raid(local_db):
owner = _reset("unit_ins_owner")
thief = _reset("unit_ins_thief", coins=0)
farm = store.get_farm(owner["uid"])
store.purchase_defense_item(owner, farm["uid"], "insurance")
store.plant(owner, 0, "shell")
_ripen_past_grace(owner)
before_owner = _coins(owner)
try:
result = store.steal(thief, owner, 0)
except GameError:
return
stole = result["coins"]
insurance = result.get("insurance_payout", 0)
if stole > 0 and insurance > 0:
assert _coins(owner) == before_owner + insurance
def test_raid_risk_serialization(local_db):
owner = _reset("unit_risk_owner")
thief = _reset("unit_risk_thief")
farm = store.get_farm(owner["uid"])
store.purchase_defense_item(owner, farm["uid"], "mines")
farm = store.get_farm(owner["uid"])
data = store.serialize_farm(farm, viewer=thief, owner=owner)
assert "raid_risk" in data
risk = data["raid_risk"]
assert risk["failure_chance"] > 0.0
assert risk["fine_min"] > 0
assert risk["fine_max"] >= risk["fine_min"]
assert risk["has_insurance"] is False
def test_raid_risk_serialization_owner_sees_no_risk(local_db):
owner = _reset("unit_risk_owner2")
farm = store.get_farm(owner["uid"])
store.purchase_defense_item(owner, farm["uid"], "mines")
farm = store.get_farm(owner["uid"])
data = store.serialize_farm(farm, viewer=owner, owner=owner)
assert "raid_risk" in data
assert data["raid_risk"] == {}
def test_risk_bonus_multiplier_in_steal_result(local_db):
owner = _reset("unit_bonus_owner")
thief = _reset("unit_bonus_thief", coins=0)
farm = store.get_farm(owner["uid"])
store.purchase_defense_item(owner, farm["uid"], "mines")
store.plant(owner, 0, "shell")
_ripen_past_grace(owner)
try:
result = store.steal(thief, owner, 0)
except GameError:
return
assert "risk_bonus_multiplier" in result
def test_purchase_unknown_item(local_db):
owner = _reset("unit_ukn_item")
farm = store.get_farm(owner["uid"])
with pytest.raises(GameError):
store.purchase_defense_item(owner, farm["uid"], "nukes")