forked from retoor/devplacepy
ticket #148 attempt 1
This commit is contained in:
@@ -427,3 +427,65 @@ def test_grant_ineligible_when_rich_returns_400(app_server, seeded_db):
|
||||
)
|
||||
r = session.post(f"{BASE_URL}/game/grant", headers=JSON)
|
||||
assert r.status_code == 400
|
||||
|
||||
|
||||
def test_defense_item_purchase_success(app_server, seeded_db):
|
||||
session, name = _signup()
|
||||
_reset_farm(name, 10000)
|
||||
refresh_snapshot()
|
||||
user = get_table("users").find_one(username=name)
|
||||
farm = store.get_farm(user["uid"])
|
||||
r = session.post(
|
||||
f"{BASE_URL}/game/farm/{name}/defense-item",
|
||||
data={"farm_uid": farm["uid"], "item_type": "mines"},
|
||||
headers=JSON,
|
||||
)
|
||||
assert r.status_code == 200
|
||||
body = r.json()
|
||||
assert body["item_type"] == "mines"
|
||||
assert body["cost"] == economy.DEFENSE_ITEM_COST["mines"]
|
||||
|
||||
|
||||
def test_defense_item_purchase_not_owner_returns_403(app_server, seeded_db):
|
||||
session, name = _signup()
|
||||
owner_session, owner_name = _signup()
|
||||
_reset_farm(owner_name, 10000)
|
||||
refresh_snapshot()
|
||||
owner_user = get_table("users").find_one(username=owner_name)
|
||||
farm = store.get_farm(owner_user["uid"])
|
||||
r = session.post(
|
||||
f"{BASE_URL}/game/farm/{owner_name}/defense-item",
|
||||
data={"farm_uid": farm["uid"], "item_type": "mines"},
|
||||
headers=JSON,
|
||||
)
|
||||
assert r.status_code in (400, 403)
|
||||
assert r.status_code != 200
|
||||
|
||||
|
||||
def test_defense_item_purchase_requires_auth(app_server, seeded_db):
|
||||
r = requests.post(
|
||||
f"{BASE_URL}/game/farm/test/defense-item",
|
||||
data={"farm_uid": "x", "item_type": "mines"},
|
||||
headers=JSON,
|
||||
)
|
||||
assert r.status_code in (401, 303)
|
||||
|
||||
|
||||
def test_insurance_purchase_duplicate_rejected(app_server, seeded_db):
|
||||
session, name = _signup()
|
||||
_reset_farm(name, 10000)
|
||||
refresh_snapshot()
|
||||
user = get_table("users").find_one(username=name)
|
||||
farm = store.get_farm(user["uid"])
|
||||
r1 = session.post(
|
||||
f"{BASE_URL}/game/farm/{name}/defense-item",
|
||||
data={"farm_uid": farm["uid"], "item_type": "insurance"},
|
||||
headers=JSON,
|
||||
)
|
||||
assert r1.status_code == 200
|
||||
r2 = session.post(
|
||||
f"{BASE_URL}/game/farm/{name}/defense-item",
|
||||
data={"farm_uid": farm["uid"], "item_type": "insurance"},
|
||||
headers=JSON,
|
||||
)
|
||||
assert r2.status_code == 400
|
||||
|
||||
@@ -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