fix: preserve points balance across account re-registration
Persist a per-email balance snapshot before account deletion and restore it on same-email re-registration, preventing both unintended balance reset and repeated signup bonus grants.
This commit is contained in:
@@ -170,7 +170,7 @@ async def test_register_run_delete_reregister_keeps_bonus_single_use(
|
||||
)
|
||||
reregister_balance.raise_for_status()
|
||||
re_data = reregister_balance.json()
|
||||
assert int(re_data["balance"]) == 0
|
||||
assert int(re_data["balance"]) == int(after_data["balance"])
|
||||
|
||||
async with AsyncSessionLocal() as session:
|
||||
points2 = (
|
||||
@@ -217,3 +217,54 @@ async def test_register_run_delete_reregister_keeps_bonus_single_use(
|
||||
).scalars()
|
||||
)
|
||||
assert len(claim_rows) == 1
|
||||
assert claim_rows[0].balance_snapshot == int(after_data["balance"])
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_register_delete_reregister_restores_unspent_balance(
|
||||
api_client: httpx.AsyncClient,
|
||||
test_identity: IdentityData,
|
||||
) -> None:
|
||||
email = str(test_identity["email"]).strip().lower()
|
||||
bonus = int(config.points_policy.register_bonus_points)
|
||||
|
||||
first = await _create_email_session(
|
||||
api_client,
|
||||
email=email,
|
||||
code=str(test_identity["code"]),
|
||||
)
|
||||
user1 = first.get("user")
|
||||
assert isinstance(user1, dict)
|
||||
user1_id = str(user1["id"])
|
||||
token1 = str(first["access_token"])
|
||||
headers1 = {"Authorization": f"Bearer {token1}"}
|
||||
|
||||
first_balance = await api_client.get("/api/v1/points/balance", headers=headers1)
|
||||
first_balance.raise_for_status()
|
||||
first_data = first_balance.json()
|
||||
assert int(first_data["balance"]) == bonus
|
||||
|
||||
delete_resp = await api_client.delete("/api/v1/users/me", headers=headers1)
|
||||
assert delete_resp.status_code == 204
|
||||
|
||||
second = await _create_email_session(
|
||||
api_client,
|
||||
email=email,
|
||||
code=str(test_identity["code"]),
|
||||
)
|
||||
user2 = second.get("user")
|
||||
assert isinstance(user2, dict)
|
||||
user2_id = str(user2["id"])
|
||||
assert user1_id != user2_id
|
||||
token2 = str(second["access_token"])
|
||||
headers2 = {"Authorization": f"Bearer {token2}"}
|
||||
|
||||
reregister_balance = await api_client.get(
|
||||
"/api/v1/points/balance", headers=headers2
|
||||
)
|
||||
reregister_balance.raise_for_status()
|
||||
re_data = reregister_balance.json()
|
||||
assert int(re_data["balance"]) == bonus
|
||||
|
||||
cleanup_resp = await api_client.delete("/api/v1/users/me", headers=headers2)
|
||||
assert cleanup_resp.status_code == 204
|
||||
|
||||
Reference in New Issue
Block a user