forked from retoor/devplacepy
ticket #148 attempt 1
This commit is contained in:
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user